8.3 实例化一个编译器

在编译器启动前,会创建出一个全局编译器状态。编译器状态(compiler 类型)结构体包含了编译器使用的属性,如:编译器标志、栈以及 PyArena 。它还包括了到其他数据结构的链接,如:符号表。

以下是编译器状态中的属性:

字段类型用途

c_arena

PyArena *

指向内存分配区的指针

c_const_cache

PyObject * (dict)

保存所有常量以及 names 元组的 Python 字典

c_do_not_emit_bytecode

int

关闭字节码编译的标志

c_filename

PyObject *(str)

正在被编译的文件名

c_flags

PyCompilerFlags *

继承的编译器标志(请参见“编译器标志”章节内容)

c_future

PyFutureFeatures *

指向模块的 __future__ 的指针

c_interactive

int

交互模式标志

c_nestlevel

int

当前嵌套级别

c_optimize

int

优化级别

c_st

symtable *

编译器符号表

c_stack

PyObject * (list)

保存 compiler_unit 指针的列表

u

compiler_unit *

当前块的编译器状态

PyAST_CompileObject() 中实例化编译器状态:

  • 如果模块没有文档字符串属性(__doc__),则在此处创建一个空的属性,就像 __annotations__ 属性一样;

  • PyAST_CompileObject() 将传递的值设置为编译器状态文件名,其用于堆栈跟踪和异常处理;

  • 编译器的内存分配区设置成解释器也在使用的内存分配区;有关内存分配区的更多信息请参阅“内存管理”章节中的“自定义内存分配区”;

  • 在编译代码前,会配置所有未来标志。

Last updated