Я не очень разбираюсь в D, но многим, многим знакомым мне программистам на С ++ это очень не нравится, и я лично должен согласиться - мне не нравится внешний вид D, и я не буду подходить ближе.
Чтобы понять, почему D не набирает обороты, нужно начать с понимания того, что привлекает людей в C ++. Одним словом, причина номер один - контроль. Когда вы программируете на C ++, вы полностью контролируете свою программу. Хотите заменить стандартную библиотеку? Ты можешь. Хотите делать небезопасные приведения указателей? Ты можешь. Хотите нарушить const-правильность? Ты можешь. Хотите заменить распределитель памяти? Ты можешь. Хотите копировать в сырую память, не обращая внимания на ее тип? Если вы действительно хотите. Хотите наследовать от нескольких реализаций? Это твои похороны. Черт, вы даже можете получить библиотеки для сбора мусора, такие как сборщик Boehm. Тогда возникают такие проблемы, как производительность, которая тесно связана с управлением - чем больше у программиста контроля, тем более оптимизированным он может выполнять свою программу.
Вот несколько вещей, которые я видел, когда проводил небольшое исследование и разговаривал с парой людей, которые попробовали это:
Единая иерархия типов. Пользователи C ++ используют наследование очень редко, большинство программистов на C ++ предпочитают композицию, и типы следует связывать через наследование только в том случае, если для этого есть очень веская причина. Концепция объекта сильно нарушает этот принцип, связывая каждый тип. Кроме того, это нарушает один из самых основных принципов C ++ - вы используете только то, что хотите. Отсутствие выбора в отношении наследования от Object и сопутствующих ему затрат очень сильно противоречит тому, что C ++ обозначает как язык с точки зрения предоставления программисту контроля над своей программой.
Я слышал о проблемах с функциями и делегатами. Очевидно, D имеет функции и делегаты как типы функций, вызываемые во время выполнения, и они не одинаковы, но они взаимозаменяемы или ... что-то? У моего друга было немало проблем с ними. Это, безусловно, понижение C ++, который только что std::function
и все готово.
Тогда у вас есть совместимость. D не особенно совместим с C ++. Я имею в виду, что ни один язык не совместим с C ++, давайте посмотрим правде в глаза, за исключением C ++ / CLI, который является своего рода обманом, но в качестве барьера для входа следует упомянуть.
Затем есть некоторые другие вещи. Например, просто прочитайте статью в Википедии.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
является одной из самых небезопасных функций, когда-либо созданных, в той же семье, что и большие проблемы, как gets
в старой библиотеке C Standard. Если вы будете искать его в Stack Overflow, вы найдете множество вопросов, касающихся его неправильного использования. По сути, printf
это нарушение СУХОЙ- вы даете тип в строке формата, а затем даете его снова, когда вы даете ему аргумент. Нарушение DRY, когда если вы ошиблись, то произойдут очень плохие вещи, скажем, если вы изменили typedef с 16-битного целого на 32-битное. Это также вообще не расширяемо - представьте, что произойдет, если все придумают свои собственные спецификаторы формата. Iostream C ++ может быть медленным, и их выбор оператора может быть не самым большим, и их интерфейс мог бы использовать работу, но они в принципе гарантированно безопасны, и DRY не нарушается, и они могут быть легко расширены. Об этом нельзя сказать printf
.
Нет множественного наследования. Это совсем не так, как в C ++. Программисты C ++ ожидают полного контроля над своей программой, и язык, обеспечивающий то, от чего вы не можете унаследовать, является нарушением этого принципа. Кроме того, это делает наследование (даже более) хрупким, потому что если вы измените тип с интерфейса на класс, потому что вы хотите предоставить реализацию по умолчанию или что-то еще, внезапно весь код вашего пользователя будет нарушен. Это не очень хорошая вещь.
Еще один пример string
и wstring
. В C ++ уже довольно болезненно выполнять преобразования между ними, и поддерживает ли эта библиотека Unicode, и эта старая библиотека C использует только ее const char*
, и ей приходится писать разные версии одной и той же функции в зависимости от желаемого типа строкового аргумента. В частности, заголовки Windows, например, имеют несколько чрезвычайно раздражающих макросов, чтобы справиться с проблемой, которая часто может мешать вашему собственному коду. Добавление dstring
к миксу только усугубит ситуацию, так как теперь вместо двух типов строк вам нужно управлять тремя. Наличие более одного строкового типа увеличит затраты на обслуживание и представит повторяющийся код, работающий со строками.
Скотт Мейерс пишет:
D - это язык программирования, созданный для помощи программистам в решении задач современной разработки программного обеспечения. Это достигается за счет поддержки модулей, соединенных через точные интерфейсы, объединения тесно интегрированных парадигм программирования, языковой изоляции потоков, безопасности модульного типа, эффективной модели памяти и многого другого.
Языковая изоляция потоков не является плюсом. Программисты на C ++ ожидают полного контроля над своими программами, и язык, навязывающий что-либо, определенно не тот, что предписал доктор.
Я также собираюсь упомянуть манипуляции со строками во время компиляции. D имеет возможность интерпретировать код D во время компиляции. Это не плюс. Подумайте об огромных головных болях, вызванных относительно ограниченным препроцессором C, хорошо известным всем опытным программистам на C ++, а затем представьте, насколько сильно эта функция будет злоупотреблена. Возможность создавать D-код во время компиляции великолепна, но она должна быть семантической , а не синтаксической.
Кроме того, вы можете ожидать определенный рефлекс. У D есть сборка мусора, которую программисты на C ++ будут ассоциировать с такими языками, как Java и C #, которые в философии довольно прямо ей противостоят, и синтаксическое сходство напомнит им об этом. Это не обязательно объективно оправдано, но это то, что, безусловно, следует отметить.
По сути, он не предлагает так много, что программисты C ++ уже не могут сделать. Может быть, проще написать факториальную метапрограмму в D, но мы уже можем написать факториальную метапрограмму в C ++. Возможно, в D вы можете написать трассировщик лучей во время компиляции, но в действительности никто не хочет этого делать. По сравнению с фундаментальными нарушениями философии C ++, то, что вы можете сделать в D, не особенно заметно.
Даже если на первый взгляд это всего лишь проблемы, я уверен, что тот факт, что D на самом деле совсем не похож на C ++, вероятно, является хорошей причиной того, что многие программисты на C ++ не переходят на D. Возможно, D нужно сделать лучшую работу, рекламируя себя.