什么是编译
机器语言-汇编语言-高级语言
机器语言
- 机器语言编写的程序可以直接被计算机理解,但是与人类理解相去甚远
- 容易写错,难以编写
- C706 0000 0002
汇编语言
- 引入助记符
- 编写起来仍然有困难
- MOV X,2
高级语言
- 方便理解与编写
- x = 2
从汇编到机器语言的过程称为汇编
从高级语言(源语言)转为汇编语言/机器语言(目标语言)的过程则称为red:编译
(源程序)-预处理器-(预处理源程序)-编译器-(汇编语言程序)-汇编器-(可重定位的机器代码)-加载器-(目标代码)
编译器过程
词法分析
主要任务
从左向右逐行扫描字符,识别单词,确定类型,并将它们转换为统一的机内表示 token
token
<种别码,属性码>
种别码包括:关键字(一次一码),标识符(多词一码),常量(一类型一码),运算符(一词一码/一型一码),界符(一词一码)
类型 | 例子 | 种别码
关键字 | if,else | 一词一码
标识符 | 变量名,数组名 | 多词一码
常量 | 整型,浮点型,布尔型 | 一型一码
运算符 | 算术,逻辑,关系 | 一型一码
界符 | (),; | 一词一码
语法分析
- 识别词法分析中各类词语,并构造语法分析树
- e.g.声明语句的分析树
<D>-><T><IDS>;
<T>->int | real | char | bool
<IDS>->id|<IDS>,id
D stands for destination;
T stands for type;
IDS stands for strings of Identifier;
(1)int a,b,c;
(2)int a;
语义分析
收集标识符的属性信息
种属Kind
简单变量,复合变量,过程
类型Type
整型,实型,字符型,布尔型
储存位置/长度
e.g.
begin
real x[8];
int i,j;
end
假设一个实型变量占用字节为8字节
x[0]起始为0,x[7]终点为63
则i的起点为64
值
作用域
参数和返回值
将所有信息存于符号表中
语义检查
中间代码生成
常用的中间表示形式
三地址码:由类似汇编语言的指令序列组成,每个指令最多三个操作数
三地址指令的表示:
-
四元式:(op,entity1,entity2,entity3)
e.g.
-
三元式
-
间接三元式
语法树
目标代码生成
- 目标代码生成器以中间形式作为输入,并映射到目标语言
- 为程序中的变量分配寄存器
代码优化器
- 为了改进代码而做的等价程序变换
- 机器无关代码负责优化中间代码,机器有关代码负责优化目标机器语言