Diving into D / Погружение в D: All
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Вы знаете, с чего всё начинается, так что долой суету: jauthu 11.12.12 в 14:22 Вы знаете, с чего все начинается, так что без лишних слов: drug007 11.12.12 в 15:04 |
|
|
import std.stdio; jauthu 11.12.12 в 14:24 |
+1 | |
|
В зависимости от знаний о других языках, вы можете чувствовать дежа-вю, лёгкое удовлетворение, что эта маленькая задача не знакомит вас с третьей частью ключевых слов языка, или, возможно, лёгкое разочарование, что D не пошёл по пути скриптовых языков позволять выражения верхнего уровня. jauthu 11.12.12 в 14:27 Зная другие языки вы можете испытать чувство дежа-вю, либо небольшое удовлетворение, что эта несложная программа не вывалила на вас добрую треть ключевых слов языка, или же, возможно, легкое разочарование, что D не пошел дорогой скриптовых языков, позволяющих выражения высокого уровня. drug007 11.12.12 в 14:37 |
||
|
(Вместе с выражениями верхнего уровня приходят и глобальные переменные, что приносит неприятности, когда программа растёт; D даёт различные возможности выполнения кода снаружи main, но в более структурным образом.) jauthu 11.12.12 в 14:34 (Выражения высокого уровня используют(?) глобальные переменные, что быстро усложняет сопровождение программы по мере ее роста; D также предлагает способы выполнения кода вне функции main(), но в более структурированной манере.) drug007 11.12.12 в 14:45 |
||
|
Если вы сторонник точности, вы с облегчением узнаете, что void main это эквивалент int main, который возвращает "успех" (код 0) операционной системе если выполнение завершено успешно. jauthu 11.12.12 в 14:36 Для яростных сторонников точности будет облегчением узнать, что void main является полным эквивалентом int main, возвращающим 0 операционной системе при успешном завершении функции. drug007 11.12.12 в 14:52 |
||
|
Но не будем бежать вперед самих себя. Целью традиционной "Hello, world" программы является не обсуждение возможностей языка, а научиться писать и запускать программы, использующие этот язык. drug007 11.12.12 в 14:53 |
+1 | |
|
Итак, после того как вы сохранили код, приведенный выше, в файл с именем, скажем, hello.d, запустите оболочку и напечатайте следующие команды: drug007 11.12.12 в 14:55 |
||
|
$ dmd hello.d drug007 11.12.12 в 14:55 |
||
|
где '$' означает ваше любимое приглашение командной строки. Если ваша операционная система поддерживает так называемую "shebang" нотацию для запуска скриптов, вы будете счастливы услышать, что что простое добавление строки: drug007 11.12.12 в 14:56 |
||
|
#!/usr/bin/rdmd drug007 11.12.12 в 14:56 |
||
|
в самое начало вашей hello.d программы сделает ее выполняемой напрямую. После того, как вы внесете данное изменение в программу, вы можете просто напечатать в командной строке: drug007 11.12.12 в 14:58 |
||
|
$ chmod u+x hello.d drug007 11.12.12 в 14:59 |
||
|
(Выполнить команду chmod нужно только один раз). Программа rdmd (часть установочного пакета D) достаточна умна, чтобы кешировать создаваемый ею исполняемый файл и таким образом, компиляция в действительности выполняется только после изменения программы, но не каждый раз, когда вы ее запускаете. drug007 11.12.12 в 15:01 |
||
|
Впоследствии, небольшие программы в этой книге не будут указывать на эту деталь, оставляя на ваше усмотрение - использовать ли shebang нотацию '#!' или нет. drug007 11.12.12 в 15:03 |
||
|
Программа начинается с директивы: drug007 11.12.12 в 16:46 |
||
|
import std.stdio; drug007 11.12.12 в 16:46 |
||
|
которая говорит компилятору, что нужно импортировать модуль называемый std.stdio и сделать его символы(?) доступными для использования. Import является родственников директивы C/C++ препроцессора #include, но по семантике ближе к import из Питона: нет никакого включения текста - только получение символьной таблицы. Каждый файл импортируется максимум один раз - сколько бы раз вы не указывали директиву import. drug007 11.12.12 в 16:50 |
||
|
По почтенной традиции установленной C, программа на D состоит из набора деклараций расположенных в множестве файлов. drug007 11.12.12 в 16:51 |
||
|
Декларации вводят, среди других вещей, типы, функции и данные. drug007 11.12.12 в 16:52 |
||
|
Наша первая программа определяет функцию main(), которая не принимает аргументов и возвращает "ничего" - void. drug007 11.12.12 в 16:53 |
||
|
При вызове, функция main() вызывает функцию writeln (которая, конечно же, была хитро определена в модуле std.stdio), передавая ей строку-константу. drug007 11.12.12 в 16:54 |
||
|
Суффикс "ln" показывает, что writeln добавляет новую строку к печатаемому тексту. drug007 11.12.12 в 16:55 Суффикс "ln" показывает, что writeln добавляет перевод строки к печатаемому тексту. Salabar 27.01.13 в 10:59 |
||
|
Следующие секции обеспечивают быструю пробежку/прогулку по Deeville(?). Небольшие наглядные программы познакомят нас с основными концепциями языка. drug007 11.12.12 в 16:57 Следующие разделы помогут провести быструю экскурсию по стране языка D. Небольшие наглядные программы познакомят нас с основными концепциями языка. Salabar 27.01.13 в 11:03 В следующих разделах мы бегло пробежимся по стране Ди. Небольшие, наглядные программы познакомят нас с основными концепциями языка. thornik 30.07.13 в 20:43 |
||
|
При этом упор будет на возможность почувствовать язык, его суть, вместо сухой подачи педантичных определений. drug007 11.12.12 в 16:59 В этом месте будет дана возможность больше почувствовать язык, чем прочитать сухие определения. thornik 30.07.13 в 20:46 |
||
|
Если некоторые детали ввергают вас в ступор, спокойно пропускайте сложные фрагменты кода. Последующие главы разъяснят каждую часть языка в мельчайших деталях, после которых имеет смысл еще раз просмотреть эту главу более тщательно. drug007 11.12.12 в 17:02 |
||
|
Когда нибудь интересовались насколько высоки иностранцы? Давайте напишем простую программу, которая покажет нам привычный диапазон значений роста в футах+дюймах и в сантиметрах. drug007 11.12.12 в 17:04 |
||
|
/* drug007 11.12.12 в 17:04 |
||
|
void main() { drug007 11.12.12 в 17:07 |
||
|
// loop'n write drug007 11.12.12 в 17:08 |
||
|
Завершив выполнение, программа напечатает отличный список в две колонки: drug007 11.12.12 в 17:09 |
||
|
5'0'' 152.4 drug007 11.12.12 в 17:09 |
||
|
Как и Java, C++, и C#, D поддерживает /*многострочные комментарии*/ и //однострочные комментарии (плюс пару других, к которым мы подойдем позже). drug007 11.12.12 в 17:10 |
||
|
Еще одна интересная деталь это как наша маленькая программа вводит данные. Во-первых, существуют две констаны: drug007 11.12.12 в 17:12 |
||
|
immutable inchperfoot = 12; drug007 11.12.12 в 17:12 |
||
|
Константы, которые никогда не изменяются вводятся ключевым словом immutable. drug007 11.12.12 в 17:13 |
||
|
Константы, как и переменные, не обязаны иметь тип; реальный тип может быть выведен из величины, которой инициализируется данный символ(опять символ не привычном для нас значении). drug007 11.12.12 в 17:14 |
||
|
В нашем случае, литерал 12 говорит компилятору, что inchperfoot является 32 битным целым (в D обозначается знакомым int); похожим образом литерал 2.54 определяет, что cmperinch это константа в виде 64 битного числа с плавающей запятой (тип double). drug007 11.12.12 в 17:17 |
||
|
Продолжая дальше, мы заметим, что определения футов и дюймов выполнены тем же магическим способом - как переменные без явного указания типа. Это не делает программу менее безопасной, чем если бы типы были указаны явно: drug007 12.12.12 в 15:10 |
||
|
immutable int inchperfoot = 12; drug007 12.12.12 в 15:10 |
||
|
и т.д, но зато программа более лаконична. Компилятор позволяет опускать декларацию типа только когда тип может быть однозначно выведен из контекста. А сейчас, когда мы коснулись типов, давайте сделаем небольшую остановку на минуту и посмотрим, какие числовые типы нам доступны. drug007 12.12.12 в 15:13 |
||
|
В порядке возрастания размера, знаковые целые типы включают byte, short, int и long, имеющие размер ровно 8, 16, 32, 64 бита соответственно. drug007 12.12.12 в 15:14 |
||
|
Каждый из этих типов имеет беззнаковый вариант такого же размера, именуемый в соответствии с простым правилом: ubyte, ushort, uint и ulong. (нет модификатора "unsigned" как в C) drug007 12.12.12 в 15:16 |
||
|
Типы чисел с плавающей точкой - это float (32-битный одинарной точности по стандарту IEEE-754), double (64-битный IEEE-754) и real (наибольший тип, который поддерживается процессором машины. Например, на машинах Intel, типом real будет так называемый IEEE 754 двойной расширенный 79-битный формат.) Salabar 27.01.13 в 11:11 |
||
|
Все эти типы автоматически приводятся друг к другу, за исключением случая, когда целый тип приводится к другому целому меньшей разрядности. thornik 30.07.13 в 19:18 |
||
|
Однако, вещественные числа допускают приведение к меньшей разрядности - сюрприз для неосторожных. thornik 30.07.13 в 19:22 |
||
|
Объяснение этому решению несколько запутанное. Кратко, это неявное уменьшающее приведение позволяет компилятору использовать оптимальные размер и точность в промежуточных вычислениях, что означает более быстрые и точные вычисления. thornik 30.07.13 в 19:26 |
+1 | |
|
На практике компилятор гарантирует, что будет использована точность не хуже заданой в коде (т.е. float, double или real). thornik 30.07.13 в 19:34 |
||
|
Разрешая компилятору оперировать на внутреннем уровне большей точностью, мы сильно уменьшаем нежелательный эффект от накопленных ошибок и промежуточного переполнения. thornik 30.07.13 в 19:38 |
||
|
Возвращаясь к целым числам, литерал вроде "42" может быть присвоен любому числовому типу. При этом компилятор проверит, что вмещающий тип будет достаточен для этого числа. Так что объявление: thornik 30.07.13 в 19:42 |
||
|
immutable byte inchperfoot = 12; thornik 30.07.13 в 19:43 |
