1. 编译器的作用
<aside>
💡 编译器 Compiler
- 读入源语言编写的程序
- 输出等价的用目标语言编写的程序
- 通常目标程序是可执行的
</aside>
<aside>
💡 解释器 Interpreter
- 直接利用用户提供的输入,执行源程序中指定的操作
- 不生成目标程序,而是根据源程序语义直接运行
- Java 的处理结合了两者
- 编译 → 生成字节码
- 解释 → 运行字节码
</aside>
2. 编译器的结构
<aside>
💡 Frontend → 分析部分:跟机器无关
- 把源程序分解成组成要素与语法结构
- 使用这个结构创造中间表示
- 收集和源程序相关的信息,存放到符号表
</aside>
<aside>
💡 Backend → 综合部分:跟机器相关
- 根据中间表示和符号表信息构造目标程序
</aside>
2.1 Phases 步骤
-
词法分析/扫描 Lexical analysis/scanning
- 读入源程序的字符流,输出为有意义的词素 Lexeme
<token-name, attribute-value>
token-name
由语法分析步骤使用
attribute-value
指向相应的符号表条目,由语义分析/ 代码生成步骤使用
-
语法分析 Syntax analysis/parsing
- 根据各个词法单元的第一个分量来创建树型的中间表示形式,通常是语法树 (Syntax tree)
- 中间表示形式指出了词法单元流的语法结构
- 语义分析 Semantic analysis
- 使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束
- 同时收集类型信息,用于代码生成、类型检查、类型转换
- 中间代码生成
- 根据语义分析输出,生成类机器语言的中间表示
- 三地址代码
- 每个指令最多包含三个运算分量
- 易于生成机器语言指令
- 中间代码优化
- 通过对中间代码的分析,改进中间代码的质量
- 代码生成
- 把中间表示形式映射到目标语言
- Others
- 符号表管理:记录源程序中使用的变量的名字,收集各种属性
- 趟 Pass
- 编译器构造工具
3. 程序设计语言的基础概念