Учебник по языку программирования D. Часть 1

в 14:06, , рубрики: dlang, tutorials, tutorials d, Программирование, системное программирование

Данный пост начинает серию переводов D Programming Language Tutorial, дабы компенсировать информационный вакуум об этом системном языке. Каждая часть будет содержать константое количество материала из книги, так как оригинальные главы имеют широкий разброс в размере: от пары абзацев до нескольких печатных страниц. Все примеры кода проверяются на текущем релизе компилятора dmd 2.065, и если возникают проблемы с технической частью, прошу отписываться в комментариях.

Благодарности

Я хотел бы поблагодарить мою жену и дочь, которые пережили столько долгих часов, сколько я писал оригинальную версию на Турецком и также Английский перевод этой книги.

Главы прошли первоначальную проверку членами турецкого форума Ddili Forum. Я благодарен турецкому коммьюнити D за поддержание моего азарта и мотивации на высоком уровне.

Mert Ataol, Zafer Çelenk, и Salih Dinçer написали отзывы практически на каждую строчку книги. Can Alpay Çiftçi и Faruk Erdem Öncel играли важную роль в развитии и книги и ddili.org.

Спасибо следующим людям за их существенные исправления, рекомендации и идеи: Ergin Güney, Jordi Sayol, David Herberth, Andre Tampubolon, Gour-Gadadhara Dasa, Raphaël Jakse, Andrej Mitrovic, Johannes Pfau, Jerome Sniatecki, Jason Adams, Ali H. Çalışkan, Paul Jurczak, Brian Rogoff, Михаил Страшун, Joseph Rushton Wakeling, Tove, Hugo Florentino, Satya Pothamsetti, Luís Marques, Christoph Wendler.

Эта книга была вычитана Ergin Güney для улучшения моего Инглиша (ориг. Inglish) до нормального Английского.

Введение

Книга предназначена для обучения языку D читателей — новичков в сфере программирования. Хотя наличие опыта в других языках программирования несомненно было бы полезным, эта книга начинает с самых основ. Если вы заинтерисованы научиться программировать, я надеюсь, что найдете книгу полезной.

Для того, чтобы книга не была бесполезной, нам будет необходима среда для написания, компилирования и запуска программ на D. Эта среда разработки должна включать в себя, по крайней мере, следующие элементы:

  • текстовый редактор
  • компилятор для D

Вместо того, чтобы скачивать и устанавливать их по отдельности, можно рассмотреть вариант с интегрированной средой разработки (IDE). Вы можете найти информацию о редакторах и IDE для D на страницах Editors и IDE на dlang.org. Обучиться программировать на D (прим. да вообще на любом языке, кроме псевдокода) без текстового редактора или комплилятора невозможно. Инструкции по установке компилятора dmd и как им пользоваться будут рассмотрены чуть позже в следующих главах.

Каждая глава книги пытается ввести настолько мало новых понятий, насколько это возможно. Большинство глав содержат несколько упражнений, и к ним имеются решения для того, чтобы сравнить свои решения с моими. (прим. В данном переводе решения находятся под спойлерами рядом с заданиями.)

Я предполагаю, что вы не пропускаете главы. Если натыкаетесь на главы, которые особенно тяжело даются, это может быть из-за того, что в книге неудачно предоставлены все необходимые понятия. Пожалуйста, напишите автору (acehreli@yahoo.com) (прим. оставьте комментарий) о таких проблемах, чтобы помочь сделать эту книгу полезнее.

Книга не раскрывает программирование с использованием графического интерфейса пользователя (GUI). Хотя многие программы гораздо удобнее использовать вместе с GUI, GUI напрямую не относится к языкам программирования. Более того, проектные решения и стиль программирования с GUI может конфликтовать со стилем самого языка и его стандартной библиотеки, и усложнить изучение языка. Поэтому книга описывает только консольные программы. Как только изучены основы D и его стандартная билиботека, Phobos, вы сможете использовать любую библиотеку для GUI, какую захотите.

Главы книги доступны онлайн по мере перевода с Турецкого языка. Можно использовать ленту RSS, чтобы быть в курсе выхода новых глав.

Изучать программирование гораздо веселее в коллективе. Заходите на D.learn newsgroup, чтобы следить за дискуссиями и задавать вопросы, и отвечать на них.

Практика программирования

Очень сложно определить беспорно, что именно включает в себя практика программирования, но ремесленный аспект в ней очень силен. Некоторые умозаключения о программировании:

  • Это задача создания программ, которые заставляют компьютер вести себя ожидаемым образом
  • Так как оно требует инструменты и использование этих инструментов руководствуется опытом программистов-мастеров, оно является ремеслом
  • Так как оно включает в себя решение проблем с ограничениями, оно является инженерным искусством
  • Оно очень увлекательное и приносит удовлетворение
  • Оно не является изобразительным искусством, но насколько это возможно в любой человеческой деятельности, программы могут являться произведениями искусства
  • Оно не является наукой, но используемые в нем методы созданы наукой-информатикой.

Может быть очень сложно обучиться программированию и преподавать его

Программирование преподается с 1950-х, и все еще не разработаны эффективные или успешные обучающие методики.

К сожалению, обучение программированию можеть быть сложной задачей для примерно половины из всех студентов. Согласно научной статье (прим. ориг. ссылка нерабочая), те, кто изучают программирование с легкостью, являются теми, кто способны создавать модели консистентности для описания новых ситуаций, с которыми сталкиваются.

Некоторые сложности в программировании вызваны числом технических деталей, которые должны быть усвоены.

The Hello World

Первой программой в большинстве книг по программированию является hello world программой. Это очень короткая и простая программа, которая выводит «привет мир» и завершается. Эта программа важна, так как она включает некоторые базовые понятия языка.

Ниже hello world на D:

import std.stdio;
 
void main()
{
    writeln("Hello world!");
}

Исходный код выше должен быть скомпилирован компилятором D для создания вызываемого файла.

Установка компилятора

На момент написания этой главы можно выбирать из трех компиляторов D: dmd, компилятор от Digital Mars; gdc, компилятор D для GCC; и ldc, компилятор, который использует LLVM инфраструктуру.

dmd — D компилятор, который использовался для проектирования и разработки языка в течении многих лет. Все примеры в этой книге были протестированы на dmd. По этой причине самый простой выход — начать с dmd и пробовать другие компиляторы, если для этого есть конкретная необходимость (прим. например, gdc выдает наиболее оптимизированный код).

Для установки последней версии dmd зайдите на страницу скачивания на Digital Mars и выберите версию компилятора, которая подходит под окружение компьютера. Вы должны выбрать версию dmd, которая соответствует установленной операционной системе и пакетному менеджеру, и совпадает с архитектурой процессора: 32-разрядная или 64-разрядная. Не устанавливаете компилятор для D1 (прим. первая версия — уже история)! Эта книга освещает только D второй версии.

Последовательность установки разная для разных окружений, но она должна быть настолько проста, как следование простым инструкциям на экране и нажатие пары кнопок.

Исходник

Файл, который пишет программист для компиляции, называется файлом исходных кодов или просто исходник. Так как D — компилируемый язык, исходники сами по себе не являются исполняемыми файлами. Исходный код должен быть переведен в исполняемую программу компилятором.

Как и все файлы, исходник должен иметь имя. Хотя это имя может любым, которое дозволяется операционной системой, обычно используется расширение .d для файлов с исходными кодами на D, так как среды разработки, инструменты программирования и программисты ожидают именно такое расширение. Например, test.d, game.d, invoice.d и т.д. подходят как имена для исходника.

Компилирование hello world

Скопируйте текст программы выше в текстовый файл и сохраните под именем hello.d.

Компилятор скоро проверит корректность синтаксиса исходного кода (т.е. на соответствие правилам языка) и создаст из него программу переводом в машинные коды. Для компиляции следуйте следущим шагам:

  1. Откройте окно консоли
  2. Перейдите к директории, где сохранен hello.d
  3. Введите следующую комманду (Не пишите символ $, он для обозначения командной строки.)
    $ dmd hello.d
    

Если вы не совершили ошибок, то может показаться, что ничего не произошло. Иначе, это означает, что все прошло хорошо. В папке должен появится исполняемый файл с именем hello (или hello.exe под Windows), который только что был создан компилятором.

Если вместо этого компилятор вывел несколько сообщений, возможно вы сделали ошибку при копировании кода программы. Попробуйте найти ошибку, исправить ее и перезапустить компиляцию. Вы будете совершать множество ошибок при программировании, поэтому процесс их исправления и компилирования станет привычным.

Как только программа удачно создалась, напишите имя исполняемого файла для ее запуска. Программа должна вывести «Hello world!»:

$ ./hello     ← запуск программы
Hello world!  ← сообщение, которое она вывела

(прим. под Windows вместо ./hello нужно вводить hello)

Поздравляю! Ваша первая программа на D работает как ожидается.

Флаги компилятора

Компилятор имеет множество параметров командной строки, которые используются для влияния на процесс компиляции. Чтобы увидеть список параметров, введите только имя компилятора:

$ dmd    ← введите только имя
DMD64 D Compiler v2.065
Copyright (c) 1999-2013 by Digital Mars written by Walter Bright
Documentation: http://www.dlang.org/index.html
Usage:
  dmd files.d ... { -switch }

  files.d        D source files
...
  -unittest      compile in unit tests
...
  -w             enable warnings
...

Сокращенный вывод выше показывает только флаги, которые я рекомендую всегда использовать. Хотя это не имеет значения для hello world программы в этой главе, следующая комманда скомпилирует программу с включенными предупреждениями и модульными тестами. Мы рассмотрим эти и другие параметры детальнее в следующих главах:

$ dmd hello.d -w -unittest

Полный список параметров dmd можно найти в оффициальной документации DMD.

Еще один флаг, который может быть полезен: -run. Он компилирует исходный код, создает исполняемый файл, и запускает его за одну комманду:

$ dmd -run hello.d -w -unittest
Hello world!  ← программа автоматически запустилась

IDE

В добавок к компилятору можно установить IDE (интегрированная среда разработки). IDE спроектированы для упрощения разработки программ путем упрощения шагов написания, компиляции и отладки кода.

Если вы установите IDE, компиляция и запуск программы будут проводиться просто нажатием на клавишу клавиатуры или кнопку в IDE. Я все еще рекомендую ознакомиться с компилированием программ вручную в консольном окне.

Если же решили установить IDE, перейдите на страницу с IDE на dlang.org, чтобы увидеть список доступных IDE (прим. пер. я пользуюсь DDT).

Разбор hello world программы

Вот краткий список из многих понятий из D, которые появились в этой короткой программе:

Ядро: Каждый язык определяет свой синтаксис, фундаментальные типы, ключевые слова, правила и т.п. Все они формируют ядро этого языка. Круглые скобки, точки с запятой и слова, такие как: main и void — все в соответствии с правилами D. Это похоже на правила Английского (Русского) языка: подлежащие, глаголы, пунктуация, структура предложения и т.д.

Ключевое слово: Специальные слова, которые являются частью ядра языка называются ключевыми. В этой программе есть два ключевых слова: import, которое используется для подключения модулей к программе; и void, которое означает «ничего не возвращает».

Библиотека и функция: Ядро определяет только структуру языка. Оно используются для определения функций и пользовательских типов, и они в свою очередь используются для проектирования библиотек. Библиотека — коллекция многоразовых частей программ, которые связываются (прим. линкуются) с вашими программами для помощи в достижении их целей.

writeln выше является функцией в стандартной библиотеке D. Она используется для вывода строки текста, как можно догадаться по ее имени: write line — написать строку.

Модуль: Содержимое библиотек собраны по типам задач, для решения которых они предназначены. Такая группа называется модулем. Единственный модуль, который использует наша программа — std.stdio, который отвечает за ввод и ввод данных.

Символы и строки: Выражения такие, как "Hello world!" называются строками, и элементы строк называются символами. Единственная строка в нашей программе содержит символы 'H', 'e', '!' и другие.

Порядок выполнения: Программы выполняют свои задачи с помощью вызова операций в определенном порядке. Выполнение задач начинается с операций, которые написаны в функции с названием main. Единственная операция в нашей программе выводит строку "Hello world!".

Важность регистра: Можно выбирать любые символы внутри строк, но вы должны использовать остальные символы точно так, как они появляются в программе. Это так, так как в программах на D важен регистр. Например, writeln и Writeln являются двумя разными именами.

Мы рассмотрим все эти особенности D подробнее в следующих главах.

Упражнения

  • Написать программу, которая выводит что-нибудь другое.
  • Измените программу, чтобы она выводила более чем одну строку.
  • Попробуйте скомпилировать программу после других изменений: например, уберите точку с запятой в конце строки с writeln и изучите ошибку компиляции.
Решения

  • import std.stdio;
     
    void main()
    {
        writeln("Something else... :p");
    }

  • import std.stdio;
     
    void main()
    {
        writeln("A line...");
        writeln("Another line...");
    }

  • Следующая программа не может быть скомпилирована, так как отстутсвует точка с запятой в конце строки с writeln:

    import std.stdio;
     
    void main()
    {
        writeln("Hello world!")
    }

writeln and write

В предыдущей главе мы увидели, что writeln берет строку внутри круглых скобок и печатает ее.

Части программы, которые фактически делают работу называются функциями и информация, которая им нужна для выполненения работы, называется параметрами. Акт передачи такой информации функции называется передачей значений параметров в функцию. Параметры передаются в функцию между круглыми скобками и разделяются запятыми.

Заметка: Слово параметр описывает информацию, которая передается в функцию на концептуальном уровне. Конкретная информация, которая на самом деле передается во время выполнения программы называется аргументом. Хотя и неправильно, но эти термины иногда заменяют друг друга в индустрии программного обеспечения.

writeln может брать более одного аргумента. Она печатает их последовательно, один за другим на той же самой строке:

import std.stdio;
 
void main()
{
    writeln("Hello world!", "Hello fish!");
}

Иногда вся информация сразу, которая должна быть напечатана на одной строчке, может быть труднодоступна для передачи в writeln. В таких случаях первые части строки могут быть распечатаны с помощью write, и последняя часть — с помощью writeln.

writeln переходит на следующую строку, write остается на той же:

import std.stdio;
 
void main()
{
    // Напишем то, что можем на данный момент
    write("Hello");
 
    // ... предположим, что здесь есть еще операции ...
 
    write("world!");
 
    // ... и наконец:
    writeln();
}

Вызов writeln без параметров просто завершает текущую строку.

Строки, которые начинаются с //, называются строками комментариев или просто комментариями. Коментарии не являются частью кода в смысле того, что они не влияют на поведение программы. Их единственное назначение — объяснять, что делает код в конкретных секциях программы. Аудиторией комментариев является любой, кто позже может прочитать исходный код, в первую очередь включая программиста, который сам написал эти комментарии.

Упражнения

  1. Обе программы в этой главе печатают строки без пробелов между ними. Измените программы так, чтобы присутствовали пробелы между аргументами, как в «Hello world!».
  2. Также попробуйте вызывать write с более чем одним параметром.
Решения

  1. Один из методов — использовать другой параметр посередине:

    writeln("Hello world!", " ", "Hello fish!");

  2. write также может брать несколько параметров:

    write("one", " two", " three");

Автор: NCrashed

Источник

Поделиться

* - обязательные к заполнению поля