- 编译的起源
- 概念:源程序 目标程序 翻译程序 汇编程序 编译程序
- 编译过程:5个基本阶段
- 编译程序:7个逻辑部分
- 遍 前端 后端 前后处理器
1.1 编译的起源:程序设计语言的发展
- 低级语言:机器语言(机器指令)、汇编语言
- 高级语言:面向用户的语言、面向问题的语言……
1.2 基本概念
低级语言&高级语言
- 低级语言(Low level language)
- 字位码、机器语言、汇编语言
- 特点:与特定的机器有关,功效高,但使用复杂、繁琐、费时、易出错。
- 高级语言
- Fortran、Pascal、C语言等
- 特点:不依赖体机器,移植性好,对用户要求低,易使用,易维护等。
编译执行
- 编译:把源程序翻译成目标程序
- 源程序:汇编语言/高级语言编写的程序
- 目标程序:用1目标语言表示的程序,目标语言可以是源语言和机器语言之间的中间语言,可以是机器语言,也可以是机器的汇编语言
- 翻译程序:把源程序转换为目标程序的程序
- 源程序是汇编语言-翻译程序是汇编程序
- 编译程序是高级语言-翻译程序是编译程序
解释执行 python
- 解释程序:对源程序进行解释执行的程序
编译-解释执行 java
1.3 编译过程和编译程序构造
1.3.1 编译过程
- 编译过程:将高级语言程序翻译为等价的目标程序的过程
词法分析
- 任务:分析和识别单词(token)。源程序是由字符序列构成的,词法分析扫描源程序 (字符串),根据语言的词法规则分析并识别单词,并以某种编码形式输出。
- 单词:是语言的基本语法单位。有四大类,关键字/保留字、标识符、常数、分界符/运算符
语法分析
- 任务:根据语法规则,分析并识别出各种语法成分,如表达式、各种说明、各种语句、过程、函数、程序等,并进行语法正确性检查,出错应输出出错信息
语义分析、生成中间代码
- 任务:对识别出的各种语法成分进行语义分析(变量在前面定义了吗、左右两边类型一不一样……),并产生相应的中间代码(翻译的实质:语义的等价性)
- 中间代码:一种源语言和目标语言之间的中间语言形式
- 便于做优化处理
- 便于编译程序的移植
- 常用:四元式(三地址指令)、三元式、逆波兰表示
代码优化
- 任务:为了得到高质量的目标程序
- 例:将常量在编译时就算出并存放在工作单元中,不必生成目标指令来计算,能省一条指令的地方
生成目标程序
- 根据具体机器进行。做这部分工作时(要注意充分利用累加器),也可以进行优化处理
- 在翻译成目标程序的过程中,要切记保持语义的等价性。
1.3.2 编译程序构造
1 编译程序的逻辑结构
- 词法分析程序
- 语法分析程序
- 语义分析生成中间代码
- 代码优化程序
- 生成目标程序
上列五个基本阶段都要做两件事 - 建表和查表——表格管理
在整个编译过程中始终都要贯穿着建表(填表)和查表的工作。即要及时地把源程序中的信息和编译过程中所产生的信息(标志符、常量等)登记在表格中,而在随后的编译过程中同时又要不断地查找这些表格中的信息。 - 出错处理
能诊察出错误,并向用户报告错误性质和位置,以便用户修改源程序。出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。****
因此一共7个逻辑部分
2 遍 ( PASS )
- 遍:对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍。
- 遍与基本阶段
- 五个基本阶段: 上一遍的结果是下一遍的输入,最后一遍生成目标程序。 是将源程序翻译为目标程序在逻辑上要完成的工作
- 遍:是指完成上述5个基本阶段的工作。可能扫一遍就能都干完,也可能要扫好几遍才能干完五个基本阶段的工作
- 一遍扫描编译程序:一遍扫描即可完成整个编译工作
一遍好还是多遍好?
希望优化好:扫多遍好
希望程序运行快:扫一遍好
3 前端和后端
根据编译程序各部分功能,将编译程序分成前端和后端。
- 前端:通常将与源程序有关的编译部分称为前端。
- 词法分析、语法分析、语义分析、中间代码生成、代码优化 -------分析部分
- 特点:与源语言有关
- 后端:与目标机有关的部分称为后端。
- 目标程序生成(与目标机有关的优化)-------综合部分
- 特点:与目标机器有关
1.4 编译程序的前后处理器
1.5 编译技术的其它应用
- 程序理解:辅助理解别人写的程序
- 提取有价值的信息,展示给用户,辅助用户理解软件
- 准确提取的前提是设计自动分析软件,提供分析能力,进而准确分析
- 软件逆向工程:分析抽象,获取软件体系结构
- 逆向抽取模块设计,模块间接口
- 理解软件架构设计,功能划分、模块调用关系
- 维护现有软件
- 二次开发新软件
- 软件演化分析:分析软件演化规律
- 分析软件,从结构、变量等多个角度分析
- 维护现有软件
- 捕捉规律,利用规律,开发新软件
- 软件错误定位:定位到有缺陷的程序语句
- 提升开发效率
- 输入:软件系统源码 + 一组测试,至少一个没有通过
- 输出:一个可能有错误的程序元素列表,根据出错概率排序
- 程序元素的级别:表达式/语句/方法/类/文件
- 软件缺陷自动修复:修复有缺陷的软件
- 提升开发效率
- 输入:一个程序和其正确性约束,并且程序不满足正确性约束
- 输出:一个补丁,可以使程序满足约束
- 研究和实践中考虑最广泛的正确性约束:软件项目中的测试
- 软件代码补全/生成:补全不完整的代码
- 提升开发效率
- 基于智能化算法(LLM、agentic systems)
- 代码片段补全 (function、class)
- 项目粒度代码生成 (repository)

















