确切地说,本教程介绍的是用 C 语言编写实现的Python,又称为CPython。平时我们所讨论的 Python,指的其实就是 CPython。随着编程语言的不断发展,Python 的实现方式也发生了变化,除了用 C 语言实现外,Python 还有其他的实现方式。例如,用Java语言实现的 Python 称为JPython,用 .net 实现的 Python 称为IronPython等等。Python 的这些实现方式虽然诞生比 CPython 晚,但一直在努力地跟上主流,并在不同的生产环境中不断地使用并推广 Python。Python 的实现方式有很多种,Python 官网上介绍了 20 多种语言变体、方言或 C 语言之外的 Python 解释器实现。其中一些只是实现了语言核心语法、功能和内置扩展的一个子集,但至少有几个与 CPython 几乎完全兼容。更重要的是,在这些不同的实现方式中,虽然有些知识玩具项目或实验,但大部分都是为了解决某些实际问题而创建的,这些问题要么使用 CPython 无法解决,要么需要开发人员花费巨大的精力,这里举几个例子:在嵌入式系统中运行 Python 代码。
与运行框架(如 Java 或 .NET)或其他语言做代码集成。
在 Web 浏览器中运行 Python 代码。由于受到篇幅的限制,本节仅给大家介绍几种 Python 开发人员最常用的几种 Python 实现方式。
Stackless PythonStackless Python 自称 Python 增强版。之所以名为 Stackless(无栈),是因为它没有依赖 C 语言的调用栈,实际上就是对 CPython 做了一些修改,添加了一些新的功能。在新添加的功能中,最重要就是由解释器管理的微线程,用来替代依赖系统内核上下文切换和任务调度的普通线程,既轻量化又节约资源。Stackless Python 最新可用的版本是 2.7.9 和 3.3.5,分别实现的是 Python 2.7 和 3.3。在 Stackless Python 中,所有的额外功能都是内置 stackless 模块内的框架。Stackless Python 并不是最有名的 Python 实现,但很值得一提,因为它引入的思想对编程语言社区有很大的影响。例如,将 Stackless Python 中的内核切换功能提取出来并作为一个独立包发布,名为 greenlet,是许多有用的库和框架的基础。此外,Stackless Python 的大部分功能都在 PyPy 中重新实现,PyPy 是另一个 Python 实现,我们将稍后介绍。
JPythonJython 是 Python 语言的 Java 实现。它将代码编译为 Java 字节代码,开发人员在 Python 模块中可以无缝使用 Java 类。Jython 允许人们在复杂应用系统(例如 J2EE)中使用 Python 作为顶层脚本语言,它还将 Java 应用引入到 Python 中,一个很好的例子就是,在 Python 程序中可以使用 Apache Jackrabbit(这是一个基于 JCR 的文档仓库 API)。Jython 最新可用的版本是 Jython 2.7,对应的是 Python 2.7 版。它宣称几乎实现了 Python 所有的核心标准库,并使用相同的回归测试套件。Jython 3.x 版正在开发中。Jython 与 CPython 实现的主要区别如下所示:真正的 Java 垃圾回收,而不是引用计数。
没有全局解释器锁(GlobakInterpreter Lock,GIL),在多线程应用中可以充分利用多个内核。这一语言实现的主要缺点是缺少对 C/Python 扩展 API 的支持,因此用 C 语言编写的 Python 扩展在 Jython 中无法运行。这种情况未来可能会发生改变,因为 Jython 3.x 计划支持 C/Python 扩展 API。某些 Python Web 框架(例如 Pylons)被认为是促进 Jython 的开发,使其可用于 Java 世界。
IronPythonIronPython 将 Python 引入 .NET 框架中,这个项目受到微软的支持,因为 IronPython 的主要开发人员都在微软工作。可以这么说,IronPython 是推广语言的一种重要实现。除了 Java,.NET社区是最大的开发者社区之一。值得一提的是,微软提供了一套免费开发工具,名为 PTVS(Python Tools for Visual Studio,用于Visual Studio 的 Python 工具),可以将 Visual Studio 转换为成熟的 Python IDE。这是作为 Visual Studio 的插件发布的,在 GitHub 可以找到其开源代码。IronPython 最新的稳定版本是 2.7.5,与 Python 2.7 兼容。与 Jython 类似,Python 3.x 的实现也在开发中,但还没有可用的稳定版本。虽然 .NET 主要在微软 Windows 系统上运行,但是 IronPython 也可以在 Mac OS X 和Linux系统上运行,这一点要感谢 Mono,一个跨平台的开源 .NET 实现。与 CPython 相比,IronPython 的主要区别或优点如下:与 Jython 类似,没有全局解释器锁(Global Interpreter Lock,GIL),在多线程应用中可以充分利用多个内核。
用 C# 和其他 .NET 语言编写的代码可以轻松集成到 IronPython 中,反之亦然。
通过 Silverlight,在所有主流 Web 浏览器中都可以运行。说到弱点,IronPython 也与 Jython 非常类似,因为它也不支持 C/Python 扩展 API。对于想要使用主要基于 C 扩展的 Python 包(例如 NumPy)的开发人员来说,这一点很重要。有一个叫作 ironclad 的项目,其目的是在 IronPython 中无缝使用这些扩展,其最新支持的版本是2.6,开发已经停止。
PyPyPyPy 可能是最令人兴奋的 Python 实现,因为其目标就是将 Python 重写为 Python。在 PyPy 中,Python 解释器本身是用 Python 编写的。在 Python 的 CPython 实现中,有一个 C 代码层来实现具体细节。但在 PyPy 实现中,这个 C 代码层用 Python 完全重写。这样,你可以在代码运行期间改变解释器的行为,并实现 CPython 难以实现的代码模式。目前 PyPy 的目的是与 Python 2.7 完全兼容,而 PyPy3 则与 Python 3.2.5 版兼容。以前对 PyPy 感兴趣主要是理论上的原因,只有喜欢深入钻研语言细节的人才会对它感兴趣。PyPy 通常不用于生产环境,但这些年来这种状况己经发生改变,PyPy 通常比 CPython 实现要快得多。基于这一特性,使得越来越多的开发人员决定在生产环境中切换到 PyPy。PyPy 与 CPython 实现的主要区别在于以下几个方面:使用垃圾回收,而不是引用计数。
集成跟踪 JIT 编译器,可以显著提高性能。
借鉴 Stackless Python 在应用层的无栈特性。与几乎所有其他的 Python 实现类似,PyPy 也缺乏对 C/Python 扩展 API 的完全官方支持。但它至少通过 CPyExt 子系统为 C 扩展提供了某种程度的支持,虽然文档不完整,功能也尚未完善。此外,社区正在努力将 NumPy 迁移到 PyPy 中,因为这是最需要的功能。