Pyston——基于 LLVM 和现代 JIT 技术的开源 Python 实现

阅读数:8856 2014 年 4 月 21 日

话题:Python语言 & 开发架构

本月初,Kevin Modzelewski 在Dropbox 技术博客撰文宣布了他们正在开发的一款开源 Python 实现——Pyston。该项目的目标是开发出一款高性能的 Python 实现,使 Python 跻身如 C++ 等传统系统级语言所统治的领域。

Dropbox 内部有很多项目是用 Python 编写的。Python 之父 Guido van Rossum 从 Google 离职后也加入了这家公司。随着业务规模的增长,性能问题也愈加突出。虽然通过其他语言改写应用可以获得性能改进,但出于对 Python 的钟爱,Dropbox 的工程师们希望改变 Python 的性能。在使用静态编译做了一些实验之后,他们放弃了这种策略。鉴于 Google 的 v8 对 JavaScript 性能的极大改进,他们决定采用类似的技术来改进 Python 的性能。

现在已经有了一些采用了 JIT 技术的 Python 实现,比如 PyPy,它使用的是基于 Trace 的 JIT技术,大幅改进了 Python 的性能,再如 Jython 和 IronPython,它们则构建于大量应用 JIT 技术的成熟虚拟机之上。那为什么还要引入一种新实现呢?文中给出的解释是:

简单地说,这是因为我们认为前景最好的技术与现有实现不兼容。例如,由于巨大的性能优势,JavaScript 世界已经从基于 Trace 的 JIT 转向基于方法的 JIT(每次编译一个方法)。在 Python 上是否有同样的优势尚不得而知,但因为这两种方法从根本上是不兼容的,所以要回答这个问题,唯一的方法是构建一个新的基于方法的 JIT。

还有一点,他们计划使用保守的垃圾收集器,以便高效支持扩展模块

当然,从零开始创建一个语言实现工作量非常大。不过 Pyston 准备基于 LLVM 构建,这会方便很多。

文中还介绍了 Pyston 的工作方式:

从高层看,Pyston 接受解析好的 Python 代码,并将其转换为 LLVM 中间代码(IR)。然后 IR 经由 LLVM 优化器处理,再被传送给 LLVM JIT 引擎,最后得到可执行的机器代码。

Pyston 的代码已经在Github上开放出来,Dropbox 希望和 Python 及 JIT 社区合作推进其开发。项目页面上还介绍了 Pyston 的一些技术特色,比如编译层次、栈上替换和内联等,感兴趣的读者可以参考。

在 Pyston 之前,Google 的几位工程师曾发起过Unladen Swallow项目,目标是将 Python 的性能提高 5 倍,主要想法是为 CPython 添加一个基于 LLVM 的 JIT 编译器,但是该项目以失败告终。关于该项目的经验与教训,有两篇文章可以参考:1.Unladen Swallow 的失败与教训,以及关于 Pypy;2. Unladen Swallow Retrospective

关于 Pyston,在 Hacker News 上也有一些讨论。比如 haberman 指出,基于方法的 JIT 编译器其实是更为传统的方式,而基于 Trace 的最近 5~10 年才流行起来的。尽管 V8 确实采用的是基于方法的 JIT,Mozilla 也放弃了基于 Trace 的 JIT TraceMonkey,但是 LuaJIT 却是最快的动态语言实现之一,而且采用的就是基于 Trace 的 JIT。LuaJIT 的作者 Mike Pall认为TraceMonkey 没有取得很好的性能,更大程度上是因为尝试将 Trace 绑到现有的虚拟机上,而不是因为基于 Trace 的 JIT 技术的缺点。

Facebook 也为优化其 PHP 应用的性能做了很多工作,现在的解决方案是基于 JIT 的 HHVM,这种方案可以说是成功的。那 Pyston 的前景如何呢?我们拭目以待。