Alexander ea3d7c4485 Знакомство с языком D 2 years ago
..
README.md ea3d7c4485 Знакомство с языком D 2 years ago

README.md

Знакомство с языком D

  • [1.1. Числа и выражения]()
  • [1.2. Инструкции]()
  • [1.3. Основы работы с функциями]()
  • 1.4. Массивы и ассоциативные массивы
  • [1.4.1. Работа со словарем]()
  • [1.4.2. Получение среза массива. Функции с обобщенными типами параметров. Тесты модулей]()
  • [1.4.3. Подсчет частот. Лямбда-функции]()
  • [1.5. Основные структуры данных]()
  • [1.6. Интерфейсы и классы]()
  • [1.6.1. Больше статистики. Наследование]()
  • [1.7. Значения против ссылок]()

Вы ведь знаете, с чего обычно начинают, так что без лишних слов:

import std.stdio;

void main()
{
    writeln("Hello, world!");
}

В зависимости от того, какие еще языки вы знаете, у вас может возникнуть ощущение дежавю, чувство легкой благодарности за простоту, а может, и легкого разочарования из-за того, что D не пошел по стопам скриптовых языков, разрешающих использовать «корневые» (top-level) инструкции. (Такие инструкции побуждают вводить глобальные переменные, которые по мере роста программы превращаются в головную боль; на самом деле, D позволяет исполнять код не только внутри, но и вне функции main, хотя и более организованно.) Самые въедливые будут рады узнать, что void main – это эквивалент функции int main, возвращающей операционной системе «успех» (код 0) при успешном окончании ее выполнения.

Но не будем забегать вперед. Традиционная программа типа «Hello, world!» («Здравствуй, мир!») – вовсе не повод для обсуждения возможностей языка. Она здесь для того, чтобы помочь вам начать писать и запускать программы на этом языке. Если у вас нет никакой IDE, которая выполнит за вас сборку программы, то самый простой способ – это командная строка. Напечатав приведенный код и сохранив его в файле с именем, скажем, hello.d, запустите консоль и введите следующие команды:

$ dmd hello.d
$ ./hello
Hello, world!
$ _

Знаком $ обозначено приглашение консоли вашей ОС (это может быть c:\Путь\К\Папке> в Windows или /путь/к/каталогу% в системах семейства UNIX, таких как OSX, Linux, Cygwin). Применив пару известных вам приемов систем-фу, вы сможете добиться автоматической компиляции программы при ее запуске. Пользователи Windows, вероятно, захотят привязать программу rdmd.exe (которая устанавливается вместе с компилятором D) к команде Выполнить. UNIX-подобные системы поддерживают запуск скриптов в нотации «shebang»[^1]. D понимает такой синтаксис: добавление строки

#!/usr/bin/rdmd

в самое начало программы в файле hello.d позволяет компилировать ее автоматически перед исполнением. Внеся это изменение, просто введите в командной строке:

$ chmod u+x hello.d
$ ./hello.d
Hello, world!
$ _

(chmod нужно ввести только один раз).

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

Программа hello.d начинается с инструкции

import std.stdio;

которая предписывает компилятору найти модуль с именем std.stdio и сделать его символы доступными для использования. Инструкция import напоминает препроцессорную директиву #include, которую можно встретить в синтаксисе C и С++, но семантически она ближе команде import языка Python: никакой вставки текста подключаемого модуля в текст основной программы не происходит – выполняется только простое расширение таблицы символов. Если повторно применить инструкцию import к тому же файлу, ничего не произойдет.

По давней традиции C программа на D представляет собой набор определений, рассредоточенный по множеству файлов. В числе прочего эти определения могут обозначать типы, функции, данные. В нашей первой программе определена функция main. Она не принимает никаких аргументов и ничего не возвращает, что, по сути, и означает слово void. При выполнении main программа вызывает функцию writeln (разумеется, предусмотрительно определенную в модуле std.stdio), передавая ей строковую константу в качестве аргумента. Суффикс ln указывает на то, что writeln добавляет к выводимому тексту знак перевода строки.

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

[^1]: «Shebang» (от shell bang: shell – консоль, bang – восклицательный знак), или «shabang» (# – sharp) – обозначение пути к компилятору или интерпретатору в виде #!/путь/к/программе. – Прим. пер.