随着今天所有新的“现代”语言问世,C仍被认为是最快和“最接近机器”的语言吗?我真的不相信只有一种正确的做事方法,而C语言已经存在很长时间了(自60年代以来!)。我们真的没有比近50年前写的东西更好的方法吗?等等。我只是问为什么C从来没有真正的第二种选择。

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

EDIT看,我不是想敲C还是​​你喜欢的语言。我想知道为什么C成为标准,为什么其他替代方案从未出现并且C只是被“接受”。

评论

C ++的编写速度和速度一样快,而且效率更高。<3

嗯,你不忘了c ++吗?

我认为组装是最快,最接近机器的机器。

为什么所有动议都告一段落?我真的很好奇...我不是要发动火焰战争或其他任何事情

又关门了在由杰夫·阿特伍德(Jeff Atwood)本人重新开放之后?为什么您可能要关闭它?

#1 楼

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

很难击败一种真正简单而快速的语言。改进这种语言的唯一一件事就是可用性:减少创建相似的通用代码所需的时间,并使抽象化建模变得更加容易。事实是,C ++是一种复杂得多的语言,这意味着它肯定会提高生产率。只要人们知道如何使用它。 C ++和C不再是同一种语言。

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

所以要回答您的问题,“更好”是很难判断的。就简单性和速度而言,C可能接近我们所能做到的最好水平。就生产力与简单性而言,尽管这种观点相差甚远,但C ++可能是我们能做到的最好的方法。最后,就充实和清理的语言而言,D凭借C的速度和简便性赢得了这种环境。

评论


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

–马里乌斯(Marius)
09年12月8日在7:56

但是需要澄清的是,对于编译器而言,简单确实意味着易于掌握。实施复杂的想法可能并不简单。

– GManNickG
09年12月8日在8:01

您不会用C#编写操作系统。 (我们谈论的是系统编程语言,可编译为本机汇编的编程语言。您可以使用任何其他语言执行的任何操作,可以使用C / C ++ / D进行的操作,但不能执行其他操作。)

– GManNickG
09年12月23日在19:18

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

–朱丽叶
10 Mar 31 '10在13:18

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

–杰夫
2010-12-23 9:13

#2 楼

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

还有一些实验性的汇编语言,例如语言,它们在前面攻击C语言,在C语言中它被用作高级汇编语言,例如编译器的创建。听说过C–或Janus吗?但是这两个人被LLVM项目杀死了。对于C语言来说,这是不可能的(伙计们:不!具有C链接的特殊优化库与C语言无关)。

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

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

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

评论


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

–康斯坦丁
2009年12月8日9:00

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

–乐透
09年12月8日在11:47

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

–斯蒂芬·佳能(Stephen Canon)
09年12月8日在16:32

@Rascher:没错,在那里您会看到C对始终指定CPU ABI的CPU设计人员的影响。即使寄存器数量没有问题(SPARC,PowerPC,Itanium),也不会想到多个返回值

–乐透
09年12月8日在19:02

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

– Pavel Minaev
09年12月9日,0:01

#3 楼

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


C曾经被广泛用作应用程序语言,在这一领域,它已经稳步丧失了地位。 C ++,Java和最近的各种其他语言(尤其是动态语言)的基础。
C过去是用于编写服务器代码的语言。 Web将各种各样的语言(Perl,Java,Python,VBScript,VB.NET,Ruby,C#)推向了这个领域,现在C对服务器代码有意义的情况已经很少了。 br /> C已用于科学计算,但是它面临来自特定领域语言(例如Matlab和Mathematica)以及SciPy这样的库的竞争。在这个小众市场上写代码的人很多都不是程序员,而C不太适合他们。

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

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

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

评论


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

– Bortzmeyer
09年12月8日在19:19

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

– Macke
09年12月8日在21:05

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


2011年11月19日,下午3:37

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


2011年11月19日,下午3:37

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

–詹森·奥伦多夫(Jason Orendorff)
11年11月21日在22:36



#4 楼

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

执行速度快还是编写速度快?

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

因此,您已经找到了:与机器更接近,比C更快的语言;它们是C之前的版本:Fortran汇编程序。可能是一些被遗忘的。

评论


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

–詹森
09年12月8日在7:22

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

–卡尔·斯莫特里兹(Carl Smotricz)
09年12月8日在7:28

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

–卡尔·斯莫特里兹(Carl Smotricz)
09年12月8日在7:31

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

–卡尔·斯莫特里兹(Carl Smotricz)
09年12月8日在7:35

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

– BlueRaja-Danny Pflughoeft
2010年3月31日在13:13

#5 楼

对于数字任务来说,Fortran比C更快,因为它处理内存引用的方式(C指针更难优化)。
像Matlab和Numpy这样的基础上的重量级数字库仍然是用Fortran编写的。 br />
另一方面,C ++可以和C一样快,但是具有许多更高级的编程功能。从80年代中期开始,它是一种更新得多的语言。

评论


而且C ++仍在更新中。

– GManNickG
09年12月8日在6:30

@GMan:C也是如此。

–峡谷
09年12月8日在9:16

C1X(en.wikipedia.org/wiki/C1X)

– narfblam
09年12月8日15:12

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

– Pavel Minaev
2009年12月9日,0:02

我认为,Fortran比C更快的想法有些神话,这取决于所编码的内容和编写者。重量级数字库位于Fortran中的原因不是因为Fortran更快,而是因为例程最初是在Fortran中编码的,很少有人愿意或需要重写它。少数编写和审核这些算法的数学专家对Fortran感到满意,并且认为不需要进行更改,尤其是因为他们认为Fortran更快。

–迈克·邓拉维(Mike Dunlavey)
2010-1-26的15:07

#6 楼

真糟糕,我会花我的0.02美元来赚钱。我将忽略大多数“高级”语言,因为没有人(至少不是很多)会争辩说对于许多任务来说,像Python,Ruby等语言更易于使用。
设计为一种系统语言,这意味着它被设计为Unix操作系统的编写语言。因此,它被设计为简单,强大和快速。一种简单的语言通过使非系统程序员经常认为危险来提高能力:指针,手​​动内存管理等。正如已经提到的,C非常简单。到目前为止,K&R是我编程书籍中最小的一本(不包括O'Reilly Pocket References),并且仅比我的《 Ruby Pocket Reference》略大。 C非常强大。如果您需要与硬件对话,则可以手动检查并旋转内存等。C具有该功能。速度和功能是以手动内存管理为代价的,而该语言没有太多的OOP支持。从程序员的角度来看,C ++(不是我最喜欢的语言)要简单得多,但从编译器的角度来看要简单得多。 Objective-C(可能是我最喜欢的语言)具有相同的权衡,在保持语言简单化方面略有倾斜(例如,垃圾回收是Objective-C的新手)。但是,由于我们许多人都知道计算世界是用C编写的,因此较新,更复杂但“更轻松”的语言很难广泛采用。 “标准”和“ C”一样“足够好”,当有足够的动力来创造某种东西时,“更好”的东西(C ++,Objective-C,D等)获得吸引力的动机就不多更好”。