Выпуск компилятора языка D 2.112

Опубликован релиз DMD 2.112, эталонного компилятора для языка D. Код компилятора распространяется под свободной лицензией BSL (Boost Software License). Поддерживаются системы Linux, Windows, macOS и FreeBSD.

Язык 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