引论
编译器与解释器¶
- 编译器:读入某种语言(源语言)编写的程序,输出等价的另一种语言(目标语言)编写的程序(目标程序通常是可执行的)
-
解释器:利用用户提供的输入执行源程序中指定的操作。不生成目标程序,根据源程序的语义直接运行
-
编译器的构造:
- 分析部分(前端):把源程序分解成组成要素以及相应的语法结构;用这个结构创建源程序的中间表示;同时收集源程序相关的信息,存放在符号表;(机器无关)
- 综合部分(后端):根据中间表示和符号表信息构造目标程序(机器相关)
-
词法分析:
- 读入源程序的字符流,输出为有意义的词素
- 分解为 \
- token-name 由语法分析步骤使用
- attribute-value 指向相应的符号表条目,由语义分析/ 代码生成步骤使用
- 符号表管理:记录源程序中使用的变量的名字,收集各种属性
-
语法分析:
- 根据各个词法单元的第一个分量来创建树型的中间表示形式,通常是语法树
- 语义分析:
- 使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束
- 同时收集类型信息,用于代码生成、类型检查、类型转换
- 中间代码生成:
- 据语义分析输出,生成类机器语言的中间表示
- 生成三地址代码(每个指令最多单个运算分量,如 t3 = id2 + t2)很容易进一步生成机器语言指令
- 中间代码优化:
- 过对中间代码的分析,改进中间代码的质量(更快、更短、能耗更低)
-
代码生成:
- 把中间表示形式映射到目标语言(寄存器的分配&指令选择)
-
趟:每趟读入一个输入文件,产生一个输出文件
- 步骤是逻辑组织方式
- 趟和具体的实现相关
程序设计语言与编译器¶
- 程序设计语言的新发展向编译器的设计者提出新的要求(不断支持新的语言特性)
- 降低高级语言的执行开销,推动高级语言的使用
- 编译器设计者还需要更好地利用新硬件的能力
程序设计语言的基础概念¶
-
静态与动态
- 静态:支持编译器静态决定某个问题
- 动态:只允许在程序运行时刻作出决定
-
作用域
- 静态作用域:通过静态阅读程序可决定
- 动态作用域:运行时确定 x 的指向
-
环境与状态
- 环境:从名字到存储位置的映射
- 状态:从存储位置到它们值的映射