Язык 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 и других архитектур.
Источник: https://www.opennet.ru/opennews/art.shtml?num=64671
(opennet.ru, основная лента)