I. Definitions
1. 编译器 Compiler
- 读入源语言编写的程序
- 输出等价的用目标语言编写的程序
- 通常目标程序是可执行的
“高级” 语言 ⇒ (通常) “低级” 语言
<aside>
🔑 语言类应用程序
- 配置文件解析 (.properties)
- CSV 文件 (Comma-Separated Values)
- JSON 文件 (JavaScript Object Notation)
- SQL 引擎 (Structured Query Language)
- TLA + /TLAPS (TPaxos.tla)
- (Java) 字节码解释器
- C/C++ 语言编译器
- 排版工具 (LATEX)
- 绘图工具 (TikZ, Dot/Graphviz)
- L-System (Cantor Set)
</aside>
2. 解释器 Interpreter
- 直接利用用户提供的输入,执行源程序中指定的操作
- 不生成目标程序,而是根据源程序语义直接运行
- Java 的处理结合了两者
II. Structure
<aside>
💡 Frontend → 分析部分:跟机器无关
- 把源程序分解成组成要素与语法结构
- 使用这个结构创造中间表示
- 收集和源程序相关的信息,存放到符号表
</aside>
<aside>
💡 Backend
→ 综合部分:跟机器相关
根据中间表示和符号表信息构造目标程序
</aside>
III. Phases
1. 词法分析/扫描 Lexical analysis/scanning
词法分析器 (Lexer/Scanner): 将字符流转化为词法单元 (token) 流。
$$
\textrm{ token : ⟨ token-class, attribute-value ⟩}
$$
- 读入源程序的字符流,输出为有意义的词素 Lexeme