Релиз компилятора D версии 2.068.0

Вышла версия 2.068 кроссплатформенного компилятора языка программирования D: Digital Mars D (DMD). D — это компилируемый в машинный код язык из семейства си‐подобных, включающий в себя опциональный сборщик мусора, мощную систему метапрограммирования, удобные шаблоны, исполнение D-кода во время компиляции, систему модулей вместо «include». D позволяет без труда использовать библиотеки на языке C, а также имеет возможность использовать некоторые C++-библиотеки и ObjC-библиотеки. Компилятор DDMD поддерживает системы GNU/Linux, Windows, OS X, FreeBSD, и архитектуры x86, x86_64, x64.

Основные изменения и новшества версии 2.068:

  • Изменения в компиляторе:
    • Новый ключ командной строки »-profile=gc» позволяет профилировать выделение памяти.
    • Блоки юниттестов (unittest) больше не парсятся, пока не задан ключ командной строки »-unittest».
    • Сгенерированые компилятором деструкторы и постблиттеры (postblitter) теперь доступны по именам »__xdtor» и »__xpostblit».
  • Изменения в языке:
    • Добавлена директива pragma (inline), для указания компилятору на то, что некоторые функции следует инлайнить всегда «pragma (inline, true)» или использовать для них обычные правила «pragma (inline, false)».
    • Для функций, тип возвращаемого значения у которых указан как auto, компилятор теперь будет автоматически выводить атрибуты pure, @safe, nothrow, @nogc (раньше это делалось только для шаблонов).
    • Парcер теперь позволяет использовать индексированные туплы (структура, существующая только во время компиляции и позволяющая хранить типы) как декларации типов: «T[0].S myvar;». Подробнее см. в http://dlang.org/changelog.html#index-type-followed-ident.
    • Аргументы шаблонов теперь могут быть выведены на основе аргументов функции:
          void previously(T=int) (T t=0) {} // раньше необходимо было так    void now(T) (T t=0) {} // а теперь можно и так  
    • Некоторые ошибочные приведения типов, которые раньше определялись на стадии генерации кода, теперь определяются на стадии семантического анализа. Это улучшило сообщения об ошибках и работу CTFE-движка, ответственного за исполнение D-кода во время компиляции.
  • Изменения в стандартной библиотеке:
    • Множество функций теперь работают с InputRange и OutputRange (абстракциями для получения входных данных и выдачи выходных данных) вместо массивов.
    • Модуль std.typetuple был переименован в std.meta. Для обеспечения совместимости std.typetuple сохранён в виде псевдонима std.meta.
    • Сущность TypeTuple была переименована в AliasSeq. Для обеспечения совместимости сохранён псевдоним.
    • Добавлен CTFE-шаблон hexString, который должен заменить встроенные в язык hex-строки:
          x"304A314B» // было    hexString!»304A314B» // стало  
    • Добавлена CTFE-функция hasUDA для проверки наличия у символов UDA (определяемых пользователем атрибутов времени компиляции).
    • Вызовы GC API теперь могут быть отдельно профилированы.
    • Переписана работа с синхронизированными (synchronized) объектами в druntime. Починена ошибка с гонкой во время инициализации мьютекса.
    • Сгенерированный вручную интерфейсный файл object.di больше не нужен, компилятор использует оригинальный object.d.
    • Новая реализация AA (ассоциативных массивов), с новой схемой разрешения конфликтов при совпадении хэшей. Чуть быстрее и лучше дружит с кэшем процессоров.
    • Улучшена работа встроенного инструмента code coverage.
    • Функция executeShell теперь игнорирует переменную среды SHELL и всегда использует sh.
    • Функция byLine (чтение текстового файла построчно) была переписана и значительно ускорена (до трёх раз).
    • В пакет std.algorithm добавлены предикаты ordered и strictlyOrdered для проверки, отсортирована ли последовательность значений.
    • Шаблон RefCounted использует новый атрибут return, чтобы указать компилятору, что внутренний объект шаблона не может быть использован вне лексического блока (espace checking).

Также следует отметить, что в будущем релизе 2.069 используемый сейчас фронтэнд, написанный на подмножестве языка C++, будет заменён фронтэндом, написаным на языке D. Фронтэнд на языке D делается при помощи полуавтоматической трансляции C++ кода, поэтому до версии 2.069 никаких изменений (кроме очевидных исправлений ошибок) во фронтэнде не будет. Кодовая база библиотек druntime и Phobos, тем не менее, не заморожена.

© OpenNet