Pyston:Dropbox 正開發(fā)的開源 Python 解釋器
大家好,我非常激動宣布 Pyston,這是一個正在由 Dropbox 開發(fā)的開源 Python 解釋器。 這個項目的目標是產(chǎn)生一個高性能的 Python 解釋器,使 Python 也能用于那些被如 C++ 這樣的傳統(tǒng)系統(tǒng)語言占據(jù)的領(lǐng)域。
在 Dropbox ,我們熱愛 Python ,嘗試用它來做一切可以做的事情。然而隨著規(guī)模的的變大和要處理的問題越來越多,我們開始發(fā)現(xiàn)繼續(xù)使用 Python 而要達到我們的性能目標有時候極其困難。有時用另外一門語言重寫也起不了多大作用。我本人非常喜歡 Python , 每次當我們決定重寫什么東西的時候我都很受傷,所以我想為它做一點什么。在靜態(tài)編譯上做了一些無用功后,我們到處查資料然后發(fā)現(xiàn) JIT 技術(shù)在 Javascript 上非常成功,尤其 是 Chrome 的 V8 引擎大大地改善了 Javascript 的性能。我們希望通過同樣的技術(shù)也能在 Python 上達到相同的性能提升。
Pyston 現(xiàn)在仍然處于初期階段,還不能投入使用。但我們希望早點在它的生命周期之初就公布并開源出來,這樣我們就能和 Python 和 JIT 社區(qū)來合作開發(fā)了。太多的細節(jié)在這篇博客寫不下,但我們想說一下我們?yōu)槭裁葱枰粋€新的 Python 實現(xiàn),以及講一點點 Pyston 是怎么工作的。
為什么選擇實現(xiàn)一個新的 Python 解釋器
早就已經(jīng)有了一大堆使用 JIT 技術(shù)的 Python 實現(xiàn):PyPy 使用它的 tracing JIT 來提高性能;Jython 和 IronPython 都是構(gòu)建在廣泛支持 JIT 的虛擬機上的。所以為什么我們認為還值得開始創(chuàng)造一個新的實現(xiàn)呢?
簡單來說,是因為我們認為絕大多數(shù)有前景的技術(shù)都和現(xiàn)有的實現(xiàn)不兼容。比如,在 Javascript 界就因為強大的性能優(yōu)勢從 tracing JIT 切換到 method-at-a-time JIT 。對 Python 是否有同樣的性能優(yōu)勢還有待商榷,但由于這兩種途徑從根本上都是和現(xiàn)有的實現(xiàn)不兼容的,所以答案只能是構(gòu)建一個新的 method-at-a-time JIT。
另外一個區(qū)別是我們對傳統(tǒng)的垃圾回收器有計劃地使用來高效地支持拓展模塊。同樣,我們現(xiàn)在也無法知道這是否是一種更好的方法,但這個決定對一個很難在現(xiàn)有的實現(xiàn)下進行測試的 JIT 來說是必不可少的。
從零開始的壞處就是,創(chuàng)造一個新的語言的實現(xiàn)毋庸置疑是一個巨大的任務(wù)。幸運的是, 有助于這個過程的一些工具已經(jīng)開始出現(xiàn)了。尤其是 Pyston 是構(gòu)建在 LLVM 之上的,使得我們不需要自己處理細節(jié)就可以生成上層的高質(zhì)量代碼。盡管如此,一個新的 Python 實現(xiàn)還是一個巨大 的工程,所以 Pyson 將不會馬上就能投入使用。
它是怎么工作的
從頂層看,Pyston 將解析好的 Python 代碼轉(zhuǎn)換成 LLVM 中間代碼。然后中間代碼就通過 LLVM 的優(yōu)化然后傳遞給 LLVM 的 JIT 引擎,產(chǎn)生可執(zhí)行的機器代碼。LLVM 包含許多優(yōu)化步驟和機制,使得它能產(chǎn)生非??斓拇a。
然而問題是 LLVM 不能推出 Python 代碼,因為動態(tài)語言不得不把所有底層的行為都隱藏在類型分派(Type Dispatch)后。為了解決這個問題,Pyston 采用類型推斷:雖然證明一個變量將會是某個特別的類型通常是不可能,但是 Pyston 經(jīng)常可以根據(jù)一些確定的事實來預(yù)測某個對象會是什么類型。一旦做出 了一個預(yù)測,Pyston 將在運行時檢測這個預(yù)測,在預(yù)測所對應(yīng)的快速分支和預(yù)測失敗所對應(yīng)的慢速分支之間進行選擇。
Pyston 還包含許多其他的現(xiàn)代技術(shù),比如為快速查找屬性和快速調(diào)用方法而設(shè)計的隱藏類和內(nèi)聯(lián)緩存。你可以在 Github 頁面上找到更多的技術(shù)細節(jié),以及一篇單獨講述這些技術(shù)細節(jié)的博文。
現(xiàn)狀
Pyston 仍然處于初始階段,只支持 Python 語言的一個最小子集。拿基準測試數(shù)據(jù)來說話是不怎么公平的,因為 1) Pyston 不支持足夠大的基準測試,所以這不具備代表意義。2) Pyston 不支持所有運行時特性(包括一些可能帶來減速的特性),所以這不是一個同類的比較。 在這兩點注意事項下,Pyston 在性能上通??梢該魯?CPython,但是仍然弱于 PyPy。
代碼以 Apache 2.0 許可證發(fā)布在 Github 上,技術(shù)文檔正在增加。還有大量的工作需要做, 我們正在擴張團隊:如果你對這類事感興趣,請聯(lián)系我們!
請繼續(xù)關(guān)注項目的進展。你也可以在這里訂閱我們的郵件列表。