Оригинальный текст: semitwist.com/articles/article/view/dispelling-common-d-myths
Reddit: www.reddit.com/r/programming/comments/118y4m/dispelling_common_d_myths/
Вступление
Как постоянный пользователь и поклонник языка D, я не мог не заметить ряд заблуждений и недопониманий, которые регулярно встречаются среди новичков.
Все эти заблуждения вполне объяснимы. Многие связаны с проблемами, которые играли важную роль в прошлом, так что не удивительно, что эти устаревшие представления продолжают существовать. Мне кажется, что это как раз те области, которые сообщество D должно как можно лучше объяснить остальным программистам. Вот эти темы:
- Для D есть IDE
- DSource угасает, но проекты на D активны как никогда ранее
- Разделения на D1 и D2 больше нет
- Phobos — стандартная библиотека? А как же Tango?
- D — open source
- D позволяет ручное управление памятью
- Статическая типизация НЕ означает непродуктивность
Для D есть IDE
Были времена, когда едва ли существовали IDE с поддержкой D чуть больше чем банальная подсветка синтаксиса. Но теперь это не так. Если вам по душе полноценные среды разработки, есть три основных варианта, каждый из которых активно поддерживается:
DSource угасает, но проекты на D активны как никогда ранее
С регулярностью в пару месяцев возникают вопросы такого рода: «D мёртв? Я зашёл на DSource и все проекты выглядели устаревшими и неподдерживаемыми, а форумы пусты. Складывается ощущение, что D умирает.»
DSource был де-факто местом для
Были некоторые поползновения обновить DSource для того, чтобы было проще найти активные проекты среди умерших ( не стоит забывать, что любой
Хотя, должен признаться, меня огорчает говорить такое про DSource. Я всегда ценил этот сайт и в своё время его существование было чертовски нужным и полезным для инфраструктуры D1, задолго до того как Github и Bitbucket стали обыденностью для почти каждого open-source программиста. Сайт, сетевой канал и сам
Что касается способа поиска активных проектов на D, помимо банальных поисковиков я бы рекомендовал D Wiki. Да, признаю, мы были далеки от совершенства в поддерживании страницы с актуальным списком проектов, но я здесь и сейчас клянусь, что внесу свою лепту и буду напоминать другим пользователям 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, чего в Phobos банально нет. Например, в Tango реализован самый быстрый в мире XML парсер. В то же время модуль 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. Front-end, который используется так же и GDC c LDC, имеет одобренную OSI Artistic лицензию и так же GPL лицензию.
Единственная вещь, которая формально не является open-source — DMD back-end. Причина — используется вещи, лицензированные в своё время у Symantec и Уолтер не может просто так сменить лицензию. Но исходники публично доступны и pull request'ам всегда рады. Вас беспокоит распространение? Не стоит: просто попросите самого Уолтера. Лицензия обязывает его требовать спрашивать его разрешения ( Прим. переводчика: рад совету, как этот копирастический казус сформулировать по-русски нормально ), но это чисто техническая формальность. Попросите у него, и тут же получите разрешение. Не известно ещё ни одного случая отказа. И да, не забвайте, это касается только DMD, точнее back-end DMD. Всё остальное — open-source без всяких «но», включая два полноформатных компилятора, GDC и LDC.
D — open-source. Не всегда был, но вне всяких сомнений таков сейчас.
D позволяет ручное управление памятью
Хотя в D предполагает наличие сборщика мусора по умолчанию, но это отнюдь не означает, что вы не можете управлять им, заменить его или вообще убрать, или использовать ручное управление памятью.
В D есть указатели ( элегантно ограниченные безопасными для памяти доступными операциями в safe режиме ) и прямой вызов функций на C. В вашем распоряжении malloc/free и вы можете разместить что угодно в полученной таким образом памяти используя emplace. Или попробуйте стэковые scoped классы. Или счётчики ссылок. Или RAII. Плюс ко всему, сейчас в процессе разработки находится система настраиваемых аллокаторов.
Статическая типизация НЕ означает непродуктивность
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 не только продуманный и эффективный, но так же безопасный и корректный.
Добавьте ещё разные полезные штуки для параллельных выичслений, простые шаблоны и инструменты метапрограммирования, а так же разные полезности, ставшие уже обыденностью.
Автор: Volfram