dlang-book/01-знакомство-с-языком-d/README.md

69 lines
8.2 KiB
Markdown
Raw Normal View History

2023-01-21 16:43:42 +00:00
# Знакомство с языком 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. Значения против ссылок]()
2023-01-21 16:59:09 +00:00
Вы ведь знаете, с чего обычно начинают, так что без лишних слов:
```d
import std.stdio;
void main()
{
writeln("Hello, world!");
}
```
В зависимости от того, какие еще языки вы знаете, у вас может возникнуть ощущение дежавю, чувство легкой благодарности за простоту, а может, и легкого разочарования из-за того, что D не пошел по стопам скриптовых языков, разрешающих использовать «корневые» (top-level) инструкции. (Такие инструкции побуждают вводить глобальные переменные, которые по мере роста программы превращаются в головную боль; на самом деле, D позволяет исполнять код не только внутри, но и вне функции `main`, хотя и более организованно.) Самые въедливые будут рады узнать, что `void main` это эквивалент функции `int main`, возвращающей операционной системе «успех» (код 0) при успешном окончании ее выполнения.
Но не будем забегать вперед. Традиционная программа типа «Hello, world!» («Здравствуй, мир!») вовсе не повод для обсуждения возможностей языка. Она здесь для того, чтобы помочь вам начать писать и запускать программы на этом языке. Если у вас нет никакой IDE, которая выполнит за вас сборку программы, то самый простой способ это командная строка. Напечатав приведенный код и сохранив его в файле с именем, скажем, `hello.d`, запустите консоль и введите следующие команды:
```sh
$ dmd hello.d
$ ./hello
Hello, world!
$ _
```
Знаком `$` обозначено приглашение консоли вашей ОС (это может быть `c:\Путь\К\Папке>` в Windows или `/путь/к/каталогу%` в системах семейства UNIX, таких как OSX, Linux, Cygwin). Применив пару известных вам приемов систем-фу, вы сможете добиться автоматической компиляции программы при ее запуске. Пользователи Windows, вероятно, захотят привязать программу `rdmd.exe` (которая устанавливается вместе с компилятором D) к команде Выполнить. UNIX-подобные системы поддерживают запуск скриптов в нотации «shebang»[^1]. D понимает такой синтаксис: добавление строки
```sh
#!/usr/bin/rdmd
```
в самое начало программы в файле `hello.d` позволяет компилировать ее автоматически перед исполнением. Внеся это изменение, просто введите в командной строке:
```sh
$ chmod u+x hello.d
$ ./hello.d
Hello, world!
$ _
```
(`chmod` нужно ввести только один раз).
Для всех операционных систем справедливо следующее: программа `rdmd` достаточно «умна», для того чтобы кэшировать сгенерированное приложение. Так что фактически компиляция выполняется только после изменения исходного кода программы, а не при каждом запуске. Эта особенность в сочетании с высокой скоростью самого компилятора позволяет экономить время на запусках программы между внесением в нее изменений, что одинаково полезно как при разработке больших систем, так и при написании маленьких скриптов.
Программа `hello.d` начинается с инструкции
```sh
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) обозначение пути к компилятору или интерпретатору в виде `#!/путь/к/программе`. *Прим. пер.*