LINUX.ORG.RU

DMD 2.015 & DMD 1.031

 , ,


0

0

17 июня вышла новая версия экспериментальной ветки компилятора языка D. Большая часть идей для последней версии, по словам Уолтера Брайта, принадлежит Андрею Александреску. Основные изменения:

  • Шаблонные функции теперь могут автоматически определять свой возвращаемый тип.
  • Возможность указывать ограничения для шаблонных параметров.
  • Шаблонные alias параметры теперь могут быть литералами.

И пара десятков багфиксов, которые также были бэкпортированы в DMD 1.031.

>>> Подробный Changelog по версиям со ссылками на скачивание

★★★★★

Проверено: maxcom ()

Что-то давно новостей не было про DMD. Пора просвещать народ.

naryl ★★★★★
() автор топика

Замечательно, что язык развивается!

Atlant ★★★★★
()

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

import std.stdio; - чем сишный стиль не понравился? или спецом так сделали, чтоб выделится - ну так не стоит тогда было давать название D, т.к. судя по всему в конечной редакции этот язык будет похож на С в той же мере, что и java, php и т.д.

if (c_cnt < 10_000_000) о_О

args[1 .. args.length] - да здравствует паскаль( тут это вроде как вырезание части массива ) ? ;)

foreach (j, c; input) - да здравстует VB/C#/Java? :)

auto f = new BufferedFile(arg); - судя по всему в D это ключевое слово стало обозначать, что переменная примет тип по значению - так что разбираясь в чужом коде прийдется сначала искать описание BufferedFile, а потом уже типа который возвращается

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

> import std.stdio;
поскольку язык делит все на модули, то синтаксис лучше изменить, чем запутаться с include позже.

> if (c_cnt < 10_000_000)
можно просто разделять разряды, для уменьшения вероятности ошибится, не хочешь - не используй, не заставляют


> args[1 .. args.length] - да здравствует паскаль( тут это вроде как вырезание части массива ) ? ;)
Копирование части массива в другой массив

> foreach (j, c; input) - да здравстует VB/C#/Java? :)
Этот оператор уже почти у всех есть =)

> auto f = new BufferedFile(arg); - судя по всему в D это ключевое слово стало обозначать, что переменная примет тип по значению - так что разбираясь в чужом коде прийдется сначала искать описание BufferedFile, а потом уже типа который возвращается
Совершенно верно, особенно хорошо при использовании шаблонных функций, классов и т.д.

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

> чесно говоря не впечатлил лично меня D

Ура! :D

> import std.stdio; - чем сишный стиль не понравился?

Тем, что препроцессор - зло. Больше ничем. В качестве побочного эффекта нужно _намного_ меньше времени и памяти для компиляции больших проектов.

> if (c_cnt < 10_000_000) о_О

Можно и так: if (c_cnt < 10000000). ИМХО вариант с "_" читается проще. Считать нолики не нужно.

> args[1 .. args.length] - да здравствует паскаль( тут это вроде как вырезание части массива ) ? ;)

В Паскале так можно? 0_0 На самом деле это определение отрезка из массива, а не "вырезание". Мы определяем отрезок, включающий весь массив, кроме первого элемента. Копирования не происходит. Операция стоит считанные еденицы машинных циклов. Важное отличие отрезков от массивов в том, что на них оператор присваивания действует по значению.

> foreach (j, c; input) - да здравстует VB/C#/Java? :)

Не совсем. Реализация абсолютно другая и более мощная. Можно определить свою коллекцию, которая будет отдавать в foreach хоть пять разных переменных на каждом шагу. И в D2 есть конструкция типа foreach (i; 0 .. args.length), аналог в C у которой for (int i = 0; i < args.length; i++). Не могу понять, чего плохого в foreach?

> auto f = new BufferedFile(arg); - судя по всему в D это ключевое слово стало обозначать, что переменная примет тип по значению - так что разбираясь в чужом коде прийдется сначала искать описание BufferedFile, а потом уже типа который возвращается

В данном случае это будет, конечно же, BufferedFile. А вообще - да. При виде auto myVar = myFunc(); сходу тип не определить, но это считается плохим стилем. Тип переменной должен либо не быть указан вообще ни разу в программе, как например в моём примере: http://rosettacode.org/wiki/Select_from_Array#D , либо в строке с определением указан хотя бы раз. т.е. правильно писать:
auto myObj = new myClass();
myClass myObj = new typeof(myObj)();
или
myObj myVar = myFunc();
но не
auto myVar = myFunc();

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

> я верно понимаю, что программу на с/с++ компилятором D скомпилировать нельзя?

Конечно! Кому нужен C++++? :) Но в большинстве случаев программу на C можно привести к компилируемому виду простым perl скриптом, которых уже штук 5 известно. Например htod (для .h) и bcd.gen. С C++ - без шансов.

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

> я верно понимаю, что программу на с/с++ компилятором D скомпилировать нельзя?

это _совсем_ другой язык.

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

> это _совсем_ другой язык.

именно поэтому я и спросил какое он право имеет называться D, к примеру С++ обратно совместим с С - т.е. является его продолжением

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

Ты не поверишь. Изначально его обозвали Mars, но где-то в пределах первых 20 версий (сейчас примерно двухсотая вышла) фанаты уболтали автора переимановать его в D.

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

>С академической точки зрения есть более интересные языки. Lisp например

Ну да, про лисп вообще отдельный разговор :)

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

> но это считается плохим стилем

почему-то в примере на офф. сайте это не только не считается плохим тоном, но еще и употребляется как можно чаще, даже там где можно просто написать size_t, в результате имеем не код, а "увлекательный" кроссворд - а что возвращается этой функцией? а в следующей строке? и т.д., а какой тип компилятор выберет - long, ulong или size_t? про то как это "облегчит" жизнь разработчикам IDE, которым надо будет реализовывать автодополнение я промолчу

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

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

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

> почему-то в примере на офф. сайте это не только не считается плохим тоном, но еще и употребляется как можно чаще

Э... в каком примере. Среди всех примеров, что я нашёл есть всего одно плохое применение auto. И то в пределах модуля.

> про то как это "облегчит" жизнь разработчикам IDE, которым надо будет реализовывать автодополнение я промолчу

Можешь почитать исходники descent. Там уже всё реализовано. Только он на Java.

Вообще, среди тех, кто написал на D нессколько десятков тысяч строк кода, претензии к языку немного другие и все они записаны багами в Issue Tracker'е. Почему-то сомнения насчёт полезности auto возникают только у тех, кто не пытался их использовать. У меня проблем не возникало ни с IDE ни с vim.

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

Blub falls right in the middle of the abstractness continuum... As long as our hypothetical Blub programmer is looking down the power continuum, he knows he's looking down. Languages less powerful than Blub are obviously less powerful, because they're missing some feature he's used to. But when our hypothetical Blub programmer looks in the other direction, up the power continuum, he doesn't realize he's looking up. What he sees are merely weird languages... Blub is good enough for him, because he thinks in Blub.(c)Paul Graham

naryl ★★★★★
() автор топика

надо же в D:

long double теперь называется real( таки паскаль :) )
int foo( void ); - не компилится( надо int foo(); - прощай красивый код... )
typedef переименован в alias - зачем???
NULL should be replaced with null - почему не оставить (и) NULL???
Multiple Inheritance - No, даже так???
C++ has a tag name space. D does not
Macro text preprocessor - No, ну и как теперь разруливать кроссплатформенный код? а достаточно часто бывает необходимость несколько строчек спецом для MacOS/оффтопика/линукса добавить, можно конечно файлы разные в проект добавлять, а потом оттуда вызывать либо пустышкми либо нужный код - но это ж просто п%здец :)

думаю при близком знакомстве с D появится гораздо большее кол-во претензий, потому подожду года 2-3 - пусть пилят, когда этот язык обкатают на многих серьезных проектах под разными ОС, тогда и можно будет на него посмотреть более внимательно

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

> http://www.digitalmars.com/d/2.0/wc.html

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

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

а уже упомянутый мной "auto f = new BufferedFile(arg);"? :)

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

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

> long double теперь называется real( таки паскаль :) )
:) Видимо всё-таки паскаль. Хотя это начинает походить на поиск поводов для того, чтобы сказать себе "C круче всех".

> int foo( void ); - не компилится( надо int foo(); - прощай красивый код... )
Смотри выше. :) Возможно это связно с тем, что в D void - это тип, который может принимать только одно значение - null, а не волшебное слово, обозначающее отсутствие типа, как в C.

> typedef переименован в alias - зачем???
Не переименован. http://www.digitalmars.com/d/2.0/ctod.html#typedefs alias - сишный typedef.

> NULL should be replaced with null - почему не оставить (и) NULL???
А зачем оставлять? Всё-равно совместимости нет.

> Multiple Inheritance - No, даже так???
Есть для интерфейсов. Как в java. Только оно не нужно. :) Честно.

> C++ has a tag name space. D does not
Вот на это и известные D-программеры жалуются периодически.

> Macro text preprocessor - No, ну и как теперь разруливать кроссплатформенный код? а достаточно часто бывает необходимость несколько строчек спецом для MacOS/оффтопика/линукса добавить, можно конечно файлы разные в проект добавлять, а потом оттуда вызывать либо пустышкми либо нужный код - но это ж просто п%здец :)

http://www.digitalmars.com/d/2.0/pretod.html

> думаю при близком знакомстве с D появится гораздо большее кол-во претензий, потому подожду года 2-3 - пусть пилят, когда этот язык обкатают на многих серьезных проектах под разными ОС, тогда и можно будет на него посмотреть более внимательно

Думаю при близком знакомстве почти все претензии разрулятся сам собой.

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

> а уже упомянутый мной "auto f = new BufferedFile(arg);"? :)

Очевидно BufferedFile. :)

> кстати насчет "препроцессор - зло", у него много применений ...

http://www.digitalmars.com/d/2.0/version.html

> ... возможность делать надстройку над языком( совершенных языков нет ) и т.д. и т.п.

В большинстве случаев - mixin. Если их не хватает, скорее всего это значит, что ты ошибся с выбором языка для решения данной задачи.

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

> Очевидно BufferedFile. :)

опс, сорри, не заметил new :)

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

> typedef переименован в alias - зачем???
он остался, алиас для других целей
>NULL should be replaced with null - почему не оставить (и) NULL???
Ну сделай алиас и все дела
>Multiple Inheritance - No, даже так???
Никогда ни понимал а нафига оно нужно??

>Macro text preprocessor - No, ну и как теперь разруливать кроссплатформенный код?
version (linux){
тута для linux
}
version (windows){
тута для windows
}

а насчет MacOS поддержки _кажется_ пока нету - народу то мало

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

> version (linux){
>тута для linux
>}
>version (windows){
>тута для windows
>}

да - уже дали ссылку, но чесно говоря подобные конструкции являются тем же только примитивным препроцессором

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

>именно поэтому я и спросил какое он право имеет называться D, к примеру С++ обратно совместим с С - т.е. является его продолжением

Так C++ называется C++, а не D :)

Есть ещё C#, несовместимый с C/C++.

Наконец, C не совместим с B.

С чего ты, вообще, предположил, что D должен быть совместимым с C? :)

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

> а насчет MacOS поддержки _кажется_ пока нету - народу то мало

gdcMac есть, но да. Почти все дишники сидят либо на оффтопике, либо на Линуксах.

> чесно говоря подобные конструкции являются тем же только примитивным препроцессором

version сложнее что-то сломать, чем препроцессором. И они являются частью языка и подчиняются общим правилам. Собственно, стадии работы препроцессора при компиляции d нет. version разруливается аж при семантическом анализе.

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

> Никогда ни понимал а нафига оно нужно??

на пальцах - есть красные обьекты и есть квадраты, надо получить красный квадрат :)

практический пример - есть гуевый контроль, он должен уметь:

1. иметь список параметров, уметь выполнять типовые операции над ними, уметь сохранять/загружать состояние в конфиг - есть базовый класс, который все это умеет - I_DataControl
2. собственно отрисовываться( есть базовый класс который умеет только рисовать на произвольном DC - т.е. его можно и нужно использовать не только для гуя, но и для печати, генерации пдф и т.п. ) - I_DrawControl
3. собс-но быть контролем, ес-но уже есть базовый контроль, к примеру wxControl

причем нужно иметь и гуевый обьект и обычный, который будет рисовать себя только при печати, как же поступить... :)

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

>С чего ты, вообще, предположил, что D должен быть совместимым с C? :)

Это я уже читал как "Си чего ты вообще,..."

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

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

wfrr ★★☆
()
Ответ на: удаленный комментарий

Представьте себе тип Утка, у него есть методы Крякать и Ходить. Так вот если некий класс Белка реализует методы Крякать и Ходить, то он реализует интерфейс Утка, без наследования и проч.

http://ru.wikipedia.org/wiki/Утиная_типизация

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

В голодные годы белкам необходим белок, иначе они будут нападать на яйца.

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

Видеть в белке тролля, это первый симптом паранойи.

wfrr ★★☆
()
Ответ на: удаленный комментарий

Почему так много белок на ЛОРе?

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

Кажись это последняя фича перед релизом. В конце осени.

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

>почему-то в примере на офф. сайте это не только не считается плохим тоном, но еще и употребляется как можно чаще, даже там где можно просто написать size_t, в результате имеем не код, а "увлекательный" кроссворд - а что возвращается этой функцией? а в следующей строке? и т.д., а какой тип компилятор выберет - long, ulong или size_t? про то как это "облегчит" жизнь разработчикам IDE, которым надо будет реализовывать автодополнение я промолчу

В C++ 00x ключевое слово auto тоже будет для автодедуцирования типов. Вернее, оно уже зарезервировано в C(?)/C++ как квалификатор (локальная стековая переменная), но бесполезно т.к все локальные переменные и так стековые.

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

> я верно понимаю, что программу на с/с++ компилятором D скомпилировать нельзя?

OMG! А зачем? Почему тогда пых не интерпретирует с/с++ код?

Lumi ★★★★★
()

Язык - помойка. Понабрали конструкций откуда непопадя. Что это за язык, на который стандарта нету и который мутирует от месяца к месяцу? Всем, кому нужен более высокий уровень, чем C++, обратите свое внимание на Ada и Eiffel. На нем хоть серьезные проекты есть. А это - Кубик Александреску. Дурит народ...

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

До семантического анализа все открытое, а дальше каждый сам за себя.

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

Да, но "С" не совместим с "В".
Это как-бы по мотивам "С".

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

>> Язык - помойка. Понабрали конструкций откуда непопадя. Что это за >> язык, на который стандарта нету и который мутирует от месяца к >> месяцу? Всем, кому нужен более высокий уровень, чем C++, обратите >> свое внимание на Ada и Eiffel. На нем хоть серьезные проекты есть. А >> это - Кубик Александреску. Дурит народ...

согласен, лишняя сущность

anonymous
()

Не интересно, даже с академической точки зрения.

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

>> Multiple Inheritance - No, даже так???
>Есть для интерфейсов. Как в java. Только оно не нужно. :) Честно.
Широко известный в узких кругах Гради Буч в одной из книг написал:
- Множественное наследование как парашют. Он не нужен в повседненевной жизни, но бывает очень неудобно, когда он действительно нужен но его нет под рукой.

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