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)
Ответ на: комментарий от RazrFalcon

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

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

Но если си не считать простым, тогда и яву тоже. Относительные оценки же.

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

И «простой» С не позволяет получить хороший результат для сложного проекта.

Спорно, gtk, linux достаточно сложные проекты?

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

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

Вы беретесь судить о том, чем никогда не пользовались

a selling point какой? как в c++ сейчас вливается новая кровь? это вообще происходит?

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

Не хочу рушить вашу стройную теорию, но я и на Python пишу.

Начать с того, что их два несовместимых с очень тонкими различиями.

То есть JVM и Dalvic - это одно и то же, и работает идентично?

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

a selling point какой?

Кому и что продавать? ;)

Если вам нужно делать что-то околосистемное, с высокими требованиями к производительности и ресурсоемкости, где языки с GC не живут, то выбор у вас совсем небольшой. Либо C, либо C++. Может быть у вас еще будет возможность включить в свой выбор Ada и Rust.

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

как в c++ сейчас вливается новая кровь?

В смысле? Приходят ли новые люди? Начинают ли новые проекты?

Приходят. Начинают.

Компиляторы C++ные сейчас развиваются просто семимильными шагами. По сравнению с тем, что было где-то в 2005-2007, так даже не сравнить. Новые стандарты каждые 3 года штампуют. Языком с выходом каждого нового стандарта пользоваться все проще и приятнее.

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

Спорно, gtk, linux достаточно сложные проекты?

GTK - монстр с попыткой создать ООП на макросах.

linux - ядро. C++ на эту нишу и не претендует.

Правда вот гугл начал пилить Fuchsia, в которой C++ преобладает.

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

C++ на эту нишу и не претендует.

С++ (урезанный, но С++) давно используется в ядрах коммерческих ОС. В той же Windows, например.

Отсутствие C++ в ядре Linux-а — это старая история, берущая корни в резкий высказываниях Линуса Торвальдса :)

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

На чём написан win - хз. Сорцы то закрыты. Но всё остальное тоже на C. Все эти маки, bsd, солярисы и прочие.

Просто наблюдение. Разработка ядра ОС не моя специальность.

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

С самого своего рождения. Она намного проще С++ это, надеюсь, не будешь оспаривать?

Про Java 2 слышал?

Был перелом, когда решили нах... простоту. И стали делать то что нужно к 8-й версии им даже пользоваться стало можно.

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

Правда вот гугл начал пилить Fuchsia, в которой C++ преобладает.

Что-то не видать там С++ в ядре...

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

На чём написан win - хз.

На LOR-е эта тема уже всплывала. Один раз так точно.

Сорцы то закрыты.

Сорцы утекали в сеть. Да и сам MS об этом говорил, емнип, в конце 90-х.

Но всё остальное тоже на C.

Те, которые берут корни из лохматых Unix-ов — да, безусловно.

Новые ОС на разных языках пишут. В том числе и на C++. Например, IncludeOS.

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

На си - древние кодовые базы. Идущие чуть ли не из 70-х. И разработчики там ... древние. Много железячников, которые кресты не осиливают.

Там где идет бодрая коммерческая разработка ОС с нуля - там C++ неплохо себя чувствует. Некоторые L4, OSv, Kaspersky OS и другие подобные.

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

Был перелом, когда решили нах... простоту. И стали делать то что нужно к 8-й версии им даже пользоваться стало можно.

Все познается в сравнении, по сравнению с С++ - примитив.

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

Чот его ваще давно не видно ни в одной теме. запил чтоль?

Он еще несколько месяцев назад сказал, что у него работы выше крыши и на LOR он в очень редких случаях заходит.

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

Ну покажи мне что-то типа

Vector < ? extends aClass>

Vector < ? super aClass>

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

Языком с выходом каждого нового стандарта пользоваться все проще и приятнее.

Старое все из языка что-ли убирают? почему проще?

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

Потому что старое становится ненужно.

И это удаляют из языка?

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

Старое все из языка что-ли убирают? почему проще?

Старое не сильно убирают, ибо совместимость.

Добавляют новые фичи, которые упрощают то, что раньше делать было либо муторно, либо вообще непонятно как.

Ну вот на пальцах. В C++98 со стандартными алгоритмами рекомендовалось использовать functor-ы. Допустим, нужно было найти первый элемент последовательности, который попадает в диапазон [l..r]. В старом C++ это можно было записать как-то так:

class in_range : public std::unary_function<int, bool> {
  int l_;
  int r_;
public:
  in_range(int l, int r) : l_(l), r_(l) {}
  bool operator()(int v) const { return l_ <= v && v <= r_; }
};
...
my_sequence::iterator it = std::find_if(seq.begin(), seq.end(), in_range(10, 120));
В С++11 добавили лямбды и вывод типов, поэтому тоже самое теперь можно записать как:
auto it = std::find_if(seq.begin(), seq.end(), [](int v) { return 10 <= v && v <= 120; });
В C++14 пошли еще дальше, теперь можно делать лямбды полиморфные, т.е. не нужно выписывать типы аргументов явно, они выводятся:
auto it = std::find_if(seq.begin(), seq.end(), [](auto v) { return 10 <= v && v <= 120; });
Вроде мелочь, но в обощенном коде сильно помогает.

В C++11 сделали variadic templates. То, чего раньше не было, и что в том же Boost-е костылили через простыни макросов. В C++17 работу с variadic templates упростили за счет if constexpr.

В C++11 сделали возможным выводить тип результата функции, что было очень важно в шаблонах. Например:

template<typename T, typename U> ? add(T a, U b) { return a+b; }
Тут в C++98 непонятно было, что писать вместо вопросика. Особенно, если T и U — это не банальные int и short, а какие-то пользовательские типы. В C++11 стало можно писать:
template<typename T, typename U> auto add(T a, U b) -> decltype(a+b) {
  return a+b;
}
А в C++14 сделали еще проще:
template<typename T, typename U> auto add(T a, U b) {
  return a+b;
}

В общем, с 2003-го года в C++ вошло столько мелких и не очень изменений, что теперь это в прямом смысле другой язык. Особенно сильно это ощущаешь, когда приходится в C++98 погрузиться и подправить что-то в древнем коде.

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

справедливости ради - он идет как обертка над сишным апи + с ограничениями на конструктор и деструктор.

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

надо идти еще дальше

Не надо. Где здесь вставить ограничения на типы a и b?

Они одного типа или разного?

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

Они одного типа или разного?

ГосподьКомпилятор рассортирует (с)

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

fk!

 auto add(auto a, auto b) { return auto(a + b) - auto { }; }
anonymous
()
Ответ на: комментарий от eao197

Т.е. я открою кодовую базу на цпп и увижу все эти варианты? Грустно, спасибо за предупреждение. Буду обходить за километр.

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

надо идти еще дальше

auto add(auto a, auto b) {
  return a+b;
}

В D это будет

auto add(T, U) (T a, U b) {
    return a + b;
}

С ограничением на типы a, b - только числовые:

auto add(T, U) (T a, U b) if (isNumeric!T && isNumeric!U) {
    return a + b;
}
Buggins
()
Ответ на: комментарий от Buggins

вот за что мне нравится D. Тут с ходу можно сказать, что происходит, в отличае от трехэтажных шаблонных матов с std::enable_if сотоварищи

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

Т.е. я открою кодовую базу на цпп и увижу все эти варианты?

Вы еще представье, что вы увидите в кодовой базе на Fortran-е, если выберете его для решения вычислительных задач :)

Ну и да, покажите что-нибудь получше в языке без GC. Ну так, для общего развития.

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

А результат будет иметь какой тип?

В Rust нет привидения типов, поэтому так:

fn add<T: Num>(a: T, b: T) -> T {
    a + b
}

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

Хз, у нас дата саентологи живут на python + r и горя не знают, сам бы разчехлил на крайняк numpy и все, нафига им плюсы?

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

Хз, у нас дата саентологи живут на python + r и горя не знают, сам бы разчехлил на крайняк numpy и все, нафига им плюсы?

У вас «дата саентологи» расчитывают прочность фундаментов методом конечных элементов? Или распределение тепла по лопастям турбин методом граничных элементов?

Ну и вы интересные вопросы игнорируете, так что повторю:

Ну и да, покажите что-нибудь получше в языке без GC.

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

У вас «дата саентологи» расчитывают прочность фундаментов методом конечных элементов? Или распределение тепла по лопастям турбин методом граничных элементов?

Для этого есть специализированный софт.

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

Ну они там модели строят по терабайтам данных, куча каких-то расчетов, я не специалист, но думаю это не проще для вычисления того о чем вы говорите

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

Ну и да, покажите что-нибудь получше в языке без GC.

Давайте по порядку разберёмся зачем ВАМ язык без gc?

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

Т.е. нормальных ответов и примеров вы привети не можете.

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

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

Давайте по порядку разберёмся зачем ВАМ язык без gc?

Естественно, что для написания софта, который экономно относится к ресурсам, и имеет приличное быстродействие. В основном, из области middleware.

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

О каком конкретно софте идет речь? Мне интересно из вашей теории перейти к практическим примерам, может я чего-то не знаю.

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

О каком конкретно софте идет речь?

Какая разница? Например, аналоги RethinkDB, Couchbase, ClickHouse. Или аналоги RabbitMQ, HiveMQ. Или альтернативы BIND9. Или что-то вроде BGPMon.

Мне интересно из вашей теории перейти к практическим примерам, может я чего-то не знаю.

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

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

Какая разница?

Большая

апример, аналоги RethinkDB, Couchbase, ClickHouse. Или аналоги RabbitMQ, HiveMQ.

Кролик - на эрланге, HiveMQ - жаба, рефинк вроде сдох давно, а вы решили написать свой кликхауз? просто ниша дб, мидлварей и прочего, сейчас весьма сомнительна для нового проекта на плюсах, sql базу новую писать смысла нет, мидлвар пишется на языках с гц, какой смысл то? или вам по фану?

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

ну и да cockroach тот же на го отлично заходит

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