Язык программирования D: различия между версиями

Содержимое удалено Содержимое добавлено
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 94:
C++ обычно требует, чтобы функции и классы были объявлены дважды — объявление происходит в заголовочных файлах (*.h), а описание происходит в файлах исходного кода (*.cpp). Это утомительный и подверженный ошибкам процесс. Очевидно, что программисту достаточно объявить функцию или класс лишь однажды, а компилятор должен впоследствии извлечь информацию об объявлении и сделать ее доступной для импортирования. Именно так работает язык программирования D, например:
 
<sourcesyntaxhighlight lang=d>
class ABC
{
Строка 102:
 
int q;
</syntaxhighlight>
</source>
 
И более нет необходимости отдельного описания функций-членов, атрибутов и спецификаций внешних объявлений (<code>extern</code>), как в языке C++:
 
<sourcesyntaxhighlight lang=d>
int ABC::func() { return 7; }
 
Строка 112:
 
extern int q;
</syntaxhighlight>
</source>
 
Заметка: Конечно же, в C++ тривиальные функции вроде { return 7; } тоже описаны внутри класса, но более сложные должны быть описаны отдельно. Вдобавок, если нужны опережающие ссылки (ссылки на класс или функцию, которые объявлены, но ещё не определены), то для этих объектов нужны прототипы (prototype). Следующий код не будет работать в C++:
 
<sourcesyntaxhighlight lang=d>
class Foo
{
Строка 127:
int bar() { return 3; }
};
</syntaxhighlight>
</source>
 
Но эквивалентный код на языке D будет рабочим:
 
<sourcesyntaxhighlight lang=d>
class Foo
{
Строка 141:
int bar() { return 3; }
};
</syntaxhighlight>
</source>
 
А то, будет ли функция встраиваемой (при компиляции вызов такой функции заменяется ее кодом) или нет, в языке D зависит от настроек оптимизатора.
Строка 157:
В языках C и C++ оператор typedef на самом деле просто создает синоним типа данных и никакого нового типа данных не объявляется. В языке D оператор typedef объявляет новый тип данных. Таким образом, код
 
<sourcesyntaxhighlight lang=d>
typedef int handle;
</syntaxhighlight>
</source>
 
создает новый тип данных handle. К новому типу данных применяется проверка на соответствие типу данных, а также при перегрузке функций новый тип данных отличается от того типа данных, на основе которого он был создан. Например:
 
<sourcesyntaxhighlight lang=d>
int foo(int i);
int foo(handle h);
</syntaxhighlight>
</source>
 
=== Документация ===
Строка 211:
* Массивы объявляются с использованием оператора <code>[]</code> после названия массива. Это ведет к использованию очень неуклюжего синтаксиса при объявлении, скажем, ссылки на массив:
 
<sourcesyntaxhighlight lang=d>
int (*array)[3];
</syntaxhighlight>
</source>
 
В языке D оператор <code>[]</code> при объявлении массива ставится после типа данных:
 
<sourcesyntaxhighlight lang=d>
int[3]* array; // объявляется ссылка на массив из трёх целых чисел
long[] func(int x); // объявляется функция, возвращающая массив длинных целых
</syntaxhighlight>
</source>
 
Этот код более легок для восприятия. В языке D можно использовать несколько видов массивов: указатели, статические массивы, динамические массивы и ассоциативные массивы.
Строка 275:
Многопоточное программирование становится всё более распространенным, поэтому в языке D реализованы базовые возможности для создания многопоточных приложений. Синхронизация может быть применена ко всему объекту или к отдельным его методам.
 
<sourcesyntaxhighlight lang=d>
synchronized int func() { ... }
</syntaxhighlight>
</source>
 
Синхронизированные функции разрешают в один момент времени исполнять код функции только одному потоку.