写点什么

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

2014 年 4 月 21 日

本月初,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 的前景如何呢?我们拭目以待。

2014 年 4 月 21 日 08:5612252
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 115.7 次阅读, 收获喜欢 23 次。

关注

评论

发布
暂无评论
发现更多内容

Spring框架源码:BeanFactory与Bean的生命周期

程序员架构进阶

Java spring 源码阅读 七日更 2月春节不断更

第十二周学习总结

Binary

公路交通区块链技术的痛点问题和典型场景应用

CECBC区块链专委会

区块链

诊所数字化从预约开始

boshi

数字化医疗 七日更 线上预约

日记 2021年2月14日(周日)

Changing Lin

2月春节不断更

熬夜7天,我总结了JavaScript与ES的25个重要知识点!

魔王哪吒

学习 程序员 面试 前端 2月春节不断更

Tomcat异常: Unable to process Jar entry [module-info.class] from Jar

小马哥

Java maven 七日更 二月春节不断更

ElasticSearch.01-简介

insight

elasticsearch 2月春节不断更

工作学习累了?试试 GitHub 上的那些简单易学的游戏项目吧!

JackTian

GitHub 游戏 开源项目 2月春节不断更

深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!

Python猫

Python 编程

松耦合

sinsy

设计模式 RabbitMQ

「架构师训练营 4 期」 第七周 - 001&2

凯迪

架构师训练营 4 期

10. 比找女朋友还难的技术点,Python 面向对象

梦想橡皮擦

Python 2月春节不断更 python入门

面试官系列:你对Spring事件发布和广播监听有了解吗?

后台技术汇

面试官 2月春节不断更

保持模块的兼容性

Rayjun

go go modules

第十二周课后作业

Binary

【STM32】串口通信出现乱码(使用官方标准库)

AXYZdong

硬件 stm32 2月春节不断更

《我们脑中挥之不去的问题》 - 卓克科普(3)

石云升

读书笔记 科普 2月春节不断更

记一次有意思的微信视频号直播

Sicolas Flamel

产品经理

架构师训练营 4 期 第7周

引花眠

架构师训练营 4 期

中国科学家突破区块链核心技术

CECBC区块链专委会

区块链

今日出门

Nydia

机器学习笔记之:

Nydia

华为 MPLS的数据转发流程

艺博东

华为

JUnit速查手册

jiangling500

Java JUnit

【LeetCode】情侣牵手Java题解

HQ数字卡

算法 LeetCode 2月春节不断更

SpringMVC专栏 第1篇 - 快速入门

小马哥

Java spring Spring MVC 七日更 二月春节不断更

深入理解gradle中的task

程序那些事

Java maven Gradle 程序那些事 构建工具

Elasticsearch dynamic mapping

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

数字资产助力未来十年打赢数字经济战

CECBC区块链专委会

数字经济

面试不踩坑!Volatile的内存屏障源码级详解

Java王路飞

Java 源码 面试 volatile 多线程

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

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