18 | Python编译器(二):从AST到字节码
该思维导图由 AI 生成,仅供参考
编译过程
- 深入了解
- 翻译
- 解释
- 总结
Python编译器的编译过程包括词法分析、语法分析和生成字节码。在语义分析阶段,Python编译器建立符号表,进行引用消解和类型检查。符号表是针对每个模块生成的,包括模块、类和函数三种级别的块,构成树状结构。Python的指令一开始是一个字节长的,后来变成了一个字的长度,但仍然习惯上称为字节码。Python的虚拟机是基于栈的虚拟机,指令也很相似于Java。编译器以visit模式遍历整个AST,并建立基本块和指令。基本块是在进入一个作用域的时候生成的,循环语句、if语句还会产生额外的基本块。汇编过程是把每个基本块的指令对象转化成字节码,拼成一个整体,并生成PyCodeObject对象。窥孔优化器在字节码的基础上做了一些优化。总的逻辑是:以visit模式遍历整个AST,并建立基本块和指令。对于每种AST节点,都由相应的函数来处理。Python编译器的优化功能是很有限的。在编译的过程中,Python编译器的优化功能是很有限的。在compiler.c的代码中,你会看到一点优化逻辑。比如,在为if语句生成指令的时候,编译器就会看看if条件是否是个常数,从而不必生成if块或者else块的代码。另一个优化机会,就是在字节码的基础上优化,这就是窥孔优化,其实现是在Python/peephole.c中。它能完成的优化包括:把多个LOAD_CONST指令替换为一条加载常数元组的指令。如果一个跳转指令,跳到return指令,那么可以把跳转指令直接替换成return指令。如果一个条件跳转指令,跳到另一个条件跳转指令,则可以基于逻辑运算的规则做优化。在做优化的时候,窥孔优化器会去掉原来的指令,替换成新的指令。如果有多余出来的位置,则会先填充NOP指令,也就是不做任何操作。最后,扫描一遍整个字节码,把NOP指令去掉,并且调整受影响的jump指令的参数。
《编译原理实战课》,新⼈⾸单¥59
全部留言(2)
- 最新
- 精选
- Jacob.C答题:因为python变量的语义设计是“定义-使用”,不存在先使用再定义的情况,所以不用担心这种情况下的消解错误2020-07-135
- 榕思考题:我的理解是Python在添加符号的时候已经通过标志位对符号做了标记,所以后面做引用消解可通过标志位区分。2021-07-23