第二章
计算机语言的实现命令,问题:效率低下
程序的解释执行 如:BASIC、DOS
输入数据
源程序
解释程序
计算结果
源程序
程序的编译执行 目标程序: 机器语言编译程序
汇编语言
目标程序
输入数据
运行系统
计算结果
2.1 编译系统的需求分析 源程序的分析 词法、语法、语义
目标程序的综合 语句的翻译、代码生成
标识符与数据目标的绑定(binding) 变量:
存储单元 函数: 目标代码序列
2.2 编译过程自然语言的翻译过程: I wish you success 主语 谓语 间接宾语 直接宾语 识别单词(拼写正确)、语法检查(顺序 格式)、 语义理解(合理)、组织译文(符合原文 、通顺)
一个 C 程序的编译过程源程序: main( ) { printf(“hello”); } 1. 词法分析 分析字符序列; 识别单词(种别、属 性) 查词法错误; 标识符登记;
结果 IDN ( ) { IDN ( STR ) ; }
main
printf
hello
2. 语法分析分析单词序列; 识别语法结构;
语句表达式 函数调用 ( 表达式 常数 字符串 ) ;
标识符
查语法错误; 构造分析树;
3. 语义分析 确认标识符的属性 类型、作用域等
语义检查 运算的合法性、取值范围等
子程序的静态绑定 代码存储的相对地址
变量的静态绑定 数据存储的相对地址
4. 生成中间代码 中间语言 简单规范 机器无关
例: printf(“hello”)的翻 译(三地址代码)x := s (赋值) param x (参数) call f (函数调用)
易于优化与转换
按照语法分析树生
成中间语言代码 运算指令 控制指令
注释s 是 hello 的地址 f 是函数 printf 的地址
5.
代码优化
中间代码的优化处理,以求提高执行效率
6.
目标代码生成
将中间代码转换成目标机上的机器指令代
码或汇编代码MOV R0, #12, 10000001 0001 1100 ADD R0, #4 10000010 0001 0100 MUL R0, R2 11000100 0001 0010 汇编指令代码 机器指令代码
编译程序的结构表格管理 中 词 法 分 析 语 法 分 析 语 义 分 析 间 代 码 生 成 错误处理 代 码 优 化 目 标 代 码 生 成
其他模块 表格管理 辅助语法检查、语义检查 完成静态绑定、管理编译过程
错误处理 词法:拼写... 语法:语句结构、表达式结构... 语义:类型不匹配...
编译程序的组织结构
编译前端 1.
2.
目标机无关部分 词法分析、语法分析、中间代码生成 语义分析、中间代码优化 目标机相关部分 目标代码优化 目标代码生成 常见:前段1.2.和后端1.2.
编译后端
1.2.
多遍扫描
程序设计
环境
集成化的程序设计环境 编辑程序 编译程序 连接程序
----- 将目标程序连接成可执行程序 调试工具 ----- 跟踪、分析
常见: Turbo
C/C++ Visual Studio for C/C++, Basic etc JBuilder, BlueJ, NetBean
2.3 编译技术的通用性把复杂数据看作一条语句 数据格式的分析 利用词法分析、语法分析方法
数据处理的框架 基于语法制导的语义处理框架
编译技术可以用于各种复杂数据的分
析处理
例2-1(1/2)DOS 命令 date 的输出格式例:9-2-1993、09-03-1993、9-03-93
语法date → month - day - year
词法month → DIG DIG | DIG day → DIG DIG | DIG year → DIG DIG | DIG DIG DIG DIG
例2-1(2/2)语义year(年)、month(月)、day(日)
语义约束条件0 < month.value < 13 0 < day.value < 32,31,30 0 < year.value < 10000