LINUX.ORG.RU

Релиз D 2.076.0

 ,


1

5

Команда разработчиков D с великим удовольствием объявляет о выходе новой стабильной версии DMD: 2.076.0

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

Поддержка static foreach

import std.conv: to;

static foreach(i; 0 .. 10)
{

    // ‘static foreach’ не добавляет вложенной области видимости
    // (так же как и в ‘static if’).
    
    // следующее объявление mixin находится в области видимости модуля
    mixin(`enum x` ~ to!string(i) ~ ` = i;`); // объявляет десять переменных x0, x1, …, x9..., x9
}

import std.range: iota;
// все типы по которым можно итерироваться обычным ‘foreach’
// так же поддерживаются ‘static foreach’
static foreach(i; iota(10))
{
    // используем объявления сгенерированные ранее в 'static foreach'
    pragma(msg, "x", i, ": ", mixin(`x` ~ to!string(i)));
    static assert(mixin(`x` ~ to!string(i)) == i);
}

void main()
{
    import std.conv: text;
    import std.typecons: tuple;
    import std.algorithm: map;
    import std.stdio: writeln;

    // у 'static foreach' есть две формы: объявление и инструкция
    // (так же как у 'static if').
    static foreach(x; iota(3).map!(i => tuple(text("x", i), i)))
    {
        // создает три локальных переменных x0, x1 и x2
        mixin(text(`int `,x[0],` = x[1];`));

        scope(exit) // внутри области видимости 'main'
        {
            writeln(mixin(x[0]));
        }
    }
    
    writeln(x0," ",x1," ",x2); // результат выполнения
}

Улучшения -betterC

Много улучшений было добавлено к новой опции компилятора dmd -betterC, программы скомпилированные с -betterC не будут ссылаться на неиспользуемые части рантайм, asserts реализованы как C <assert.h> вызовы, а phobos (прим. пер. стандартная библиотека) не слинкована по умолчанию.

Хотите знать больше про Better C? Вам сюда.

Добавлена поддержка AVX2

Компилятор теперь может генерировать инструкции AVX2. Поддержка автоматически распознается с помощью -mcpu=native.

Изменения в стандартной библиотеке

std.base64.Base64URLNoPadding позволяет кодирование/декодирование без смещения

import std.base64 : Base64URLNoPadding;

ubyte[] data = [0x83, 0xd7, 0x30, 0x7b, 0xef];
assert(Base64URLNoPadding.encode(data) == "g9cwe-8");
assert(Base64URLNoPadding.decode("g9cwe-8") == data);

std.digest.digest переименовано в std.digest.

std.meta.Stride добавлен, позволяет выбрать подмножество шаблона по размеру шага и отступу

alias attribs = AliasSeq!(short, int, long, ushort, uint, ulong);
static assert(is(Stride!(3, attribs) == AliasSeq!(short, ushort)));
static assert(is(Stride!(3, attribs[1 .. $]) == AliasSeq!(int, uint)));

Был добавлен Config.detached флаг для spawnProcess, он позволяет запускать новые процессы независимо от текущего процесса. Нет нужды ждать их завершения, ведь они никогда не станут зомби процессами! Попытки вызвать std.process.wait или std.process.kill на обособленом процессе бросит исключение.

Теперь можно использовать std.range.chunks с непрямыми диапазонами, но с ограничениями, налагаемыми этими диапазонами.

import std.algorithm.comparison : equal;

int i;

// генератор не сохраняет состояние, так что он не может быть прямым диапазоном
auto inputRange = generate!(() => ++i).take(10);

// мы все еще можем его обработать по частям, но только за один проход
auto chunked = inputRange.chunks(2);

assert(chunked.front.equal([1, 2]));
assert(chunked.front.empty); // итерация по чанку сьедает его
chunked.popFront;
assert(chunked.front.equal([3, 4]));

Теперь std.socket.UnixAddress поддерживает абстрактные адреса. UNIX сокеты обычно идентифицируются по пути. Linux поддерживает непереносимое расширение этой схемы, известное как абстрактный адрес сокета, которое независимо от файловой системы. Начинается абстрактный адрес с нулевого байта.

auto addr = new UnixAddress("\0/tmp/dbus-OtHLWmCLPR");

Добавлена возможность использовать базовый класс когда производится автоматическая реализация интерфейса. Второй шаблон std.typecons.AutoImplement был добавлен, в отличии от существующего он принимает дополнительный параметр. Этот параметр позволяет уточнить класс от которого наследуемся во время автоматической реализация интерфейса.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Ответ на: комментарий от eao197

Ну так вы же не слушаете, что вам говорят. Спорить, чтобы доказать свою правоту, у меня нет никакого желания. Было интересно пообщаться до некоторого момента.

Просто я несколько раз общался с Си++ программистами. Каждый раз у меня складывалось впечатление, что если это профессионалы, то до некоторой степени шизоидный тип (я не утверждаю, что эти люди шизофреники в клиническом смысле): мышление в стиле взаимоисключающих параграфов и подмена понятий для них происходит столь естественно, что обвинять этих людей во лжи и провокации оказывается затруднительно. Во общем-то, я остаюсь при мнении, что инструмент влияет на личность работника, чем дольше они вместе, тем сильнее.

Кстати, я стал лучше понимать Линуса. Действительно, в ядре Си++ не место. Раньше я так не думал. Теперь у меня есть основания полагать, что его через чур резкая и несколько показательная реакция на предложение внести Си++ в ядро в значительных объёмах (какой-то % там-таки присутствует) оправдана.

Vudod ★★★★★ ()
Ответ на: комментарий от Vudod

Ну так вы же не слушаете, что вам говорят.

А вот у меня прямо противоположное мнение. Это вы a) не слушаете и b) игнорируете заданные вам вопросы.

Получается, что вам приводишь аргументы, от вас просишь ответов, а вы шлангуете. Чтобы затем написать про то, что C++ники упороты и не прислушиваются к чужому мнению.

Ну и да, вы может понимаете Линуса, но знаний C++ вам это не прибавляет. И, получается, что осуждая C++ и требуя его забвения, вы беретесь судить о вещах, в которых не понимаете.

eao197 ★★★★ ()
Ответ на: комментарий от Vudod

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

То есть критическим мышлением вы не наделены?

инструмент влияет на личность работника

Советую посмотреть в зеркало.

Кстати, я стал лучше понимать Линуса.

Клиническая картина на лицо: сначала делаем безумное заявление, а затем начинаем от него отталкиваться.

RazrFalcon ★★★ ()
Ответ на: комментарий от umren

Получается, что отметившиеся здесь плюсохейтеры просто форумное трепло, которое максимум что может сделать это громко перднуть «C++ must die»?

Ни ума, ни знаний, ни аргументации, но мнение имеют, да.

Скучно, господа. Программиришки измельчали совсем за последние 10 лет.

eao197 ★★★★ ()
Ответ на: комментарий от eao197

Ни ума, ни знаний, ни аргументации, но мнение имеют, да.

Не нужно быть повором, чтобы понять - продукт пахнет как Г. - наверное его не стоит есть?

А ты предлагаешь всем окунуться в плюсовую массу, а потом уже иметь мнение?

Реальность так не работает.

umren ★★★★★ ()
Ответ на: комментарий от umren

Не нужно быть повором, чтобы понять - продукт пахнет как Г. - наверное его не стоит есть?

Решили прибегнуть к доказательству по аналогии? Показательно, но извольте: сыры с плесенью. Дуриан. Сюрстрёмминг, наконец. Пахнут так себе.

А ты предлагаешь всем окунуться в плюсовую массу, а потом уже иметь мнение?

Прежде всего предлагаю включить голову: если язык все еще развивается и массово используется, значит не все так однозначно. Следовательно, нужно сделать попытку разобраться почему.

Реальность так не работает.

А как работает реальность? В виде советов: «если вам нужен высокопроизводительный код, то берите C»? Да еще от человека, который C в этой самой реальности вообще никогда не нюхал.

eao197 ★★★★ ()
Ответ на: комментарий от Vudod

Кстати, я стал лучше понимать Линуса. Действительно, в ядре Си++ не место.

Это никак не помогает Торвальдсу решить проблему фризов всей системы при переполнении I/O буфером доступного объёма оперативной памяти.

dzidzitop ★★ ()
Ответ на: комментарий от eao197

Прежде всего предлагаю включить голову: если язык все еще развивается и массово используется, значит не все так однозначно. Следовательно, нужно сделать попытку разобраться почему.

Инерция.

anonymous ()
Ответ на: комментарий от Vudod

Модула2. Да, она не столь продвинута, модна и молодёжна, но Роскосмос её активно использует и ненарадуется на свои Прогрессы, которые в отличие от американских Шатлов летают по сей день

Странная какая-то аргументация. Если бы в штатах взяли модулу, то шаттлы до сих пор летали, так что ли?

Есть MLton
Его производительность на больших проектах существенно выше плюсов

Где почитать можно?

DarkEld3r ★★★★★ ()
Ответ на: комментарий от DarkEld3r

Есть MLton
Его производительность на больших проектах существенно выше плюсов

Где почитать можно?

А нигде, это пример п%больства фанбоя, который вероятно не знает, что LTO есть и в плюсах. И даже PGO есть. И, или не знает, или умалчивает, что MLton давно в полувегатативном состоянии по сравнению с компиляторами С и С++. И что даже раньше он успешно им сливал:

https://web.archive.org/web/20080412042042im_/http://shootout.alioth.debian.o...

anonymous ()
Ответ на: комментарий от anonymous

«на больших проектах» тебе говорят, а ты шутаут...

Ты большие проекты на нем в принципе видел? Шутаут - это его предел, высшая точка взлета и лучшее, что с ним было и будет. И я уже написал про LTO, который в случае плюсов таки используется в крупных проектах.

anonymous ()

Пробежался по туру https://tour.dlang.org/tour/ru/welcome/welcome-to-d Язык выглядит годнее чем все ваши расты и го (имхо конечно). Мне лень читать 20 страниц этой темы, но все же - почему он так не популярен (я понимаю идею маркетинга и что нет крупных авторитетов-компаний, но все же)?

wist512 ()
Ответ на: комментарий от wist512

У этих чудаков довольно долго было две(!) стандартных библиотеки. Пока боролись с проблемами роста, появились конкуренты от

крупных авторитетов-компаний

Virtuos86 ★★★★★ ()
Ответ на: комментарий от wist512

Дополню предыдущего комментатора: довольно много сторонников они потеряли, насколько я понимаю, при переходе с D1 на D2.

А так, да, в наше время «популярность» определяется количеством вложенного бабла.

anonymous ()
Ответ на: комментарий от wist512

почему он так не популярен (я понимаю идею маркетинга и что нет крупных авторитетов-компаний, но все же)?

крестовики фанатичны и готовы есть кактус

в остальном проблема - маленькое сообщество

umren ★★★★★ ()
Ответ на: комментарий от anonymous

Java, C# тоже имеют GC однако...

Имеют, вот только эти языки, которые заточены на GC, а в D тебе предлагают работать со смесью ужа с ежом. Что мало кого интересует.

anonymous ()
Ответ на: комментарий от anonymous

А чем GC плох? Ну то есть, что вам приходится писать такого, где помимо логики нужно руками постоянно контролировать хип? Я вот правда не понимаю этот добровольный мазахизм, когда разработчик хочет всегда и всюду (а не в каких-то узких местах только) контролировать и следить за памятью. Какая мотивация у таких взглядов?

Даже тот же раст с RAII (если я не ошибаюсь), выглядит для меня переусложненным и все равно функция «GC» перекладывается на плечи программиста (и многие считаю это плюсом, лол)

wist512 ()
Ответ на: комментарий от wist512

Зачастую языки с GC требуют жирного рантайма. За это не любят. Еще stop the world и прочие проблемы.

На Rust можно написать либу и подключить к питону/руби/ноде. У языка с GC с этим будут проблемы.

RazrFalcon ★★★ ()
Ответ на: комментарий от RazrFalcon

Так то логично все, но вот.

Зачастую языки с GC требуют жирного рантайма.

Речь про то, что код потом не помещается в какую-то embedded платформу, или людям прям реально важно весит рантайм 10кб, 100кб или 10мб?

Я знаю, голый си++ тоже не будет просто так работать и в ОС лежат рантаймы типа *.so или *.dll и они вроде тоже не мало весят? Этот их вес тоже для них важен?

Еще stop the world и прочие проблемы.

В го там добились каких-то успехов в мелких паузах, мне думается, можно же специфичный GC написать для языка, не такой как на java. Или какой-то API по GC, чтобы потом портировать в питон/руби...

Ну в целом я не знаю, перекладывание функций GC на программиста, выглядит для меня забавно (потому как человеку надо писать логику, а он с ветряными мельницами борется, ради сомнительных плюсов размера рантайма или портирование библиотеки в питон)

wist512 ()
Ответ на: комментарий от wist512

Речь про то, что код потом не помещается в какую-то embedded платформу,

так у нас тут все пишут ядра неанонсированных осей и высокопроизводительные хайлоад сервера, да торгуют в hft

вот им gc и мешает

umren ★★★★★ ()
Ответ на: комментарий от wist512

А чем GC плох?

Если бы в D был просто GC - в принципе было бы норм. Но D это особенный язык, в нем есть и GC, и возможность стрелять себе во все конечности, получая утечки, креша, порчу памяти и пр.

anonymous ()
Ответ на: комментарий от wist512

Я знаю, голый си++ тоже не будет просто так работать и в ОС лежат рантаймы типа *.so или *.dll и они вроде тоже не мало весят? Этот их вес тоже для них важен?

«голый с++» как раз ничего не требует, и это не рантайм, а стандартная библиотека, без которой можно обойтись.

anonymous ()
Ответ на: комментарий от anonymous

без которой можно обойтись

Или слинковать статично, тогда все ненужное будет отброщено. Точно так же в С есть своя стандартная библиотека, да и практически во всех языках.

anonymous ()
Ответ на: комментарий от anonymous

Точно так же в С есть своя стандартная библиотека, да и практически во всех языках.

Вот у Си точно нет рантайма и собрать можно даже без стандартной библиотеки.

anonymous ()
Ответ на: комментарий от RazrFalcon

Я конечно не супер системный программист, но целом (пятница же) у нас бывает два состояния.

1) Мы намусорили в функции и круто было после выхода из нее все убрать (типа стека что ли, который тупо все разом трет).

2) Второй случай это долгоживущие данные (специальный тип).

Долгоживущие данные это банальный контекст того или иного скоупа программы. Возьмем веб сайт.

Сервер прям в своей главной функции регистрирует некий скоуп который доступен всегда (потому что его функция никогда не заканчивается). Потом, по выполнению программы он регистрирует скоуп контроллера, который будет очищен после достижение конца скоупа контроллера. Пользователь же регистрирует свои какие-то скоупы или же если надо ложит в другие.

И все, выглядит это прост, есть скоуп функции или {...} ты там пишешь нечто типа

myScope = scope.register(SCOPE_NAME_CONSTANT) myScope.add(data) // скоуп делает какую-то магию и делает переменную специальной, и мы можем типа потом проверить data.isScope(), data.isExist(), data.getCurrentScope()... КОНЕЧНО, если ты поместил что-то не туда, ты аутист, но в целом небольшое число скоупов тебе не даст обгадится.

Этот подходи ужасен?

wist512 ()
Ответ на: комментарий от wist512

Ужасное тут форматирование

myScope = Scope.register(SCOPE_NAME_CONSTANT) 
myScope.add(data)


if (Scope.isScope(data)) {
  data.isExist() // существуют ли еще данные.
  data.getCurrentScope() // хочу получить этот контекст скоупа.
}
Scope.getAll() // печатает имена скоупов и их стектрейс, где они объявлены.

wist512 ()
Ответ на: комментарий от wist512

Я знаю, голый си++ тоже не будет просто так работать и в ОС лежат рантаймы типа *.so или *.dll

2-3МБ. А джава/дотнет больше сотни. И если каждая прога будет их собой тянуть...

В го там добились каких-то успехов в мелких паузах

На го пока нету серьезных пользовательских приложений, чтобы это оценить.

выглядит для меня забавно

Я пишу на C++/Rust и «перекладывание функций GC на программиста» у меня занимает от силы 5% моего времени.

RazrFalcon ★★★ ()
Ответ на: комментарий от dzidzitop

Это никак не помогает Торвальдсу решить проблему фризов всей системы при переполнении I/O буфером доступного объёма оперативной памяти.

А при чем тут язык? о_0 Чтобы освободить место в оперативе при переполнении, сначала нужно что-то записать в своп, сделать ремаппинг виртуальной памяти, выделить нужное количество памяти в оперативке. А потом опомнится вторая программа, у которой часть виртуальной памяти перемещена на диск, и потребует ее обратно. И всё сначала: ищем, что скинуть в своп...

iVS ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Я пишу на C++/Rust и «перекладывание функций GC на программиста» у меня занимает от силы 5% моего времени.

Что конкретно вы пишите на этих языках (ну кроме легаси на работе)?

wist512 ()