为什么没有比C更快,更好的语言出现呢?[关闭]


147

如今,随着所有新的“现代”语言问世,C为何仍被誉为最快和“最接近机器”?我真的不相信只有一种正确的做事方式,而C语言已经存在很长时间了(自60年代以来!)。我们真的没有想出比50年前更好的东西了吗?

我知道现代语言是高级语言,可以处理某些任务,例如垃圾收集和内存分配,并利用库等。我只是问为什么C从来没有真正的第二选择。

难道C太完美了,以至于没有其他方法可以操作计算机(除开发人员采用之外)?

编辑看,我不是想敲C或任何您喜欢的语言。我想知道为什么C成为标准,为什么其他替代方案从未出现,而C只是被“接受”。


44
C ++的写入速度和速度一样快。<3
GManNickG

6
嗯,您不是忘了c ++吗?

23
我认为组装是机器最快,最“接近”的地方。

27
为什么所有议案都告一段落?我真的很好奇...我不是要发动火焰大战或其他任何事情
杰森(Jason)2009年

15
又关门了 在被杰夫·阿特伍德(Jeff Atwood)重新开放后?你为什么可能要关闭这个?
杰森

Answers:


164

C是一种非常简单的语言,正因为如此,它的长寿才能使其快速,优化。在嵌入式环境,微处理器等方面,它也得到了广泛的支持。

很难击败一种非常简单而又快速的语言。改进这种语言的唯一一件事就是可用性:减少制作相似的通用代码所需的时间,并使抽象化建模更容易。

这就是C ++的用武之地。C++的速度与C一样快。实际上,C ++是一种更为复杂的语言,这意味着它肯定会提高生产率。只要人们知道如何使用它。C ++和C 不再是相同的语言。

现在,D又向前迈进了一步。快速代码,可选垃圾回收等功能相同,但从未流行。希望这会有所改变,因为它消除了困扰C ++的问题:与C的向后兼容性。

因此,要回答您的问题,“更好”是很难判断的。就简单性和速度而言,C可能接近我们所能做到的最好水平。就生产率还是简单性而言,尽管这种观点相差甚远,但是C ++可能是我们能做到的最好的方法。最后,在充实和整理的语言方面,C的速度和简单性使D赢得了这一优势。


31
“简单”的意思是“从编译器POV而不是程序员POV的简单”。C很简单,因为它基本上是用语句和表达式进行汇编的。Python简单的方法并不简单。
Marius

15
但是需要澄清的是,对于编译器而言,简单确实意味着易于掌握。也许不是简单的实现复杂的想法。
GManNickG

16
无论如何,OCaml可以生成高度优化的本机代码,其速度与C和C ++差不多,而代码本身却像Python一样简洁。稍加修饰,我认为当需要编写代码以实现最大速度和最小内存占用时,OCaml可以与C匹配或击败C作为选择的语言。Objective-C也做得很好,尽管它并不总是和C一样快,但它以C ++永远不可能也永远不会做到的方式使整个“带有对象的C”事情变得正确。
朱丽叶

2
同意@Thorbjørn,与C的向后兼容性是C ++流行而D却没有的原因。如果我们愿意放弃这一点,那么就没有理由满足于D的增量改进。我们可以选择完全不在C家族之外的更好的语言。正如@Juliet所说,OCaml在性能方面可能是一个可行的竞争者。但是,如果编译器编写者在它们上面花费了与在C或C ++上一样多的时间,那么其他许多语言也可以。无论如何,好的答案,并向我+1。
jalf

5
@Ferruccio:是的,但是每种语言都可以链接到C库。因此,如果我们愿意为此而解决,而不是像C ++(或多或少)所提供的实际的源代码兼容性那样,那么我们不妨选择一种完全不同的语言,例如Haskell或Python。C ++流行的原因并不是它可以链接到C库。那是因为它可以编译 C代码。
jalf

64

有比C语言更快的语言。

有比C更快的语言。例如,已经提到的Fortran表现很好,因为它具有更多受限制的别名语言规则。

也有实验性的汇编语言,例如语言,它们在前面攻击C语言,在C语言中它被用作高级汇编语言,例如,创建编译器。听说过C–或Janus吗?但是那两个被LLVM项目杀死了。

我敢打赌,APL或其他数学语言将在特殊的应用领域中将C抛诸脑后,因为它们已经建立了对Vector处理单元的支持。对于C语言来说,这是不可能的(伙计们:不!具有C链接的特殊优化库与C语言无关)。

另外,CPU生产者还删除了所有其他语言的内容,以帮助其他语言的编译器编写者-记住带标记的算术汇编代码,这些代码可快速在SPARC上实现LISP?随风而逝。

而且,如果您从微基准测试转到应用程序开发,则可以使用更快的语言进行应用程序开发。我的个人示例始终是SmartEiffel。它针对C,但正在使用全局系统优化,这使其在实际应用程序开发中的速度比C更快。

在这个领域中,即使是简单的错误或低级抽象也可能会破坏整个语言的性能。因为C没有提供高度抽象,大多数人说这是一个编程问题,但事实并非如此。例如,看看缺少泛型。在C语言中,您将最终获得慢速的实现,例如“ qsort”库函数,该函数可以使用泛型更快地编写(无需进行键比较的函数调用)。

只需将兆字节整数数组上的qsort调用与使用数组访问和内置“ <”运算符的良好手写实现进行比较即可。


9
很好的评论。重要的是要认识到C语言规范的某些方面(例如指针别名规则)使得不可能生成真正的最佳机器代码。作为高级汇编程序,C不是“最快”,而仅仅是“相当快”。

1
谢谢,我忘了提到不可能返回多个结果值的问题。在将其用作高级汇编程序时,我很想念另一个低级方面。

5
正确编写的Modern C可以编码与任何其他语言相同的别名假设,从而使编译器可以进行相同的优化。该语言的一个重要功能是,它还允许程序员在不适用时不承担这些要求。您的其他观点很明确,因此+1。
斯蒂芬·佳能

1
@Rascher:没错,在那里您会看到C对始终指定CPU ABI的CPU设计人员的影响。和多个返回值的东西,只是不来还有脑海即使寄存器的数量将不会是一个问题(SPARC,PowerPC上,安腾)

13
C中的指针别名已由restrictC99 处理(10年前!)。

35

好问题。我认为语言通过找到合适的市场而成功。重要的是要注意,有许多更新的语言在其优势领域比C更好。

  • C曾经被广泛用作一种应用程序语言,在这一领域,它已逐渐被C ++,Java和最近各种其他语言(特别是动态语言)所取代。

  • C曾经是用于编写服务器代码的语言。网络将各种各样的语言(Perl,Java,Python,VBScript,VB.NET,Ruby,C#)推向了这个领域,现在C对服务器代码具有某种意义的情况已经很少了。

  • C已经用于科学计算,但是它面临来自特定领域的语言(如Matlab和Mathematica)以及诸如SciPy之类的库的竞争。在这个小众市场上写代码的很多人都不是行业编码人员,C不适合他们。

但是C的定位是系统代码。操作系统内核。司机。运行时库。它在这样的空间中建立起来,以至于C ++都在缓慢地取代它。

由于UNIX,C早在1970年代就赢了,原因是竞争性语言的限制太严格或太慢,并且C代码被认为是可移植的(即使如此)。但是,如今它的最大优势是无关紧要的,主要源于数十年主导其利基市场。对于C语言,有很好的工具:优化编译器,内核调试器,有效的静态分析以查找驱动程序代码中的错误等。几乎每个主要平台都定义了C ABI,并且通常是库的通用语言。有一群知道如何编写C的程序员,并且知道C的问题和陷阱是什么。

长期来看,这种利基市场并不会消失。C有一些问题。但是,对于任何新手来说,竞争仍然非常困难。


9
C仍然广泛用于服务器代码。不仅Web,大多数DNS,电子邮件等服务器都是用C编写的。即使对于Web,Apache也是用C

@bortzmeyer:虽然Apache很老。我并不是说它没有用或已被取代,它只是在C出现时创建的,没有很多好的选择。
Macke

1
我很好奇您为什么认为C不适​​合科学计算。固然Python的使用更令人愉悦,但我发现C是需要较快代码时的可靠替代品,并且与其他编程方面不同,许多可能的替代品(C ++)并没有给表带来太多价值。
Fomite

1
除此之外, C 编写的 SciPy / NumPy等内容已经使了解它变得很有用。
Fomite

1
@EpiGrad也许C是您的可靠选择。但是C的学习曲线非常陡峭,特别是对于那些没有编码背景的人。特别是,有时它会崩溃,如果您不是编码人员,则几乎没有希望弄清楚它。Mathematica使大量的事情变得更容易编写,并且最终您减少了数百倍的代码。而且不会崩溃。
詹森·奥伦多夫

25

用一个很好的措辞来解释:快速和“接近机器”的语言没有很多不同的方法 -C语言做得很好,并且几乎没有任何改进的余地。

原始答案:

快速执行或快速写入内容?

语言执行的速度不是很快或很慢而是特定的实现。只有在某种程度上使一种语言易于实现快速实现时,它才能被认为比其他语言更快。始终意味着“靠近机器”。但是随着机器呈指数级增长,随着时间的流逝,这变得越来越不有趣了。相反,开发的便捷性和速度以及可移植性变得更加重要,因此“更好”已意味着“远离机器”。在过去的50年中,几乎所有语言设计方面的努力都朝着这个方向发展。

所以,您到了:与C机器更近,语言更快的语言;它们是C之前的版本:Fortran的汇编器。可能是一些被遗忘的。


@michael-但仍然存在超精简,超快速编程的市场,尤其是在所有这些移动设备的猛烈冲击下……为什么C仍然是其中某些设备的最佳选择,即为什么没有其他设备这样的语言,例如.NET-vs-Python-esque?
杰森

5
Lisp。沉睡但不被遗忘!:)

2
@Jason:问题是,您需要多少个便携式汇编器?C是众所周知的,很难用更快的实现来编写语言,那么为什么要麻烦呢?用西服讲,没有要求,没有市场,没有动力。

4
@ Michael,对您的回答发表评论深表歉意。在python / ruby​​ / java等领域中存在更多原因的原因是,一旦您停止尝试最有效的语言,便会获得更多关于要优先排序的功能的选择,并且每种方法都可以产生一种新的语言。编写最快可能的语言的方法要少得多。

1
-1表示“几乎没有任何改进的余地”- 在C / C ++上有很多改进的余地而不会影响性能。
BlueRaja-Danny Pflughoeft,2010年

21

对于数字任务,Fortran比C更快,这是因为它处理内存引用的方式(C指针更难优化)。诸如Matlab和Numpy之类的重量级数字库仍然是用Fortran编写的。

另一方面,C ++的速度与C一样快,但是具有许多更高级的编程功能。从80年代中期开始,它是一种更新得多的语言。


1
而且C ++仍在更新中。
GManNickG

5
@GMan:C也是如此


3
如果我错了,请纠正我,但是C99 restrict指针不会具有与Fortran相同的别名语义吗?还有什么与众不同?

9
我认为,Fortran比C更快的想法有些荒谬,这取决于所编码的内容和编写者。重量级数字库位于Fortran中的原因不是因为Fortran速度更快,而是因为例程最初是在Fortran中编码的,很少有人愿意或需要重写它。少数编写和审查这些算法的数学专家对Fortran感到满意,并且认为不需要更改,特别是因为他们认为Fortran更快。
Mike Dunlavey 2010年

16

哎呀,我将用我的0.02美元投入。

在许多情况下,“系统”语言和高级语言之间存在真实或可感知的差异。我将忽略大多数“高级”语言,因为没有人(至少不是很多)会争辩说对于许多任务而言,Python,Ruby等语言更易于使用。

C被设计为一种系统语言,这意味着它被设计为Unix操作系统的编写语言。因此,它被设计为简单,强大和快速。一种简单的语言通过使非系统程序员经常认为危险来提高能力:指针,手​​动内存管理等。正如已经提到的,C非常简单。到目前为止,K&R是我编程书籍中最小的一本(不包括O'Reilly Pocket References),并且仅比我的《 Ruby Pocket Reference》略大。C非常强大。如果您需要与硬件对话,请手动检查并旋转内存等。C具有此功能。

但是,从程序员的角度来看,C并不是那么简单。速度和功能是以手动内存管理为代价的,而该语言没有内置太多的OOP支持。从程序员的角度来看,C ++(不是我最喜欢的语言)要简单得多,但从编译器的角度来看要简单得多。Objective-C(可能是我最喜欢的语言)具有相同的权衡,在保持语言简单化方面略有倾斜(例如,垃圾回收是Objective-C的新手)。但是,由于我们许多人都知道计算世界是用C编写的,因此较新,更复杂但“更轻松”的语言很难被广泛采用。

在某些情况下,尤其是当当前的“标准”与C一样“足够好”时,根本就没有很多“更好”的东西(C ++,Objective-C,D等)来获得牵引力的动力。甚至足以激励人们创造出“更好”的东西。

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.