什么是CPython?
CPython是特指C语言实现的Python,就是原汁原味的Python。
之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。
如下是官方对CPython的说明:
CPython is Guido van Rossum’s reference version of the Python computing language. It’s most often called simply “Python”; speakers say “CPython” generally to distinguish it explicitly from other implementations.
这个页面对Python各种不同的实现有一个说明:
https://wiki.python.org/moin/PythonImplementations?action=show&redirect=implementation
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
CPython
当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python
就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。
为什么 CPython 是用 C 而不是 Python 编写的?
CPython 中的 C 是对 C 编程语言的引用,暗示这个 Python 发行版是用 C 语言编写的。
CPython 中的编译器是用纯 C 编写的。但是,许多标准库模块都是用纯 Python 或 C 和 Python 的组合编写的。
那么为什么 CPython 是用 C 而不是 Python 编写的?
答案就在于编译器的工作原理。
编译器有两种类型:
自托管编译器
是用它们编译的语言编写的编译器,例如 Go 编译器。
源到源编译器
是用另一种已经有编译器的语言编写的编译器。
这也就意味着如果从头开始编写新的编程语言,则需要一个可执行的应用程序来编译你的编译器!你就需要一个编译器来执行任何操作,因此在开发新语言时,它们通常首先用较旧的,更成熟的语言编写。同时节省时间和学习成本。
一个很好的例子就是 Go 语言。
第一个 Go 编译器是用 C 编写的,然后 Go 可以编译,编译器就在 Go 中重写了。
CPython 保留了它的 C 的特性:许多标准库模块(如 ssl 模块或 sockets 模块)都是用 C 语言编写的,用于访问低级操作系统 API。
用于创建网络套接字,与文件系统一起工作或与显示器交互的 Windows 和 Linux 内核中的 API 都是用 C 语言编写的。所以将 Python 的可扩展性层专注于 C 语言是有意义的。
标准版本的Python是用C来编译的,又被称为Cpython。还有一个用的Python解释器是完全由Java写成的,名为Jython。
两种解释器之间存在一些细微的差别,但是它们非常接近,而且启动环境也完全相同。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
Jython,是用JPython实现的Python,它支持用Java扩展,只要有Java虚拟机,就能运行Jython,拥有访问Java包与类库的能力;提供访问Java原生异常处理的能力;继承了JavaBeans的特性和内省能力。鼓励Python到Java的开发,Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。比如,GUI开发人员可以访问Java的AWT/Swing库,Jython的用户界面将使用Swing,AWT或者SWT。 Jython可以被动态或静态地编译成Java字节码。
Jython还包括 Jythonc,一个将Python代码转换成Java代码的编译器。这意味着Python程序员能够将自己用Python代码写的类库用在Java程序里。
与相似的 Java 程序相比,Jython 极大的的减少了编程代码量。
Jython 为Java开发环境提供了脚本引擎;能很容易测试Java类库,同时拥有解释器和编译器,使其无需编译就可以测试程序代码;利用了Java原生垃圾收集器(Cpython没有实现该功能)。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>
作为提示符,而IPython用In [序号]:
作为提示符。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术
,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
参考资料
Cpython官网:
https://cython.readthedocs.io/en/latest/index.html
廖雪峰官方网站:https://www.liaoxuefeng.com/wiki/1016959663602400/1016966024263840