八、编译器

完成解析任务后,解释器拥有了一棵抽象语法树,其包含 Python 代码的操作、函数、类以及命名空间。

**编译器(compiler)**的任务是将抽象语法树转换为 CPU 能理解的指令:

图片翻译:File Input: 文件输入,IO Stream Input:文件流输入,String Input:字符串输入,Reader:阅读器,Parser:解析器,Compiler:编译器

此编译任务会被分成两个组件:

  1. 编译器:遍历抽象语法树并创建一个控制流图(CFG),此图表示执行的逻辑顺序;

  2. 汇编器:将 CFG 中的节点转换为能按顺序执行的语句,被大家称为:字节码(bytecode)

下图是编译过程的可视化展示:

图片翻译:Parser:解析器,AST:抽象语法树,CFG:控制流图,Assembler:汇编器,ByteCode:字节码,Execution:执行

重要

在本章中,请牢记 CPython 的编译单元是一个模块。本章中涉及的编译步骤和过程将为项目中的每一个模块执行一次。

在本章节中,你将会重点关注抽象语法树是如何被编译成一个 code object

PyAST_CompileObject() 是 CPython 编译器的主要入口之一。其将 Python 抽象语法树模块作为主要形参,其他形参还包括文件名和解释器早期创建的全局变量、局部变量和 PyArena

你现在开始要深入了解 CPython 编译器的核心,其背后是几十年的开发演进以及计算机科学理论体系。不要被规模和复杂度吓坏。一旦你把编译器分解成逻辑模块,就不那么难理解了。

Last updated