一、引论
1、介绍程序设计语言编译程序构造的基本原理和基本实现技术。
2、编译程序:把高级语言等价地转换成另一种低级语言(如:汇编或机器语言)的程序。
3、解释程序:把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行。
4、编译步骤:
例如:In the room,he broke a window with a hammer.
词法分析:确定句子中各个单词的词性(名词、介词等)
语法分析:识别句子中的各类短语,获得句子的结构。
语义分析:根据句子的结构分析出各个短语在句子中充当的成分。从而确定各个名词性成分同核心谓语间的语义关系。
编译器结构:
语法制导翻译:语法分析的同时语义分析
5、词法分析:
从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示——词法单元(token)形式。
token:<种别码,属性值>
词法分析后得到的token:
输入:while(value!=100){num++;}
输出:
1 while <WHILE,_ >
2 ( <SLP,_>
3 value <IDN,value>
4 != <NE,_>
5 100 <CONST,100>
6 ) <SRP,_>
7 { <LP,_>
8 num <IDN,num>
9 ++ <INC, _>
10 ; <SEMI,_>
11 } <RP,_>
6、语法分析:
语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树。
例如:
1、赋值语句的分析树:
position=initial+rate*60;
2、变量声明语句的分析树:
文法:由一系列规则构成
<D> -> <T><IDS>;
<T> ->int | real |char |bool
;
<IDS> ->id |<IDS>,id
D:declaration 的首字母,表示声明语句
T:type 的首字母,表示类型
IDS:identify sequence 表示标识符序列
一个声明语句D:是由一个类型T,连接上一个标识符序列 IDS和一个分号构成。T可以是int、real、char、或者bool。竖线表示或者的关系。一个id可以构成一个标识符序列,一个 IDS一个逗号一个id可以构成一个更大的标识符序列 IDS。
输入:
int a,b,c;
分析树:
7、语义分析:
主要任务:
(1)收集标识符的属性信息:(种属、类型(int、float、double…)、存储位置、长度、值、作用域、参数和返回值信息)
标识符的属性信息存放在符号表中。每个标识符对应一条记录。
(2)语义检查(变量未经声明就使用,运算分量类型不匹配)
8、中间代码生成:
常用的中间表示形式:三地址码、语法结构树(语法树)不同于语法分析树。
三地址码:由类似汇编语言的指令序列组成,每个指令最多有三个操作数。
说明:
x=y[i] i 是数组元素的偏移地址,不是数组的下标。
x[i] =y , 将变量的值赋给一个数组元素。
x=y op z:op 是二元运算符 ,y,z 是两个运算分量的地址。x是运算结果的存放地址
x=op y :op是一元运算符
if x relop y goto n :如果x、y满足关系relop 则跳转到地址n对应的指令
param x :将x设置为参数
call p,n : p是过程的名字,n是过程的参数的个数
三地址指令的表示(表示成数据结构):四元式(op,y,z,x)、三元式、间接三元式
由分析树转化为中间代码。 j (jump)表示跳转,冒号前的数字表示编号
9、代码优化:
为改进代码所进行的等价程序变换,使其运行的更快一些,占用的空间更少一些,或者二者兼顾。
10、目标代码生成:
目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言。
目标代码生成的一个重要任务就是为程序中使用的变量合理分配寄存器。
倍笠: 感谢博主! 问题解决
m0_62870837: 为什么我右边没有三角符号
学习越学越多: 简洁明了,帮助很大
weixin_44183720: 按照博主的方法安装测试成功了,感谢!
Elylicery: 我也觉得?为什么这个命令里是x86呢????