Python解释器
本文最后更新于 2024年7月24日 晚上
这篇文章主要讨论的是 Python 解释器是如何运作的,可能你认为这是一个到了高阶才应该去了解的知识,但是当你去安装 Python 或者是使用 Python IDE 的时候会发现:知道 Python 解释器的工作原理会帮助你解决许多基本问题,虽然可能这些知识你在使用 Python 的时候根本不会用到,哈哈!
程序的运行原理
首先我们需要讨论的是任何一个程序是如何在电脑上运行的,因为如果你不了解这个,你讲无法真正了解 Python 解释器。
处理器和内存
在程序运行在你的电脑里时,有两个器件十分重要:处理器和内存
处理器(Processor)
现在的处理器分为很多种类:Intel,ARM,AMD 等等,每种处理器的架构都是不同的,这意味着他们执行程序的方式也有所区别。
每种处理器接受来自 memory 中 instructions 的时候,都是会有一套自己独特的指令的,我们一般称作为:Instruction Set Architecture(ISA)。换句话说,intel 处理器可以理解的 instruction lists 与 arm 处理器可以理解的 instruction lists 是不同的,每种处理器都有自己能够理解的一套指令。
内存(Memory)
程序运行时在内存中会存储一系列的指令集(Instructions),这些 instruction 都是一堆 0 和 1 组成的机器代码(Machine Code),只有 Processor 能够看懂,我们自己是看不懂的;除此以外,内存中还有数据(data)。
所以内存中存储的就是 instructions 和 data
处理器工作
事实上,Processor 的工作是十分简单的:Fetch instruction and execute it
如图,假设有两条指令,那么 processor 的处理过程就是:
- fetch instruction 1,假设 instruction 1 的内容是:ADD 12 and 2,那么 Processor 将会执行这条命令得到结果14
- fetch instruction 2,假设 instruction 2 的内容是:Store result in memory,那么 Processor 就会把结果保存在 Memory 的某一个位置
编译器(Compiler)
当你编写源代码(Source Code)的时候,无论是 Python,Java,C 或者其他语言,这些不过是储存在硬盘中的一些文本,Processor 是无法理解这些文本的,但是我们人类可以。所以我们就需要一个翻译器能够将这些文本翻译成 Processor 可以理解的 Machine Code,这个东西就叫做编译器——Compiler。
需要注意的是,由于不同种类的 Processor 能够理解的 instruction 不同,所以 compiler 是针对特定的 Processor 和特定的操作系统平台来进行翻译的,翻译的结果就是二进制文件——binary。
当你在你的电脑里双击 binary 时,首先会将 binary 中的数据存储在 memory 中,然后 processor 开始处理 memory 中的指令。
但是这样的处理过程只适用于 C 、C++ 、Go 语言
Python 的运行原理
首先让我们考虑一个简单的情况,当我们有一个 Python 文件:hello.py 时,里面的内容是这样
1 |
|
当我们想要去运行这个文件,我们需要在终端 terminal 执行以下命令
1 |
|
事实上,在你的命令中,Python 代表的就是 Python 解释器,它是一个 binary,要去处理 hello.py 这个文件。所以说,此时在 memory 中的 instruction 可不是 hello.py 里的 machine code,而是 Python 解释器本身的 machine code。
Python 解释器
所以说我们现在要了解的就是 Python 解释器的在 memory 中是如何形式展现的。
)
可以看到,在 Memory 中,Python 解释器由两部分组成:Python Virtual Machine(PVM)和 Compiler。
Compiler
Python 解释器中的编译器与前面所提到的 compiler 类似,都是源代码文件的翻译器,但是又有所不同。Python 编译器是将 Source Code 翻译成 Byte Code 存储在内存当中,而不是 Processor 能够直接理解的 machine code。
byte code 也是一个 binary 文件,只不过这样的 binary 文件 Processor 是不能够直接理解的。
PVM
byte code 这样中间代码格式的 instruction 是由 Python 虚拟机(Python Virtual Machine)来执行的。和 Processor 一样,PVM 差不多也是做着相同的工作,不过一个针对的对象是 machine code,一个针对的对象是 byte code。
事实上,Java 等编程语言也是以相同的方式去运行的。
演示
假设我们已经有 hello.py 这个文件,通过 python 解释器运行这个文件得到的结果是
1 |
|
得到 byte code
如果不想运行 Python compiler 翻译得到的 byte code,而只是编译该如何操作呢?
运行这条命令
1 |
|
便可以生成这样一个文件夹:pycache
文件夹里面有一个文件:hello.cpython-312.pyc
pyc 文件后缀就代表着这是一个 byte code 类型的二进制文件
1 |
|
查看这个文件的结果便是一堆乱码
1 |
|
可读版本 byte code
如果你想要阅读一下我们可以理解的 byte code 文件,你可以执行以下命令
1 |
|
然后你会得到以下结果
1 |
|
视频资料参考:
What is the Python Interpreter? (How does Python Work?) (youtube.com)