是否有Ruby / Python特性阻碍了V8引擎的优化实现(例如内联缓存)?

Python是由谷歌的人共同开发的,所以它不应该被软件专利所阻止。

或者这是谷歌在V8项目中投入的资源问题。


当前回答

因为JavaScript实现不需要关心其绑定的向后兼容性。

Until recently the only users of the JavaScript implementations have been web browsers. Due to security requirements, only the web browser vendors had the privilege to extend the functionality by writing bindings to the runtimes. Thus there was no need keep the C API of the bindings backwards compatible, it was permissible to request the web browser developers update their source code as the JavaScript runtimes evolved; they were working together anyways. Even V8, which was a latecomer to the game, and also lead by a very very experienced developer, have changed the API as it became better.

OTOH Ruby(主要)用于服务器端。许多流行的ruby扩展被编写为C绑定(考虑RDBMS驱动程序)。换句话说,如果不保持兼容性,Ruby就永远不会成功。

今天,这种差异在某种程度上仍然存在。使用node.js的开发人员抱怨很难保持他们的本机扩展向后兼容,因为V8会随着时间改变API(这也是node.js被分叉的原因之一)。IIRC ruby在这方面仍然采取更为保守的方法。

其他回答

我刚刚遇到了这个问题,还有一个很大的技术原因导致了性能差异,但没有提到。Python有一个非常强大的软件扩展生态系统,但这些扩展大多数是用C或其他低级语言编写的,以提高性能,并与CPython API紧密相关。

有很多众所周知的技术(JIT、现代垃圾收集器等)可以用来加速CPython的实现,但所有这些技术都需要对API进行重大更改,破坏了过程中的大多数扩展。CPython会更快,但是Python吸引人的很多东西(广泛的软件堆栈)将会丢失。举个例子,有一些更快的Python实现,但与CPython相比,它们几乎没有吸引力。

正如其他人所提到的,Python有一个PyPy形式的高性能JIT编译器。

Making meaningful benchmarks is always subtle, but I happen to have a simple benchmark of K-means written in different languages - you can find it here. One of the constraints was that the various languages should all implement the same algorithm and should strive to be simple and idiomatic (as opposed to optimized for speed). I have written all the implementations, so I know I have not cheated, although I cannot claim for all languages that what I have written is idiomatic (I only have a passing knowledge of some of those).

我没有任何明确的结论,但PyPy是我得到的最快的实现之一,比Node好得多。相反,CPython位于排名最慢的一端。

是什么阻碍了Ruby和Python获得V8的Javascript速度?

什么都没有。

好吧,钱。(还有时间、人力和资源,但如果你有钱,这些都是可以买到的。)

V8有一个优秀的、高度专业化的、经验丰富的(因此薪酬很高的)工程师团队,他们在为动态OO语言创建高性能执行引擎方面有几十年的经验(我是单独说的——总的来说更像是几百年的经验)。他们基本上是创建Sun HotSpot JVM(以及其他许多JVM)的同一群人。

首席开发人员Lars Bak已经在vm上工作了25年(所有这些vm都已经发展到V8),这基本上是他的整个(职业)生涯。一些编写Ruby vm的人甚至不到25岁。

是否有Ruby / Python特性阻碍了V8引擎的优化实现(例如内联缓存)?

考虑到至少IronRuby、JRuby、MagLev、MacRuby和Rubinius都有单态(IronRuby)或多态内联缓存,答案显然是否定的。

现代Ruby实现已经做了大量的优化。例如,对于某些操作,Rubinius的Hash类比YARV的更快。现在,这听起来并不令人兴奋,直到您意识到Rubinius的Hash类是100%纯Ruby实现的,而YARV的Hash类是100%手工优化的C实现的。

所以,至少在某些情况下,Rubinius可以生成比GCC更好的代码!

或者这是谷歌在V8项目中投入的资源问题。

是的。不只是谷歌。V8的源代码已经有25年的历史了。在V8上工作的人还创建了Self VM(迄今为止创建的最快的动态OO语言执行引擎之一),Animorphic Smalltalk VM(迄今为止创建的最快的Smalltalk执行引擎之一),HotSpot JVM(有史以来创建的最快的JVM,可能是最快的VM时期)和OOVM(有史以来创建的最高效的Smalltalk VM之一)。

事实上,V8的首席开发人员Lars Bak参与了其中的每一个项目,以及其他一些项目。

我相信这是因为不同的设计优先级和用例目标。

一般来说,脚本语言(又称动态语言)的主要目的是在本地函数调用之间充当“粘合剂”。这些原生功能应a)覆盖最关键/最常用的领域b)尽可能有效。

这里有一个例子: jQuery排序导致iOS Safari冻结 那里的冻结是由于过度使用get-by-selector调用造成的。如果get-by-selector可以在本地代码中实现,那么就不会有这样的问题了。

考虑一下V8演示中经常使用的光线跟踪演示。在Python世界中,它可以在本机代码中实现,因为Python为本机扩展提供了所有工具。但在V8领域(客户端沙盒),除了让VM尽可能高效之外,你没有其他选择。所以唯一的选择是使用脚本代码来实现光线跟踪器。

不同的优先级和动机。

在Sciter中,我做了一个测试,在本地实现了几乎完整的jquery核心。在像ScIDE(由HTML/CSS/Script组成的IDE)这样的实际任务中,我相信这样的解决方案比任何VM优化都要好得多。

性能似乎并不是核心Python开发人员的主要关注点,他们似乎觉得“足够快”就足够好了,而且帮助程序员提高工作效率的功能比帮助计算机更快地运行代码的功能更重要。

然而,确实有一个谷歌项目unladen-swallow(现在已被放弃),目的是生产一个与标准解释器兼容的更快的Python解释器。PyPy是另一个旨在生成更快Python的项目。还有Psyco,它是PyPy的前身,它可以在不更改整个解释器的情况下为许多Python脚本提供性能提升,还有Cython,它允许您使用非常类似于Python语法的东西为Python编写高性能C库。