Стоит ли стараться узнать D?
Представьте, что у вас есть 3 проекта:
- Текстовый редактор для программистов
- компилятор
- и библиотеки поисковых систем для не менее 3 типов файлов: html,.xls и pdf.
У вас есть 3 варианта:
- С++
- Java
- и С#
- или вы можете изучить альтернативу его выполнению с D.
Затем вы просите больше программистов: Может ли D дать мне существенные преимущества в этой задаче, в том числе: модульность, исправление ошибок, работа в команде и эффективность машины?
Ответы
Ответ 1
Как я вижу, D имеет следующие преимущества перед более "традиционными" статически типизированными языками:
-
Insanely мощное средство метапрограммирования времени компиляции. Например, проверьте std.algorithm
или std.range
в стандартной библиотеке D2. В скором времени будет включен модуль std.parallelism
, и если/когда он будет, это будет еще один хороший пример. Эти средства достаточно мощные, что язык иногда чувствует себя почти утиным, но с исполнением статически типизированного языка. Также см. Вопрос SO о метапрограммировании D: Примеры того, какие шаблоны Ds можно использовать для
-
Модель по умолчанию D2 concurrency основана на передаче сообщений. Если вы не подрываете систему типов очевидными, greppable способами, не может быть неявного совместного использования данных между потоками в D2. Конечно, если вы действительно хотите неконтролируемый обмен данными, вы можете сломать это с помощью броска. Например, модуль std.parallelism
, который в настоящее время просматривает, делает это, чтобы получить многоядерный parallelism с педалью-металлом.
-
D стремится к сделать простые вещи намного проще, чем С++ или Java. (Я не так уверен в С#.) Простыми вещами я имею в виду такие вещи, как базовый ввод/вывод файлов или шаблон стратегии, не требующий почти такого же шаблона. Фактически, я чувствую, что одна из основных целей проекта D заключалась в том, чтобы изгнать код шаблона с лица Земли, так как избежать необходимости в нем в значительной степени подчеркивается дизайн как языка, так и стандартной библиотеки.
/li >
Относительно динамических языков D имеет:
-
Производительность изначально компилируемого языка при меньшем удобстве, чем вы ожидаете, в основном из-за потрясающих возможностей метапрограммирования и их использования при разработке стандартной библиотеки.
-
Статическая проверка. Ваша программа не будет разбита на один день, потому что вы ошибочно указали имя переменной или попытались присвоить строку целому числу.
-
Возможность выполнять низкоуровневую работу. Например, за исключением нескольких небольших кусков встроенного ассемблера, сборщик мусора D записывается целиком в D.
Ответ 2
Если вы хотите "власть" С++ без громоздкого синтаксиса или "власть" C с полезными функциями, такими как правильные строки и классы, я бы сказал, что это того стоит. Если вам нравится иметь гигантский API, на котором можно опираться (С#/Java), D, вероятно, не будет поражать ваше воображение. Также убедитесь, что вы используете D 1.0, поскольку поддержка библиотеки (wxD и других GUI-библиотек) и компилятора (GCD, LDC, ничего, кроме DMD) является ужасающей для D 2.0, хотя эта версия языка является явным улучшением.забастовкa >
Ответ 3
Я сам участвую в процессе обучения D, исходя из фона C/С++. D привлек меня из-за его элегантности, он продуманный дизайн. Это выглядит как небо после интенсивных, глубоких и темных углов С++.
Для меня одним большим недостатком D является отсутствие библиотек. Даже стандартную библиотеку я не нахожу очень хорошо. Язык велик, библиотеки пока (пока). Вы можете использовать C libs, хотя это большой палец вверх.
Хотя D, похоже, обладает многими ноу-хау и многими языковыми аспектами, это не половина того, что имеет С++. Поэтому я бы сказал, что гораздо быстрее научиться (определенно потому, что 90% - это языки С++ или родственные языки). Поэтому изучение языка должно быть вопросом недель/месяцев.
Так как пока еще нет отличных инструментов для GUI, вам может понадобиться разработать редактор в чем-то другом. Два других проекта идеально подходят для D.
Ответ 4
Я хотел бы сказать, что вчера я стал энтузиастом D, когда узнал, насколько это лучше, чем С++, и я изучал D в течение двух дней прямо из чистой любви. О, это не идеально, но по сравнению с С++? Нет конкурса. То же самое для Java. С# был моим языком выбора по состоянию на 3 дня назад, но сегодня я думаю, что он перешел на ранг.
Не используя D для какой-либо серьезной работы, я мог ошибаться. Но D имеет ответ на каждую серьезную критику, часто возникающую против С++, от времени компиляции, до плохого типа безопасности, до головной боли для хранения файлов заголовков, для медленной компиляции. D - это не просто эволюционное улучшение, но и нововведения, которые не найдены ни в одном из популярных мировых языков:
- Говорят, что один из самых быстрых компиляторов мира
- Вы можете использовать try/catch/finally и RAII, но
scope(exit)
упрощает чтение и запись кода, отличного от кода,
- Вы можете определить замыкания, которые компилятор может встроить (какие-либо компиляторы С++ 11 делают это? Я не уверен, я застрял на Visual С++ 2008 из-за необходимости поддерживать Windows CE)
- Сбор мусора является стандартным, но необязательным, поэтому вы можете писать программы с гарантиями с низкой задержкой, избегая выделения GC (но как управлять памятью?) Я подозреваю, что можно использовать
alias this
, чтобы сделать умные указатели a la С++?)
- Slices - механизм доступа к коллекции, который намного безопаснее, чем итераторы С++, а также гораздо удобнее, не нужно повторять себя, как в
lower_bound(blobCollection.begin(), blobCollection.end(), blob)
- Дженерики более гибкие, чем на С++, и не создают страницы сообщений об ошибках.
- Метапрограммирование времени компиляции, которое значительно превосходит С++ (и, очевидно, С# тоже)
- отражение времени компиляции, которое (надеюсь, но не могу подтвердить) можно использовать для построения системы отражения во время выполнения, если один хотел
- Хорошо разработанный подход с несколькими парадигмами к concurrency с интересными функциями как для общей памяти, так и для архитектуры передачи сообщений
- Встроенная поддержка модульных тестов
- Массивные выражения, например. a [] = (b [] + c [])/2 (MATLAB делает это более тесно, но среди языков общего назначения эта особенность встречается редко)
- Превосходные функции с плавающей запятой (например, nextUp()/nextDown()/ulp(), шестнадцатеричные поплавки, контроль аппаратных исключений)
Для библиотеки компилятора или поисковой системы D явно превосходит. И так как D настолько похож на С++, вам не придется тратить много времени на его изучение, так почему бы и нет? Кроме того, не должно быть трудно переносить небольшие программы и библиотеки из С++. У меня есть впечатление, что привязки GUI также улучшаются, поэтому, возможно, D будет хорошо работать для текстового редактора в наши дни.
По общему признанию, я не доволен всем. Они по-прежнему обслуживают толпу C, поэтому вам все равно нужно заполнить свои switch
с помощью breaks
, ключевое слово static
сбивает с толку чрезмерное использование, lambdas требует скобки и оператор "return" (в отличие от С# quicker < синтаксис t26 > ), все функции и попытки/уловы требуют скобок, pass-by-reference неявна на сайте вызова... но то, что предлагает D, слишком хорошо, чтобы уйти.
Но, конечно, хотя D язык явно потрясающий, и стандартная библиотека, по-видимому, созрела, окружающие инструменты могут быть не такими уж хорошими: IDE, поддержка платформ для смартфонов и т.д. Единственное IDE, которую я пробовал, Visual D (плагин IDE для Visual Studio) работает очень хорошо, включая отладку, которая, похоже, работает так же, как и отладчик Visual С++, и которая может войти в стандартную библиотеку (весело!). Однако Code Completion работает не очень хорошо.
По сравнению с С#, D лучше в большинстве областей, но кажется слабым, когда дело доходит до динамической привязки и отражения. Например, ваш текстовый редактор может легко иметь подключаемую систему под .NET, но я не уверен в том, что D..NET также предлагает создание кода времени исполнения, а D - нет. Однако для компиляции кода D в .NET существует компилятор исследований. Учитывая, что С++/CLI уже компилируется в .NET(С++/CLI), возможно, когда-нибудь один сможет использовать D одинаково хорошо для управляемого и собственного кода (с небольшим успехом в управляемой земле, конечно.)
Взаимодействие с C/С++ и .NET довольно приличное. D должен взаимодействовать с функциями С++ и однонаправленными классами с помощью extern (C++)
и сглаживания имени С++ (но какое имя компилятора называют?), В то время как вы можете легко создавать COM-интерфейсы, вызываемые из .NET и других языков.
Ответ 5
Я бы дал +1 для эффективности, 0 (без pro или con) для модульности, 0 для командной работы и огромного -1 для исправления ошибок.
-1 происходит от того факта, что D на самом деле недостаточно используется, чтобы сделать библиотеку полной и без ошибок. В этом случае вы всегда теряете время, исправляя сторонний код. Также огромный -1 для небытия хорошего отладчика D.
Обычно - как программист Эйфеля - я бы дал D +1 для разработки по контракту, но это не используется постоянно по стандартной библиотеке и абсолютно не используется 95% дополнительных библиотек. Таким образом, вы не получите от этого много преимуществ.
Ответ 6
Я думаю, что D определенно лучше всего подходит для компилятора и менее подходит для двух других задач.