# 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()` 将传递的值设置为编译器状态文件名，其用于堆栈跟踪和异常处理；
* 编译器的内存分配区设置成解释器也在使用的内存分配区；有关内存分配区的更多信息请参阅“内存管理”章节中的“自定义内存分配区”；
* 在编译代码前，会配置所有未来标志。
