是否有可能设计一种没有显着性能损失的动态语言?

时间:2010-09-18 09:16:04

标签: performance programming-languages language-design dynamic-languages high-level

与C / Java相比,在许多情况下是否可以设计像Ruby或Clojure这样的东西而不会显着降低性能?硬件设计是否起作用?

编辑:有意义的是我的意思是数量级,而不仅仅是十次

编辑:我怀疑delnan对我来说是正确的意思是动态语言所以我更改了标题

5 个答案:

答案 0 :(得分:8)

性能取决于很多事情。当然,即使我们正在编译语言,也必须保留语言的语义 - 你不能从Ruby中删除动态调度,它会加速干扰,但它会完全破坏世界上所有Ruby代码的95%。但是,大部分性能取决于实施的智能程度。

我认为,“高级别”,你的意思是“动态”? Haskell和OCaml是非常高级的,但它们是本地编译的,并且在某些极端情况下可以胜过C#或Java,甚至是C和C ++ - 特别是在并行性发挥作用的情况下。他们当然没有将性能设计为#1目标。但编译器编写者,特别是那些专注于功能语言的编写者,是一个非常聪明的人。如果你或我开始使用高级语言,即使我们使用了例如LLVM作为本地编译的后端,我们不会接近这种性能。

使动态语言快速运行 - 它们将许多决策(类型,类/对象的成员......)延迟到运行时而不是编译时,而静态代码分析有时可以证明它在行n中是不可能的而且,你仍然必须携带一个高级运行时,并做一些静态语言编译器在编译时可以做的事情。甚至可以使用更智能的VM(Inline Cache任何人?)来优化动态调度,但这需要做很多工作。不仅仅是一种新的小型语言,也就是说。

另见Steve Yegge's Dynamic Languages Strike Back

当然,什么是重大的性能损失?比C读取慢100倍,但众所周知,80%的执行时间花费在20%的代码上= 80%的代码不会对整个程序的执行性能产生显着影响。对于剩余的20%,您始终可以使用C或C ++重写它,并使用动态语言调用它。对于许多应用程序,这就足够了(对某些人来说,甚至不需要优化)。其余的......好吧,如果性能非常重要,那么你应该用一种专为性能而设计的语言来编写它。

答案 1 :(得分:1)

不要将语言设计与其运行的平台混淆。

例如,Java是一种高级语言。它在JVM上运行(如上所述,Clojure和JRuby-- Ruby的Java版本)。 JVM将执行字节码分析并优化代码的运行方式(利用转义分析,即时编译等)。因此,平台对性能的影响很大程度上与语言本身无关(有关Java性能和与C / C ++的比较的更多信息,请参阅here

答案 2 :(得分:1)

相比什么损失?如果您需要垃圾收集器或关闭,那么您需要它们,而且无论如何您都要付出代价。如果一种语言让你很容易进入,那并不意味着你必须在不需要时使用它们。

如果一种语言被解释而不是编译,那将会引入一个数量级的减速。但是这样的语言可能具有补偿优势,例如易用性,平台独立性以及无需编译。并且,您在其中编写的程序可能无法运行足够长的时间以使速度成为问题。

可能有语言实现引入缓慢而没有充分理由,但不必使用它们。

答案 3 :(得分:0)

您可能想看看DARPA HPCS倡议提出的建议。提出了3种编程语言:Sun的Fortress,IBM的X10和Cray的Chapel。后两者仍在开发中。这些是否满足您对高级的定义我不知道。

是的,硬件设计肯定会发挥作用。所有这三种语言都针对具有很多处理器的超级计算机,并展示了适合该领域的功能。

答案 4 :(得分:0)

这当然是可能的。例如,Objective-C是一种动态类型的语言,其性能可与C ++相媲美(尽管通常会慢一点,但仍大致相当)。