PyPy

此條目需要擴充。 (2019年5月4日) |
![]() | |
首次发布 | mid 2007年 |
---|---|
当前版本 | 7.3.19[1]![]() |
源代码库 | |
编程语言 | 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生态系统(至少是它的最新版本):它只宣称兼容于Python 2.7和3.6语法,以及3.7(beta版,有着一些特征缺失)[4][5];它不提供Python 3.8[6]和3.9[7]等中的新语法,比如指定表达式[8],和唯位置形式参数[9];和将来的Python 3.10语法,比如模式匹配[10]。
细节和动机
PyPy被构思为使用一种类似于Python的编程语言来书写Python实现。目的是易于辨识出可改进的区域,并使得PyPy更加灵活和易于同CPython进行试验。
PyPy目标是为产生动态语言实现提供通用转换和支持框架,强调了在语言规定和实现方面之间的明晰分离。它还致力于提供规矩的、灵活的和快速的Python编程语言实现,使用上述框架来启用新的高级特征而不需要在其中编码低层细节[11][12]。
RPython
PyPy解释器自身是使用叫作RPython(Restricted Python)的Python受限子集书写的[13]。RPython在Python语言上施加了一些约束,使得一个变量的类型可以在编译时间推论出来[14]。
PyPy计划开发了一个工具链来分析RPython代码并将它转译成某种形式的字节码,它可以降低为C。除了C之外还有其他后端:Java、CSharp和Javascript,但是它们遭受了软件腐败而已经移除了。PyPy的递归式图标是一个吞噬自己的蛇,因为RPython是用Python解释器转译的。代码还可以不转换的运行来测试和分析,这为动态语言研究提供了很好的试验台。
它允许可插拔的垃圾回收,还有可选的启用Stackless Python特征。最户,它包括了即时编译(JIT)生成器,在解释器源代码中加入一些标注,就能在解释器中建造入即时编译器。生成的JIT编译器是跟踪JIT[15]。
RPython现在也用于书写非Python语言实现比如Pixie[16]。
项目现状
PyPy是Armin Rigo开发的,Python语言的动态编译器,是Psyco的后继项目。PyPy的目的是,做到Psyco没有做到的动态编译。
PyPy开始只是研究性质的项目。但是开发非常成熟,在2007年中旬发布了1.0 Release版本后,大家关注的焦点是,能否在2008年出现可供生产环境使用的版本。
它支持Python语言的所有核心部分以及大多数的Python语言标准库函数模块,并且通过了Python语言的test suite。但是,Pypy无法支持官方的C/Python API,导致无法使用例如Numpy,Scipy等重要的第三方库。与CPython的区别可以去看它的兼容性页面[17]。
PyPy还提供了JIT编译器和沙盒功能,因此运行速度比CPython要快,以及可以安全地运行一些不被信任的代码。PyPy还有一个单独的支持微线程的版本。
另外,PyPy也有每夜构建版本[18]供开发者测试。
PyPy是作为Specific Targeted Research Projects(特定领域研究项目)从2004年12月到2007年3月[19],开始接受欧盟的援助。
PyPy的实现与原理
- 其实这么说并不准确,准确表达应为用RPython实现的Python。RPython是Python的一个子集,虽然RPython不是完整的Python,但用RPython写的这个Python实现却可以解释完整的Python语言。
PyPy的第二部分:编译器
- 这是一个编译RPython的编译器,或者说这个编译器有一个RPython的前端。目前也只有这一个前端,不过它的后端却有不少,亦即这个编译器支持许多的目标语言,比较重要的有:C,CIL,Javascript等。
註釋
- ^ PyPy v7.3.19 release. [2025年3月12日].
- ^ Interview Maciej Fijalkowski PyPy.
- ^ PyPy Speed. speed.pypy.org. [2019-12-01].
- ^ PyPy – Python compatibility. pypy.org. [2020-12-15].
- ^ PyPy 7.3.3 triple release: python 3.7, 3.6, and 2.7. pypy.org. [2020-12-15].
- ^ What’s New In Python 3.8 — Python 3.9.1 documentation. docs.python.org. [2021-02-15].
- ^ What’s New In Python 3.9 — Python 3.9.1 documentation. docs.python.org. [2021-02-15].
- ^ PEP 572 -- Assignment Expressions. Python.org. [2021-02-15] (英语).
- ^ PEP 570 -- Python Positional-Only Parameters. Python.org. [2021-02-15] (英语).
- ^ PEP 634 -- Structural Pattern Matching: Specification. Python.org. [2021-02-15] (英语).
- ^ Samuele Pedroni. PyPy – Goals and Architecture Overview. March 2007. (原始内容存档于2012-06-30).
- ^ PyPy – Goals and Architecture Overview – Mission Statement. [11 October 2013].
- ^ 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.
- ^ 兼容性(页面存档备份,存于互联网档案馆)
- ^ 每夜构建(页面存档备份,存于互联网档案馆)
- ^ PyPy EU project page. [2008-03-09]. (原始内容存档于2008-05-12).
參考文獻
- 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).