C++,D和C++ 0x之间的主要区别是什么?

Shi*_*nok 10 c++ d c++11

我们最近经常会遇到并听到它们,我想在stackoverflow上对它们进行一些很好的比较.链接,参考和文章也没关系.

Jon*_*vis 12

C++ 0x肯定更像D而不是C++ 98或03,但它们仍然是绝对不同的语言.从刻板印象来看,D被认为是一个更好的C++,它更像是C++而不是任何其他语言,但它仍然是它自己的野兽.在这种情况下,我能想到的唯一一个C++具有D绝对缺乏的功能是多重继承,但考虑到多重继承的所有问题,几乎C++之后的所有语言都决定反对它.相反,D引入了许多其他功能,例如alias this和mixins,以允许实现继承(在具有C#和Java之类的接口之上),因此通常仍然可以获得多继承的好处,而不会有任何令人头疼的问题.可能还有一些其他的东西,C++没有D,但你可能不得不为它们搜索.

D通常可以做C++可以做的任何事情,但它可以做的比C++更多,并且它通常可以做得更好.D的弱点主要在于其相对年轻的编译器实现(这可能意味着编译器在处理更新的功能时存在错误)以及其标准库非常重要的事实(尽管其中很多内容很棒,并且它仍在继续改善和成长).但是,给定时间,这些问题显然会消失.如果有的话,我会说D比C++强大得多.在D中完成一系列编程之后,我不得不用C++编程,这让人感到很沮丧.当涉及到模板时(D的模板在功能和可用性方面将C++的模板从水中清除),这一点尤其令人沮丧.一般来说,D更简单,更容易出错.它确实存在的问题是实施问题,这些问题是完全暂时的,并且正在稳步修复.

现在,对于C++ 0x,它为C++添加了许多新功能,这些功能肯定会改进它.其中一些功能已经在D中.其中一些例子是lambdas,foreach循环,auto(我特别期待auto.我已经非常惊讶于它在D中的游戏规则有多大).因此,D在C++ 98/03上改进的一些东西将在C++ 0x中.但显然不是所有人都会这样,而且C++绝对是一种与D不同的语言.它不是D.它不能是D.它不应该是D.虽然它们在核心非常相似,但它们是绝对不同的语言.

如果你真的想了解更多有关D的知识,你应该看看Andrei Alexandrescu的The D Programming Language,这是关于D的权威书籍,也是我读过的最好的编程书籍之一.此外,作为另一种回答指出,有各种语言的一个相当不错的比较格在这里.当然,还有官方网站.

  • 关于D的任何问题都可以通过"请阅读本书"来回答.安德烈的书不仅阅读愉快,而且内容丰富,而且结构合理,非常适合樱桃采摘.你不会后悔,即使你永远不会最终使用D.安德烈做了很好的工作,解释为什么你会想要D的功能,这将有助于任何人批评他们自己的首选语言. (4认同)

Meh*_*dad 11

我曾经是一名C#程序员(我也熟悉C++和Java),但在学习D之后,我会说它是有史以来最好的语言,只要它的编译器没有错误.看看这些页面:

语言与D

D语言功能

D没有流行的主要原因有两个:

  1. 编译器没有错误(例如,前向引用错误非常烦人并且难以解决)(编辑:它已经改进了很多!).

  2. 没有可移植的方式与传统的C++代码交互几乎任何其他语言,包括D.因此,大多数人只是被迫继续使用C++来使用他们的旧代码.

  3. 虽然使用GC并非"必需",但标准库会广泛使用它,因此如果您使用的是Phobos,则非常不得不使用它.我认为有计划解决这个问题,但只要是这种情况,那些想要手动内存管理的人可能会避免D.

如果这些问题得到解决,我会说D很可能会很快流行起来.

  • @Yttrill,D确实有强大的OOP功能,为什么这么糟糕?标准库不会大量使用对象,并且主要包含自由函数或结构.最好的模块是std.algorithms http://digitalmars.com/d/2.0/phobos/std_algorithm.html,它受STL的影响. (6认同)
  • D不会流行起来:它在面向对象中过多,这是错误的答案.看看C++标准库.功能编程是未来,OO是一种次要技术. (5认同)
  • @Yttrill D的设计者完全理解函数式编程的强大功能,而标准库包含了很多工具.该语言有一个类型系统,它强调不可变数据的强大功能,一个关键字将函数表示为纯函数,以便编译器可以更积极地进行优化. (3认同)

Pup*_*ppy 10

我的经验主要是C++ 0x调整了C++的某些方面,但实际上,它是相同的语言,只是更清晰,更灵活.但是,C++ 0x中存在很多主要问题,比如#include,常规函数的自动类型推导代码在某种程度上还远远不够.我喜欢C++ 0x,这是一个很大的改进,但它朝着正确的方向迈出了一小步.

D,我发现是,好吧.我不知道.我不喜欢D.我觉得它没有解决需要在C++中修复的问题,并且几乎按照自己的方式进行.我的意思是,语言无论它想成为什么都没有错,但它并没有让我觉得D在C++上真正进化过,它只是一个C++/C#混合体,它只是C#的演变.例如,它具有相同的单根对象层次结构,强制GC等.我觉得D可能是C#,其中一些功能如泛型和RTCG只是转移到编译时而不是运行时.

C++ 0x远远不够,D在一边走进C#和Java已经存在的领域.作为C++的继任者,我肯定还在市场上寻找其他东西.

  • @wilhelmtell:我认为你错了,C++的根本问题在于人们认为*可以修复*.它不能:修复它的时间是在第一个标准发布之前.D的失望之处在于它做得不够麻烦. (12认同)
  • 两点:据我所知,D不会尝试*修复*c ++,而是承认它是一个进化的死胡同(也就是说它无法以D的创造者想要的方式改进而仍然声称很多C++祖先的方式)并重新开始.它可能比C++更接近C. - 第二:D的模板可以做任何事情*我听说过C++正在做的事情,并且能够以最有能力的程序员能够理解的方式完成. (9认同)
  • "让我们修复C++"十字军的根本误解是有一些东西需要解决.人们认为C++很难,这是需要解决的问题.事实是**编程**很难.诀窍是创建一种促进正确代码的语言,而C++*就像其他语言一样擅长*.我认为,原因在于它的强大保证,因为它的效率和范式的灵活性.只有它与C的关系才有问题,因为它们使C++更受欢迎或更不受欢迎. (7认同)
  • @wilhelmtell:我不知道你是否知道,但D模板也是*编译时间,而且我说比C++更灵活.此外,它们可以像C++一样专业,*没有*含糊不清和**你需要的清晰度.如果您愿意,我可以向您发送一些简洁的示例,看看您是否可以将它们转换为干净的C++代码?"找到另一种可以接近这种力量的语言." - >请允许我介绍D. :) (7认同)
  • @jalf:是什么让你这么说的?D占用与C++相同的空间,即系统编程和高性能计算.这不是C#的用途. (6认同)
  • @wilhelmtell:没关系像`map <string,map <int,string >> m;`这样的事实甚至不能在C++上编译(虽然C++ 0x试图解决这个问题,但是引入了更加可怕的语法很多其他的事情).看一下这个页面,寻找"无上下文语法":http://www.digitalmars.com/d/2.0/overview.html通过单独的语义和语法分析阶段,D代码变得几乎无歧义且更易读比C++更清洁. (5认同)
  • @Lambert:完成http://ideone.com/g95Sc - 老实说,我认为C++ 0x版本比较整洁. (5认同)
  • @lambert:按规范进行模板元编程证明C++是搞砸的.去看看像Haskell或Ocaml这样的真正多态的语言.核心问题是C++的底层类型系统是crud,而依赖名称查找主要是试图支持类方法的人工制品.对于C++来说,删除这些东西为时已晚. (4认同)
  • @wilhelmtell:"人们认为C++很难,这是需要解决的问题." 是的,这很难,是的,它需要修复.C++模板经常使用副作用 - 而不是代码本身 - 来表达它们的含义.阅读这篇文章,看看我的意思,我在这里无法解释:http://www.digitalmars.com/d/2.0/templates-revisited.html(主要引用:"C++中的模板元编程通常似乎是依靠副作用,而不是能够明确地编码所需的东西.") (3认同)
  • 而且我认为大多数只有D熟悉D的人会同意D通常会在可读性和简洁性上获胜.但正如已经提到的,它不再真正与C++竞争.它徘徊在一个C#和其他语言更接近竞争对手的领域.所以这应该是它应该被比较的东西.它不再是目前使用C++的项目的合适替代品. (3认同)
  • 不,C++占据了与C和C++兼容的重要空间,成熟,稳定的工具支持非常重要,并且库支持几乎无处不在.D扔掉那些东西,从头开始创建一个新的生态系统.如果我们愿意这样做,那么我们也可以切换到其他几十种候选语言中的任何一种.我们不再需要留在C系列语言中的任何地方. (3认同)
  • @jalf:"我们不妨切换到其他几十种候选语言." - >我很想知道一些比D更好的系统编程语言的例子(以及原因).此外,仍然使用C/C++的主要原因是遗留代码 - 由于ABI不兼容,这主要只是C++的一个问题.但我想知道*确切**您认为D的哪个部分*不适合系统编程?在没有任何事实支持的情况下,你会做出诸如"你无法比较D与C++"之类的断言. (3认同)
  • @jalf:D大部分与C兼容.您只需要标题,您可以使用名为htod的自动化工具生成标题.无需从头开始生成库.此外,Python不用于高性能计算.例如,你永远不会*看到用Python编写的尖端渲染引擎.它根本没有它需要的东西. (3认同)
  • @jalf,Re:在D http://h3.gd/code/nucleus/中渲染引擎(说他在评论中使用了D).顺便说一下,我并不是说能够使用C库给它带来了优势,我只是驳斥了D程序员不得不扔掉C库并从头开始建立新生态系统的说法.这简直是​​假的. (3认同)
  • @jalf:那引擎是最前沿的. (3认同)
  • @Lambert:MS坚持保持他们的API C兼容. (3认同)
  • C++有效; D没有.就这么简单.通过"工作"我的意思是C++证明了自己,D没有.C++流行起来,D没有.飞机,宇宙飞船,潜艇,核工厂在没有一次爆炸的情况下使用C++.我希望看到垃圾收集和"大众语言"的发生! (2认同)
  • @wilhemltell:很抱歉在这里放三条消息,但也看一下这篇文章:http://stackoverflow.com/questions/52506/c-template-ambiguity (2认同)
  • @Lambert @Yttrill模板是C++特性使用的一个例子,它远远超出了预期的范围.请注意,并不是很糟糕.只是人们将模板的容量扩展到极限.例如,使用具有策略副作用的模板.这里的C++没有错; 反之.这只是意味着缺少一个功能.C++ 0x尝试引入概念,但唉,提案尚未准备就绪并失败.下次吧.仍然:C++在**世界**中拥有**最强**,**最佳**模板.你想"解决这个问题"吗? (2认同)
  • @Peter:我不得不说,你(和C++)做得很好; 老实说,我没想到这一点; +1.但是我遇到了一些问题:你没有返回一个函数,你返回了一个函数对象(struct) - 如果你要将一个memoized函数传递给外部代码,那么它不会是一个突破性的变化从非记忆版?或者我错过了什么(很可能就是这种情况)?(返回lambda的重点是你可以像原始函数一样传递它 - 而结构不能这样做......或者可以吗?) (2认同)
  • @ Peter,@ wilhelmtell:你知道,起初我放弃了,说C++ 0x和D一样好,但是现在我又把它拿回来了:请你看看[这个版本的memoize()(20行) )](http://ideone.com/lAzZQ)?你怎么看?这次C++ 0x能否超出可读性和简洁性?(我真的很想知道你现在的想法!:]) (2认同)
  • @Lambert:我怀疑会有更好的D版本:-)我不认为C++ 0x能够击败它. (2认同)
  • D粉丝接受麻烦的事情是*它不是真正的语言*.拥有一套干净,设计精良的语言并不能给你带来任何好处.您不需要学习多种语言才能实现这一点.作为一般的经验法则,最终流行的语言是丑陋,笨拙和原始的语言.D语言比C++更清晰并不重要,你可以编写一个优雅的memoization函数或编译时光线跟踪器并不重要.它仍然没有使C和C++坚持的*实用*品质...... (2认同)
  • @jalf:我们意识到,这就是为什么人们正在努力改进工具链和库. (2认同)
  • 当然,致力于改进这些事情的人们意识到这一点(总的来说,有很多非常聪明的人在D上工作,其中很多人完全清楚为什么语言尚未流行),这很好.那些说D是今天C/C++利基的更好选择的人*显然没有意识到这一点. (2认同)

Edw*_*nge 5

D是一种不同的语言,据说是为解决C++的许多问题而发明的.我从来没有尝试过,因为我没有被C++的"问题"困扰.

C++ 0x是C++的一个新标准,它增加了许多非常需要的功能(不幸的是,不幸的是我们不希望这些功能).要查看C++ 0x添加的内容,请查看其上的wiki条目:

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

  • 这是一个诚实的问题,而不是一个巨魔.如果你没有被C++的"问题"所困扰,那么为什么你认为新的C++ 0x特性是"非常需要的".新功能是否让您认识到您遇到的问题,或者您是否已经看到了问题并且不介意语言在某些方面被破坏了? (5认同)