)
AST抽象语法树根本不是 Python 独有的东西它是所有现代高级编程语言C, C, Java, Go, Rust, Python编译和解释过程的“绝对核心”和“通用语言”。**1. 所有的语言第一步都是“造树”无论是 C 语言还是 Python计算机都不认识人类写的文本代码。所以它们的第一步都是词法分析Lexical Analysis和语法分析Syntax Analysis。C 语言gcc 编译器把int a b 1;解析成 C 语言规范的 AST 树。Python解释器把a b 1解析成 Python 规范的 AST 树。在这个阶段大家做的事情是一模一样的把线性的文本变成结构化的树。2. 分道扬镳造完树之后干什么这是 C 语言和 Python 最大的区别也是它们底层架构的不同走向C 语言编译型语言AST 是为了“翻译成机器码”C 语言生成 AST 后编译器会进行极其复杂的语义分析、优化比如死代码消除、常量折叠最后把这棵 AST 树翻译成底层的汇编语言再变成机器码.exe或二进制文件。AST 在这里是通往机器码的“桥梁”。Python解释型语言AST 是为了“动态执行”Python 生成 AST 后它不会去翻译成机器码而是直接把 AST 转换成 Python 虚拟机CPython能看懂的字节码Bytecode然后由解释器一行行执行。AST 在这里是通往字节码的“桥梁”。3. 为什么 Python 的 AST 让你觉得“更高级”既然 C 语言也有 AST为什么我们在 Python 里能随便拿 AST 出来玩比如 Pytest 的断言重写而 C 语言里却很少见因为C 语言是静态语言而 Python 是动态语言在 C 语言里AST 在编译阶段就被“消耗”掉了变成了死板的二进制机器码。你没法在 C 语言运行的时候去修改它的 AST。在 Python 里AST 是运行时Runtime可访问的Python 官方直接把ast模块暴露给了开发者。这意味着你可以在 Python 程序运行的时候去读取、修改、甚至动态生成 AST 树。这就是为什么 Python 能做到那么多极其灵活的“元编程Metaprogramming”和“魔法”。