编译过程

解析(Parse):词法分析与语法分析;编译(Compile):从 AST 至生成字节码的过程。其中,编译(Python/compile.c)过程主要完成 5 项工作:

7. Simple statements - Python 3.10.5 documentation

语义分析:建立符号表与引用消解

通常来说,在语义分析阶段首先是建立符号表,然后在此基础上做引用消解和类型检查。而 Pyhon 是动态类型的语言,类型检查应该是不需要了,但引用消解还是要做的。并且,Python 的引用消解有其独特之处。

f2d30eaa6yy3fd1e5dc5589f2ff197b9.webp

在编译的过程中,针对每个模块(也就是一个 Python 文件)会生成一个符号表(symtable)。Python 的程序被划分为 “块”(block),块分为三种:模块、类和函数。每种块其实就是一个作用域,而在 Python 里面还叫做命名空间。每个块对应一个符号表条目(PySTEntryObject),每个符号表条目里存有该块里的所有符号(ste_symbols)。每个块还可以有多个子块(ste_children),构成树状结构。

在符号表里,有一个 st_blocks 字段,这是个字典,它能通过模块、类和函数的 AST 结点,查找到 Python 程序的符号表条目,通过这种方式 ,就把 AST 和符号表联系在了一起。