- PVSM.RU - https://www.pvsm.ru -

Последние версии компиляторов D

Последние версии компиляторов D - 1Группа разработчиков LDC закрыла ушедший год версией 1.19.0 компилятора D, использующего LLVM [1], а основная команда начала новый год версией 2.090.0 эталонного компилятора DMD [2]. И если вы еще не слышали, не так давно появились важные новости о D-компиляторе на базе GCC, GDC [3]. Наверстываем!

LDC 1.19.0

Этот релиз содержит обновление компилятора LDC до версии D фронтэнда 2.089.1, которая была текущей версией на момент выпуска, сразу после католического Рождества. Собранные сборки основаны на LLVM 9.01 [4].

Среди основных моментов в этом релизе — некоторая симпатия к Android. Готовая библиотека DRuntime/Phobos теперь доступна для всех Android таргетов. Этот релиз может использоваться в сочетании с проектом D Android Адама Руппе [5], сборником вспомогательных программ и интерфейсов, сейчас в бете близкой к завершению [6], для разработки на D под Android с LDC.

Пользователи Windows обнаружат, что поставляемые в комплекте библиотеки линковки на базе MinGW были обновлены. Теперь они являются производными от файлов .def из пакета MinGW-w64 7.0.0 [7]. Эти библиотеки позволяют использовать системные библиотеки Windows без необходимости установки Windows SDK.

DMD 2.090.0

Последняя версия DMD была объявлена 7 января [8]. Она вышла с 10 крупными изменениями и 71 закрытым багом, любезно предоставленными 48 соавторами [2].

С этим релизом теперь возможно больше с lazy-параметрами. D давно поддерживает ленивые параметры [9]:

Аргумент 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 [10], используемую теми, кто сталкивается с необходимостью различать финализацию (недетерминистическое разрушение объектов, обычно инициируемое сборщиком мусора) и нормальную деструкцию (детерминистическое разрушение объектов) изнутри деструктора класса или структуры.

При нынешнем состоянии GC, осуществление любых GC-операций во время финализации запрещено. Однако в D не предусмотрены раздельные финализаторы и деструкторы. Существует только ~this, который называется деструктором, несмотря на то, что исполняет обе роли. Это иногда создает трудности при реализации деструкторов для типов, которые предназначены как для GC, так и для не-GC аллокаторов. Любое обращение к GC при очистке может привести к ошибке InvalidMemoryOperationError. Отсюда вытекает необходимость вышеупомянутого обходного пути.

Теперь можно вызвать статическую функцию GC, core.memory.GC.inFinalizer, чтобы получить ваше состояние в деструкторе. Она возвращает true, если текущий поток выполняет финализацию, и в этом случае вы не желаете совершать никаких действий, затрагивающих операции с GC. (Я ждал чего-то подобного, прежде чем писать следующую статью в моей серии про GC [11]).

GDC

Благодаря упорному труду Иена Буклау, Йоханнеса Пфау и всех волонтеров, которые поддерживали и вносили свой вклад на протяжении многих лет, GDC был принят в GCC 9 [12] в конце 2018 года и стал доступен в составе комплекта GCC 9.1, выпущенного в мае прошлого года. GCC 9.2 был выпущен в августе прошлого года. Эта версия GDC реализует версию 2.076 фронтенда D. Вы можете собрать ее самостоятельно [3] или установить оттуда же, откуда вы обычно берете GCC 9.x.

От переводчика

Данный выпуск блога практически полностью перекрыл блок из готовящейся статьи по надежному программированию, посвященной в т.ч.D, ну за исключением критики и состоянию дел с IDE, потому подвернулся исключительно удачно.

Автор: Siemargl

Источник [13]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/342750

Ссылки в тексте:

[1] версией 1.19.0 компилятора D, использующего LLVM: https://github.com/ldc-developers/ldc/releases/tag/v1.19.0

[2] версией 2.090.0 эталонного компилятора DMD: https://dlang.org/changelog/2.090.0.html

[3] D-компиляторе на базе GCC, GDC: https://github.com/D-Programming-GDC/gcc

[4] основаны на LLVM 9.01: http://releases.llvm.org/

[5] D Android Адама Руппе: https://github.com/adamdruppe/d_android

[6] сейчас в бете близкой к завершению: https://forum.dlang.org/post/cqdqhrporufpzkwjwkrw@forum.dlang.org

[7] MinGW-w64 7.0.0: http://mingw-w64.org/doku.php

[8] была объявлена 7 января: https://forum.dlang.org/post/qv1mji%24f81%241@digitalmars.com

[9] D давно поддерживает ленивые параметры: https://dlang.org/spec/function.html#lazy-params

[10] идиому D: https://p0nce.github.io/d-idioms/#GC-proof-resource-class

[11] моей серии про GC: https://dlang.org/blog/the-gc-series/

[12] был принят в GCC 9: https://gcc.gnu.org/gcc-9/

[13] Источник: https://habr.com/ru/post/483440/?utm_campaign=483440&utm_source=habrahabr&utm_medium=rss