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

а

$ gdc --version
gdc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

нет. хз чего не хватает.

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

99.9999% Я бы сказал что 100%, но может все же есть исключения.

wolph ★★
()

Проблемы Си++ в том, что писать по-нормальному в нём многие не хотят. Даже договориться не могут. Одни используют его как Си с классами, другие везде суют Буст, третьи пишут на шаблонах, четвёртым подавай КуТэСтринг, пятые собирают плюсовым компилятором в основном сишный код с вкраплениями ++ных функций. Каждый уверен, что он прав и все нормальные люди давно должны делать, как он. Договориться очень сложно, а при использовании плюсовых либ становится страшно, т.к. будучи написаны в разное время они имеют совершенно разные внутренности и как к ним обращаться, я не понимаю, как и какие будут ограничения и какой стиль я должен использовать. Для профи Си++ это не проблема, он знает все варианты. Но я не могу так страдать.

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

Простите, а «все верно» — это про что именно?

И к какому пункту из перечня проблем C++ по Vudod-у относится «Видел таких упертых программистов на Си++»?

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

Строки это вечная проблема хз с каких времен. По сути речь идет об выборе между utf8 и utf16. Последний становится все более популярным если бы не сотни софта включая файловую систему которые работают в utf8.

Поэтому некоторые запиливают себе свой с++ с блекджеком и шлюхами как это сделали в qt.

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

Вроде как модно делать внутреннее поедставление в utf32 для простоты индексирования и поиска, а на диске хранить в utf8.

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

а как они символы, который длинее 16 бит обрабатывают? Вот например 𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩 вполне себе может запинаться в строку qtшную.

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

ах да. Это символы вот из такого ренджа

for i in 120016..(120016 + 25) { io.put(char(i)) }
anonymous
()
Ответ на: комментарий от dave

Тем не менее, мне не понятно, к какому именно месту из перечня тов.Vudod-а относится «Видел таких упертых программистов на Си++».

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

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

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

По сути речь идет об выборе между utf8 и utf16.

Э.... Как бы варианта то и нет. utf16 мертворожденное нечто запихнутое кем-то в API кое-чего.

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

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

Ну да, голову включать нужно, есть такое.

Поскольку C++ применяется и в системах реального времени, и в GUI приложениях, то очевидно, что не может быть какого-то одного «правильного C++» для всех. В low-latency и real-time областях будет свое подмножество языка и свой набор инструментов, в GUI — свой, в тяжелых вычислениях — свой.

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

Понятно, что далеко не у всех есть время и желание с этим разбираться. Речь о том, что C++ может позволить вам создать нужный вам инструментарий, который мало в чем будет уступать тому, что есть из «коробки» в каком-то другом языке. Чем, собственно, многие в области вычислительной математики и пользуются уже лет 30.

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

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

Для этого и есть в фирмах и группах разработки свободного ПО стандарт кодирования.

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

Понятно, что далеко не у всех есть время и желание с этим разбираться. Речь о том, что C++ может позволить вам создать нужный вам инструментарий, который мало в чем будет уступать тому, что есть из «коробки» в каком-то другом языке. Чем, собственно, многие в области вычислительной математики и пользуются уже лет 30.

Это удел профессиональных программистов. И этот самопал все равно будет проигрывать специализированным решениям по удобству и надежности.

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

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

Для вменяемого человека наиболее естественно пойти первым путём, а второй он выберет в двух случаях: когда выбора нет и если начальство приказало. Или если он до этого уже изучал Си++.

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

не не не.

А как он длину строки за O(1) получит при этом? длина строки 26. Или ты имеешь сказать, что он будет анализировать ее за O(n) на предмет пар? И нах тогда нужен такой UTF если то же самое с utf8 получится?

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

напишите разработчикам qt жавы и браузеров что вы против. им важно ваше мнение.

алсо, длина строки это количество двухбайтовых символов в ней. любых.

а вы, судя по тому, что пишете один из тех, кто печатную длину строки по длине в байтах вычисляет. а потом им С++ виноват.

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

А как он длину строки за O(1) получит при этом?

Длину можно отдельно хранить, кстати о какой длине речь?

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

По существу товарищ сказать не имеет, т.к. ты, анонимус, прав. Но просто разрабы КуТей насрали га тех, кому нужны эти редкие дополнительные символы.

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

Сильно зависит от того, что именно вкладывается в «решить некую задачу». Бывает, что в задаче расчет одноразовый. И не важно, будет ли расчет идти час, шесть или сутки. Такие вещи и раньше делали на чем придется, хоть на Basic-е.

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

Вот лет 15-20 вопроса вообще не стояло: нужно считать быстро — значит выбор между Fortran и C++. Ну или Pascal-ем.

Сейчас, видимо, ситуация поменялась. Тем не менее, там, где скорость расчета все еще важна, Fortran и C++ используются. И учить в XXI-ом веке Fortran вряд ли перспективнее, чем подмножество C++.

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

а мужики то не знают. везде в приличных местах кроме gtk utf-16

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

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

а вы, судя по тому, что пишете один из тех, кто печатную длину строки по длине в байтах вычисляет. а потом им С++ виноват.

Как бы он тебе как раз о четырехбайтовых последовательностях в utf-16 говорит.

Получается ты себя обоср...

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

А вот и насчет заточки на бордель.

One main reason to use UTF-16 as the internal representation is that it makes it fast to use them with native unicode APIs' on the Mac OS X and Windows (which expect UTF-16).

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

Да, больных на голову хватает.

аабаснуйте.

мы используем MPIR, например, в которой цпп только обертки над сишным кодом. А вся либа (форк GNU MP) на си. 6 лет полет нормальный, проблем ни разу не было.

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

мы используем MPIR, например, в которой цпп только обертки над сишным кодом.

Так с хрена ли вам обертки на C++? Писали бы сразу на C. Что останавливает?

Ну или Eigen на чистом C запилили бы. То-то профит был бы.

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

Так с хрена ли вам обертки на C++?

именно. нах они не нужны. они просто в либе идут

Ну или Eigen

зачем нужно это говно, если есть GSL или даже clapack?

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

Так с хрена ли вам обертки на C++? Писали бы сразу на C. Что останавливает?

Ну пишешь, например, на Matlab, а там где надо быстро на Си. Зачем тут C++?

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

Ну пишешь, например, на Matlab, а там где надо быстро на Си. Зачем тут C++?

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

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

а нафига нужно 32бита?

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

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

именно. нах они не нужны. они просто в либе идут
зачем нужно это говно, если есть GSL или даже clapack?

Она как, у нас тут признанный эксперт. Можно посмотреть на ваш вычислительный код, который на чистом C написан?

Ну дабы понять, откуда взялась оценка «говно».

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

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

Ты правда такой дурачок, или прикидываешься?

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

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

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

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

чего только умученные от С++ не придумают чтоб на С++ гавкнуть.

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

чота знакомое в словах ... ах да. KOI-8 хватит всем, нахуя мне юникод, я только латиницу и кирилицу пользую (с)

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

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

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

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

а можно просто выбирать язык под нишу

Это слишком сложная идея для eao197. :)

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

По теме есть что сказать?

Я, например, видел вычислительный код на Pascal, на C и на C++. Там, где дело касается операций с матрицами, писать на Pascal и C могут разве что упоротые мазохисты. Которым «удобнее» баги в своих простынях неделями искать, чем перегрузку операторов с C++ освоить. Не говоря уже про копипасту там, где в C++ рулят шаблоны.

Ну так что, код покажете, экспертный вы наш?

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