- PVSM.RU - https://www.pvsm.ru -

Разрушая распространённые мифы о D

Оригинальный текст: semitwist.com/articles/article/view/dispelling-common-d-myths [1]
Reddit: www.reddit.com/r/programming/comments/118y4m/dispelling_common_d_myths/ [2]

Вступление

Как постоянный пользователь и поклонник языка D [3], я не мог не заметить ряд заблуждений и недопониманий, которые регулярно встречаются среди новичков.

Все эти заблуждения вполне объяснимы. Многие связаны с проблемами, которые играли важную роль в прошлом, так что не удивительно, что эти устаревшие представления продолжают существовать. Мне кажется, что это как раз те области, которые сообщество D должно как можно лучше объяснить остальным программистам. Вот эти темы:

  • Для D есть IDE
  • DSource угасает, но проекты на D активны как никогда ранее
  • Разделения на D1 и D2 больше нет
  • Phobos — стандартная библиотека? А как же Tango?
  • D — open source
  • D позволяет ручное управление памятью
  • Статическая типизация НЕ означает непродуктивность

Для D есть IDE

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

DSource угасает, но проекты на D активны как никогда ранее

С регулярностью в пару месяцев возникают вопросы такого рода: «D мёртв? Я зашёл на DSource [7] и все проекты выглядели устаревшими и неподдерживаемыми, а форумы пусты. Складывается ощущение, что D умирает.»

DSource был де-факто местом для хостинга [8] проектов на D. Обратите внимание — БЫЛ. В настоящее время большинство активных проектов переехало на Github и Bitbucket. На самом деле, даже репозитории с референсным компилятором D и стандартной библиотекой расположены на Github [9] вот уже больше года. И за это время темп разработки значительно ускорился, а не наоборот.

Были некоторые поползновения обновить DSource для того, чтобы было проще найти активные проекты среди умерших ( не стоит забывать, что любой хостинг [8] open-source проектов обречён со временем собирать множество заброешнных ). Но в связи с огромной популярностью, которую получили Github и Bitbucket, ценность усилий в этом направлении сочли незначительной.

Хотя, должен признаться, меня огорчает говорить такое про DSource. Я всегда ценил этот сайт и в своё время его существование было чертовски нужным и полезным для инфраструктуры D1, задолго до того как Github и Bitbucket стали обыденностью для почти каждого open-source программиста. Сайт, сетевой канал и сам хостинг [8] были безвозмездно пожертвованы для сообщества D ( и таковы до сих пор! ), так что мне неприятно говорить о DSource в духе панегирика. Но в любом случае, хотя DSource почти не используются в современной инфраструктуре D, сам язык не только очень и очень жив, он развивается прямо на глазах.

Что касается способа поиска активных проектов на D, помимо банальных поисковиков я бы рекомендовал D Wiki [10]. Да, признаю, мы были далеки от совершенства в поддерживании страницы с актуальным списком проектов, но я здесь и сейчас клянусь, что внесу свою лепту и буду напоминать другим пользователям D делать то же самое.

Разделения на D1 и D2 больше нет

D2 — это текущее положении дел. D2 уже считается стабильной веткой, D1 — пережиток прошлого. Забудьте про D1, можете даже не тыкать палочкой, оно мертво.

И когда я говорю «мертво» я не имею в виду тот же вид смерти, что можно представить по аналогии с Python 2. Я имею в виду, что практически никто не больше использует D1. Все уже на D2, даже запоздавшие. D1 достаточно мало используется, что его официальная поддержка прекращается в конце этого года ( как было объявлено год назад ). Никого не волнует D1. Всё, точка.

Есть только D2.

( Примечание переводчика: автор немного погорячился тут с «мертво», скорее «никто не использует D1 для новых проектов, это чистый legacy» )

Phobos — стандартная библиотека? А как же Tango?

Возможно вы слышали о противостоянии Phobos vs Tango. Оглядываясь в прошлое, это была несомненная ошибка D, но проблема была идентифицирована и исправлена. Вкратце суть: Phobos является стандартной библиотекой D, точка. Tango теперь является дополнительной и опциональной, но полностью Phobos-совместимой библиотекой. Как-то так.

Но так было не всегда. Немножко истории для тех, кому интересно:

Давным-давно, во времена молодости D1, задолго до того как Андрей Александреску присоединился к команде, состояние стандартной библиотеки Phobos было далеко не лучшим. Она разрабатывалась от и до одним единственным человеком ( Уолтером Брайтом ), который, конечно же, будучи основным разработчиком языка, был слишком занят работой над языком и компилятором. И по ряду причин она тогда не была полноценным open-source.

Поэтому группа талантливых разработчиков собралась и решила исправить эту проблему, создав полноценную стандартную библиотеку. Её назвали Tango и она была настолько лучше незаконченной Phobos, что стала стандартом де-факто.

К сожалению, для нормальной работы Tango пришлось заменить некоторые низкоуровневые части Phobos, связанные со средой времени выполнения. Библиотеки стали несовместимыми — не было никакого способа использовать обе одновременно. Это, само собой, стало настоящим кошмаром для пиара D.

Тем временем, Phobos стал полность open-source, Андрей Александреску взял на себя руководство его разработкой и понемногу Phobos становился краше и законечнней. В некоторых местах он был чертовски хорош, но это не помогало ключевой проблеме несовместимости Phobos и Tango. Но к счастью, сообщество разработчиков D услышало многочисленные жалобы насчёт двух стандартных библиотек и сосредоточилось на решении проблемы.

На тот момент D2 развивался в качестве основной unstable ветки, в то время как D1 стал stable веткой, в которой запрещены изменения, ломающие обратную совместимость. И для D2 вся функциональность, что создавала несовместимость между Phobos и Tango была переработана и вынесена в отдельную сущность Druntime. Так что тперь и Phobos, и Tango используют Druntime и являются полностью совместимыми. Никакого конфликта больше не существует.

Которую из них стоит использовать? Phobos, если у вас не возникло какой-то специфической потребности в функциональности Tango. Как бы то ни было, но Phobos всё-таки является настоящей стандартной библиотекой.

Что может заставить вас обратится к Tango? Те же причины, что и к любой дополнительной библиотеке: если вам больше нравится её дизайн, как вариант. Tango стилистически намного более похоже на Java и может понравиться перешедшим из этого языка. Или вам потребовалось что-то из Tango [11], чего в Phobos банально нет. Например, в Tango реализован самый быстрый [12] в мире [13] XML парсер [14]. В то же время модуль XML из Phobos входит в число вещей, которые ой как надо бы взять и переписать с нуля. ( Не беспокойтесь, остальная часть Phobos просто великолепна. )

D — open source

Существует 3 основных компилятора для D:

  • DMD: референсный компилятор
  • GDC: использует GCC бэкэнд и находится в процессе включения в основную поставку GCC
  • LDC: использует LLVM

GDC и LDC — самый настоящий open-source, без всяких но, и даже включены в соответствующие разделы репозиториев некоторых дистрибутивов Linux. Стандартная библиотека и среда исполнения, Phobos и Druntime — лицензированы под Boost-лицензией, одобренной Open Source Initiative.

Все исходники DMD доступны на Github [9]. Front-end, который используется так же и GDC c LDC, имеет одобренную OSI Artistic лицензию и так же GPL лицензию.

Единственная вещь, которая формально не является open-source — DMD back-end. Причина — используется вещи, лицензированные в своё время у Symantec и Уолтер не может просто так сменить лицензию. Но исходники публично доступны и pull request'ам всегда рады. Вас беспокоит распространение? Не стоит: просто попросите самого Уолтера [15]. Лицензия обязывает его требовать спрашивать его разрешения ( Прим. переводчика: рад совету, как этот копирастический казус сформулировать по-русски нормально ), но это чисто техническая формальность. Попросите у него, и тут же получите разрешение. Не известно ещё ни одного случая отказа. И да, не забвайте, это касается только DMD, точнее back-end DMD. Всё остальное — open-source без всяких «но», включая два полноформатных компилятора, GDC и LDC.

D — open-source. Не всегда был, но вне всяких сомнений таков сейчас.

D позволяет ручное управление памятью

Хотя в D предполагает наличие сборщика мусора [16] по умолчанию, но это отнюдь не означает, что вы не можете управлять им [17], заменить его или вообще убрать [18], или использовать ручное управление памятью.

В D есть указатели ( элегантно ограниченные безопасными для памяти доступными операциями в safe [19] режиме ) и прямой вызов функций на C. В вашем распоряжении malloc/free и вы можете разместить что угодно в полученной таким образом памяти используя emplace [20]. Или попробуйте стэковые scoped классы [21]. Или счётчики ссылок [22]. Или RAII [23]. Плюс ко всему, сейчас в процессе разработки находится система настраиваемых аллокаторов.

Статическая типизация НЕ означает непродуктивность

D — статически типизированный язык, но это не должно у вас вызывать ассоциации со стилем C++ или Java:

% cat funWithRanges.d
import std.algorithm;
import std.range;
import std.stdio;

void main()
{
	// All done lazily:
	auto squares   = sequence!((a,n) => n^^2)(0);
	auto fibonacci = recurrence!((a,n) => a[n-1] + a[n-2])(1, 1);
	auto fibEven   = fibonacci.filter!(x => x%2 == 0)();

	foreach(v; zip(squares, fibonacci, fibEven).take(6))
		writeln(v[0], "t", v[1], "t", v[2]);
}

% rdmd funWithRanges.d
0       1       2
1       1       8
4       2       34
9       3       144
16      5       610
25      8       2584

D не только продуманный и эффективный [24], но так же безопасный [25] и корректный [26].

Добавьте ещё разные полезные штуки для параллельных выичслений [27], простые шаблоны [28] и инструменты метапрограммирования [29], а так же разные [30] полезности [31], ставшие [16] уже [32] обыденностью [33].

Автор: Volfram


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/17011

Ссылки в тексте:

[1] semitwist.com/articles/article/view/dispelling-common-d-myths: https://semitwist.com/articles/article/view/dispelling-common-d-myths

[2] www.reddit.com/r/programming/comments/118y4m/dispelling_common_d_myths/: http://www.reddit.com/r/programming/comments/118y4m/dispelling_common_d_myths/

[3] языка D: http://dlang.org/

[4] Mono-D: http://mono-d.alexanderbothe.com/

[5] Visual D: http://www.dsource.org/projects/visuald

[6] DDT: https://code.google.com/a/eclipselabs.org/p/ddt/

[7] DSource: http://dsource.org

[8] хостинга: https://www.reg.ru/?rlink=reflink-717

[9] расположены на Github: https://github.com/D-Programming-Language

[10] D Wiki: http://www.prowiki.org/wiki4d/wiki.cgi

[11] что-то из Tango: http://forum.dlang.org/post/k53866$2s71$1@digitalmars.com

[12] самый быстрый: http://dotnot.org/blog/archives/2008/03/12/why-is-dtango-so-fast-at-parsing-xml/

[13] в мире: http://dotnot.org/blog/archives/2008/03/10/xml-benchmarks-parsequerymutateserialize/

[14] XML парсер: http://dotnot.org/blog/archives/2008/03/10/xml-benchmarks-updated-graphs-with-rapidxml/

[15] попросите самого Уолтера: http://digitalmars.com/contact.html

[16] сборщика мусора: http://dlang.org/garbage.html

[17] управлять им: http://dlang.org/phobos/core_memory.html

[18] заменить его или вообще убрать: http://forum.dlang.org/post/k4jqg3$221v$1@digitalmars.com

[19] safe: http://habrahabr.ru/users/safe/

[20] emplace: http://dlang.org/phobos/std_conv.html#emplace

[21] scoped классы: http://dlang.org/phobos/std_typecons.html#scoped

[22] счётчики ссылок: http://dlang.org/phobos/std_typecons.html#RefCounted

[23] RAII: http://dlang.org/exception-safe.html

[24] продуманный и эффективный: http://www.drdobbs.com/article/print?articleId=240008321&siteSectionName=architecture-and-design

[25] безопасный: http://dlang.org/safed.html

[26] корректный: http://erdani.com/d/three-cool-things-about-d.pdf

[27] полезные штуки для параллельных выичслений: http://dlang.org/phobos/std_parallelism.html

[28] простые шаблоны: https://semitwist.com/articles/article/view/template-primer-in-d

[29] инструменты метапрограммирования: http://dlang.org/version.html#StaticIf

[30] разные: http://dlang.org/arrays.html#slicing

[31] полезности: http://dlang.org/hash-map.html

[32] уже: http://dlang.org/const3.html

[33] обыденностью: http://dlang.org/function.html#property-functions