1.6 【大牛讲坛】Python解释器详解

从上一节介绍的创建hello_world.py文件的例子,我们学会如何运行扩展名为.py的程序文件。这么简简单单的一句命令,背后却隐藏着很复杂的解析机制。如果你接触过C/C++之类的编译型语言编写的程序,就会知道要在计算机上运行任何程序都需要把程序语言转换成计算机可以理解的机器语言,也就是一串二进制可执行编码,运行该程序时,把二进制编码从硬盘载入到内存中并运行就可以了,这就是编译型语言的工作机制。Python的工作机制和那些编译型语言的机制又不太一样,Python代码不需要编译成二进制编码这一过程,它可以跳过编译这个步骤,直接从代码运行程序。当我们运行Python程序的时候,Python解释器将代码转换成字节码,在Python中一般为.pyc文件,然后再由解释器来执行这些字节码,这样Python就不用担心程序的编译问题了。

这种设计机制跳过了程序的编译和库的链接,会极大减轻开发的负担,而且Python代码与计算机底层机器编码更远了,会使程序可移植性变强,基本上不需要太大的改动就能跨平台运行。当然,就像一枚硬币的两面,有优点也会有缺点,其增强便利性的代价就是性能的下降。

由于整个Python从语言规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码,当然这需要很高的软件工程水平。

由于Python解释器是开源的,所以目前产业界存在多种Python解释器。

1)CPython是标准解释器,也是其他Python解释器的参考实现。通常提到“Python”一词,都是指CPython。CPython由C编写,将Python源码编译成CPython字节码,由虚拟机解释执行,这里的虚拟机可以理解为Python解释器。

2)Jython(曾用名Jpython)是在JVM上实现的Python,由Java编写。Jython将Python源码编译成JVM(Java虚拟机)字节码,由JVM执行对应的字节码。因此它能与JVM集成,如利用JVM的垃圾回收和JIT,直接导入并调用JVM上其他语言编写的库和函数。笔者在工作中经常使用Jython编写程序去调用系统的中间件,这也是一种Jython的实现形式。

3)IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。

4)PyPy是指使用RPython实现、利用Tracing JIT技术实现的Python,而不是RPython工具链。PyPy可以选择多种垃圾回收方式,如标记清除、标记压缩等。相对于CPython,PyPy的性能提升非常明显,但对第三方库的支持不够,如无法很好地支持使用CPython的API编写的扩展。

5)IronPython与Jython类似,所不同的是IronPython在CLR上实现了Python,即面向.NET平台,由C#编写。IronPython将源码编译成TODO CLR,同样它也能很好地与.NET平台集成。与Jython相同,可以利用.NET框架的JIT、垃圾回收等功能,能导入并调用.NET上其他语言编写的库和函数。IronPython默认使用Unicode字符串。

总而言之,Python的解释器种类很多,但是使用最为广泛的还是CPython。

本章我们初步了解Python的文件架构和运行框架,而且还练习搭建了Python的开发环境,对Python解释器有了一个初步的了解。如果把学习Python比喻成享受一顿美味的大餐,那我们也仅仅只是品尝了开胃甜点而已,后面内容才是真正的主食,请继续享用。