PyPy
首次發布 | 2007年 |
---|---|
當前版本 | 7.3.17[1](2024年8月28日,2個月前) |
源代碼庫 | |
編程語言 | RPython |
操作系統 | 跨平台 |
類型 | Python解釋器和編譯器工具鏈 |
許可協議 | MIT許可證 |
網站 | https://www.pypy.org/ |
PyPy(/ˈpaɪpaɪ/)是一種Python編程語言實現[2],可用於替代CPython(它是標準實現)。PyPy通常運行得比CPython更快,因為PyPy是一種即時編譯器,而CPython是一種解釋器[3]。多數Python代碼可以很好的運行在PyPy之上,除非代碼依賴於CPython擴展,它們在運行於PyPy的時候,要麼不工作要麼招致一些開銷。PyPy在內部使用叫做元跟蹤的技術,它將解釋器變換成跟蹤即時編譯器。因為解釋通常比編譯器要容易寫,但運行得更慢,這種技術可以更容易的產生出編程語言的高效實現。PyPy的元跟蹤工具鏈叫做RPython。
PyPy不完全兼容於Python(至少最近版本的)生態系統:它的最新發行版本PyPy 3.10和2.7,分別兼容於相應的CPython版本。
細節和動機
PyPy被構思為使用一種類似於Python的編程語言來書寫Python實現。目的是易於辨識出可改進的區域,並使得PyPy更加靈活和易於同CPython進行試驗。
PyPy目標是為產生動態語言實現提供通用轉換和支持框架,強調了在語言規定和實現方面之間的明晰分離。它還致力於提供規矩的、靈活的和快速的Python編程語言實現,使用上述框架來啟用新的高級特徵而不需要在其中編碼低層細節[4][5]。
RPython
PyPy解釋器自身是使用叫作RPython(Restricted Python)的Python受限子集書寫的[6]。RPython在Python語言上施加了一些約束,使得一個變量的類型可以在編譯時間推論出來[7]。
PyPy計劃開發了一個工具鏈來分析RPython代碼並將它轉譯成某種形式的字節碼,它可以降低為C。除了C之外還有過其他後端:Java、C#和Javascript,但是它們遭受了軟件腐敗而已經移除了。PyPy的遞歸式圖標是一個吞噬自己的蛇,因為RPython是用Python解釋器轉譯的。代碼還可以不轉換的運行來測試和分析,這為動態語言研究提供了很好的試驗台。
它允許可插拔的垃圾回收,還有可選的啟用Stackless Python特徵。最後,它包括了即時編譯(JIT)生成器,在解釋器源代碼中加入一些標註,就能在解釋器中建造入即時編譯器。生成的JIT編譯器是跟蹤JIT[8]。
RPython現在也用於書寫非Python語言實現比如Pixie[9]。
項目狀態
第一個兼容於CPython v3的PyPy版本是2014年的PyPy v2.3.1[10]。兼容於CPython v3的PyPy解釋器叫作PyPy3。
PyPy有着在32-bit/64-bit x86和32-bit/64-bit ARM處理器上的JIT編譯支持[11]。它已經夜間測試於Windows、Linux、OpenBSD和Mac OS X之上。PyPy能夠運行不依賴於特定於實現特徵的純Python軟件[12]。
有叫作CPyExt的針對CPython C API擴展的兼容層,但它是不完全和實驗性的。同C共享庫交互的較好方式是通過內建的C外界函數接口(CFFI)或ctypes庫[13]。
歷史
PyPy可溯源至Psyco計劃,它是Python的即時特殊化編譯器,由Armin Rigo在2002年至2010年間開發。最初時,RPython還可以被編譯成Java字節碼、CIL和JavaScript,但是這些後端由於缺乏價值而被移除了。
PyPy最初是研究和面向開發的項目。在2007年中期達到了開發成熟狀態並官方發行了1.0版本,接下來它聚焦於發行更好的CPython兼容性的生產級版本。
資助
PyPy在2004年十二月至2007年三月期間由歐盟特殊目標研究計劃資助[14]。在2008年六月,PyPy宣布獲得資助為Google開源規劃的一部份,允諾使PyPy更加兼容於CPython。
註釋
- ^ 1.0 1.1 PyPy v7.3.17 release. [2024年9月20日].
- ^ Interview Maciej Fijalkowski PyPy. [2020-09-26]. (原始內容存檔於2021-03-09).
- ^ PyPy Speed. speed.pypy.org. [2019-12-01]. (原始內容存檔於2021-05-10).
- ^ Samuele Pedroni. PyPy – Goals and Architecture Overview. March 2007. (原始內容存檔於2012-06-30).
- ^ PyPy – Goals and Architecture Overview – Mission Statement. [11 October 2013]. (原始內容存檔於2021-05-26).
- ^ Our runtime interpreter is 「RPython」 (頁面存檔備份,存於網際網路檔案館), Coding Guide – PyPy documentation
- ^ "It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation", Ancona et al., 2007.
- ^ Bolz, Carl; Cuni, Antonio; Fijalkowski, Maciej; Rigo, Armin. Tracing the Meta-Level: PyPy’s Tracing JIT Compiler. ICOOOLPS '09. doi:10.1145/1565824.1565827.
- ^ Timothy Balridge interview (頁面存檔備份,存於網際網路檔案館).
- ^ the PyPy team. PyPy3 2.3.1 – Fulcrum. PyPy blog. 20 June 2014 [2021-12-19]. (原始內容存檔於2017-12-26).
- ^ PyPy v7.2.0: release of 2.7, and 3.6. pypy.org. 16 October 2019 [2021-03-23]. (原始內容存檔於2019-10-16).
- ^ PyPy – Python compatibility. [2021-03-20]. (原始內容存檔於2021-06-07).
- ^ ctypes — A foreign function library for Python. [2021-12-20]. (原始內容存檔於2022-04-27).
- ^ EU Community Research and Development Information Service Entry. [2021-03-23]. (原始內容存檔於2012-09-10).
參考文獻
- Davide Ancona, Massimo Ancona, Antonio Cuni, Nicholas D. Matsakis, 2007. RPython: a Step Towards Reconciling Dynamically and Statically Typed OO Languages (頁面存檔備份,存於網際網路檔案館). In Proc. Dynamic Language Symposium (DLS), 2007. ACM Press.
- Carl Friedrich Bolz, Antonio Cuni, Maciej Fijalkowski, 2009. Tracing the meta-level: PyPy's Tracing JIT Compiler. In Proc. ICOOOLPS, 2009. ACM Press.
- Corbet, Jonathan. A brief experiment with PyPy. LWN.net. 11 May 2011 [2018-01-06]. (原始內容存檔於2017-12-26).
- von Eitzen, Chris. PyPy 1.7 widens the performance "sweet spot". The H (Heinz Heise). 21 November 2011 [2018-01-06]. (原始內容存檔於2018-02-17).
- Rose, John. A Day with PyPy. Oracle developer blog. 2 December 2011 [2018-01-06]. (原始內容存檔於2012-05-26).
- Interview Maciej Fijalkowski pypy. Decisionstats blog. [2018-01-06]. (原始內容存檔於2018-01-07).