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 ()
Последнее исправление: CYB3R (всего исправлений: 11)

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

К чему еще изволите доколупаться?

Я просто хочу показать что заменить макросы ЭТО не сможет. И если и достигнет сравнимого удобства, то только благодаря мощьной ide, которую наверняка скоро не сделают

NextGenenration ★★
()

Использую Python с numpy уже много лет. Очень странно слышать, что питонщики побежали в стан Go. Там же и аналога numpy даже бизко нет. Что касается D, то там что-то подобное пытаются запилить. Если выйдет, будет здорово: у зыка появится большая собственная ниша в виде высокопроизводительного научного программирования.

Vudod ★★★★★
()
Ответ на: Чем это лучше Ada? от Smetchik

Ада отличный язык. Учу его понемногу. Вот скажи мне, как мне в Ада считать текстовый файл, в который написана матрица неизвестного размера? В Д это можно сделать в 3 строчки встроенными функциями (если вектор - то в одну). Сколько нужно писать в Аде кода?

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

Да уже слышали мы много раз о том, что программисты-хомячки хотят писать только на популярных языках и с популярным тулчейном. По этой причине у нас в России засилие пэ-аш-пе-шников.

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

Ты учи лучше D, а не Ada. На D можно писать конкурентный софт, один только vibe.d чего стОит!

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

Кстати, очень нужен. Если запилят-таки удобную работу с матрицами, будет классная замена для Python+numpy.

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

Вообще-то благодаря CTFE и traits'ам 500 алиасов сделать вообще не проблема - сама считает все методы модуля, и сама применит нужные шаблоны.

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

Вот есть модуль. Как мне сделать все методы мемоизированными? Или вот вторая ситуация - мне надо чтоб некоторые методы сообщали в лог о своём вызове. Тут тоже есть какой-то инструмент, или придётся руками делать?

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

Можно сделать что-то вроде этого:

class FastModule
{
    import Module;
    auto opDispatch(string m, Args...)(Args args)
    {
       return mixin("memoize!".m)(args);
    }
}

мне надо чтоб некоторые методы сообщали в лог о своём вызове

Некоторые?

Точно также пишешь шаблон который пишет в лог имя функции и вызывает её и используешь его с alias'ами с новым модулем. Или точно такой же класс с opDispatch'ем пишешь...

В общем есть средства. Не нужны уже никакие макросы. Вообще хотели завезти AST-макросы, даже слово зарезервировали «macro», но - цитирую с форума - «however it was found that string mixins (an already existing feature) were already as powerful as the proposed AST macros.»

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

будет классная замена для Python+numpy

ученые ненавидеть и не хотеть понимать такой синтаксис, где там куда ~ {} . .! * >> & и в каком контексте чего из этого означает. Потому в той среде царят фортран и питон.

arkhnchul ★★
()

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

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

в области научных исследований

Русские физики выбирают D?

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

румынского наверное? да и он же просто со-автор, D это подделие американского программиста

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

Coedit

Который внезапно написан в Lazarus. О чем это говорит?

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

Чем это лучше чем Ada?

Да это будет слегка многословнее. Но в D, как там с реальным временем, там есть что-то типа SPARK, есть там что-то типа ASIS, что в D творится с числами с фиксированной точкой, ввобще D может так же как Ada в типы, D может в пользовательские пулы памяти? Это типа к тому, что вы выбрали маленькую толику D. удобную вам для сравнения, а что там с остальным в D?

Smetchik
()
Ответ на: Чем это лучше чем Ada? от Smetchik

С реальным временем пока не очень. Типа SPARK нету, есть betterC. Ниши языков пересекаются частично. Лучше с Адою сравнивать Руст.

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

Произвольные срезы по любому измерению, в том числе с шагом, отличным от 1.

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

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

ada кстати где-то за пределами оборонки сша существует?

Дык вроде как Ada до сих пор применяется в mission-critical софте для авиации, космоса, транспорта и медицины (вне оборонных заказов). Конечно, ее сильно подвинули C++ и Java в последние лет 15, но там инерция такая мощная, что Ada еще долго будет жить.

Вроде как для WindRiver-а Ada — это один из немногих инструментов для разработки софта (наряду с C и C++). А WindRiver широко используется в узких областях :)

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

В Фортране встроено. Ну а в Питоне это тоже как бы в сторонней библиотеке — numpy, но фактически на неё половина питоновского софта завязана. Первое, что стали пилить для Андроида и для PyPy, — это numpy.

К тому же, уже есть срезы одномерных массивов, что бывает удобно.

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

Можно сделать что-то вроде этого:

Что означает импорт модуля внутри класса? Методы из модуля становятся доступными только внутри класса? Args... это переменное число аргументов? (Args args) что это? Вроде не тип возвращаемого значения. В какой момент вызывается opDispatch? string m это что, имя метода? Ошибки в написании будут всплывать только в рантайме?

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

Args... это переменное число аргументов?

Это variadic templates.

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

а также отсутствием как хайпа

После хайпа как-раз зрелость начинается, люди начинают просто использовать инструмент, осознанно, а не как в период хайпа, когда никто не понимает что это, но все усиленно делают, ну или по крайней мере говорят об этом.

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

После хайпа как-раз зрелость начинается

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

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

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

Как то так.

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

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

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

После хайпа как-раз зрелость начинается, люди начинают просто использовать инструмент

Во время хайпа его тоже тупо используют. Просто о нём ещё и говорят. А будет ли развитие после хайпа - большой вопрос.

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

Во время хайпа его тоже тупо используют.

Не всегда. Например, о расте трещат без умолку, но никто еще не видел рабочих проектов.

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

А олдскул вечен как классическая музыка

Классическая музыка просто существует больше чем текущая. Не в последнюю очередь по тому что это самоподдерживающаяся иллюзия. Её к примеру усиленно форсят в школе. Если текущую форсить, то она тоже будет долго существовать. Но это не делает классику ценнее чего-то обычного и наоборот

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

но никто еще не видел рабочих проектов

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

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

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

обычно это происходит так

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

Что означает импорт модуля внутри класса? Методы из модуля становятся доступными только внутри класса?

Ну, да. Хотя я так никогда не пробовал делать.

Args... это переменное число аргументов?

Переменное, только это аргументы не функции, а шаблона. А аргументами шаблона обычно (не всегда) являются типы.

(Args args) что это?

А это уже аргументы функции.

В какой момент вызывается opDispatch?

В момент когда ты написал вызов несуществующего метода класса. Во время компиляции будет проверено верен ли написанный в этом шаблоне mixin. Если ты написал туда несуществующий метод в модуле вообще, то будет ошибка во время компиляции. Если ты написал неверные аргументы функции, также ошибка во время компиляции..

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

Спорно. QtC пилит коммерческая контора уже 8 лет, и он ещё много чего не умеет (зато умеет кучу мусора).

RazrFalcon ★★★★★
()

Вроде как книжку переводят новую ? Где можно посмотреть?

shpinog ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.