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

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

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


当前回答

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

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

其他回答

There's a lot more impetus to highly optimize JavaScript interpretors which is why we see so many resources being put into them between Mozilla, Google, and Microsoft. JavaScript has to be downloaded, parsed, compiled, and run in real time while a (usually impatient) human being is waiting for it, it has to run WHILE a person is interacting with it, and it's doing this in an uncontrolled client-end environment that could be a computer, a phone, or a toaster. It HAS to be efficient in order to run under these conditions effectively.

Python和Ruby运行在一个由开发人员/部署人员控制的环境中。一个健壮的服务器或桌面系统,限制因素通常是内存或磁盘I/O,而不是执行时间。或者可以利用缓存等非引擎优化。对于这些语言,关注语言和库特性集而不是速度优化可能更有意义。

这样做的附带好处是,我们拥有两个出色的高性能开源JavaScript引擎,它们可以并且正在被重新用于各种应用程序,例如Node.js。

因为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在这方面仍然采取更为保守的方法。

Misleading question. V8 is a JIT (a just in time compiler) implementation of JavaScript and in its most popular non-browser implementation Node.js it is constructed around an event loop. CPython is not a JIT & not evented. But these exist in Python most commonly in the PyPy project - a CPython 2.7 (and soon to be 3.0+) compatible JIT. And there are loads of evented server libraries like Tornado for example. Real world tests exist between PyPy running Tornado vs Node.js and the performance differences are slight.

这种说法并不完全正确

就像V8只是JS的一个实现一样,CPython只是Python的一个实现。Pypy的性能与V8相当。

此外,还有感知性能的问题:由于V8本身是非阻塞的,Web开发会导致更高性能的项目,因为您节省了IO等待时间。V8主要用于开发Web,其中IO是关键,所以他们将它与类似的项目进行比较。但是,除了web开发,你还可以在许多其他领域使用Python。你甚至可以在许多任务中使用C扩展,比如科学计算或加密,并以出色的性能处理数据。

但是在网络上,大多数流行的Python和Ruby项目都是阻塞的。尤其是Python,它继承了同步WSGI标准,像著名的Django这样的框架就是基于它的。

你可以编写异步Python(比如Twisted、Tornado、gevent或asyncio)或Ruby。但这种做法并不常见。最好的工具仍然是阻塞的。

然而,这也是Ruby和Python的默认实现速度不如V8的原因之一。

经验

就像Jörg W Mittag指出的那样,V8的开发者都是VM天才。Python是由一群充满激情的人开发的,在很多领域都很出色,但在VM调优方面并不专业。

资源

Python软件基金会只有很少的钱:每年在Python上的投资不到4万美元。当你认为像谷歌、Facebook或苹果这样的大公司都在使用Python时,这有点疯狂,但这是丑陋的事实:大多数工作都是免费完成的。在Java之前就存在的支持Youtube的语言是由志愿者手工制作的。

他们是聪明和敬业的志愿者,但当他们发现自己在某个领域需要更多的能量时,他们不能要求30万美元来雇佣一个该领域的顶级专家。他们必须四处寻找愿意免费做这件事的人。

虽然这是有效的,但这意味着你必须非常小心你的优先级。因此,现在我们需要看看:

目标

即使拥有最新的现代特性,编写Javascript也很糟糕。你有范围问题,很少的集合,糟糕的字符串和数组操作,除了日期,数学和正则表达式之外几乎没有标准列表,甚至对于非常常见的操作也没有语法糖。

但在V8引擎中,你有速度。

这是因为,速度是谷歌的主要目标,因为它是Chrome页面渲染的瓶颈。

在Python中,可用性是主要目标。因为这几乎从来都不是项目的瓶颈。这里的稀缺资源是开发人员的时间。它是为开发人员优化的。

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

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