PyPy

PyPy（aɪ）是一種Python編程語言實現，可用於替代CPython（它是標準實現）。PyPy通常運行得比CPython更快，因為PyPy是一種即時編譯器，而CPython是一種解釋器。多數Python代碼可以很好的運行在PyPy之上，除非代碼依賴於CPython擴展，它們在運行於PyPy的時候，要麼不工作要麼招致一些開銷。PyPy在內部使用叫做元跟蹤的技術，它將解釋器變換成跟蹤即時編譯器。因為解釋通常比編譯器要容易寫，但運行得更慢，這種技術可以更容易的產生出編程語言的高效實現。PyPy的元跟蹤工具鏈叫做RPython。
PyPy不完全兼容於Python（至少最近版本的）生態系統：它的最新發行版本PyPy 3.10和2.7，分別兼容於相應的CPython版本。

**細節和動機**
PyPy被構思為使用一種類似於Python的編程語言來書寫Python實現。目的是易於辨識出可改進的區域，並使得PyPy更加靈活和易於同CPython進行試驗。
PyPy目標是為產生動態語言實現提供通用轉換和支持框架，強調了在語言規定和實現方面之間的明晰分離。它還致力於提供規矩的、靈活的和快速的Python編程語言實現，使用上述框架來啟用新的高級特徵而不需要在其中編碼低層細節。

**RPython**
PyPy解釋器自身是使用叫作RPython（Restricted Python）的Python受限子集書寫的。RPython在Python語言上施加了一些約束，使得一個變量的類型可以在編譯時間推論出來。
PyPy計劃開發了一個工具鏈來分析RPython代碼並將它轉譯成某種形式的字節碼，它可以降低為C。除了C之外還有過其他後端：Java、C#和Javascript，但是它們遭受了軟件腐敗而已經移除了。PyPy的遞歸式圖標是一個吞噬自己的蛇，因為RPython是用Python解釋器轉譯的。代碼還可以不轉換的運行來測試和分析，這為動態語言研究提供了很好的試驗檯。
它允許可插拔的垃圾回收，還有可選的啟用Stackless Python特徵。最後，它包括了即時編譯（JIT）生成器，在解釋器源代碼中加入一些標註，就能在解釋器中建造入即時編譯器。生成的JIT編譯器是跟蹤JIT。
RPython現在也用於書寫非Python語言實現比如Pixie。

**項目狀態**
第一個兼容於CPython v3的PyPy版本是2014年的PyPy v2.3.1。兼容於CPython v3的PyPy解釋器叫作PyPy3。
PyPy有著在32-bit/64-bit x86和32-bit/64-bit ARM處理器上的JIT編譯支持。它已經夜間測試於Windows、Linux、OpenBSD和Mac OS X之上。PyPy能夠運行不依賴於特定於實現特徵的純Python軟件。
有叫作CPyExt的針對CPython C API擴展的兼容層，但它是不完全和實驗性的。同C共享庫交互的較好方式是通過內建的Cforeign function interface（CFFI）或ctypes庫。

**歷史**
PyPy可溯源至Psyco計劃，它是Python的即時特殊化編譯器，由Armin Rigo在2002年至2010年間開發。最初時，RPython還可以被編譯成Java字節碼、CIL和JavaScript，但是這些後端由於缺乏價值而被移除了。
PyPy最初是研究和麵向開發的項目。在2007年中期達到了開發成熟狀態並官方發行了1.0版本，接下來它聚焦於發行更好的CPython兼容性的生產級版本。

**資助**
PyPy在2004年十二月至2007年三月期間由歐盟特殊目標研究計劃資助。在2008年六月，PyPy宣佈獲得資助為Google開源規劃的一部份，允諾使PyPy更加兼容於CPython。

**註釋**

**參考文獻**
 Davide Ancona, Massimo Ancona, Antonio Cuni, Nicholas D. Matsakis, 2007.  RPython: a Step Towards Reconciling Dynamically and Statically Typed OO Languages date=20150816204310 . 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.- cite web | last = Corbet | first = Jonathan | title = A brief experiment with PyPy | publisher = LWN.net | date = 11 May 2011 | url = https://lwn.net/Articles/442268/ | accessdate = 2018-01-06 | archive-date = 2017-12-26 | archive-url = https://web.archive.org/web/20171226131240/https://lwn.net/Articles/442268/ | dead-url = no - cite news | last = von Eitzen | first = Chris | title = PyPy 1.7 widens the performance "sweet spot" | newspaper = The H | publisher = Heinz Heise | date = 21 November 2011 | url = http://www.h-online.com/open/news/item/PyPy-1-7-widens-the-performance-sweet-spot-1382249.html | accessdate = 2018-01-06 | archive-date = 2018-02-17 | archive-url = https://web.archive.org/web/20180217110916/http://www.h-online.com/open/news/item/PyPy-1-7-widens-the-performance-sweet-spot-1382249.html | dead-url = no - cite web | last = Rose | first = John | title = A Day with PyPy | publisher = Oracle developer blog | date = 2 December 2011 | url = http://blogs.oracle.com/jrose/entry/a_day_with_pypy | accessdate = 2018-01-06 | archive-date = 2012-05-26 | archive-url = https://www.webcitation.org/67wcRyeiI?url=https://blogs.oracle.com/jrose/entry/a_day_with_pypy | dead-url = no -  dead-url = no 

**外部鏈接 ==