1.编译简介的要点
编译器的作用
编译的阶段
编译器的上下文环境
编译器的其他问题
分析与综合
前端与后端

编译器的构造
T形图
自举与移植
构造工具高级语言程序机器语言程序结果编译程序翻译 运行一,什么是编译程序
编译程序 (compiler)
把某一种高级语言程序等价地转换成另一种低级语言程序 (如汇编语言或机器语言程序 )的程序二,编译过程
把英文翻译为中文
识别出句子中的一个个单词;
分析句子的语法结构;
根据句子的含义进行初步翻译;
对译文进行修饰;
写出最后的译文 。
二,编译过程
编译程序的工作一般分为以下几个阶段,
词法分析
语法分析
语义分析
中间代码产生
代码优化
目标代码产生四元式单词符号语法单位四元式目标代码词法分析器语法分析器语义分析与中间代码生成器优化段源程序表格管理出错处理目标代码生成器
1,词法分析
任务,对源程序字符流进行扫描和分解,识别出一个个单词符号。
依循原则:构词规则
描述工具:有限自动机
例:
Z,= X + 6 * Y
z,= x + 6 * y
可识别为下列单词(记号):
标识符 z 赋值,= 标识符 x 加号 + 数字 6 乘号 * 标识符 y
2,语法分析
任务,在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位 。
依循的原则:语法规则
描述工具:上下文无关文法,语法树
例 (PASCAL):
VAR Z,X,Y:real;
Z,= X + 6* Y
E
A_E
ID,= E
E E+
E E*ID
ID ID
Z
:=
*
+
6 Y
X
3.语义分析
检查源程序的语义错误,并收集代码生成阶段要用到的类型信息。
Z
:=
*
+
6
Y
X
inttoreal
4,中间代码产生
任务,对各类不同语法范畴按语言的语义进行初步翻译 。
依循的原则:语义规则
中间代码,三元式,四元式,树形结构等
例:
Z:=X + 6 * Y 翻译成四元式为
(1) * 6 Y T1
(2) + X T1 T2
(3),= T2 _ Z
5,优化
任务:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码 。
依循的原则:程序的等价变换规则

FOR K:=1 TO 100 DO
BEGIN
X:=I+1;
M,= I + 10 * K;
N,= J + 10 * K;
END
中间代码(一)
序号 OPR OPN1 OPN2 RESULT 注释
(1),= 1 K K:=1
(2) j< 100 K (10) if (100<K)
goto (10)
(3) + I 1 X X:=I+1
(4) * 10 K T1 T1:=10*K
(5) + I T1 M M:=I+T1
(6) * 10 K T2 T2:=10*K
(7) + J T2 N N:=J+T2
(8) + K 1 K K:=K+1
(9) j (2) goto (2)
(10)
优化

FOR K:=1 TO 100 DO
BEGIN
X:=I+1;
M,= I + 10 * K;
N,= J + 10 * K;
END
X:=I+1;与循环无关,没必要执行100次 |
每次 M,= I+某个值,可以预先给 M在循环外赋以初值 I,变乘法为累加运算。
转换后的等价代码(二)
序号 OPR OPN1 OPN2 RESULT 注释
(1) + I 1 X X:=I+1
(2),= I M M:=I
(3),= J N N:=J
(4),= 1 K K:=1
(5) j< 100 K (10) if (100<K)
goto (10)
(6) + M 10 M M:=M+10
(7) + N 10 N N:=N+10
(8) + K 1 K K:=K+1
(9) j (5) goto (5)
(10)
6,目标代码产生
任务,把中间代码变换成特定机器上的目标代码 。
依赖于硬件系统结构和机器指令的含义
目标代码三种形式,
绝对指令代码,可直接运行
可重新定位指令代码,连接装配
汇编指令代码,需要进行汇编
6,目标代码产生
例,b=a+2
汇编代码
MOV a,R1
ADD #2,R1
MOV R1,b
表格和表格管理
常见的表格,符号名表,常数表,标号表,入口名表,过程引用表 。
格式,
例,PASCAL程序段:
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR
K:INTEGER;
BEGIN
START:
K:=M+1;
M:=N+4;
N:=K;
END.
表 0.1 符号名表 SNT
NAME INFORMATION
M 形式参数,整型,值参数
N 形式参数,整型,值参数
K 整型,变量表 0.2 常数表 CT

(VALUE)
(1) 1
(2) 4
表 0.3 入口名表 ENT
NAME INFORMATION
(1) INCWAP 二目子程序,
入口四元式,1
表 0.4 标号表 LT
NAME INFORMATION
(1) START 四元式,(4)
表 0.5 四元式表 QT
OPR OPN1 OPN2 RESULT
(1) link
(2) par INCWAP 1 M
(3) par INCWAP 2 N
(4) + M 1 K
(5) + N 4 M
(6),= K N
(7) return
出错处理
出错处理程序,发现 源程序中的 错误,把有关错误信息报告给用户
语法错误
语义错误编译程序与程序设计环境
程序设计环境
编辑程序
编译程序
连接程序
调试工具
集成化的程序设计环境编译器的上下文环境要产生可执行的文件,除了编译器外,还需要其他的一些程序。
源程序骨架预处理器源程序编译器目标汇编程序汇编器可重定位的机器代码装配 /连接器库,可重定位目标文件绝对机器代码宏扩展,加入头文件预处理器的功能
产生编译器的输入
宏扩展
#define PI 3.1415926
加入头文件
如,C语言的 #include <stdio.h>
,理性”预处理器
把现代控制流和数据结构机制添加到比较老式的语言中。
语言扩充
通过大量的内部宏定义来增强语言的能力
如:嵌套在 C语言中的数据库查询语言 Equel
编译器的其他问题
分析与综合
前端与后端
遍编译器结构中的其他问题
(1) 分析和综合编译器的分析( analysis)
—— 分析源程序以计算其特性的编译器操作。
词法分析、语法分析和语义分析属于分析部分。
编译器的综合( synthesis)
—— 生成翻译代码时所涉及到的操作部分。
代码生成是综合部分。
在优化步骤中,分析和综合都有。
分析的应用
结构化编辑器
对程序文本分析,构造恰当格式,检查输入格式,
关键字自动匹配等
智能打印机
注释以特殊字体打印,自动缩排
静态检查器
不运行程序的条件下,查错,如:永不执行的语句,
变量未定义等
解释器
直接执行源程序的操作编译前端与后端
编译前端:与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化
编译后端,与目标机有关,与目标机有关的优化,目标代码产生
同一语言的前端,配以不同后端,可移植到不同机型使用
同一后端,只需将不同语言翻译成同一中间语言,可得到同一机器上的不同编译器源语言 中间语言 目标语言前端 后端
JAVA语言操作系统平台
Java虚拟机 (解释器 )
Java编译器
Java源程序 (.java)
Java虚拟机代码 (.class)
解释执行遍 (pass)
所谓 "遍 ",就是对源程序或源程序的中间表示从头到尾扫描一次 。
阶段与遍是不同的概念 。 一遍可以由若干段组成,一个阶段也可以分若干遍来完成 。
可以单遍编译,也可以多遍编译。
允许符号先使用后定义的语言至少需要 2遍。
优化层次越深,所需遍数越多。
遍数越多,花的时间就越多。
五,编译程序生成
以汇编语言和机器语言为工具
优点,可以针对具体的机器,充分发挥计算机的系统功能。生成的程序效率高。
缺点,程序难读、难写、易出错、难维护、
生产的效率低。
常用于构造核心部分
T型图
高级语言书写
S T
I
S 源程序 T 目标程序 I 实现语言
优点,程序易读、易理解、容易维护、
生产的效率高。
缺点,难以充分发挥计算机的系统功能,
生成的程序效率低。
五,编译程序生成
移植方法利用已有的某种语言的编译程序实现另一语言的编译程序。
L1语言 A代码
A代码
L2语言 A代码
L1语言
L2语言 A代码
A代码五,编译程序生成
移植方法把一种机器上的编译程序移植到另一种机器上。
L语言 A代码
A代码
L语言 B代码
L语言
L语言 B代码
A代码
L语言 B代码
L语言
L语言 B代码
B代码五,编译程序生成
自展技术
像滚雪球一样,先对语言的核心部分构造一个小小的编译程序,
再以它为工具构造一个能够编译更多语言成分的较大编译程序。
如此扩展下去,最后形成所期望的整个编译程序。
L1
L1+L2
L1+L2+...+Ln

五,编译程序生成
编译程序自动产生编译程序 -编译程序,编译程序书写系统
LEX 词法分析程序产生器
YACC 语法分析程序产生器编译程序自动产生器
L语言的语法描述语义描述目标语言或机器描述
L语言的编译程序思考题
1.简述编译器的作用。
2.简述编译的阶段,并说明其中哪些属于前端,
哪些属于后端。
3.简述什么是前端与后端,引入前端与后端的概念有什么好处?
4.名词解释:遍