LINUX.ORG.RU

Релиз D 2.076.0

 ,


1

6

Команда разработчиков 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 ()

mixin(`enum x` ~ to!string(i) ~ ` = i;`);

Хуже перла выглядит если честно.

// у 'static foreach' есть две формы

Что такое static foreach, и зачем выдумывать непонятно что?

loz ★★★★★ ()

мультипарадигменный, быстрый, стабильный, модный, молодежный и мёртвый

Не, ну серьёзно. Или убирай про модность-молодёжность или пиши про юдоль печали и геенну огненную.

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

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

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

Дер Гроссе Шланге? Но ты ведь прекрасно понимаешь о чём я. Интерпретаторы (а то и компиляторы) Форта тоже есть и развиваются. Есть и сообщество. Есть и вакансии. Бери и пиши. Но ведь Форт мёртв, так?
Забей. Я не против языка. Я даже написал бы что-то поощрительное если бы не натолкнулся на фразу «модный и молодежный». Это как личинка кухонной моли в каше. Она сварилась. Она безвредна. А аппетит пропал.

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

Но ведь Форт мёртв, так?

как ты определяешь мертвость/живость? поделись

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

Что есть жизнь? Ты поднимаешь серьёзные вопросы, на которые многие поколения философов не смогли дать внятного ответа. Но на бытовом уровне даже ребёнок отличит живое от мёртвого. Не шлангуй и не троллен будешь (что-то из народной еврейской мудрости)

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

ясно т.е. это твои какие-то личные мироощущения которые ты не можешь формализовать

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

то есть ты даже не уверен живой ты или мертвый? грустно

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

Ай-йа-яй... Ты передёргиваешь, майн либе шланге.

ты не можешь формализовать

Никто не может. И я ничем не лучше.

Однако:

Но на бытовом уровне даже ребёнок отличит живое от мёртвого.

Тебе должно быть стыдно за своё поведение.

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

по делу ты ничего сказать не можешь? мертвый мальчик?

umren ★★★★★ ()

на нем можно писать приложения, выполняемые на клиенте?

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

Хуже перла выглядит если честно.

Вполне себе интуитивно понятный код. ~ - очевидно конкатенация строк, а to!string - вероятно шаблон или макрос, хотя to<string> смотрелось бы привычней.

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

Мёртвость языка определяется количеством вакансий разработчиков на этом языке, а также отсутствием как хайпа так и поддержки какой-либо крупной корпорации или консорциума. Получается что язык применить где-либо кроме пет проекта, где ты царь и бог, представляется невозможным. Соответственно число пользователей языка практически не увеличивается, а жизнь языка это его активное использование. Это не говорит о том что язык плохой и не может однажды взлететь, но при возрасте в 16 лет и текущей пользовательской базе, подобное событие выглядит маловероятным.

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

я не думаю, что у D есть проблемы «взлететь» (не важно сколько времени прошло), вопрос только в укреплении сообщества, реальные задачи на нем можно решать без проблем в самых разных областях прямо сегодня, а язык сам по себе приятный

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

Что такое static foreach, и зачем выдумывать непонятно что?

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

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

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

Только программы на нем не пишут.

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

ничто не мешает их писать, есть компиляторы, либы для работы с бд/сетью/вебом/написания апи, полные биндинги к гтк и своя либа для гуев кросс платформенная, не в раст не в го этого нету всего в той же мере

umren ★★★★★ ()

А с образовательной точки зрения, насколько оправданы инвестиции времени в изучение D? Если я использую в основном Scala в профессиональной деятельности и знаком с C, Java, Python, OCaml, Haskell и Rust, то получу я что-то новое от ознакомления с D?

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

Вот интересно, в каких областях нужен сложный нативный язык с GC?

Тот же Go стрельнул благодаря тому, что он нативный и быстрый, с GC, но при этом очень простой. Да и то ниша у Go довольно узкая.

Там же где требуются более-менее мощные языки и GC, там уже давно живет JVM (с кучей языков на любой вкус) и .NET (опять же с кучей языков).

Получается, что с одной стороны есть C/C++/Rust/Ada, которые быстрые, нативные и без GC, закрывающие самый низкий уровень. И есть JVM/.NET (а так же разные Haskell-и и OCaml-ы), а еще есть куча совсем тормозной динамики (Python, Ruby, Erlang, JavaScript), но на которой пишут активно и очень много.

Собственно, куда тут влазить D?

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

Так же думали, пока не было Go. Сейчас он рулит и бибикает. D это более адекватный Go, с готовыми гуями и менеджером пакетов. Кроме того gc давно optional, а теперь ещё и -betterC подвезли. https://dlang.org/blog/2017/08/23/d-as-a-better-c/

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

D это более адекватный Go

o_O

Кроме того gc давно optional

Ага, только ты забыл рассказать, что без него D малоюзабелен.

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

Так же думали, пока не было Go.

Когда не было Go, не было ни C++11, ни Rust-а. Да и D2 был еще в очень сыром состоянии.

Сейчас он рулит и бибикает.

Он рулит и бибикает потому, что прост как лопата. Сам Пайк, если не ошибаюсь, говорил о том, что когда в Google осознали, что производительности Python-а не хватает, то просто пересадить разработчиков на Java был не вариант, т.к. Java оказалась сложнее для тамошних программистов, чем Python. Поэтому и пришлось делать максимально простой Go.

D это более адекватный Go

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

Мой вопрос как раз в том, как часто нужен сложный нативный язык с GC сейчас, когда есть тот же Rust с одной стороны (без GC), а так же всякие Haskell/OCaml/Java/Scala/Kotlin/Ceylon/C#/F# с другой? Ну и про C++11/14/17 тоже не следует забывать.

eao197 ★★★★ ()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от umren

Как бы по ответу понятно

Что смысла нет. Если бы он был, то был бы озвучен.

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

Ну и про C++11/14/17 тоже не следует забывать.

Про всё это уже давно следует забыть :-) Как страшный сон :-) Лол :-)

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

D можно использовать и в любом более простом случае, а наворачивать шаблоны на старте тебя никто не заставляет. По поводу истории с пайком ты так и не понял, что это был стеб? Сложный язык он бы и не сделал, склад ума у него слишком практичный. Сложный язык с опциональным gc нужен во множестве случаев. Гуй, сети, бекенды, консольщина, инфраструктурные тулы, мобилки (в ldc уже завезли андроид), если хочешь HFT то велкам в -betterC

umren ★★★★★ ()
Последнее исправление: umren (всего исправлений: 2)
Ответ на: Как бы по ответу понятно от x86_64

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

umren ★★★★★ ()
Последнее исправление: umren (всего исправлений: 1)

Куда/кому столько языков? Горшочек не вари

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

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

Речь не про меня, я бы и сам предпочел D с его шаблонами Go без оных. Дело в другом: основные вещи в Go осваиваются за пару дней и потом остаются лишь частные случаи. При этом программирование на Go для всех одинаковое, никому не нужно думать о том, что вот эта фича языка способна сократить трудозатраты на пару дней, но вызовет сложности при сопровождении менее квалифицированными программистами.

А вот в D не так, по сложности он не сильно отстает от C++, хотя программировать на D приятнее. Так что даже освоение базовых вещей в D будет сложнее, чем в Go. А уж при использовании проблема выбора между простым, но объемным кодом, и более сложным, но компактным, будет встречаться постоянно.

Взять хотя бы коды возврата vs исключения. Или дублирование кода vs метапрограммирование.

По поводу истории с пайком ты так и не понял, что это был стеб?

С чего бы это был стеб? Вам доводилось учить людей программированию?

Сложный язык с опциональным gc нужен во множестве случаев.

В D до сих пор GC обязателен. Без GC его умудряются использовать только отдельные уникумы. А так там даже stdlib без GC может отвалиться.

Гут, сети, бекендов, консольщина, инфраструктура, мобилки (в ldc уже завезли андроид)

Не знаю, что такое «Гут», а в сетях и инфраструктуре GC как-то не сильно приветствуют.

если хочешь HFT то велкам в -betterC

Там уже давно есть тот же C++.

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

а теперь ещё и -betterC подвезли

Этот betterC выглядит как урезанный Rust. И зачем он, если есть Rust, у которого перспектив взлететь в разы больше. Да и либ уже в десятки раз больше.

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

а в сетях и инфраструктуре GC как-то не сильно приветствуют.

А что там делает Go тогда? Почти монополия

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

В ноде их в тысячи раз больше, а толку? Экспрессом одним и пользуемся, vibe.d шикарный сам по себе

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

А что там делает Go тогда?

Походу, мы по разному понимаем «сети и инфраструктуру». По мне, так сети — это сетевой стек и необходимые для него приблуды (начиная от ping/traceroute и заканчивая анализаторами трафика), а инфраструктура — это и http-сервера, и СУБД, и антивирусы, и еще куча всего, что служит прослойкой между ОС и прикладным софтом.

Как-то Go в этих вещах еще не был сильно заметен.

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

В dub 1к пакетов. Учитывая, что 90%, как и везде, - мусор. То остаёмся с сотней либ...

Вот мне нужна либа на работы с SVG - нету.

XML?

This module is considered out-dated and not up to Phobos' current standards.

И всё в том же духе.

Основная причина популярности Go, кроме простоты, это Google, который вливает в него кучу человеко-часов, из-за чего он имеет всеобъемлющую std.

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

Этот betterC выглядит как урезанный Rust. И зачем он, если есть Rust, у которого перспектив взлететь в разы больше.

Rust слишком сложен для массового рынка. D в этом отношении смотрится куда более выигрышно. Фактически тот же C# только системного уровня.

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

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

Имхо, в таком ключе rust привлекательней.

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

Rust слишком сложен для массового рынка.

Это вообще сложная тема.

C/C++ намного сложнее, но ничего.

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

Я писал выше, самая главная проблема D это маленькое сообщество, поэтому специфичных либ может не быть. Однако язык и его инфраструктура незаслуженно обходят стороной. Нужно больше интереса.

umren ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)