Выпуск компилятора языка D 2.113
- DMD 2.113 получил экспериментальный анализатор Data Flow Analysis, который отслеживает состояние переменных и выявляет чтение неинициализированных значений, в том числе через указатели.
- В DMD добавлена проверка разыменования null-указателей во время выполнения, позволяющая обработать ошибку через механизмы core.exception.
- На основе DMD 2.113 выпущен LDC 1.43 с поддержкой LLVM 22, сборщика мусора и исключений в WebAssembly; DRuntime и Phobos поддерживают WASI и Emscripten.
Опубликован релиз DMD 2.113, эталонного компилятора для языка D. Код компилятора распространяется под свободной лицензией BSL (Boost Software License). Поддерживаются системы Linux, Windows, macOS и FreeBSD.
Язык D использует статическую типизацию, обладает синтаксисом, схожим с C/C++, и обеспечивает производительность компилируемых языков. Язык D также заимствует некоторые возможности динамических языков, полезные для повышения эффективности разработки и обеспечения безопасности. Например, имеется поддержка: ассоциативных массивов, косвенного определения типов, автоматического управления памятью, средств параллельного программирования, шаблонов, компонентов для метапрограммирования. Опционально доступен сборщик мусора. В программах на языке D можно использовать библиотеки на языке C, а также некоторые библиотеки на C++ и Objective-C.
Среди изменений в выпуске 2.113:
- Новый экспериментальный движок Data Flow Analysis (»-preview=fastdfa»), который пытается отслеживать состояние переменных по ходу выполнения функции. Движок анализирует может ли указатель быть null, инициализирована ли переменная, какие значения переменная потенциально может иметь и как состояние меняется после выражений «if», циклов и присваиваний. Также он обнаруживает чтение неинициализированных переменных. Причём анализ умеет проходить через указатели:
void readFromUninit() @system { int val1 = void; int val2 = val1; // error int* ptr = &val1; int val3 = *ptr; // error } - Добавлен новый типаж, обрабатываемый на этапе компиляции (compile-time trait) »__traits (needsDestruction, T)», который позволяет определять типы, требующие сложного уничтожения.
class C { ~this(); } struct S { ~this(); } static assert(!__traits(needsDestruction, C)); static assert(__traits(needsDestruction, S)); static assert(!__traits(needsDestruction, S[0])); static assert(__traits(needsDestruction, S[1])); Появилась опциональная проверка, производимая на этапе выполнения,»-check=nullderef=on», позволяющая вместо состояния «crash» получить контролируемую ошибку, которую можно обработать через механизмы core.exception.
- Добавлен вывод длины статических массивов.
Используя символ »$», вывод длины будет происходить автоматически:
int[$] arr = [1, 2, 3]; // int[3] arr = [1, 2, 3];
Улучшена реализация «pragma (inline, true)» — компилятор теперь рассматривает такие функции в отдельной стадии «inlining», что важно для высокопроизводительного и шаблонного кода.
Улучшен режим диагностики »-vgc», который отслеживает операции, требующие выделения памяти через сборщик мусора. В новой версии реализовано точное определение местоположения вложенной функции и переменной, из-за которых создаётся замыкание (closure).
Добавлен новый синтаксис «with (auto x = expression ())», который можно применять когда результат выражения нужно временно использовать как объект контекста.
- Появился механизм для перехвата необработанных исключений, которые выходят за пределы потока. Например, можно глобально или для конкретного потока перехватить исключение и решить, что с ним делать до остановки выполнения из-за фатальной ошибки: логировать; завершить процесс;- передать дальше; выполнить собственную runtime policy.
filterThreadThrowableHandler = (ref Throwable t) { ... }; - В пакетный менеджер dub добавлена опция »-timeout для использования «dustmite» — инструмента по поиску минимального кода с примером проблемного поведения компилятора.
На основе DMD 2.113 выпущен компилятор LDC 1.43, в который добавлено множество улучшений.
- Реализована поддержка LLVM 22.
Существенно улучшена поддержка «WebAssembly». Добавлены поддержка сборщика мусора и исключений. Теперь «DRuntime» и «Phobos» (стандартная библиотека) поддерживают WASI Preview 1, WASI Preview 2 и Emscripten.
- Кросс-компиляция в «LDC» стала проще и появились готовые дополнения, которые можно указывать при сборке через опцию »-mtriple=»
Windows x86_64-windows-msvc i686-windows-msvc Android aarch64-linux-android30 armv7a-linux-androideabi29 x86_64-linux-android29 i686-linux-android29 WASI wasm32-unknown-wasip1 wasm32-unknown-wasip2 Emscripten wasm32-unknown-emscripten
- Оператор @restrict теперь работает для динамических массивов, что помогает делать авто-векторизацию:
@ldc.attributes.restrict float[] foo(float[] a, float[] b) { float[] c; c[] = a[] * b[]; return c; } Улучшена поддержка встроенного ассемблера в стиле «DMD»: «asm { naked; }», для которого реализована возможность применять встроенные в компилятор оптимизации, включая «LTO».
В «LDC» добавлена поддержка «dcompute», который теперь умеет внутри вызывать «PTX» и «SPIR-V» для работы на GPU. Ведётся работа по поддержке графических API «metal» и «directx».
Дополнительно можно отметить разработку ряда интересных проектов на языке D:
В области разработки игр (GameDev) были следующие обновления: в движке Parin улучшена поддержка WASM и добавлены примеры для WASI. В Steam выпущена демонстрация новой игры Rhythm Game Studio, реализованная на D с использованием «SDL3».
В области веб-разработки представлен проект crate, упрощающий разработку CRUD веб-приложений. Проект по описанной модели данных позволяет автоматически создавать интерфейсы для протоколов REST, JSON: API, GraphQL и MCP.
В области графических интерфейсов разрабатывается написанный на языке D порт «XOrg/XLibre» — xenia. Графический тулкит Sciter получил возможность использовать D вместе с логикой на JS/HTML.
Для работы с аудио появились нативные обвязки для LV2 и JACK Audio Connection Kit. Для профессиональных разработчиков аудио-плагинов продолжается развитие библиотеки dplug. Представлен проект синтезатора звука на WASM4.
Улучшена поддержка системы сборки Bazel, что упростило сборку смешанных приложений с кодом на C++.
Представлены приложения, упрощающие работу с ключами шифрования: neverstored и hideout.
В сентябре в Лондоне прошла конференция Dconf2026. Представлены доклады о развитии языка D и проектах, связанных с ним.
Источник: http://www.opennet.ru/opennews/art.shtml? num=66399
© OpenNet
