[Перевод] Последние версии компиляторов D
Группа разработчиков LDC закрыла ушедший год версией 1.19.0 компилятора D, использующего LLVM, а основная команда начала новый год версией 2.090.0 эталонного компилятора DMD. И если вы еще не слышали, не так давно появились важные новости о D-компиляторе на базе GCC, GDC. Наверстываем!
LDC 1.19.0
Этот релиз содержит обновление компилятора LDC до версии D фронтэнда 2.089.1, которая была текущей версией на момент выпуска, сразу после католического Рождества. Собранные сборки основаны на LLVM 9.01.
Среди основных моментов в этом релизе — некоторая симпатия к Android. Готовая библиотека DRuntime/Phobos теперь доступна для всех Android таргетов. Этот релиз может использоваться в сочетании с проектом D Android Адама Руппе, сборником вспомогательных программ и интерфейсов, сейчас в бете близкой к завершению, для разработки на D под Android с LDC.
Пользователи Windows обнаружат, что поставляемые в комплекте библиотеки линковки на базе MinGW были обновлены. Теперь они являются производными от файлов .def из пакета MinGW-w64 7.0.0. Эти библиотеки позволяют использовать системные библиотеки Windows без необходимости установки Windows SDK.
DMD 2.090.0
Последняя версия DMD была объявлена 7 января. Она вышла с 10 крупными изменениями и 71 закрытым багом, любезно предоставленными 48 соавторами.
С этим релизом теперь возможно больше с lazy-параметрами. D давно поддерживает ленивые параметры:
Аргумент lazy-параметра не вычисляется до вызова функции. Аргумент обрабатывается только если/когда параметр вычисляется внутри функции.
Следовательно, lazy-аргумент может быть выполнен 0 или более раз.
Под капотом они реализуются как делегаты. Теперь можно добраться до базового делегата, взяв адрес параметра, что ранее было запрещено.
import std.stdio;
void chillax(lazy int x)
{
auto dg = &x;
assert(dg() == 10);
writeln(x);
}
void main()
{
chillax(2 * 5);
}
Этот релиз также делает устаревшей идиому D, используемую теми, кто сталкивается с необходимостью различать финализацию (недетерминистическое разрушение объектов, обычно инициируемое сборщиком мусора) и нормальную деструкцию (детерминистическое разрушение объектов) изнутри деструктора класса или структуры.
При нынешнем состоянии GC, осуществление любых GC-операций во время финализации запрещено. Однако в D не предусмотрены раздельные финализаторы и деструкторы. Существует только ~this, который называется деструктором, несмотря на то, что исполняет обе роли. Это иногда создает трудности при реализации деструкторов для типов, которые предназначены как для GC, так и для не-GC аллокаторов. Любое обращение к GC при очистке может привести к ошибке InvalidMemoryOperationError. Отсюда вытекает необходимость вышеупомянутого обходного пути.
Теперь можно вызвать статическую функцию GC, core.memory.GC.inFinalizer, чтобы получить ваше состояние в деструкторе. Она возвращает true, если текущий поток выполняет финализацию, и в этом случае вы не желаете совершать никаких действий, затрагивающих операции с GC. (Я ждал чего-то подобного, прежде чем писать следующую статью в моей серии про GC).
GDC
Благодаря упорному труду Иена Буклау, Йоханнеса Пфау и всех волонтеров, которые поддерживали и вносили свой вклад на протяжении многих лет, GDC был принят в GCC 9 в конце 2018 года и стал доступен в составе комплекта GCC 9.1, выпущенного в мае прошлого года. GCC 9.2 был выпущен в августе прошлого года. Эта версия GDC реализует версию 2.076 фронтенда D. Вы можете собрать ее самостоятельно или установить оттуда же, откуда вы обычно берете GCC 9.x.
От переводчика
Данный выпуск блога практически полностью перекрыл блок из готовящейся статьи по надежному программированию, посвященной в т.ч.D, ну за исключением критики и состоянию дел с IDE, потому подвернулся исключительно удачно.