Diving into D / Погружение в D: All

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Вы знаете, с чего всё начинается, так что долой суету:

jauthu 11.12.12 в 14:22

0

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

drug007 11.12.12 в 15:04

2

import std.stdio;
void main() {
writeln("Привет, мир!");
}

jauthu 11.12.12 в 14:24

0
+1

В зависимости от знаний о других языках, вы можете чувствовать дежа-вю, лёгкое удовлетворение, что эта маленькая задача не знакомит вас с третьей частью ключевых слов языка, или, возможно, лёгкое разочарование, что D не пошёл по пути скриптовых языков позволять выражения верхнего уровня.

jauthu 11.12.12 в 14:27

0

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

drug007 11.12.12 в 14:37

1

(Вместе с выражениями верхнего уровня приходят и глобальные переменные, что приносит неприятности, когда программа растёт; D даёт различные возможности выполнения кода снаружи main, но в более структурным образом.)

jauthu 11.12.12 в 14:34

0

(Выражения высокого уровня используют(?) глобальные переменные, что быстро усложняет сопровождение программы по мере ее роста; D также предлагает способы выполнения кода вне функции main(), но в более структурированной манере.)

drug007 11.12.12 в 14:45

1

Если вы сторонник точности, вы с облегчением узнаете, что void main это эквивалент int main, который возвращает "успех" (код 0) операционной системе если выполнение завершено успешно.

jauthu 11.12.12 в 14:36

1

Для яростных сторонников точности будет облегчением узнать, что void main является полным эквивалентом int main, возвращающим 0 операционной системе при успешном завершении функции.

drug007 11.12.12 в 14:52

0

Но не будем бежать вперед самих себя. Целью традиционной "Hello, world" программы является не обсуждение возможностей языка, а научиться писать и запускать программы, использующие этот язык.

drug007 11.12.12 в 14:53

0
+1

Итак, после того как вы сохранили код, приведенный выше, в файл с именем, скажем, hello.d, запустите оболочку и напечатайте следующие команды:

drug007 11.12.12 в 14:55

0

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

drug007 11.12.12 в 14:55

0

где '$' означает ваше любимое приглашение командной строки. Если ваша операционная система поддерживает так называемую "shebang" нотацию для запуска скриптов, вы будете счастливы услышать, что что простое добавление строки:

drug007 11.12.12 в 14:56

0

#!/usr/bin/rdmd

drug007 11.12.12 в 14:56

0

в самое начало вашей hello.d программы сделает ее выполняемой напрямую. После того, как вы внесете данное изменение в программу, вы можете просто напечатать в командной строке:

drug007 11.12.12 в 14:58

0

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

drug007 11.12.12 в 14:59

0

(Выполнить команду chmod нужно только один раз). Программа rdmd (часть установочного пакета D) достаточна умна, чтобы кешировать создаваемый ею исполняемый файл и таким образом, компиляция в действительности выполняется только после изменения программы, но не каждый раз, когда вы ее запускаете.

drug007 11.12.12 в 15:01

0

Впоследствии, небольшие программы в этой книге не будут указывать на эту деталь, оставляя на ваше усмотрение - использовать ли shebang нотацию '#!' или нет.

drug007 11.12.12 в 15:03

0

Программа начинается с директивы:

drug007 11.12.12 в 16:46

0

import std.stdio;

drug007 11.12.12 в 16:46

0

которая говорит компилятору, что нужно импортировать модуль называемый std.stdio и сделать его символы(?) доступными для использования. Import является родственников директивы C/C++ препроцессора #include, но по семантике ближе к import из Питона: нет никакого включения текста - только получение символьной таблицы. Каждый файл импортируется максимум один раз - сколько бы раз вы не указывали директиву import.

drug007 11.12.12 в 16:50

0

По почтенной традиции установленной C, программа на D состоит из набора деклараций расположенных в множестве файлов.

drug007 11.12.12 в 16:51

0

Декларации вводят, среди других вещей, типы, функции и данные.

drug007 11.12.12 в 16:52

0

Наша первая программа определяет функцию main(), которая не принимает аргументов и возвращает "ничего" - void.

drug007 11.12.12 в 16:53

0

При вызове, функция main() вызывает функцию writeln (которая, конечно же, была хитро определена в модуле std.stdio), передавая ей строку-константу.

drug007 11.12.12 в 16:54

0

Суффикс "ln" показывает, что writeln добавляет новую строку к печатаемому тексту.

drug007 11.12.12 в 16:55

0

Суффикс "ln" показывает, что writeln добавляет перевод строки к печатаемому тексту.

Salabar 27.01.13 в 10:59

0

Следующие секции обеспечивают быструю пробежку/прогулку по Deeville(?). Небольшие наглядные программы познакомят нас с основными концепциями языка.

drug007 11.12.12 в 16:57

0

Следующие разделы помогут провести быструю экскурсию по стране языка D. Небольшие наглядные программы познакомят нас с основными концепциями языка.

Salabar 27.01.13 в 11:03

0

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

thornik 30.07.13 в 20:43

0

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

drug007 11.12.12 в 16:59

0

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

thornik 30.07.13 в 20:46

0

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

drug007 11.12.12 в 17:02

0

Когда нибудь интересовались насколько высоки иностранцы? Давайте напишем простую программу, которая покажет нам привычный диапазон значений роста в футах+дюймах и в сантиметрах.

drug007 11.12.12 в 17:04

0

/*
Compute heights in centimeters for a range of heights
expressed in feet and inches
Высоту, выраженную в футах и дюймах, переводит в
высоту в сантиметрах
*/
import std.stdio;

drug007 11.12.12 в 17:04

0

void main() {
// values unlikely to change soon
// величины, которые вряд ли изменятся в ближайшее время
immutable inchPerFoot = 12;
immutable cmPerInch = 2.54;

drug007 11.12.12 в 17:07

0

// loop'n write
// крутимся и пишем
foreach (feet; 5 .. 7) {
foreach (inches; 0 .. inchPerFoot) {
writeln(feet, "'", inches, "''\t",
(feet * inchPerFoot + inches) * cmPerInch);
}
}
}

drug007 11.12.12 в 17:08

0

Завершив выполнение, программа напечатает отличный список в две колонки:

drug007 11.12.12 в 17:09

0

5'0'' 152.4
5'1'' 154.94
5'2'' 157.48
...
6'10'' 208.28
6'11'' 210.82

drug007 11.12.12 в 17:09

0

Как и Java, C++, и C#, D поддерживает /*многострочные комментарии*/ и //однострочные комментарии (плюс пару других, к которым мы подойдем позже).

drug007 11.12.12 в 17:10

0

Еще одна интересная деталь это как наша маленькая программа вводит данные. Во-первых, существуют две констаны:

drug007 11.12.12 в 17:12

0

immutable inchperfoot = 12;
immutable cmperinch = 2.54;

drug007 11.12.12 в 17:12

0

Константы, которые никогда не изменяются вводятся ключевым словом immutable.

drug007 11.12.12 в 17:13

0

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

drug007 11.12.12 в 17:14

0

В нашем случае, литерал 12 говорит компилятору, что inchperfoot является 32 битным целым (в D обозначается знакомым int); похожим образом литерал 2.54 определяет, что cmperinch это константа в виде 64 битного числа с плавающей запятой (тип double).

drug007 11.12.12 в 17:17

0

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

drug007 12.12.12 в 15:10

0

immutable int inchperfoot = 12;
immutable double cmperinch = 2.54;
...
foreach (int feet; 5 .. 7) {
...
}

drug007 12.12.12 в 15:10

0

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

drug007 12.12.12 в 15:13

0

В порядке возрастания размера, знаковые целые типы включают byte, short, int и long, имеющие размер ровно 8, 16, 32, 64 бита соответственно.

drug007 12.12.12 в 15:14

0

Каждый из этих типов имеет беззнаковый вариант такого же размера, именуемый в соответствии с простым правилом: ubyte, ushort, uint и ulong. (нет модификатора "unsigned" как в C)

drug007 12.12.12 в 15:16

0

Типы чисел с плавающей точкой - это float (32-битный одинарной точности по стандарту IEEE-754), double (64-битный IEEE-754) и real (наибольший тип, который поддерживается процессором машины. Например, на машинах Intel, типом real будет так называемый IEEE 754 двойной расширенный 79-битный формат.)

Salabar 27.01.13 в 11:11

0

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

thornik 30.07.13 в 19:18

0

Однако, вещественные числа допускают приведение к меньшей разрядности - сюрприз для неосторожных.

thornik 30.07.13 в 19:22

0

Объяснение этому решению несколько запутанное. Кратко, это неявное уменьшающее приведение позволяет компилятору использовать оптимальные размер и точность в промежуточных вычислениях, что означает более быстрые и точные вычисления.

thornik 30.07.13 в 19:26

0
+1

На практике компилятор гарантирует, что будет использована точность не хуже заданой в коде (т.е. float, double или real).

thornik 30.07.13 в 19:34

0

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

thornik 30.07.13 в 19:38

0

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

thornik 30.07.13 в 19:42

0

immutable byte inchperfoot = 12;

thornik 30.07.13 в 19:43

0
Минутку...

Следующая страница →