基本概念
源程序(Source Program)
指用汇编语言或高级语言(如C、Java等)编写的程序,是程序员直接编写的代码形式。
目标程序(Target Program)
指由翻译程序处理源程序后生成的程序,使用目标语言表示。目标语言可以是:
- 中间语言(如字节码、IR中间表示),
- 某种计算机的机器语言(二进制代码),
- 或某种汇编语言。
翻译程序(Translator)
指将源程序转换为目标程序的程序,是广义的翻译工具总称。它包括:
- 编译程序(Compiler):将高级语言源程序整体翻译为目标程序。
- 汇编程序(Assembler):将汇编语言源程序翻译为机器语言。
- 其他变换程序(如转换工具)。
编译执行 vs. 解释执行
| 特性 | 编译执行 | 解释执行 | JIT(混合) |
|---|---|---|---|
| 执行方式 | 提前编译成机器码 | 逐行解释执行 | 先编译成中间码,再动态编译 |
| 执行速度 | 快 | 慢 | 较快(优化后接近编译执行) |
| 跨平台性 | 差(依赖平台) | 好(解释器跨平台) | 好(如 JVM、CLR) |
| 错误检查 | 编译时发现 | 运行时发现 | 编译 + 运行时检查 |
| 典型语言 | C、C++、Go | Python、JS | Java、C# |
编译过程
- 词法分析
- task:分析和识别单词
- 语法分析
- task:根据规则,分析和识别程序中的各种语法成分,进行语法正确性检测
- 语义分析,生成中间代码
- 对识别出的各种语法成分进行语义分析,并产生相应的中间代码
- 便于优化
- 方便移植
- 代码优化
- task:得到高质量的目标程序
- 生成目标程序
编译程序构造
逻辑结构
1.
- 按照五个阶段
- 每个阶段都要做两件事
- 表格管理
- 出错处理
- 以上7个部分
遍:从头到尾扫描一次(很多遍扫描)
- 在一遍扫描即可完成整个编译过程→一边扫描编译程序
前端和后端
- front:负责分析与源语言相关的部分,将源代码转换为中间表示
- back:负责与目标机器相关的部分,将中间表示转换为目标机器代码