要点
[源代码] –> 词法分析 –> [token串] –> 编译器第一轮(语法分析) –> [语法树] –> 编译器第二轮(中间语言转换/翻译) –> [中间语言] –> 中间语言 VM 执行/解释 –> [原生机器语言]
编译器第一轮和第二轮可以合并成一轮,直接输出中间语言,在现代语言实现里不常见,只用于教学。
以 VM 为分界点,前面可以看成 解释型 语言,用 VM 来解释执行,可能用到即时编译。
如果走完全过程,发布原生机器语言,就是 编译型 语言
三种解释器/编译器
walk-through
建立出语法树,每次运行的时候遍历语法树,速度较慢
解释型语言
生成中间语言
编译型语言
后两者都可以实现为:
- 先建立出语法树,
- 然后设计一个基于 stack 的虚拟机,
- 接着将语法树转换/翻译成基于 stack 的虚拟机指令(栈、二叉树结构其实是等价的)。
代码和数据
程序由代码和数据组成,代码被表示成语法树AST,数据需要创建出数据结构来放置,如 hash, string, stack