Опубликован релиз DMD 2.111, эталонного компилятора для языка D. Код компилятора распространяется под свободной лицензией BSL (Boost Software License). Поддерживаются системы Linux, Windows, macOS и FreeBSD.
Язык D использует статическую типизацию, обладает синтаксисом, схожим с C/C++, и обеспечивает производительность компилируемых языков. Язык D также заимствует некоторые возможности динамических языков, полезные для повышения эффективности разработки и обеспечения безопасности. Например, имеется поддержка: ассоциативных массивов, косвенного определения типов, автоматического управления памятью, средств параллельного программирования, шаблонов, компонентов для метапрограммирования. Опционально доступен сборщик мусора. В программах на языке D можно использовать библиотеки на языке C, а также некоторые библиотеки на C++ и Objective-C.
Выпуск включает изменения за более чем полугодовой период, не вошедшие в релиз 2.110, который скорее являлся корректирующим и содержащим только исправления.
Среди изменений в выпуске 2.111:
- Добавлена функция профилирования времени сборки, включаемая через флаг “-ftime-trace” в компиляторе DMD. Компилятор LDC уже обладал этой функцией. Видео с руководством по использовании time-trace.
- Флаг компилятора “-i” теперь корректно обрабатывает и файлы на языке Си.
- В шаблонные миксины добавлена возможность использования синтаксиса присваивания: mixin MyMixinTemplate!(Args) myName; // старый стиль mixin myName = MyMixinTemplate!(Args); // новый стиль
- Для методов “extern(Objective-C)” теперь автоматически генерируются селекторы, даже если не указан аттрибут “@selector”: extern(Objective-C) extern class NSObject { static NSObject alloc(); // Generates as “alloc” NSObject init(); // Generates as “init” } extern(Objective-C) class Fox : NSObject { bool fluffy; @property bool isFluffy() => fluffy; // “isFluffy” @property void isFluffy(bool value) { fluffy = value; } // “setFluffy:” void yip(int a) @selector(“bark:”) { // “bark:” // … } void doSomething(int a, int b, int c) { // “doSomething:b:c:” // … } }
- Добавлено placement-выражение “new” для инициализации указанным значением (без GC). struct S { float d; int i; char c; } … S s; S* p = new (s) S(3.14, 42, ‘X’); // place new object into s
- Новое ключевое слово “__rvalue”, позволяющее реализовать move-семантику. Использовано для добавления библиотечных примитивов “move” и “forward”.
- Добавлен флаг “-preview=safer”, при использовании которого все проверки применяемые в коде “@safe” включаются для всего кода, при этом трудно исправимые части (такие как вызов функций “@system”) будут всё ещё разрешены в режиме Safer D.
- Улучшена поддержка классов данных “ref” и “auto ref”, которые теперь могут применяться к локальным, глобальных и статическим переменным. Параметры “auto ref” должны определяться только вместе.
- Включён вывод ошибок для некоторых возможностей, имеющих статус устаревших. Среди них замена “delete” на “destroy”, “проваливания” в многозначных “case”, самоинициализация переменных.
- Укороченный синтаксис для определения методов теперь можно использовать и в конструкторах: struct Number { int x; void vf(int); this(int x) => vf(x); this(float x) => this(cast(int) x); }
- В runtime добавлены Windows-байндинги к BCrypt.
- В стандартной библиотеке реализован импорт ODBC 4.0 и расширены методы работы с Unicode, версия которого была увеличена до 16.
- Новый API для “std.sumtype”, где появились три функции “has!T”, “get!T” и “tryGet!T”.
- В пакетном менеджере dub исправлена ошибка с “cImportPaths”.
Дополнительно можно отметить, что продолжают развиваться крупные проекты с использованием D по разным направлениям:
В области разработки игр (GameDev) развиваются несколько движков. HipremeEngine – кросс-платформенный движок, который помимо основных десктопных систем Windows/Linux/macOS поддерживает также iOS/Android/Xbox/WebAssembly/PS Vita. Другой проект – Dagon продолжает развитие 3D движка с обширными возможностями графики.
Графические библиотеки также имеют отличную поддержку в D, где помимо стандартной поддержки OpenGL, развивается поддержку таких библиотек как SDL (включая 3 и 2 версии) и Sokol. Работа с графическими изображениями (decoding/encoding) активно развивается в пакете gamut, который умеет работать с множеством форматов. Есть поддержка как классических PNG, JPEG и BMP, так и более современных JPEG-XL, QOI и QOIX.
В области графических пользовательских интерфейсов (GUI) сформирована новая экосистема библиотек gID, предоставляющая обвязки к многим библиотекам, основанным на GObject, включая полную поддержку GTK 3/4, Arrow/Parquet, Adw и других. Примеры и список входящих библиотек можно найти в репозитории. Также набирает популярность декларативный фреймворк с применением в играх Fluid.
В области веб-разработки на RISC-V архитектуре продемонстрирована работа фреймворка Serverino. Этот минималистичный и производительный веб-фреймворк без других зависимостей может работать на очень слабых машинах, включая некоторые встраиваемые системы без большого объёма памяти.
Продолжается развитие библиотеки для кукольной 2D-анимации в реальном времени – Inochi2D. Среди недавних новшеств проекта были представлены отдельные библиотеки управления памятью и собственный runtime, которые позволяют использовать многие возможности языка без сборщика мусора.