C / C ++的可编译现代替代方案


38

我正在考虑编写新的软件产品。性能将是至关重要的,因此我对使用一种解释性语言或使用仿真层的语言(阅读Java)保持警惕。

这使我想到了使用C(或C ++)的想法,但是它们都相当长。我很久没用了。我认为在过去的20年中,有人可能创建了相当流行的东西,可以很好地编码和编译。

有什么比C更现代的替代方法来编写高性能的已编译代码?

如果说C ++与15年前是不同的野兽,我会考虑一下,我想我假设它有一些固有的问题。

并行化很重要,但可能不会跨多台计算机。


21
现代C ++与C根本不同。它与Java或C#之类的东西相比,与C具有更多的可比性,不同之处在于它具有确定性破坏而不是垃圾收集的功能,并且具有不确定的行为,因为它无法在VM中运行或托管环境。另一个选择是D,它是一种不错的语言,但是在库和支持方面仍然很不成熟。
查尔斯·索尔维亚

11
您能否详细说明“性能至关重要”部分?为什么如此关键?你测量了吗?
JesperE 2012年

3
15年是计算机领域的新纪元,从那时起,像爱立信这样的人就一直在使用像Erlang这样的功能语言来在其嵌入式系统中支持分布式,容错,软实时,不间断的应用程序!不要以为只有C ++可以为您提供所需的性能,不如在问题上投入更多的硬件,并节省使用另一种语言的大量实现时间,这可能更好。
Mark Booth

5
@JeremyFrench:但是您是根据错误的假设提出问题,即性能=>静态编译。
vartec

4
就其价值而言,在大多数情况下,Haskell目前可以替代我的C ++。
乔恩·普迪

Answers:


54

开发中的一种语言称为Rust编程语言,其追求的目标与C ++相似,尤其是零成本抽象和对内存管理的精细控制。也就是说,尽管还很年轻,但它可能是即将到来的最著名的候选人。

除了Rust之外,实际上没有其他流行的替代方法可以编译为本机代码。当然也有Delphi和D,但是它们不那么快,不受欢迎或不常用。谷歌的Go语言可能是一种候选语言,但它还很年轻,并且目标领域有所不同。

但是,请注意,即使C#(假定为Microsoft平台)和Java运行在虚拟机之上,它们的运行速度也可能不会那么慢。由于缺少程序状态和环境的信息,因此代码的即时编译可以进行一些传统的提前编译器无法应用的优化。

坦率地说,如果可以选择使用C ++,我个人不认为C是候选对象,主要是因为现代C ++更安全,可以在更高的抽象水平上运行,更具表达性,并且几乎没有C的性能损失(在某些情况下) C ++明显更快)。简而言之,C ++提供了C提供的一切以及更多功能。大多数C功能被认为“已弃用”,C ++标准库提供了更好,更安全,更快和更直观的替代方法。


5
从官方的意义上讲,我不会说C功能已“过时”-只是几乎没有理由在C ++中使用C库函数,原始指针或C数组。
查尔斯·索尔维亚

20
+1反对“性能需要编译”的错误假设。
Telastyn 2012年

3
@gbjbaanb尝试在Windows下使用Visual Studio和MinGW进行编译,并祝您好运:| 也要说服一个给您提供了使用该工具之一编译的,对ABI一无所知的已编译库的人,他错了,他应该给您该库的源代码或学习如何重新编译并提供正确的规范。有时会很恐怖。
user827992 2012年

5
@paxRoman:你可以用C小程序++,和他们比C.你可以更安全地写
凯文·克莱恩

3
@JBRWilkinson据我所知,Objective-C在苹果平台之外并不流行。
zxcdw 2012年

19

还有Ada,它可以编译为本地代码,并且可以在其标准库的范围内跨各种平台移植。该语言非常生动,目前正在进行最新的语言标准更新(称为Ada 2012)。

那些不熟悉Ada的人的简要概述:

  • 强类型
  • 内置的并发支持
  • 面向对象或过程,取决于您的要求
  • 由GNU工具链支持(GCC包含Ada前端)
  • 也非常适合软件开发,即当您需要直接与硬件接口时
  • 支持通用编程(通用包,过程,函数)
  • 功能支持大规模软件开发(程序包,子程序包,单独的编译,规范与实现之间的严格区分)

1
更不用说Ada Tasks(并行化!)
NWS 2012年

6
+1:我尝试学习一些Ada,并且我认为这是一种非常强大且简洁的语言。可惜没有其他编程语言那么多的工作。
Giorgio

3
提个不错,我一直在寻找更“现代”的东西,但是我忘了艾达(Ada)
杰里米·法兰西

4
@Jeremy French:您正在寻找Ada不提供的更“现代”语言的功能?
乔治

17

如果说C ++与15年前是不同的野兽,我会考虑一下,我想我假设它有一些固有的问题。

15年前,还没有C ++标准。第二本已于去年出版。C ++最佳实践在98标准发布后的5年中发生了很大变化,并且随着11标准的发布而又发生了变化。


12

人们为什么总是坚持寻找新语言?

C ++:

  • 是TIOBE的第4种语言,但如果与C结合使用,则会击败所有竞争产品
  • 有很多框架
  • 很容易编写代码
  • 很容易调音
  • 表现很出色
  • 很安全
  • 有很好的行业支持
  • 是跨平台
  • 如果正确完成,则不需要额外的VM / Frameworks /部署混乱
  • 轻松找到工作
  • 具有构建.so / .dll的所有必需的东西以在非常旧的系统上启动
  • 易于排除故障
  • 很有表现力
  • 非常动态
  • 和一堆其他有趣的东西

C ++的唯一缺点是您必须学习一些知识。而已。

将该语言与以下一种或多种其他语言进行比较:

  • 窄支持(OCML,Fortran等)
  • 慢(Java,Javascript)
  • 实验(Silverlight)
  • 移动目标(.NET 1/2/3/4/5?现在最后一个?)
  • 平台已锁定(.NET)
  • 框架支持不佳(Fortran)
  • 有小型社区(前10名以外的任何社区)
  • 进行恶梦般的故障排除(任何带有高级傻瓜概念和东西的东西)
  • 在客户计算机上需要500MB的预安装(JVM / .NETVM)

恕我直言,我们将使用和支持的语言越少,情况就会越好。

这会导致语言,支持,文档,标准化委员会的工作框架自动改进,书籍更好,知识更多,软件更容易支持,更好的模式,更长的语言支持周期以及使用该语言编写的更熟练的代码。

我知道人们会对此表示反对,但请认真考虑。


71
对不起,C ++“非常容易编码”是错误的。这是一种很难学习的语言,即使您使用现代的C ++习惯用法和避开指针,您也将在陷入困境之前面临大量令人费解的编译器和运行时错误。甚至在您掌握了语法之后,语法还是会很常见。Safe C ++通常使用一堆嵌套模板,这些模板会生成大量样板代码。
康拉德·鲁道夫2012年

20
与动态语言相比,非常富有表现力和动态的听起来不像典型的C ++特性。
vartec

29
@gbjbaanb再次“难以学习”,这离谱。抱歉。我已经对所有这些语言进行了多年编程,我显然更喜欢C ++(并且在其中进行了最认真的编程),但是说这很容易完全是一种误导。我不是在谈论花哨的元编程,而是在谈论由常规代码产生的编译器错误,这些错误是由名称隐藏,ADL,const正确性问题以及类似的东西引起的。读过有效C ++(如Coder所声称的那样)并坚持认为C ++简单易行的任何人都存在精神上的脱节。
康拉德·鲁道夫

13
@gbjbaanb我是C ++程序员。再说一次,我认为C ++并不容易。这个注释线程也引起了C ++聊天的皱眉。所以不是那样。C ++陷阱与其他语言的陷阱之间的区别在于,如果您不了解其他语言的陷阱,可能会很好。在C ++中,您敬酒。而且即使你知道这些,你仍然可以得到一个错误(今天再次发生在我身上)的编译错误的几个屏幕页面。即使错误很容易解决(错字),也需要花费时间来解析所有错误。
康拉德·鲁道夫2012年

6
什么时候流行一种流行语言?PHP非常流行,甚至没有认真的人认为它是一种“好的”语言,即使对于它的利基市场也是如此。关于流行语言的唯一“好处”是,有很多库可以使某些领域的编程变得更加容易。C++本身充满了挫败感。
weberc2

11

C / C ++太长了。。。这是一件好事。这意味着它们的设计足够好(糟糕),它们仍然非常有用,许多人将它们用于日常任务,并且您会发现很多开发人员都是其中的专家。成熟是值得珍惜的。

如果您将所有时间都花在寻找新事物上,仅仅因为它是新事物,并因此认为那一定是更好的话,那么您会感到非常失望。这适用于软件语言,GUI系统(请注意,Microsoft和Gnome)和爱好者(请注意,年轻女士:))

现在可以肯定的是,如果您的C ++经验已有20年之久,而当C ++代码通常像C一样编码时,那么也许是时候重新评估该语言了,使用了当日从未使用过的所有功能。如今,语言有了更多的发展,并且一些标准化工作使该语言略有扩展,使其看起来与那些旧的C样式开发有很大不同。并不是说C也很糟糕-它对于许多类型的编码任务来说也是一种完美的语言!


16
我认为C和C ++很好地说明了Hoare对软件设计的评论:要么使它变得如此简单,显然没有缺陷,要么使它变得如此复杂,没有明显的缺陷。
TMN 2012年

1
无论某种语言有多古老或根深蒂固,由于某种形式的缓冲区而导致的重复安全漏洞如何利用“好东西”?而且,这与争论反复受虐后是否继续确立的婚姻真的不同吗?
user2864740

@ user2864740你的建议是离婚,因为妻子老了,你想要一个新的,令人兴奋的模特……我说你坚持拥有的东西,因为你知道自己的缺点和怪癖。有多少种新颖的,很酷的语言解决了诸如缓冲区溢出之类的问题,然后发现有微妙的缓冲区溢出方法?那么,有什么更好的选择-您可以通过不懒惰或使用正确的构造来避免溢出,或者因为不知道在那里而陷入的溢出?
gbjbaanb

@gbjbaanb不,我从未这么说过。我是专门针对因不改善情境而造成损害的比喻。我通常很理性,不倾向于“选择”趋势主题或工具(这只是我的本性)。此外,C和C ++是不同的语言。然而,由于相同的掩盖原因,它们都是有道理的。这就是问题所在。
user2864740

8

C ++的当前标准是C ++ 11,该标准于2011年发布。因此它不是20岁的标准。两者之间有许多标准。它们每个都带来了许多性能改进。

编译器也在不断改进。与过去相比,它们在优化方面要好得多。

可执行格式也有所改进,在20年前您有了a.out,现在有了ELF

总的来说,关于C ++在20年内没有改变的建议离事实还很远。

另外,请记住,C和C ++是非常不同的语言。


2
我的假设是20年前首次构想的东西会具有固有的体系结构限制,只有使用空白状态才能改善。我认为这个假设可能是错误的。
杰里米·法兰西

4
@JeremyFrench:喜欢x86架构吗?
TMN 2012年

2
@TMN是证明还是反驳了我的假设?
杰里米·法兰西

6
原始的x86架构是在与8080向后兼容和与68000和NS32032竞争的一系列功能之间的一种令人讨厌的折衷。分段存储器(带有“ far”和“ near”指针),仅4个通用寄存器,可变长度指令编码,超过50种口味的JMP指令,多路复用的三态系统总线...但是直到今天,在许多“高级”全新设计(Alpha,MIPS,PowerPC)未能取代其基础设计之后,基础设计比以往任何时候都更加强大。
TMN 2012年

1
@JeremyFrench不,至少在C ++中,您的假设没有错。C ++ 11功能绝对有用。但是,在这一点上,它们只是胡扯而已。它们试图建立现代语言的功能,但是为了应对现有的C ++混乱,它们必须具有异常,并且这些异常将具有异常等等。
weberc2

6

我不是这种语言的专家,但是我认为OCaml可能是一个有趣的选择。

OCaml是一种编译的,功能/面向对象的语言。有关与C ++的性能比较,请参见C ++与OCaml:Ray Tracer比较。当然,这是一个非常具体的示例,应该进行更广泛的测试,以更好地了解OCaml的性能。


拒绝投票的人可否提示如何改善此答案?谢谢。
Giorgio

3

取决于您的产品将要做什么。如果性能真的很关键,那么首选的语言仍然是FORTRAN。我也不排除Java-它已在许多大容量金融交易应用程序中使用。如果您的问题域需要高并发性,那么Erlang值得一看。尽管我不知道它在Apple生态系统之外(除编译器和基本运行时之外)的支持程度如何,但Objective-C很好。我也听说过有关Haskell性能的好消息,但是我不确定这是绝对性能还是相对于其他功能语言的性能。


2
我看过的所有财务工作都需要C / C ++开发人员,而不是Java。从Java的经验来看,除非您投入大量硬件,否则我看不到任何高性能。
gbjbaanb 2012年

华尔街以及美国和英国的各种投资银行都在运行许多Java交易系统。在芝加哥商业交易所,它也被大量使用。
TMN 2012年

3

当您说您的项目对性能敏感时,您的意思是项目的每一行代码吗?还是像平常一样,是否有较小百分比的性能受到批评,而其余部分是您对工厂业务代码的常规运行?

回答完之后,您的项目面临的最大风险是:最终结果太慢,或者您从未首先完成它?

假设您都回答了第二个问题,则应该使用支持本机互操作的高级语言进行开发(Python,Ruby,.Net系列都具有此功能)。首先,完成项目。然后剖析,优化,冲洗,重复。只有在那之后,才考虑在本机代码中重新请求应用程序的选择段,并将该本机代码与最终产品集成在一起。


一旦是Java,如果速度太慢,就无法挽救它。
编码员

6
@Coder Java具有FFI(JNI),可让您以选择的语言“肆虐”。因此,如果您已经很好地设计了接口,则只需用本机替换Java实现即可。Java平台是经过深思熟虑的。
K.Steff

1

Vala与Java和C#类似,可以编译为本机代码(如果愿意,也可以编译为C源代码),并且速度非常快。它确实需要GLib作为其面向对象的位,并且它是由Linux黑客为Linux黑客编写的,因此,如果您的域是Windows,则可能不是很好。


1

Objective-C是现代的,经过编译的替代直接C和C ++的替代方案。它具有垃圾收集和确定性内存管理功能,并且消息传递的OO运行时已针对性能进行了优化。

它可以通过GCC和CLang获得,并且有可以在各种平台上工作的应用程序库,例如GNUStep和Cocotron。

如果您要执行高性能的工作,那么我将假定这是一种数字运算或其他分而治之的工作,而不是UI,这意味着您可以使用最适合您的语言进行UI,例如通过小型http服务器的HTML。


0

我从未使用过它,但是Cython的一个朋友发誓,它可以让您在代码的性能关键部分中使用C样式基元,同时保留通用的python语法,并能够充分利用python的更高层次的结构来减少开发其他地方的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.