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)

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

И в чём же заключается ошибочность моих рассуждений?

Вероятно в том, что вы пытаетесь говорить о том, в чем не разбираетесь.

В том что на крестах ядра не пишут?

Linux-овые и BSD-шные не пишут. Соответственно, кучу уязвимостей находят именно в С-шном коде.

И потом, разве си тщательнее проверяет код?

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

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

Ну тогда подтвердите свои слова. А то пока получается именно так: вы приписали мне то, чего я не говорил.

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

Рискованным по совокупности факторов: наличию большого количества библиотек

Рискованно ли сейчас начинать проект на крестах?

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

Вероятно в том, что вы пытаетесь говорить о том, в чем не разбираетесь

Конкретная ошибка в чём?

Linux-овые и BSD-шные не пишут. Соответственно, кучу уязвимостей находят именно в С-шном коде.

Поэтому неправильно поливать помоями C++ приводя в качестве аргумента дырявость софта на C.

Не в ядрах уязвимостей не находят?

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

В том что на крестах ядра не пишут? Ну подставь вместо ядре браузер.

Приведи пример нормального браузера на другом языке.

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

Конкретная ошибка в чём?

В ДНК.

Не в ядрах уязвимостей не находят?

Ну так и приводите примеры таких уязвимостей.

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

Не в ядрах уязвимостей не находят?

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

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

Разумеется не привет миру

А конкретнее? Я же не телепат, чтобы узнать, о каких проектах вы думаете.

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

Приведи пример нормального браузера на другом языке.

Твоё утверждение лишь подтверждает моё.

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

Ну так и приводите примеры таких уязвимостей.

Мне лень искать на багтрекере конкретные примеры. Ты отрицаешь наличие уязвимостей как таковых?

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

Мне лень искать на багтрекере конкретные примеры.

Ну а пердеть в лужу не лень?

Ты отрицаешь наличие уязвимостей как таковых?

Нет. Однако, когда уязвимости в C-шных проектах приписываются как недостаток языка C++, то это уже определенным образом характеризует говорящего.

Например проект для работы с json

Молодой человек, скажите честно, вы дурак? Или вам еще 15-ти не исполнилось?

Что за «проект для работы с json»? Написать свой парсер JSON-а на C++ — это нисколько не проблема и нисколько не риск. Тут скорее вопрос здравого смысла: «Зачем, если их уже несколько десятков, всяких разных и разнообразных».

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

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

Тут уже примеры из vibe.d привели, очень интересно.

Но с меньшей болью для кого? Разработчика парсера или пользователя парсера?

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

макросы

Ахахаххахахаха.

^ Истеричный смех, потекли слёзы боли.

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

проект для работы с json

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

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

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

вот это тоже.

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

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

Чего непонятно то? Просто аттрибуты, которые можно использовать и это удобно. В какой-то ORM для дишки, кажется hibernated вроде в структурах так можно связи помечать - ну типо пишешь над полем @ManyToMany - и все отлично.

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

Однако, когда уязвимости в C-шных проектах приписываются как недостаток языка C++, то это уже определенным образом характеризует говорящего.

Какая ошибка, которую легко можно допустить в си, но невозможно в крестах?

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

количество телодвижений в D растет.

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

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

Какая ошибка, которую легко можно допустить в си, но невозможно в крестах?

Например, автоматический кастинг из void* к любому другому типу указателя. Например, вот это валидный C:

void * f() { return 0; }

int main()
{
	char * a = f();
}
но невалидный C++.

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

Например проект для работы с json

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

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

Разве в плюсах доступны пользовательские атрибуты?

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

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3984.pdf

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

Ага. Нашёл вроде бы: https://dlang.org/spec/attribute.html#uda
Эпично:
enum EEE = 7;
@(«hello») struct SSS { }
@(3) { @(4) @EEE @SSS int foo; }

Вот описание атрибутов:

https://tour.dlang.org/tour/ru/gems/attributes

Любой функции и любому типу в D можно назначить атрибуты, определяемые пользователем:

Любой тип, как встроенный, так и определяемый пользователем, можно использовать как атрибут функции. В данном примере функции foo() назначается два атрибута: «Hello» (тип string) и Bar (тип Bar со значением 10). Чтобы получить список атрибутов функции, используйте встроенный типаж __traits(getAttributes, Foo), который возвращает TypeTuple.

UDA позволяют обогатить обобщённый код, открывая новую метрику для типов, что помогает генераторам кода, работающим во время компиляции, подстроиться под конкретный тип.

В Dlang tour много интересного.

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

Пример аннотации в HibernateD ORM

@Entity("Person")
class Person {
    @Generated
    int id;
    
    @Column @NotNull
    string firstName;
    
    @Column @NotNull
    string lastName;
    
    @OneToOne @NotNull
    @JoinColumn("more_info_fk")
    MoreInfo moreInfo;
}

Можно использовать как в Java, но обрабатываются они в compile time.

Buggins
()

у меня gdc чот не работает

gdc main.d 
/usr/include/d/core/stdc/stdarg.d:48:23: error: undefined identifier '__va_list_tag'
     alias __va_list = __va_list_tag;

чозахренть? код обычной хеловорд.

anonymous
()
Ответ на: комментарий от anonymous
➤ gdc --version
gdc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 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.

➤ dmd --version
DMD64 D Compiler v2.076.0-dirty
Copyright (c) 1999-2017 by Digital Mars written by Walter Bright

Собирают.

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

УМВР, gdc 7.2.0 убунтовской сборки.

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