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).