Язык программирования D: особенности
Содержание:
1.Массивы и строки (Вы читаете данный раздел);
2. Семантика и шаблоны;
3. Функциональные типы и делегаты;
4. Модули и их тестирование;
5. Контрактное программирование.
B D есть множество очень интересных особенностей. Перечислить их все в короткой статье невозможно, поэтому кратко опишу только самые полезные и впечатляющие. Базовый синтаксис D практически идентичен С++, так что на нем останавливаться не буду. Не буду касаться и возможностей стандартной библиотеки - во-первых, потому что этих библиотек две, а во-вторых, из-за того, что многие реализованные там решения (например, нетрадиционный подход к многозадачности) будут рассмотрены в заключительной статье, посвященной этому языку.
Компилятор D позволяет пропускать тип переменной везде, где он в состоянии определить его однозначно.
Например:
Функция может возвращать как просто int, так и некий «страшный» шаблонный тип, но знать его не обязательно - достаточно того, что компилятору всегда известен возвращаемый тип функции. Такая функциональность будет в новом стандарте С++0х, но пока в С++ ее остро недостает.
Синтаксис объявления массивов отличается от С++ и гораздо более логичен. Сами массивы знают свой размер и поддерживают срезы. Имеются как статические массивы, так и динамические, автоматически меняющие размер при присваивании:
Ассоциативные массивы встроены в базовый язык:
Строки являются встроенным базовым типом и по умолчанию поддерживают Unicode. Из-за особенностей реализации для корректного посимвольного доступа строку нужно сначала конвертировать в формат UTF-32, а затем обратно в UTF-8 или UTF-16. Это не касается работы со строкой как с целым и обычно не вызывает сложностей. Тем не менее, эту особенность обычно относят к недостаткам языка.
Хотя динамический массив в прошлом примере и создавался оператором new, освобождать память вручную не нужно - в D есть автоматический сборщик мусора, как в Java. Однако в отличие от Java при желании можно брать управление памятью для нужного объекта полностью на себя или явно указывать сборщику мусора, где и когда пора «прибраться».
1.
2. Семантика и шаблоны;
3. Функциональные типы и делегаты;
4. Модули и их тестирование;
5. Контрактное программирование.
B D есть множество очень интересных особенностей. Перечислить их все в короткой статье невозможно, поэтому кратко опишу только самые полезные и впечатляющие. Базовый синтаксис D практически идентичен С++, так что на нем останавливаться не буду. Не буду касаться и возможностей стандартной библиотеки - во-первых, потому что этих библиотек две, а во-вторых, из-за того, что многие реализованные там решения (например, нетрадиционный подход к многозадачности) будут рассмотрены в заключительной статье, посвященной этому языку.
Автоматическое определение типов
Компилятор D позволяет пропускать тип переменной везде, где он в состоянии определить его однозначно.
Например:
auto b = Some_complex_function();
Функция может возвращать как просто int, так и некий «страшный» шаблонный тип, но знать его не обязательно - достаточно того, что компилятору всегда известен возвращаемый тип функции. Такая функциональность будет в новом стандарте С++0х, но пока в С++ ее остро недостает.
Массивы и строки
Синтаксис объявления массивов отличается от С++ и гораздо более логичен. Сами массивы знают свой размер и поддерживают срезы. Имеются как статические массивы, так и динамические, автоматически меняющие размер при присваивании:
int[] a = new int[20]; // Динамический массив
int[10] b; // Массив постоянного размера
auto sz = a.length; // Массив знает свою длину
a.length = 100; // А так ее можно изменить
int[] c = a[2..6]; // Срез массива - часть между элементами
// 2 и 5 включительно
a[0..10] = a[10..$]; // Знак $ означает последний элемент
int[10] b; // Массив постоянного размера
auto sz = a.length; // Массив знает свою длину
a.length = 100; // А так ее можно изменить
int[] c = a[2..6]; // Срез массива - часть между элементами
// 2 и 5 включительно
a[0..10] = a[10..$]; // Знак $ означает последний элемент
Ассоциативные массивы встроены в базовый язык:
int[string] dictionary; // Ключи - строки, значения - числа
dictionary["hello!"] = 4;
string[] k = dictionary.keys; // Получаем все ключи
dictionary["hello!"] = 4;
string[] k = dictionary.keys; // Получаем все ключи
Строки являются встроенным базовым типом и по умолчанию поддерживают Unicode. Из-за особенностей реализации для корректного посимвольного доступа строку нужно сначала конвертировать в формат UTF-32, а затем обратно в UTF-8 или UTF-16. Это не касается работы со строкой как с целым и обычно не вызывает сложностей. Тем не менее, эту особенность обычно относят к недостаткам языка.
Сборщик мусора
Хотя динамический массив в прошлом примере и создавался оператором new, освобождать память вручную не нужно - в D есть автоматический сборщик мусора, как в Java. Однако в отличие от Java при желании можно брать управление памятью для нужного объекта полностью на себя или явно указывать сборщику мусора, где и когда пора «прибраться».