编译原理绪论
计算机程序设计程序以及编译
编译:将高级语言(语言)翻译成汇编语言或机器语言(目标语言)的过程
编译器在语言处理系统中的位置
-
编译器在语言处理系统中的位置
- 源程序
- 预处理器:把存储在不同文件中的源程序聚合在一起,并把被称为宏的编写语句转换位原始语句。
- 经过预处理的源程序
- 编译器
- 汇编语言程序
- 汇编器
- 可重定位的机器代码:可重定位:在内存中存放的起始位置不是固定的
- 起始位置+相对位置=绝对位置
- 连接器/加载器
- 加载器:修改可重定位地址,将修改后的指令和数据放到内存中适当的位置
- 连接器:将多个可重定位的机器代码问题链接到一起;解决外部内存地址问题。
- 目标机器代码
- 源程序
编译系统的结构
人工英汉翻译的例子
编译器的结构
词法分析/扫描(Scanning)
词法分析的主要任务从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示词法单元(token)形式token:<种别码,属性值>
例:词法分析后得到的token序列
语法分析
语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)。
语法分析树描述了句子的语法结构。
例题
语义分析的主要任务
1.收集标识符的属性信息
种属(Kind)
简单变量、复合变量(数组、记录、…)、过程、:
类型 (Type)
整型、实型、字符型、布尔型、指针型、…
存储位置、长度
begin
real x[8];
integer i, j;
end
值
作用域
参数和返回值信息
参数个数、参数类型、参数传递方式、返回值类型、…
2.语义检查
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 数组下标不是整数
- 对非数组变量使用数组访问操作符
- 对非过程名使用过程调用操作符
- 过程调用的参数类型或数目不匹配
- 函数返回类型有误
常用的中间表示形式
-
三地址码 (Three-address Code)
- 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
-
语法结构树/语法树(Syntax Trees)
常用的三地址指令
- 让可以具有如下形式之一
- 源程序中的名字 (name)
- 常量(constant)
- 编译器生成的临时变量(temporary)
三地址指令的表示
- 四元式(Quadruples)
- (op,y, z,x)
- 三元式(Triples)
- 间接三元式(Indirect triples)
中间代码生成的例子
目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
rect triples)
中间代码生成的例子
[外链图片转存中…(img-YAi8fyxz-1599398063181)]
目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
代码优化为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾
别废话,拿你代码给我看。