8.2 KiB
Знакомство с языком 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
добавляет к выводимому тексту знак перевода строки.
Следующие разделы – это стремительная поездка по Дибургу. Небольшие показательные программы дают общее представление о языке. Основная цель повествования на данном этапе – обрисовать общую картину, а не дать ряд педантичных определений. Позже все аспекты языка будут рассмотрены с должным вниманием – в деталях.
-
«Shebang» (от shell bang: shell – консоль, bang – восклицательный знак), или «shabang» (# – sharp) – обозначение пути к компилятору или интерпретатору в виде
#!/путь/к/программе
. – Прим. пер. ↩︎