这个问题有一个普遍的问题,那就是它太绝对了。说“语言X比语言Y快”实际上没有任何意义。计算机语言本身不是“快速”或“慢速”的,因为它仅仅是表达算法的一种方式。实际的问题应该是“对于这个特定的问题域,为什么语言X的实现X1比语言Y的实现Y1快?”的顺序。
由于某些语言比其他语言更容易实现某些领域,因此某些速度差异肯定会从语言本身中消失。但是,使实现快速的很多因素并不是语言。例如,如果不考虑要谈论CPython,IronPython还是PyPy,就不能说“ Python比Java慢”。对于使用VM的语言来说尤其如此,因为速度将直接受VM的质量影响。
顺便说一句,由于某种原因,我使用的系统无法在我们的设备上使用通常支持JIT的非常流行的JavaScript VM来使用它。这意味着我们的JavaScript的运行速度远远慢于具有类似处理器的PC上的运行速度。这项与语言本身没有直接关系的更改使JavaScript从“比C ++慢几倍”变为“比C ++慢几个数量级”。
还应考虑的是,语言在性能特征上的差异是无法直接比较的。太多的基准测试只是将程序从语言A转换为语言B,而没有考虑到语言在快速功能方面的差异。(您可以在任何合理的基准比较中看到它,例如您链接到的那些,因为它们经常有诸如“感谢某某某人向我展示如何用Foo语言实现它的注释”。)
例如,使用以下Java代码:
for(int i=0;i<10;i++) {
Object o = new Object;
doSomething(o);
}
在C ++中“重写”并比较运行时间将很诱人:
for(int i=0;i<10;i++) {
Object *o = new Object;
doSomething(o);
delete(o);
}
事实是,任何有能力的C ++程序员都会立即看到在C ++中,这不是最快的方法。您可以通过将其更改为更适合C ++的方式轻松加快速度:
for(int i=0;i<10;i++) {
Object o;
doSomething(&o);
}
关键不是C ++可以快,而是写基准来比较语言确实非常困难。为此,您必须是两种语言的专家,并从头开始用两种语言编写。即使这样,您也可以轻松地进入一种语言在特定任务上表现出色的领域。例如,我可以用C ++写一个河内塔的版本,在任何合理的编译器上,它的运行速度都比Java快。我可以通过使用C ++模板作弊,在编译时进行评估来做到这一点(http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
并不是说我可以说“ C ++比Java快”,是因为我的程序在Java版本运行了几分钟后立即返回了(希望没人注意到我的程序花了半个小时来构建)。在各种情况下,C ++都更快。对于其他狭窄情况,可能是相反的情况。因此,它不是“ C ++更快”,而是“在可以使用模板在构建时评估表达式的实例中,C ++更快。” 不太令人满意,但真实。
语言的速度差异主要与实现方式有关。编译语言将比解释语言更快。编译为本地代码比编译为字节代码要快。这比诸如是否静态键入语言之类的问题具有更大的作用。当然,好的实现将比坏的实现更快。
并且不要忘记,优秀的程序员将比劣质的程序员产生更快的代码,通常程度要远远超过语言差异。