Каковы основные различия между C++, D и C++0x?

В последнее время мы все чаще сталкиваемся с ними и слышим их, и я хотел бы провести хорошее сравнение между ними прямо здесь, в stackoverflow. Ссылки, ссылки и статьи тоже подойдут.


person Shinnok    schedule 01.01.2011    source источник
comment
я ищу экранированные и exp. подкрепленные ответы, а не обычный поиск Google.   -  person Shinnok    schedule 01.01.2011
comment
Я удалил тег C, так как вопрос никак не касается C.   -  person Puppy    schedule 01.01.2011
comment
Ваш вопрос намного слишком объемен.   -  person wilhelmtell    schedule 01.01.2011
comment
@wilhelmtell: мне кажется забавным, как такой большой вопрос вызвал столь маленькую дискуссию. :D   -  person user541686    schedule 02.01.2011


Ответы (6)


По моему опыту, в основном C++0x настраивает некоторые аспекты C++, но, по сути, это тот же язык, только чище и несколько более гибкий. Тем не менее, в C++0x осталось много серьезных проблем, таких как #include, и код автоматического вывода типов для обычных функций в каком-то смысле недостаточно эффективен. Мне нравится C++0x, это большое улучшение, но это маленький шаг в правильном направлении.

D, я обнаружил, что да. Понятия не имею. Мне не нравился D. Я чувствовал, что он не решает проблем, которые нужно исправить в C++, и в значительной степени идет своим путем. Я имею в виду, что нет ничего плохого в том, что язык может быть тем, чем он хочет быть, но мне не кажется, что D действительно развился на C++, это просто гибрид C++/C# и является такой же эволюцией, как и C#. Например, у него такая же иерархия объектов с одним корнем, принудительный сборщик мусора и т. д. Мне показалось, что D мог бы быть C# с некоторыми функциями, такими как дженерики, и RTCG, просто перенесенный на время компиляции, а не на время выполнения.

C++0x не идет достаточно далеко, и D ушел далеко в сторону, в область, где C# и Java уже существуют. Я определенно все еще ищу что-то еще в качестве преемника C++.

person Puppy    schedule 01.01.2011
comment
Последний абзац определенно описывает в нескольких хорошо подобранных словах то, что я слышал от большинства, кто играл с C++0x и D, когда их просили сравнить их с C++. Спасибо за комментарий. - person Shinnok; 01.01.2011
comment
С++ работает; Д нет. Это так просто. Под работами я подразумеваю, что C++ зарекомендовал себя, а D нет. C++ прижился, D — нет. Самолеты, космические корабли, подводные лодки, атомные станции работают на C++ без единого взрыва. Я хочу увидеть, что происходит со сборкой мусора и языком для масс! - person wilhelmtell; 01.01.2011
comment
Я чувствовал, что это не решило проблемы, которые нужно было исправить в C++ --› Не могли бы вы поделиться некоторыми примерами? :) - person user541686; 01.01.2011
comment
Фундаментальное заблуждение борцов за исправление C++ состоит в том, что есть что исправлять. Люди думают, что C++ сложен, и это нужно исправить. Правда в том, что программировать сложно. Хитрость заключается в создании языка, который поддерживает правильный код, и C++ преуспевает в этом, как почти никакой другой язык. Причина, я думаю, в его сильных гарантиях, в его эффективности и в гибкости парадигм. Сомнительны только его связи с C в отношении того, делают ли они C++ более популярным или менее популярным. - person wilhelmtell; 01.01.2011
comment
@Lambert: Как насчет множественного наследования? Я предполагаю, что, строго говоря, это не нуждается в исправлении, но в D его точно нет. Как насчет отражения - статического или динамического? Или действительно расширенная стандартная библиотека, охватывающая такие вещи, как графический интерфейс, или, по крайней мере, настоящая стандартная библиотека? По сравнению с огромными библиотеками, доступными для C#. Есть ли у D стандартный ABI и искажение имен? - person Puppy; 02.01.2011
comment
@DeadMG: Множественное наследование - это единственная функция, которой я не видел. (Хорошо это или плохо - другой вопрос... по крайней мере, у него есть интерфейсы.) Однако для остальных: да, у него есть статическое отражение (поищите трейты). Да, существуют библиотеки DFL и GtkD для графического интерфейса, хотя ни одна из них не является стандартной в том смысле, что является частью стандартной структуры. И да, у него есть стандартный ABI и искажение имен; просто посмотрите на ссылки, например: digitalmars.com/d/2.0/abi.html< /а> - person user541686; 02.01.2011
comment
@wilhelmtell: Не обращайте внимания на тот факт, что что-то простое, например map<string, map<int, string>> m;, даже не компилируется на C++ (хотя C++0x пытался это исправить, но представил гораздо более ужасный синтаксис для множества других вещей). Взгляните на эту страницу и найдите контекстно-свободную грамматику: digitalmars.com/d/ 2.0/overview.html С отдельными этапами семантического и синтаксического анализа код D становится практически однозначным и намного более читабельным и чистым, чем C++. - person user541686; 02.01.2011
comment
@wilhelmtell: я думаю, вы ошибаетесь, фундаментальная проблема C++ заключается в том, что люди думают, что ее можно исправить. Не может: время исправить это было до выхода первого стандарта. Разочарование D в том, что он не сделал достаточно, чтобы беспокоиться. - person Yttrill; 02.01.2011
comment
@wilhemltell: извините, что разместил здесь три сообщения, но также взгляните на этот пост: stackoverflow.com/questions/52506 /c-шаблон-неоднозначность - person user541686; 02.01.2011
comment
@Yttril: +1 ... Просто любопытно, вы имеете в виду, что язык (спецификации) был недостаточно хорош или реализация (компилятор)? Если первое, то интересно, почему? :) @Wilhelmtell: Еще один пример неоднозначного кода C++: можете ли вы сказать, что это должно делать? y = (T)-1; - person user541686; 02.01.2011
comment
@lambert: метапрограммирование шаблонов по спецификации доказывает, что C ++ облажался. Посмотрите на языки с настоящим полиморфизмом, такие как Haskell или Ocaml. Основные проблемы заключаются в том, что базовая система типов C++ является грубой, а поиск зависимых имен является в первую очередь артефактом попытки поддерживать методы класса. Для С++ уже слишком поздно удалять эти вещи. - person Yttrill; 02.01.2011
comment
@Yttril: Спасибо за комментарий! Однако я имел в виду то, что вы имели в виду в отношении D, а не C ++ ... если вы не скажете, что метапрограммирование шаблонов также является проблемой в D? (Если да, то почему?) - person user541686; 02.01.2011
comment
Шаблоны @Lambert @Yttrill являются примером использования функций C++, которые были расширены далеко за пределы того, для чего они были предназначены. Не в плохом смысле, заметьте. Просто люди исчерпали возможности шаблонов до предела. Например, использование шаблонов с побочными эффектами для политик. Здесь нет ничего плохого в C++; Напротив. Это просто означает, что какой-то функции не хватает. C++0x пытался внести концепции, но, увы, предложение не было готово и провалилось. Может быть в следующий раз. Тем не менее, в C++ есть самые надежные, лучшие шаблоны в мире. И ты хочешь это исправить? - person wilhelmtell; 02.01.2011
comment
@wilhelmtell: Сильнейший? Лучший? Каким образом? (Поддержите пожалуйста?) Не могли бы вы привести полезный пример, который вы не можете сделать в D? - person user541686; 02.01.2011
comment
@Lambert @Yttrill Я не говорю, что шаблоны нельзя улучшить. В частности, мне бы хотелось видеть более качественные сообщения об ошибках шаблонов от компилятора. Но это потому, что отсутствует функция, если мы хотим продолжать использовать шаблоны для того, для чего мы их используем. Я имею в виду, что мы используем шаблоны для политик в современном коде, и именно здесь возникают ошибки. Не в том, для чего вводились шаблоны, а для обобщения кода. - person wilhelmtell; 02.01.2011
comment
О, я не имел в виду сообщения об ошибках, это наименьшая из моих проблем при использовании шаблонов. Вы только посмотрите на двусмысленность синтаксиса! Как это самый сильный и лучший в мире?! Если бы вы могли привести примеры, это было бы очень хорошо, и мне было бы очень интересно. :) - person user541686; 02.01.2011
comment
@Lambert, очевидно, это вопрос мнения. Но они выполняются во время компиляции, что означает, что они настолько быстры, насколько это возможно. Они поддерживают типы, а также примитивы и шаблоны, что означает их гибкость. Они поддерживают специализацию, что означает, что они создают язык сами по себе, полный по Тьюрингу и все такое. Теперь найдите мне другой язык, который делает что-то близкое к этой силе, и я возьму свои слова обратно. - person wilhelmtell; 02.01.2011
comment
@wilhelmtell: не знаю, знаете ли вы, но шаблоны D также создаются во время компиляции, и я бы сказал, что они намного более гибкие, чем C++. Кроме того, они могут быть специализированы так же, как и в C++, без двусмысленностей и с ясностью, которая вам нужна. Если хотите, я могу отправить вам несколько чистых примеров и посмотреть, сможете ли вы преобразовать их в чистый код C++? Найдите мне другой язык, который делает что-то близкое к этой силе. --› Разрешите представить Д. :) - person user541686; 02.01.2011
comment
@wilhelmtell: Вот сложная проблема C++: как вы думаете, можно ли написать функцию с именем memoize() на C++ или C++0x, которая будет принимать адрес функции и возвращать другую функцию с такая же точная подпись, но та, которая кэширует результаты вызова исходной функции, возможно, в хеш-таблице? Примечание: вы не можете использовать переменные varargs, потому что они небезопасны для типов и не проверяются компилятором; возвращаемая функция (или указатель на функцию) должна иметь точно такой же список параметров, ни больше, ни меньше. Я сделал это довольно легко в D. - person user541686; 02.01.2011
comment
@Lambert: здесь я нахожусь в лагере D, но вы можете сделать это в C++0x, используя вариативные шаблоны и ссылки rvalue для идеальной переадресации. Я не думал об этом полностью, но кажется, что это было бы возможно. - person Peter Alexander; 02.01.2011
comment
@Peter: Интересно ... но окажется ли код достаточно чистым и читаемым? (Обратите внимание, что вы не можете установить какие-либо ограничения на количество аргументов, поэтому вам нужно будет получить ссылку на каждый аргумент по индексу.) - person user541686; 02.01.2011
comment
Два момента: насколько я знаю, D не пытается исправить C++, а скорее признает, что это эволюционный тупик (то есть его нельзя улучшить способами, которые создатель D хотел, все еще заявляя о своем происхождении от C++) и начал сначала. Возможно, он ближе к C, чем к C++. -- И во-вторых: шаблоны D способны делать все, что я когда-либо слышал о C++, и могут делать это так, как понимают большинство компетентных программистов. - person BCS; 02.01.2011
comment
@Lambert: Да, это должно быть читаемо. Нет необходимости в границах или индексации массива; вы просто распаковываете пакеты параметров шаблона прямо в вызов функции. - person Peter Alexander; 02.01.2011
comment
Хорошо, давайте проведем небольшое сравнение. Я написал этот фрагмент кода, о котором говорил, всего в 36 строках: gist.github.com/741782 #file_memoize.d @Peter: Вы действительно думаете, что C++ хотя бы приблизится к этому по краткости и/или удобочитаемости? @wilhelmtell: Просто попробуйте сделать это на C++. Я предлагаю вам также взглянуть на код D, и, пожалуйста, ответьте мне честно: он более читабелен, чем версия C++, или менее? :) - person user541686; 02.01.2011
comment
@Lambert: Готово ideone.com/g95Sc. Честно говоря, я думаю, что версия C++0x аккуратнее. - person Peter Alexander; 02.01.2011
comment
@Peter: я должен сказать, что вы (и С++) справились очень хорошо; Я честно не ожидал этого; +1. Но у меня есть небольшая проблема: вы не вернули функцию, вы вернули функциональный объект (структуру) - и если бы вы передали запомненную функцию внешнему коду, разве это не было бы критическим изменением? из незапоминаемой версии? Или я что-то упускаю (что вполне может быть так)? (Смысл возврата лямбда заключался в том, чтобы вы могли передавать его так же, как и исходную функцию, а структура не может этого сделать... или может?) - person user541686; 02.01.2011
comment
@Lambert: Вы можете легко просто изменить функцию memo, чтобы она делала то, что вы просите (пусть она просто хранит статическую версию объекта и делает все через нее). - person Peter Alexander; 02.01.2011
comment
Хм... кажется, это имеет смысл... если вы заставите memo хранить статический объект, вам придется его инициализировать. Но не каждая версия memo принадлежит одной функции, поэтому вам нужно иметь статическую карту внутри memo, а затем индексировать ее адресом пользовательской функции... правильно? Хм... это кажется разумным, я пытаюсь понять, насколько это большое изменение. В целом, я скажу, что потерял это, хотя бы потому, что не попробовал это сам заранее, прежде чем выносить суждения о С++. Большое спасибо, что нашли время, чтобы напечатать это!! :) - person user541686; 02.01.2011
comment
@Peter: О, и, кстати, вы использовали довольно классный сайт, спасибо, что поделились! (Кроме того, размещение моего кода делает его более красивым. ;)) - person user541686; 02.01.2011
comment
@Lambert: статические переменные будут уникальными для каждого экземпляра функции в шаблоне, поэтому вам просто нужно добавить функцию в качестве параметра типа шаблона. - person Peter Alexander; 02.01.2011
comment
@Peter: Но каждый экземпляр шаблона не соответствует запоминаемой функции - две функции с одинаковой сигнатурой будут использовать одни и те же таблицы, а это не то, что вам нужно. Так что вам придется индексировать по адресу внутри другой карты, не так ли? - person user541686; 02.01.2011
comment
@Lambert: О... да, сегодня я не думаю. Да, вы правы, что-то в этом роде. - person Peter Alexander; 02.01.2011
comment
(Не волнуйтесь, я тоже не очень хорошо думал, когда слишком рано оценивал C++0x. ;)) Да, это сделало бы код немного менее красивым, я просто пытался выяснить, насколько. Но похоже, что вам просто нужен еще один map<Func, Memoize<Func> > (если бы это было до C++0x, это пространство было бы решающим!), и так что это почти то же самое, так что да, я бы сказал, что это d по-прежнему выглядит довольно читабельно. - person user541686; 02.01.2011
comment
@Peter: Теперь меня интересует кое-что еще: как насчет оценки функций во время компиляции и примесей? Можете ли вы сгенерировать строку, а затем проанализировать ее содержимое как код на C++0x? (Я действительно не знаю этого, я просто спрашиваю - поскольку это действительно мощная функция, которая иногда оказывается очень удобной, и поскольку я не слышал, чтобы C++ имел ее.) - person user541686; 02.01.2011
comment
@Lambert: C ++ вообще не имеет оценки функции времени компиляции. В C++0x он имеет очень ограниченную форму, но ничто по сравнению с D и ничего похожего на миксины. - person Peter Alexander; 02.01.2011
comment
@Peter: Итак, D является более мощным, чем C++!!! - person user541686; 02.01.2011
comment
@Peter, @wilhelmtell: Знаете, сначала я сдался и сказал, что C++0x так же хорош, как D, но теперь я снова беру свои слова обратно: не могли бы вы взглянуть на эта версия memoize() (20 строк)? Как вы думаете? Сможет ли на этот раз C++0x превзойти читабельность и лаконичность? (Мне очень любопытно узнать, что вы сейчас думаете! :] ) - person user541686; 02.01.2011
comment
В C++ есть много вещей, которые нужно исправить. Проблема в том, что для этого вам придется пожертвовать другими вещами (обратной совместимостью с C или C++, производительностью во время выполнения, временем компиляции или рядом других вещей). Единственная причина, по которой D кажется более чистым, чем C++, заключается в том, что они были готовы отказаться от некоторых преимуществ C++ и более узко сосредоточиться на оставшихся. - person jalf; 02.01.2011
comment
И я думаю, что большинство людей, лишь поверхностно знакомых с D, согласятся, что D обычно выигрывает в удобочитаемости и лаконичности. Но, как уже упоминалось, он больше не конкурирует с C++. Он забрел в область, где C# и другие языки являются гораздо более близкими конкурентами. Так что это действительно то, с чем его следует сравнивать. Он больше не является подходящей заменой в проекте, который в настоящее время использует C++. - person jalf; 02.01.2011
comment
@jalf: Что заставляет тебя так говорить? D занимает то же место, что и C++, то есть системное программирование и высокопроизводительные вычисления. Это не то, для чего используется C#. - person Peter Alexander; 02.01.2011
comment
Нет, C++ занимает пространство, в котором важна совместимость с C и C++, где важна зрелая, стабильная поддержка инструментов и где поддержка библиотек практически повсеместна. D отбрасывает эти вещи, создавая новую экосистему с нуля. И если мы хотим это сделать, то мы могли бы также переключиться на любой из десятков других языков-кандидатов. От нас больше не требуется оставаться где-либо в пределах семейства языков C. - person jalf; 02.01.2011
comment
По разным причинам системное программирование обычно делается на C или C++, независимо от того, был бы D в идеальном мире лучшим языком для этого. А высокопроизводительные вычисления выполняются практически на любом языке, включая Python. - person jalf; 02.01.2011
comment
@jalf: Мы могли бы также переключиться на любой из десятков других языков-кандидатов. --› Мне любопытно узнать несколько примеров лучших языков для системного программирования, чем D (и почему). Кроме того, основная причина, по которой C/C++ все еще используется, - это устаревший код, и это в основном проблема только C++ из-за несовместимости ABI. Но я хотел бы знать, точно какая часть языка D, по вашему мнению, делает его непригодным для системного программирования? Вы делаете утверждения, что вы не можете сравнивать D с C++ без какой-либо фактической поддержки. - person user541686; 02.01.2011
comment
@Peter, @wilhelmtell: Извините, что забил это до смерти, но поскольку я зашел так далеко, я мог бы также разместить ссылку здесь: Вот 7-строчная, полностью читаемая версия memoize(). Давайте посмотрим, как C++ сравнивается. :) - person user541686; 02.01.2011
comment
@Lambert: я подозревал, что будет более хорошая версия D :-) Я не думаю, что C++0x сможет превзойти это. - person Peter Alexander; 02.01.2011
comment
@Lambert: я полагал, что было ясно, что, когда я говорю языки с GC, я имею в виду языки, в которых вы действительно используете GC. Если вы используете D, не полагаясь на сборщик мусора, то, очевидно, характеристики языка с сборщиком мусора на вас не влияют. - person jalf; 02.01.2011
comment
@jalf: D по большей части совместим с C. Все, что вам нужно, это заголовки, которые вы можете сгенерировать с помощью автоматизированного инструмента под названием htod. Нет необходимости создавать библиотеки с нуля. Кроме того, Python не используется для высокопроизводительных вычислений. Например, вы никогда не увидите передовой движок рендеринга, написанный на Python. У него просто нет того, что нужно. - person Peter Alexander; 02.01.2011
comment
@Lambert: я не говорил, что существуют десятки лучших языков системного программирования. Для системного программирования C и C++ являются бесспорными королями не из-за самих языков, а потому, что они устоялись, широко используются и широко поддерживаются. То, что делает D непригодным для системного программирования, заключается просто в том, что он обычно не используется для системного программирования. Если бы я использовал C++, я мог бы работать с существующей кодовой базой, над которой я работал последние 15 лет, и я мог бы использовать тысячи библиотек, разработанных для него. С Д...? Не так много. - person jalf; 02.01.2011
comment
@Peter: каждый язык может использовать библиотеки C. Это не впечатляет и не дает D какого-либо исключительного преимущества. И да, Python используется для высокопроизводительных вычислений. Однако механизм рендеринга обычно не считается HPC; что-то, работающее в сети с несколькими тысячами процессоров, будет считаться HPC, и там используется Python, хотите верьте, хотите нет. И знаете, я никогда не видел передового движка рендеринга, реализованного в D. Но я видел несколько на С++. О чем тебе это говорит? - person jalf; 02.01.2011
comment
Фанаты D с трудом принимают тот факт, что на самом деле дело не в языке. Наличие красивого, чистого и хорошо спроектированного языка на самом деле ничего вам не даст. Вам не нужно учить больше, чем пару языков, чтобы понять это. Как правило, популярными становятся уродливые, неуклюжие и примитивные языки. Неважно, важно, что у D более чистый синтаксис, чем у C++, не имеет значения, что вы можете написать в нем элегантную функцию запоминания или трассировщик лучей во время компиляции. Он по-прежнему не обладает практическими качествами, которые заставляют C и C++ оставаться рядом... - person jalf; 02.01.2011
comment
... в частности, у него нет поддержки инструментов C/C++, вездесущих компиляторов и совместимости исходного кода с существующими базами кода или библиотеками. У него также нет миллионов существующих программистов, знакомых с языком, и он не представляет собой стабильную экосистему (C / C ++, сертифицированный ISO, может замедлить эволюцию языков, но также стабилизирует его, делая его менее рискованным. использовать, потому что вы знаете, что язык не сломает ваш код на следующей неделе). В той нише, которую занимают C и C++, речь идет не об элегантности. Если бы это было так, C++ никогда бы не прижился. - person jalf; 02.01.2011
comment
@jalf, Re: Механизм рендеринга в D h3.gd/code/nucleus (говорит, что использует D в комментариях). Кстати, я не говорил, что возможность использовать библиотеки C давала ему преимущество, я просто опровергал ваше утверждение о том, что программистам D пришлось выбросить библиотеки C и создать новую экосистему с нуля. Это просто ложь. - person Peter Alexander; 02.01.2011
comment
@jalf: Мы это понимаем, поэтому люди работают над улучшением цепочки инструментов и библиотек. - person Peter Alexander; 02.01.2011
comment
@Peter: речь шла не о движке рендеринга. Они есть и в Python. Речь шла о передовом движке рендеринга. И да, D может использовать библиотеки C, но они не являются частью экосистемы D. Они несовместимы с исходным кодом, я не могу изменить их, не покидая свой милый маленький D-мир. И они не так просты в использовании, как настоящая библиотека D. И, конечно же, мне просто не повезло, если бы я попытался использовать библиотеку C++. - person jalf; 02.01.2011
comment
И, конечно же, люди, работающие над улучшением этих вещей, понимают это (вообще, над D работает много умнейших людей, многие из которых прекрасно понимают, почему язык до сих пор не прижился), что приятно. Люди, которые говорят, что D является лучшим выбором для ниши C/C++ сегодня, по-видимому, не осознают этого. - person jalf; 02.01.2011
comment
@jalf: Этот движок передовой. - person Peter Alexander; 02.01.2011
comment
@jalf: Итак, вы по определению подразумеваете, что, поскольку D не популярен, он не станет популярным. Что, к сожалению, может быть правдой. Но я не про популярность, я про полезность самого языка. (Примечание: полезность не обязательно означает наличие десятков функций; она также включает в себя такие вещи, как удобочитаемость.) По популярности выигрывает C++, но обсуждение (или, по крайней мере, моя точка зрения) касается полезности, а не популярности. . - person user541686; 02.01.2011
comment
..по поводу вашего комментария по поводу необходимости учить более одного языка: я начал программировать в средней школе с Logo. Затем я выучил Visual Basic у своего отца, затем самостоятельно перешел на VB.NET и C#; затем я самостоятельно изучил C++ и Java в старшей школе, а недавно стал лучше разбираться в ассемблере. Я изучил PHP/MySQL для некоторых соревнований; мы использовали Scheme в колледже, так что я тоже выучил его. Теперь я выучил D. Итак, я выучил более одного языка (и я выучил их довольно хорошо, многие из них довольно глубоко), и мое честное мнение таково: этот язык имеет значение, хотя бы просто для удобочитаемости. - person user541686; 02.01.2011
comment
... или даже если избежать таких глупых ошибок, как в map<int, map<char*, int>>, которых в любом случае не должно быть в языке. Я был застигнут врасплох программой Питера только потому, что это был C++0x, а не C++, который в любом случае официально еще не существует -- я знаю тот факт, что вы не можете даже приблизиться к тому, что я сделал в D с чистым C++. Так что не думайте, что когда мы говорим о хороших сторонах D, мы не видели и другие языки — мы видели, и в моем случае я бы сказал, что написал достаточно полезных программ на других языках (например, : средство записи компакт-дисков на основе SCSI на языке C#), чтобы сделать обоснованное суждение. :) - person user541686; 02.01.2011
comment
... и, кстати, если дело не в языке, то почему мир вообще перешел на C++? Даже Windows написана на C, так что C должен в значительной степени удовлетворять всем требованиям, верно? Зачем вообще переходить на C++? Кроме того: если вам неудобно оставлять красивый пузырь D при взаимодействии с C/C++, я бы сказал, что вам действительно следует подумать о повышении уровня комфорта; как вы сказали, вы не можете быть хорошим программистом на любом одном языке, живете ли вы в удобном пузыре C++ или пузыре D. - person user541686; 02.01.2011
comment
Приятно осознавать, что мой ответ вызвал так много комментариев... почти никогда. - person Puppy; 02.01.2011
comment
@Lambert: да, это почти то, что я говорю (грустно, но правда. Я хотел бы жить в мире, где языки программирования стали популярными благодаря их фактической выразительности и удобочитаемости). И что полезность языка зависит от его популярности. Широко используемый язык по своей сути более полезен, чем небольшой нишевый язык, из-за всего того, что вы получаете бесплатно в популярном языке (лучшие инструменты, больше библиотек и более широкий кадровый резерв). - person jalf; 04.01.2011
comment
@Lambert: Windows в целом написана на C++. Я не уверен, откуда вы взяли C. (Намек, конечно, на то, что практически все библиотеки Microsoft написаны на C++, и хотя команда VC по-прежнему вкладывает большие средства в улучшение поддержки C++, C-сторона их компилятора в значительной степени осталась гнить за последнее десятилетие). Так или иначе, причина, по которой мир принял C++, заключается в том, что он был упрощен. Поскольку исходный код (особенно в первые дни) был почти на 100% совместим с C, стоимость внедрения этого языка была почти нулевой. - person jalf; 04.01.2011
comment
@Peter Alexander: Как вы это определяете? На первый взгляд, я не вижу в нем ничего такого, что не делалось много раз раньше. И, конечно же, многофункциональный рендерер может быть (и был) так же легко написан на Python. Предположительно, то, что сделало бы это превосходным, было бы производительностью. Так как же он соотносится со всеми большими игровыми движками, написанными на C++? - person jalf; 04.01.2011
comment
@jalf: я думал, что Windows в основном написана на C? Потому что, когда вы смотрите на большинство DLL (конечно, есть несколько исключений), вы видите только API со связями C. Откройте Explorer.exe в дизассемблере... почему вы думаете, что это C++, а не C? - person user541686; 04.01.2011
comment
@jalf: см. эту ссылку, за исключением MFC и несколько других примеров, большинство программ для Windows все еще на C. (Сколько вы видите программ для Windows, которые зависят от msvcrt.dll, и сколько от msvcprt60.dll?) Глядя на дизассемблер, даже кажется, что ntoskrnl написан на C... что заставляет вас думать, что это C++? - person user541686; 04.01.2011
comment
@Lambert: MS настаивает на том, чтобы их API-интерфейсы были совместимы с C. - person Puppy; 04.01.2011
comment
Да, но почему вы думаете, что это на самом деле написано на C++? (Почему большинство DLL не зависят от msvcprt**.dll? Конечно MS не будет связывать вещи статически...) - person user541686; 04.01.2011
comment
@Lambert: msvcprt.dll нет. Сижу смотрю папку CRT Visual Studio, а msvcprt нет. - person Puppy; 04.01.2011
comment
Извините, опечатка с моей стороны: -rt не существует, на самом деле это msvcp60.dll, и IIRC всегда был в Windows, начиная с XP (это не распространяемый, он встроенный). Так что наверняка программы на C++ будут ссылаться на него?! - person user541686; 04.01.2011
comment
заявления, сделанные различными разработчиками Microsoft. Конечно, Windows — это огромный беспорядок из разных языков (готов поспорить, что вы все еще можете найти Pascal там, наряду с C и C++, а в наши дни — C# и VB.NET). Но они широко используют C++. Как говорит @DeadMG, они поддерживают C-совместимость своих API, потому что знают, что вызывающая сторона может не использовать C++. И я вижу много программ, которые зависят от различных версий библиотеки времени выполнения C++. Я не знаю, почему вы ожидаете, что они будут зависеть от среды выполнения 6.0 12-летней давности. - person jalf; 05.01.2011
comment
Само собой разумеется, что частью ядра будет ASM и C. В любом случае, большая часть исходного кода для Windows NT написана на C или C++ с сайта technet.microsoft.com/sv-se/library/cc767881%28en-us%29.aspx. Не сказано, какой язык они используют чаще всего, но я утверждаю, что C++ — это большая часть Windows, как и C. - person jalf; 05.01.2011
comment
Покопавшись в файле depend.exe, я не могу найти файл .exe или .dll, который не связан с MFC. Это говорит мне о том, что 1) MFC, который является кодом C++, широко используется в Windows, и 2) что код, который его использует, также должен быть, по крайней мере, частично написан на C++, что приводит к выводу, что существует немало C++. в Windows. Кроме того, я не могу поверить, что мы даже спорим об этом. Что это меняет? Как я уже сказал, C++ был принят, потому что он предлагал простой путь обновления. Он не заменил и никогда не заменит C, но занял свое место под солнцем. - person jalf; 05.01.2011

C++0x определенно больше похож на D, чем C++ 98 или 03, но это все же разные языки. Стереотипно, D рассматривается как лучший C++, и он больше похож на C++, чем на любой другой язык, но все же он во многом сам по себе. В таком случае единственное свойство, которое я могу придумать навскидку, которое есть в C++ и которого определенно не хватает D, — это множественное наследование, но, учитывая все проблемы с множественным наследованием, почти каждый язык после C++ отказался от него. . Вместо этого D вводит ряд других функций, таких как alias this и примеси, позволяющие наследование реализации (помимо наличия интерфейсов, таких как C# и Java), так что вы можете получить преимущества множественного наследования без всех головных болей. Вероятно, есть некоторые другие вещи, которые есть в C++ и которых нет в D, но вам, вероятно, придется тщательно их искать.

D обычно может делать все то же, что и C++, но он может делать больше, чем C++, и часто может делать это лучше. Слабые стороны D заключаются, прежде всего, в его относительно молодой реализации компилятора (что может означать ошибки в компиляторе при работе с новыми функциями) и в том факте, что его стандартная библиотека в значительной степени находится в стадии разработки (хотя многое из того, что есть, фантастично, и оно продолжается). совершенствоваться и расти). Однако со временем эти проблемы, очевидно, исчезнут. Во всяком случае, я бы сказал, что D немного мощнее, чем C++. Меня разочаровывает необходимость программировать на C++ после того, как я выполнил кучу программирования на D. Это особенно верно, когда дело доходит до шаблонов (шаблоны D превосходят шаблоны C++ с точки зрения мощности и удобства использования). Вообще говоря, D просто более мощный и менее подверженный ошибкам. Проблемы, которые у него есть, - это проблемы с реализацией, которые носят совершенно временный характер и постоянно устраняются.

Теперь, что касается C++0x, он добавляет ряд новых функций в C++, которые определенно улучшат его. Некоторые из этих функций уже есть в D. Примерами этого могут быть лямбда-выражения, циклы foreach и auto (я особенно с нетерпением жду auto. Я был очень удивлен тем, насколько сильно это изменило правила игры в D). Итак, некоторые вещи, которые D улучшил по сравнению с C++ 98/03, будут в C++0x. Но очевидно, что не все они будут, и C++ определенно отличается от D. Это не D. Это не может быть D. И он не должен быть D. Хотя они очень похожи в основе, они точно разные языки.

Если вы действительно хотите узнать больше о D, вам следует ознакомиться с Язык программирования D, исчерпывающая книга по D и одна из лучших книг по программированию, которые я когда-либо читал. Кроме того, как указано в другом ответе, существует довольно хорошая сетка сравнения различных языков здесь . И, конечно же, есть официальный сайт.

person Jonathan M Davis    schedule 02.01.2011
comment
На самом деле на любой вопрос, касающийся D, можно ответить, прочитав книгу. Книгу Андрея не только приятно читать, но она очень информативна и хорошо структурирована. Вы не пожалеете об этом, даже если никогда не перейдете к использованию D. Андрей прекрасно объясняет, почему вам нужны функции D, которые помогут любому критически взглянуть на предпочитаемый им язык. - person deft_code; 06.01.2011

Раньше я был программистом на C# (я также знаю C++ и Java), но после изучения D я бы сказал, что это был бы лучший язык на свете, если бы его компилятор был безглючным. Просто посмотрите на эти страницы:

Языки против D

Функции языка D

Есть две основные причины, по которым D не прижился:

  1. Компилятор не свободен от ошибок (например, ошибки прямой ссылки очень раздражают и их сложно решить) (Редактировать: он значительно улучшился!).

  2. Не существует переносимого способа взаимодействия с устаревшим кодом C++ практически с любым другим языком, включая D. Следовательно, большинство людей просто вынуждены продолжать использовать C++, чтобы иметь возможность использовать свой старый код.

  3. Хотя использование GC не является «обязательным», стандартная библиотека широко использует его, поэтому вы в значительной степени вынуждены использовать его, если используете Phobos. Я думаю, что есть планы исправить это, но пока это так, люди, которым нужно ручное управление памятью, вероятно, будут избегать D.

Если бы эти проблемы были решены, я бы сказал, что D, вероятно, быстро завоевал бы популярность.

person user541686    schedule 01.01.2011
comment
Вы должны попробовать Феликса. Он основан на ML, с самого начала был разработан для привязки к C++ и генерирует ISO C++ в качестве целевого языка. Компилятор, конечно, не свободен от ошибок, но вам не нужно беспокоиться о прямых ссылках (поиск осуществляется по наборам, как метки перехода в C). - person Yttrill; 02.01.2011
comment
Хм, посмотрю, когда будет возможность, спасибо! :) - person user541686; 02.01.2011
comment
D не приживется: он слишком сильно зависит от объектной ориентации, что является неправильным ответом. Посмотрите на стандартную библиотеку C++. Будущее — за функциональным программированием, объектно-ориентированное программирование — второстепенная техника. - person Yttrill; 02.01.2011
comment
Ха-ха, сначала я собирался не согласиться, но я полностью согласен с тем, что будущее за функциональным программированием, а ООП — это техника (хотя я не уверен насчет второстепенной части). Но мне любопытно, каким образом библиотека C++ больше подходит для функционального программирования, чем библиотека D? - person user541686; 02.01.2011
comment
@Yttrill, D действительно имеет надежные функции ООП, почему это плохо? Стандартная библиотека не сильно использует объекты и содержит в основном бесплатные функции или структуры. Одним из лучших модулей является std.algorithms digitalmars.com/d/2.0/phobos/std_algorithm. .html, на который влияет STL. - person he_the_great; 02.01.2011
comment
@Yttrill Разработчики D полностью понимают мощь функционального программирования, и стандартная библиотека содержит множество инструментов для этого. В языке есть система типов, которая сильно подчеркивает силу неизменяемых данных, и ключевое слово, обозначающее функции как чистые, чтобы компилятор мог оптимизировать их более агрессивно. - person Justin Spahr-Summers; 02.01.2011
comment
Я знаю, что это поток D, но нет переносимого способа взаимодействия с устаревшим кодом C++ практически на любом другом языке. С введением CXXI (произносится как секси) любой .NET/ Язык Mono может легко взаимодействовать с устаревшим C++ и расширять его. - person Justin; 25.02.2012

D — это другой язык, предположительно изобретенный для решения многих проблем с C++. Я никогда не пробовал, потому что меня никогда не беспокоили "проблемы" С++.

C++0x — это новый стандарт для C++, который добавляет множество столь необходимых функций (хотя, к сожалению, не все, на что мы надеялись). Чтобы увидеть, что добавляет C++0x, взгляните на вики-запись об этом:

http://en.wikipedia.org/wiki/C%2B%2B0x

person Edward Strange    schedule 01.01.2011
comment
Это честный вопрос, а не троллинг. Если вас никогда не беспокоили проблемы C++, то почему вы считаете, что новые возможности C++0x так необходимы? Это потому, что новые функции заставили вас распознать проблемы, которые у вас были, или вы уже видели проблемы и просто не возражаете, что язык в чем-то сломан? - person Justin; 25.02.2012

C++0x — это следующий стандарт C++ (предыдущий из них был установлен в 2003 году). Эти два являются одним языком.

Д - это совсем другой язык. Вы могли бы лучше спросить, что общего между C++ и D. У меня почти нулевой опыт работы с D, поэтому я не могу сказать вам свое мнение о нем, но у меня есть довольно небольшой опыт работы с C++. Я слышал, что одной из наиболее значительных (предполагаемых) проблем с C++, которую решает D, является сборка мусора: в C++ нет сборщика мусора, а в D он есть.

Лично мне C++ намного больше нравится. Я мало разбираюсь в сборщиках мусора, но в прошлый раз, когда я проверял, не существовало эффективного сборщика мусора, который гарантировал бы правильную и детерминированную очистку памяти в отношении точного момента, когда GC врывается и делает свое дело. Конечно, динамическое выделение памяти в C++ может дать сбой, но есть способы сгруппировать все ошибки распределения памяти программы в одну точку (пул памяти), чтобы во время компиляции можно было сказать, что после прохождения этой точки больше не будет сбои operator new. Этот метод также дает вам почти мгновенные динамические распределения: тогда выделения являются внутренними для программы и представляют собой простую игру указателей.

Кроме того, сборщики мусора применяются только к памяти, а не к другим ресурсам.

person wilhelmtell    schedule 01.01.2011
comment
Если вы мало знаете о GC, зачем комментировать? Современный сборщик мусора является генерационным и инкрементным, а некоторые могут даже работать одновременно, а программы на языках высокого уровня, как правило, быстрее и без джиттера. Если C — это переносимый ассемблер, то C++ — это ассемблер с уродливым макропроцессором, наброшенным сверху. :) - person Yttrill; 02.01.2011
comment
@Yttrill Я имел в виду, что сборщик мусора решает, когда войти, и делает это в основном в непредсказуемое время. Здесь я ожидаю, что люди с хорошим знанием GC поправят меня, если я ошибаюсь. Если мой код зависит от производительности, как я могу быть уверен, что сборщик мусора не сработает в определенный период времени? Например, если я приземлюсь на самолете, это будет очень неудачное время для освобождения памяти. Кроме того, препроцессор исходит от C, а не от C++. - person wilhelmtell; 02.01.2011
comment
@wilhelmtell, он сказал, что макропроцессор (отвечающий за печальное оправдание объектной системы в C ++), а не препроцессор. Кроме того, современные сборщики мусора очень отличаются от ранних сборщиков мусора, которые получили довольно несправедливую репутацию из-за того, что всегда пытались освободить память в самый неподходящий момент. Современные GC на самом деле не врываются, как человек с Kool-Aid, и не разрушают ваши системы реального времени. - person ; 02.01.2011
comment
@wilhelmtell, D позволяет отключить сборщик мусора, предотвращая сбор. Вы по-прежнему можете использовать те же методы ручного управления памятью, что и в C++. - person he_the_great; 02.01.2011
comment
@wilhelmtell: -1 -- не потому, что я не согласен, а из-за неверной информации: ВСЕ динамическое выделение памяти недетерминировано. (Вы когда-нибудь слышали о том, что malloc() гарантирует ответ в течение 5 мс в режиме реального времени, например?) Сборщик мусора этого не меняет. Я действительно предлагаю вам посетить эту страницу, чтобы понять, чем полезен GC: digitalmars.com/d/2.0/garbage.html (как сказал he_the_great, вы всегда можете отключить его, если действительно хотите.) - person user541686; 02.01.2011
comment
@Lambert Позже я более серьезно рассмотрю D. Сейчас немного занят. Но согласно вашему отрицательному голосованию: есть разница между новым и GC. Я контролирую new и не контролирую GC. Я могу использовать пул памяти для одной цели, а затем новый является детерминированным, чтобы быстро реагировать и работать. То есть перенаправить все сбои памяти программы на начало ее выполнения. Я могу играть с этим. Также: мне нравится RAII. - person wilhelmtell; 02.01.2011
comment
@Lambert Я посмотрю на D более внимательно, но убедитесь, что вы не минусуете меня в защите языка. Я действительно сказал что-то неправильное? Я не сказал ни слова о new или malloc. Я сказал что-то не так о GC? - person wilhelmtell; 02.01.2011
comment
@wilhelmtell: я проголосовал против, потому что это явно подразумевало, что выделенная пользователем память (также известная как память без GC) является детерминированной, что неверно. Но учитывая, что технически вы этого не говорили (хотя это очень явно подразумевалось), я уберу свой голос против (и изменю его на +1, так как в остальном это отличный ответ), если вы делаете небольшое изменение, чтобы не подразумевать это. (Я все равно не могу изменить его сейчас, потому что он заблокирован... извините за это. :() - person user541686; 02.01.2011
comment
@wilhelmtell: В качестве примечания: вы можете управлять сборщиком мусора в D. Вы можете отключить его и, если я не ошибаюсь, вы можете перегрузить new и delete, как в C++. Таким образом, вы имеете столько контроля, сколько хотите. - person user541686; 02.01.2011
comment
@Lambert разъяснил мою точку зрения. Я все еще защищаюсь от C++ :), потому что мне все еще нужно копаться в D. - person wilhelmtell; 02.01.2011
comment
@wilhelmtell: Спасибо за разъяснение; +1 (или +2, если смотреть на это очень оптимистично, ха-ха). :) И я понял, что я в некотором роде противоположность вам... Я знал довольно много C++ и после изучения DI узнал все о его ошибках, но теперь мне нужно покопаться в C++0x (в отличие от D для вас), прежде чем судить о нем на основе его предшественника. И спасибо за обсуждения (здесь и ниже), я многому научился. :) - person user541686; 02.01.2011
comment
D поддерживает уничтожение на основе области действия аналогично C++, а также с помощью ключевого слова языка scope, что означает, что ресурсы, не относящиеся к памяти, могут быть очищены так же эффективно, как и в последнем. - person Justin Spahr-Summers; 02.01.2011
comment
@Lambert: детерминированный в этом контексте обычно означает, что вы можете контролировать порядок, в котором происходят вещи, а не то, что вы знаете точную продолжительность вызова функции. C++ в этом отношении детерминирован. new/delete/free/malloc вызываются в известном порядке. Деструкторы вызываются в известных точках программы. Это не относится к языкам с GC. - person jalf; 02.01.2011
comment
@jalf: Это не относится к языкам с GC. Я не уверен, использовали ли вы D, но он позволяет вам удалять объекты вручную. Таким образом, деструкторы также могут быть вызваны в известных точках программ с сборщиком мусора. - person user541686; 02.01.2011

Просто пытаюсь дать простой сводный ответ:

C++ — это императивный мультипарадигмальный язык программирования. C++ до недавнего времени не предоставлял примитивов для параллелизма, и программисты в значительной степени полагались на поддержку библиотек. C++ поддерживает сложное множественное наследование. Стандарт C++ включает обширную стандартную библиотеку.

C++0x На момент написания (2 января 2011 г.) C++0x — это последний проект стандарта C++. Он добавляет много новых функций, которые помогают привести его в соответствие с другими современными языками. Некоторые из наиболее примечательных функций включают в себя: функции параллелизма и многопоточности, лямбда-выражения и расширения, существующую поддержку метапрограммирования.

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

C++ и D имеют совершенно разные реализации стандартных библиотек. C++ получил широкое признание в отрасли и широко используется. D не удалось проникнуть в отрасль в той же степени.

person MW_dev    schedule 02.01.2011