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

Содержимое удалено Содержимое добавлено
простановка нового тега <source> для подсветки синтаксиса
Строка 94:
C++ обычно требует, чтобы функции и классы были объявлены дважды — объявление происходит в заголовочных файлах (*.h), а описание происходит в файлах исходного кода (*.cpp). Это утомительный и подверженный ошибкам процесс. Очевидно, что программисту достаточно объявить функцию или класс лишь однажды, а компилятор должен впоследствии извлечь информацию об объявлении и сделать ее доступной для импортирования. Именно так работает язык программирования D, например:
 
<source lang=d>
<code><pre>class ABC
{
int func() { return 7; }
static int z = 7;
}
int q;</pre></code>
</source>
 
И более нет необходимости отдельного описания функций-членов, атрибутов и спецификаций внешних объявлений (extern), как в языке C++:
 
<source lang=d>
<code><pre>int ABC::func() { return 7; }
 
int ABC::z = 7;
 
extern int q;</pre></code>
</source>
 
Заметка: Конечно же, в C++ тривиальные функции вроде { return 7; } тоже описаны внутри класса, но более сложные должны быть описаны отдельно. Вдобавок, если нужны опережающие ссылки (ссылки на класс или функцию, которые объявлены, но еще не определены), то для этих объектов нужны прототипы (prototype). Следующий код не будет работать в C++:
 
<source lang=d>
<code><pre>class Foo
{
int foo(Bar *c) { return c->bar(); }
Строка 120 ⟶ 125 :
public:
int bar() { return 3; }
};
};</pre></code>
</source>
 
Но эквивалентный код на языке D будет рабочим:
 
<source lang=d>
<code><pre>class Foo
{
int foo(Bar c) { return c.bar; }
Строка 132 ⟶ 139 :
{
int bar() { return 3; }
}
}</pre></code>
</source>
 
А то, будет ли функция встраиваемой (при компиляции вызов такой функции заменяется ее кодом) или нет, в языке D зависит от настроек оптимизатора.
Строка 148 ⟶ 156 :
В языках C и C++ оператор typedef на самом деле просто создает синоним типа данных и никакого нового типа данных не объявляется. В языке D оператор typedef объявляет новый тип данных. Таким образом, код
 
<source lang=d>
<code><pre>typedef int handle;</pre></code>
</source>
 
создает новый тип данных handle. К новому типу данных применяется проверка на соответствие типу данных, а также при перегрузке функций новый тип данных отличается от того типа данных, на основе которого он был создан. Например:
 
<source lang=d>
<code><pre>int foo(int i);
int foo(handleint hi);</pre></code>
int foo(handle h);
</source>
 
==== Тип данных bit ====
Строка 159 ⟶ 171 :
Бит является фундаментальным типом данных, поэтому в D существует такой тип данных. Следующий код используется для создания массива битов:
 
<source lang=d>
<code><pre>bit[] foo;</pre></code>
bit[] foo;
</source>
 
=== Документация ===
Строка 204 ⟶ 218 :
* Массивы объявляются с использованием оператора <code>[]</code> после названия массива. Это ведет к использованию очень неуклюжего синтаксиса при объявлении, скажем, ссылки на массив:
 
<source lang=d>
<code><pre>int (*array)[3];</pre></code>
int (*array)[3];
</source>
 
В языке D оператор <code>[]</code> при объявлении массива ставится после типа данных:
 
<source lang=d>
<code>int[3]* array; // объявляется ссылка на массив из трех целых чисел
longint[3]* func(int x)array; // объявляется функция,ссылка возвращающаяна массив длинныхиз трёх целых</code> чисел
long[] func(int x); // объявляется функция, возвращающая массив длинных целых
</source>
 
Этот код более легок для восприятия. В языке D можно использовать несколько видов массивов: указатели, статические массивы, динамические массивы и ассоциативные массивы.
Строка 263 ⟶ 281 :
Многопоточное программирование становится все более распространенным, поэтому в языке D реализованы базовые возможности для создания многопоточных приложений. Синхронизация может быть применена ко всему объекту или к отдельным его методам.
 
<source lang=d>
<code><pre>synchronized int func() { ... }</pre></code>
</source>
 
Синхронизированные функции разрешают в один момент времени исполнять код функции только одному потоку.