1. 程式人生 > >Pyston——基於LLVM和現代JIT技術的開源Python實現

Pyston——基於LLVM和現代JIT技術的開源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的前景如何呢?我們拭目以待。