简短的答案是:我们不知道,请在100年后再问一次。(那时我们可能仍然不知道;也许我们永远不会知道。)
从理论上讲,这是可能的。拿走曾经编写的所有程序,手动将它们翻译为最有效的机器代码,然后编写一个解释器,将源代码映射到机器代码。这是可能的,因为仅编写了有限数量的程序(并且随着编写更多程序,请保持手动翻译)。当然,从实际意义上讲,这也是完全愚蠢的。
再说一次,从理论上讲,高级语言也许能够达到机器代码的性能,但它们不会超越机器语言。这仍然是非常理论上的,因为实际上,我们很少诉诸于编写机器代码。此参数不适用于比较高级语言:并不意味着C必须比Python更高效,只有机器代码的性能不能比Python差。
从另一方面来看,从纯粹的实验角度来看,我们可以看到,大多数情况下,解释性高级语言的性能要比编译后的低级语言差。我们倾向于以非常高级的语言和对时间要求严格的内部循环在汇编中编写对时间不敏感的代码,介于两者之间的是C和Python。尽管我没有任何统计数据可以支持这一点,但我认为在大多数情况下这确实是最好的决定。
但是,在一些毫无争议的实例中,高级语言击败了人们实际上会写的代码:特殊用途的编程环境。Matlab和Mathematica之类的程序通常在解决某些数学问题上比单纯的凡人所能写的要好得多。库函数可能是用C或C ++编写的(这有助于“低级语言更有效”阵营),但是如果我正在编写Mathematica代码,那不关我的事,库是一个黑匣子。
从理论上讲,Python能否比C达到或接近最佳性能?如上所示,是的,但是我们离今天还很遥远。再说一次,在过去的几十年中,编译器取得了很大的进步,而且这种进步并没有放缓。
高级语言倾向于使更多的事情自动化,因此它们需要执行更多的工作,因此效率较低。另一方面,它们往往具有更多的语义信息,因此可以更容易地发现优化(如果您正在编写Haskell编译器,则不必担心其他线程会在您的鼻子下修改变量)。比较苹果和橙子不同编程语言的几种努力之一是“ 计算机语言基准测试”(以前称为枪战)。Fortran倾向于在数字任务上大放异彩。但是在处理结构化数据或高速线程交换时,F#和Scala表现出色。不要将这些结果当作福音:它们所衡量的很多东西是每种语言的测试程序作者的水平。
支持高级语言的一个论点是,现代系统上的性能与执行的指令数量并没有那么紧密的联系,随着时间的推移,这种联系就不那么紧密了。低级语言很适合简单的顺序机器。如果高级语言执行两倍的指令,但设法更智能地使用高速缓存,那么它会造成一半的高速缓存未命中,那么它可能会成为赢家。
在服务器和台式机平台上,CPU几乎达到了一个稳定的水平,在此期间它们无法获得更快的速度(移动平台也可以到达那里)。这适合于易于利用并行性的语言。许多处理器将大部分时间都花在等待I / O响应上。与I / O量相比,花在计算上的时间没什么大不了的,而允许程序员最小化通信的语言是一个优势。
总而言之,尽管高级语言从惩罚开始,但它们还有更多的改进空间。他们能接近多远?100年后再问一次。
最后说明:通常,比较不是在可以用语言A 编写的最高效程序与在语言B相同的编写程序之间进行比较,也不是用每种语言编写的最高效程序之间进行比较,而是在可以编写的最高效程序之间进行比较。由人类在一定时间内使用每种语言编写。这引入了即使在原则上也无法进行数学分析的元素。实际上,这通常意味着,最佳性能是在为满足性能目标而需要编写的低级代码与为发布日期而有时间编写的低级代码之间的折衷。