Язык D использует статическую типизацию, обладает синтаксисом, схожим с C/C++, и обеспечивает производительность компилируемых языков. Язык D также заимствует некоторые возможности динамических языков, полезные для повышения эффективности разработки и обеспечения безопасности. Например, имеется поддержка: ассоциативных массивов, косвенного определения типов, автоматического управления памятью, средств параллельного программирования, шаблонов, компонентов для метапрограммирования. Опционально доступен сборщик мусора. В программах на языке D можно использовать библиотеки на языке C, а также некоторые библиотеки на C++ и Objective-C.
Среди изменений в выпуске 2.112:
- Операции над Ассоциативным массивом (хэшмап) реализованы через шаблоны.
- Битовые поля включены в язык и теперь не нужно использовать отдельный «-preview=bitfields».
- Висящие операторы «else», указанные без выделения блока фигурными скобками, теперь будет выдавать ошибку вместо предупреждения:
int i, j; if (i) if (j) return 1; else // Error: else is dangling, add { } after condition `if (i)` return 2; - Добавлен новый ключ «-extI» для указания внешних путей импорта, который аналогичен параметру пути импорта (-I), за исключением указания на то, что найденный с его помощью модуль находится вне компилируемого в данный момент исполняемого файла. В Windows он используется, когда параметр переопределения dllimport установлен на любое значение, кроме «none», чтобы принудительно импортировать символы внешнего модуля с помощью DllImport.
- Добавлены модули для C-файлов. Подобно расширению «__import», ключевое слово «__module» переносит объявление модулей из языка D в язык C. Это особенно полезно, когда необходимо импортировать несколько C-файлов с одинаковым именем (например, hello/utils.c и world/utils.c), поскольку оба файла должны быть импортированы с помощью import utils, когда они указаны в командной строке, что приводит к конфликтам.
--hello/utils.c: #if __IMPORTC__ __module hello.utils; #endif int sqr(int x) { return x * x; } --world/utils.c: #if __IMPORTC__ __module world.utils; #endif int max(int a, int b) { return a > b ? a : b; } --app.d: import hello.utils; import world.utils; static assert(sqr(3) == 9); static assert(max(3, 5) == 5); - Объявлено устаревшим неявное преобразование целых чисел в присваивании значений типа «int op= float».
Это сделано для предотвращения потенциальных ошибок, когда присваивание «op=» неявно обрезает правую часть выражения от ненулевого значения до нуля.uint a; float b = 0.1; a += b; // Deprecation: `uint += float` is performing truncating conversion
- В runtime добавлены несколько новых шаблонных реализаций.
- Исправлены ошибки связанные с недокументированным изменением в ABI macOS 15.4.
- С-макросы теперь преобразуются в шаблоны при работе «ImportC»:
import core.sys.posix.stdlib; import core.sys.posix.unistd; extern(C) int main() { int status, pid = vfork(); if (pid == 0) { // ... return 0; } waitpid(pid, &status, 0); if (WIFEXITED(status)) { // ... } return 0; } - В стандартной библиотеке реализована функция «lazyCache«, которая предоставляет механизм кэширования диапазонов с отложенной оценкой. В отличие от cache, который немедленно оценивает элементы диапазона во время его создания, lazyCache откладывает оценку до тех пор, пока элементы не будут явно запрошены.
auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); // No computations performed at this point auto firstElement = result.front; // First element is now evaluated
- Улучшена обратная совместимость «getrandom()» на старых версиях Linux и других системах.
- «std.uni» обновлена до поддержки Unicode 17.
- В «std.uuid» добавлена поддержка uuid v7 .
- Новый API для «std.conv», где появились три функции «writeText», «writeWText» и «writeDText».
- В пакетный менеджер dub добавлена опция «-dest и ключ frameworks.
--Было: lflags "-framework" "Cocoa" --Теперь можно: frameworks "Cocoa" "OpenGL"
Дополнительно можно отметить разработку ряда интересных проектов на языке D:
- В области разработки игр (GameDev) были следующие обновления: в dvn, движок для создания визуальных новелл, добавлены примеры использования. В порт движка Godot добавлена экспериментальная поддержка экспорта в Web. В Steam выпущена игра The Art of Reflection, реализованная с использованием технологий D и DirectX на собственном движке.
- В области веб-разработки развивается легковесный планировщик файберов photon, который показал высокие результаты в тесте производительности TechEmpower и вошёл в топ 10 результатов по нескольким тестам (Plaintest, JSON). Данный движок был интегрирован в популярный веб-фреймворк Vibe.D, в результате чего удалось добиться прироста производительности без изменения кода веб-приложений.
- После анонса о начале разработки нового сборщика мусора на конференции Dconf (видео1, видео2), данное обновление вошло в новый релиз. Новый GC также можно попробовать установить в качестве отдельного пакета. На данный момент поддерживается архитектура x86_64 для OC Linux и Windows. Продолжается работа над поддержкой macOS и других архитектур.
Источник: http://www.opennet.ru/opennews/art.shtml?num=64671
