Python 基础

什么是 Python 解释器?

Python 解析器提供了程序的运行环。Python 是解析执行的,与C/C++之类的编译性语言编写的程序类比,Python 源码不需要从源文件转换成计算机使用的机器语言,也不需要经过连接器链接之后形成二进制可执行文件。当我们运行 Python 程序的时候,Python 解析器将源码转换为字节码,然后再由 Python 解析器来执行这些字节码。但是,Python 程序每次运行都需要转换成字节码,然后再由虚拟机把字节码转换成机器语言,最后才能在硬件上运行。与编译性语言相比,每次多出了编译和链接的过程,性能会受到一定的影响。

官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行 python 命令就是启动 CPython 解释器。

什么是编译型语言和解释型语言

  • 编译型语言实现的,如:C、C++、Fortran、Pascal、Ada。由编译型语言编写的源程序需要经过编译,汇编链接才能输出目标代码,然后由机器加载到内存中执行目标代码。目标代码是有机器指令组成,不能独立运行,因为源程序中可能使用了一些汇编程序不能解释引用的库函数,而库函数又不在源程序中,此时还需要链接程序完成外部引用和目标模板调用的链接任务,最后才能输出可执行代码。

  • 解释型语言,解释器不产生目标机器代码,而是产生中间代码,这种中间代码与机器代码不同,中间代码的解释是由软件支持的,不能直接使用在硬件上。该软件解释器通常会导致执行效率较低,用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。和编译的程序不同的是, 解释程序的任务是逐一将源代码的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码再执行。对于解释型语言,需要一个专门的解释器来执行该程序, 每条语句只有在执行是才能被翻译,这种解释型语言每执行一次就翻译一次,因而效率低下。

  • Java 解释器,也称 Java 虚拟机, Java 程序是需要编译的,但是没有直接编译成机器语言,而是编译成字节码, 然后在 Java 虚拟机上用解释的方式执行 Java 字节码。Python 也使用了类似的方式,先将 Python 编译成 Python 字节码,然后由一个专门的 Python 字节码解释器负责解释执行字节码。

  • Python 是一门解释语言,但是出于效率的考虑,提供了一种编译的方法。编译之后就得到 pyc 文件,存储了字节码。Python 这点和 Java 很类似,但是Java 与 Python 不同的是,Python 是一个解释型的语言,所以编译字节码不是一个强制的操作,事实上,编译是一个自动的过程,一般不会在意它的存在。编译成字节码可以节省加载模块的时间,提高效率。

Java 虚拟机概貌(图片来源维基百科)