В последнее время мы все чаще сталкиваемся с ними и слышим их, и я хотел бы провести хорошее сравнение между ними прямо здесь, в stackoverflow. Ссылки, ссылки и статьи тоже подойдут.
Каковы основные различия между C++, D и C++0x?
Ответы (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++.
map<string, map<int, string>> m;
, даже не компилируется на C++ (хотя C++0x пытался это исправить, но представил гораздо более ужасный синтаксис для множества других вещей). Взгляните на эту страницу и найдите контекстно-свободную грамматику: digitalmars.com/d/ 2.0/overview.html С отдельными этапами семантического и синтаксического анализа код D становится практически однозначным и намного более читабельным и чистым, чем C++.
- person user541686; 02.01.2011
y = (T)-1;
- person user541686; 02.01.2011
memoize()
на C++ или C++0x, которая будет принимать адрес функции и возвращать другую функцию с такая же точная подпись, но та, которая кэширует результаты вызова исходной функции, возможно, в хеш-таблице? Примечание: вы не можете использовать переменные varargs, потому что они небезопасны для типов и не проверяются компилятором; возвращаемая функция (или указатель на функцию) должна иметь точно такой же список параметров, ни больше, ни меньше. Я сделал это довольно легко в D.
- person user541686; 02.01.2011
memo
, чтобы она делала то, что вы просите (пусть она просто хранит статическую версию объекта и делает все через нее).
- person Peter Alexander; 02.01.2011
memo
хранить статический объект, вам придется его инициализировать. Но не каждая версия memo
принадлежит одной функции, поэтому вам нужно иметь статическую карту внутри memo, а затем индексировать ее адресом пользовательской функции... правильно? Хм... это кажется разумным, я пытаюсь понять, насколько это большое изменение. В целом, я скажу, что потерял это, хотя бы потому, что не попробовал это сам заранее, прежде чем выносить суждения о С++. Большое спасибо, что нашли время, чтобы напечатать это!! :)
- person user541686; 02.01.2011
map<Func, Memoize<Func> >
(если бы это было до C++0x, это пространство было бы решающим!), и так что это почти то же самое, так что да, я бы сказал, что это d по-прежнему выглядит довольно читабельно.
- person user541686; 02.01.2011
map<int, map<char*, int>>
, которых в любом случае не должно быть в языке. Я был застигнут врасплох программой Питера только потому, что это был C++0x, а не C++, который в любом случае официально еще не существует -- я знаю тот факт, что вы не можете даже приблизиться к тому, что я сделал в D с чистым C++. Так что не думайте, что когда мы говорим о хороших сторонах D, мы не видели и другие языки — мы видели, и в моем случае я бы сказал, что написал достаточно полезных программ на других языках (например, : средство записи компакт-дисков на основе SCSI на языке C#), чтобы сделать обоснованное суждение. :)
- person user541686; 02.01.2011
msvcp60.dll
, и IIRC всегда был в Windows, начиная с XP (это не распространяемый, он встроенный). Так что наверняка программы на C++ будут ссылаться на него?!
- person user541686; 04.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 и одна из лучших книг по программированию, которые я когда-либо читал. Кроме того, как указано в другом ответе, существует довольно хорошая сетка сравнения различных языков здесь а>. И, конечно же, есть официальный сайт.
Раньше я был программистом на C# (я также знаю C++ и Java), но после изучения D я бы сказал, что это был бы лучший язык на свете, если бы его компилятор был безглючным. Просто посмотрите на эти страницы:
Есть две основные причины, по которым D не прижился:
Компилятор не свободен от ошибок
(например, ошибки прямой ссылки очень раздражают и их сложно решить)(Редактировать: он значительно улучшился!).Не существует переносимого способа взаимодействия с устаревшим кодом C++ практически с любым другим языком, включая D. Следовательно, большинство людей просто вынуждены продолжать использовать C++, чтобы иметь возможность использовать свой старый код.
Хотя использование GC не является «обязательным», стандартная библиотека широко использует его, поэтому вы в значительной степени вынуждены использовать его, если используете Phobos. Я думаю, что есть планы исправить это, но пока это так, люди, которым нужно ручное управление памятью, вероятно, будут избегать D.
Если бы эти проблемы были решены, я бы сказал, что D, вероятно, быстро завоевал бы популярность.
D — это другой язык, предположительно изобретенный для решения многих проблем с C++. Я никогда не пробовал, потому что меня никогда не беспокоили "проблемы" С++.
C++0x — это новый стандарт для C++, который добавляет множество столь необходимых функций (хотя, к сожалению, не все, на что мы надеялись). Чтобы увидеть, что добавляет C++0x, взгляните на вики-запись об этом:
http://en.wikipedia.org/wiki/C%2B%2B0x
C++0x — это следующий стандарт C++ (предыдущий из них был установлен в 2003 году). Эти два являются одним языком.
Д - это совсем другой язык. Вы могли бы лучше спросить, что общего между C++ и D. У меня почти нулевой опыт работы с D, поэтому я не могу сказать вам свое мнение о нем, но у меня есть довольно небольшой опыт работы с C++. Я слышал, что одной из наиболее значительных (предполагаемых) проблем с C++, которую решает D, является сборка мусора: в C++ нет сборщика мусора, а в D он есть.
Лично мне C++ намного больше нравится. Я мало разбираюсь в сборщиках мусора, но в прошлый раз, когда я проверял, не существовало эффективного сборщика мусора, который гарантировал бы правильную и детерминированную очистку памяти в отношении точного момента, когда GC врывается и делает свое дело. Конечно, динамическое выделение памяти в C++ может дать сбой, но есть способы сгруппировать все ошибки распределения памяти программы в одну точку (пул памяти), чтобы во время компиляции можно было сказать, что после прохождения этой точки больше не будет сбои operator new
. Этот метод также дает вам почти мгновенные динамические распределения: тогда выделения являются внутренними для программы и представляют собой простую игру указателей.
Кроме того, сборщики мусора применяются только к памяти, а не к другим ресурсам.
malloc()
гарантирует ответ в течение 5 мс в режиме реального времени, например?) Сборщик мусора этого не меняет. Я действительно предлагаю вам посетить эту страницу, чтобы понять, чем полезен GC: digitalmars.com/d/2.0/garbage.html (как сказал he_the_great, вы всегда можете отключить его, если действительно хотите.)
- person user541686; 02.01.2011
new
и delete
, как в C++. Таким образом, вы имеете столько контроля, сколько хотите.
- person user541686; 02.01.2011
scope
, что означает, что ресурсы, не относящиеся к памяти, могут быть очищены так же эффективно, как и в последнем.
- person Justin Spahr-Summers; 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 не удалось проникнуть в отрасль в той же степени.