title: 609.编程语言的评测 outline: deep

摘要:这篇文章的原文出处在这里 我意译了整篇文章。结合计算机语言评测基准这个网站来读此文还是比较有意思。当然也不能以这个评测结果就贸然断定什么语言最好,什么语言不好。没有好不好的语言,只有适不适用于你解决问题域的语言。就文章而言请大家还是不必太过认真,就当从另一个方面来了解一下这33种编程语言吧。

计算机语言评测基准是一个由429个程序组成的集合,它评测了33个程序语言的13的重复实现的基准程序。如果你想量化的比较不同语言,那么这个是一个非常不错的资源。

在计算机评测基准中,评测者为了尽量让评测准确,非常谨慎的选择了13个基准程序,这13个基准程序并不针对某以特定语言有特殊的优化。对于评测选择33中语言都实现了13个基准程序。当然,除了速度这个指标外,程序基准评测同时也为每一个基准测试程序发布一个编码大小指标。非常感谢基准评测让我们看到程序设计中非常重要的一个方面:程序语言的性能和程序语言灵活性之间的矛盾。正是这个矛盾给所谓“高级编程语言”带上一个含蓄的轻蔑的意思。即,当你在使用这些高级语言编码时,你也许可以编写出漂亮的代码,但是你是如此的远离了硬件,你不可能获得更好的性能,是这样的吗?

size-vs-speed-vs-depandability-context-3
如果我们将基准测试程序的结果放在一张XY的图表上,那么我们就可以为这张表的4个角命名。快速而复杂的语言应积聚在图表的左上角。我们把这类语言称为系统语言。简洁但慢速的语言应该聚集在右下角,我们称之为脚本语言。在右上角,应该是过时的语言。除非这些语言具有非常吸引人的特性,否则语言已经被新出现的语言所淘汰。最后在左下角,基本上找不到对应的语言,因为在这一区域的语言是理想状态的语言。在这个区域的语言是又快又短又利于使用的语言。

图中每一个小点就代表一种语言的一个基准程序实现,因此这图里面共有429个点,每个点的XY轴分别代表了其和最好的语言实现差距的倍数(从语言的复杂性和语言执行性能来说),其中一些点比较分散,我们就没有在图中画出。从上面这个图我们可以看到这些粉红色点沿着Y轴(复杂性)比X轴(执行性能)分布更统一,这是不是意味着,人类在提升语言表达的灵活性上还在稳步的不断进步,而在提升语言性能方面却遇到了很多的麻烦呢:)

针对每一个种语言,比如说scala语言,我们用下面的图来描述:图的中心点,是这个语言测试结果的平均值,然后做每一个评测结果的具体值到这个均值的连线就够成了一个星型图。这个图说明了scala一些特性,在X轴性能上来说,大部分点都分布在靠近左边,说明scala的性能是不错的,如果优化JVM的话,scala可以大部分提高性能,但是scala性能分布并不一致,其中的一个点甚至到了最右边。就语言复杂性(Y轴)来说,scala的表现也不错,不过有时候为了获得高性能,也会导致语言复杂提高,比如scala的其中一个点就在最顶端。

size-vs-speed-vs-depandability-scala

通过为每一种语言形成如上的一个图,我们最后可以为这33种语言评的测结果形成了如下的一个图,这是一个6*6的图。其中每一个小图具有同样的轴和同样的精度。这张图的目的是为了方便的比较每一个语言的星型。这些图按语言的平均性能来组织列,最左边的语言的性能最好,最右边的语言性能最差,在每一列中的语言又按照平均的语言代码量(复杂程度)进行排列,代码量最小的语言在最低端,代码量最大的在最顶端。

size-vs-speed-vs-depandability-2009

点击看大图

在图的最左边的性能是最好的,又高又瘦的星型,我们可以看到,除了GCC和G++外,其他的性能都显示了惊人的一致性(每一个基准测试程序的性能都非常接近)。而JAVA也非常骄傲的出现在一组中,这说明经过了10年的优化后,Java运行时的性能已经得到长足的提高(要用Java做大系统的人是否还会犹豫呢:))。
在图的右边,我们看到了一些又胖又矮的星型,这些是一些脚本语言,从图中可以看出,这些脚本语言社区的人们当他们在不断改善他们语言的表达性的同时并没有花大力气在性能的改善上。然而也有例外,Lua这门脚本语言就有很好的执行性能。