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

В новых книжках - нет.

boost тут при чём? shared_ptr/unique_ptr уже давно в std.

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

Нет где? Чуть ли не в любой книжке «выучи кресты» обязательно есть пунтк про указатели. Далеко не все могут взять и использовать boost или что-то вроде этого

все что издано до 2012 года можно уже не читать - устарело

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

Чуть ли не в любой книжке «выучи кресты» обязательно есть пунтк про указатели.

Вы путаете указатели как концепцию и указатели как результат работы с динамической памятью.

Понимать указатели как концепцию нужно. Особенно если придется сталкиваться с адресной арифметикой. Хотя бы для возможности использовать указатель как итератор.

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

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

Хедеров не хватает?! Шутка века.

У них на форуме это обсуждалось. Нужно четкое разделение на интерфейс и реализацию. Ну про ABI.

Иначе в системещине не уживуться.

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

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

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

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

А так - ненужно.

пи..нул как господь. Хорошо, что ты не системный разработчик.

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

Потому что не было никакого резона. В 2000-ные я писал в основном на Фортране (на Паскале перестал писать в 2001 на четвёртом курсе). Там встроенные операции с массивами, включая перемножение, а также взятие от них любых элементарных функций. Есть маскированные массивы, всякие удобности типа where, поиск номера максимального/минимального элемента в массиве по одному из измерений одною функцией.

С 2009 перешёл главным образом на Питон, т.к. он гораздо проще и благодаря numpy позволяет делать примерно то же и даже лучше.

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

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

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

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

Понятно. Спасибо, что нашли время ответить.

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

Нет, он вызывается не явно. Каждый раз когда вызывается несуществующий метод класса, он переписывается как opDispatch!«имя метода»(args). Если, конечно, opDispatch объявлен.

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

Причем все это можно было сделать 15 лет назад и все эти 15 лет спокойно заниматься тяжелыми вычислениями.

С использованием фортрана нельзя было 15 лет заниматься тяжёлым вычислениями?

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

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

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

оо! Баггиннс живой! Недавно тебя вспоминали в теме про кулридер.

CoolReader не очень живой, слегка надоел.

В планах - переписать на D.

Пока что портировал GUI библиотеку из CoolReader GL на D: https://github.com/buggins/dlangui

Рендеринг XML/CSS (нужный для читалки) - в процессе.

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

неплохо. буду потестировать, если что. репа уже есть для D версии? под андроид, кста, как у него дела у этого dui?

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

неплохо. буду потестировать, если что. репа уже есть для D версии? под андроид, кста, как у него дела у этого dui?

Репы CR на D нет.

Андроид в DlangUI поддерживается частично.

Приложение на DlangUI можно без дополнительных исправлений собрать под Android.

Демки от dlangui - apk собранные под Android (тетрис, minecraft, helloworld):

https://sourceforge.net/projects/crengine/files/DlangUI/

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

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

Охотно верим

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

Даже не включая мозги ясно, что из комментария никак не следует какой будет профит потом от перехода с фортрана на c++, особенно после использования первого 15 лет.

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

Можете патч просмотреть на гитхабе, если он не очень страшный? Патч, а не гитхаб :)

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

Писать без владеющих указателей можно и нужно уже лет 20 как.

RazrFalcon Я уже не помню какой код вызывал проблемы, сейчас вроде накидал по памяти. И да, я уже не помню почему писал именно так, а не иначе

#include <iostream>
 
using namespace std;
 
int * test() {
	int r[3] = { 0, 1, 2 };
	return r;
}
int main() {
	int * r = test();
	cout << r[0] << r[1] << r[2];
	return 0;
}

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

нет, если все файлы в одной директории, то хватит и 5-6

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

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

Это С, а не С++

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

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

И компилятор о них заботливо молчит.

warning: address of stack memory associated with local variable 'r' returned [-Wreturn-stack-address]
    return r;
           ^

Емнип даже неинициализированные переменные можно использовать, если флаг не поставить.

В том же qmake, -Wall по умолчанию.

C++ ужасен, спору нет. Но не настолько, как вам хотелось бы.

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

Ну да, если фокусы компилятора для вас это магия

Спасибо, я уже с postsharp пообщался. А тут это не просто сторонний пакет, а часть языка

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

В C++ давно умные указатели.

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

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

В том же qmake, -Wall по умолчанию.

Да, да есть ключи. Только вот зачем, для какой тайной цели это вынесли в отдельные ключи, когда можно было сделать неотъемлимой частью компилятора?

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

Но не настолько, как вам хотелось бы

Возможно я и ослеплён ненавистью, но она не беспричинна

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

Вам не угодишь. То вы хотите быстро и легко 500 методов модифицировать, то теперь не нравится реализация в языке...

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

Вам не угодишь

Макропроцессор. Если над этим хорошо подумать(а зачем в 2017 году выпускать язык не подумав над ним), то не будет какой-то магии, для поддержания которой нужны особые ритуалы. Просто в случае с postsharp я наткнулся на проблему состоящую в том что из-за ошибки метода кидалось исключение, а поскольку код уже успел перекроить postsharp строка ошибки не показывалась. Хорошо что это был простой случай, и я нашёл ошибку отключив аспект за пару минут. Будь это какой-то сложный случай, когда аспект сильно модифицирует код, мне бы пришлось отлаживать через Console.WriteLine

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

Макропроцессор.

Как в C, да? Когда как раз теряется вся информация о номере строки ошибки.

В D как раз вся магия никак не теряет номера строки ошибки.

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

Как в C, да?

Емнип там он называется препроцессор. Как в лиспе - манипуляцией с ast

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

Не всё так плохо на крестах. Чтоб обмануть современный компилятор нужно временный указатель/итератор через нелокальную переменную или через функцию пропустить.

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

И да, я уже не помню почему писал именно так, а не иначе

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

И да, C++ таким создавался специально.

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

Замыкания есть. Что такое вложенные функции не знаю.

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

Т.е. вы хотите сказать, что вот этот фрагмент:

class User {
public :
  template<typename JSON_IO>
  void json_io(JSON_IO & io) {
    io & json_dto::mandatory("id", _id)
      & json_dto::mandatory("name", _name)
      & json_dto::mandatory("birthday", _birthday)
      & json_dto::mandatory("phone", _phone);
  }
};
На D будет выглядеть сильно лучше?

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