1.1从面向机器的语言到面向人类的语言:
面向机器:
机器语言 其表现形式为:0和1组成的数字串
汇编语言 其表现形式为:add si,ax 使用具有一定含义的符号为助忆符
面向人类:
通用程序设计语言 例如C/C++、JAVA 特点:具有很高的抽象程度
数据查询语言 例如SQL语言
形式化描述语言 例如编译器构造中常用的工具YACC语言 特点:基于数据基础的产生式
1.2语言之间的翻译
看下面图解就差不多了
1.3编译器与解释器
解释器与编译器的主要区别在于:运行目标程序时的控制权在解释器而不在目标程序
与编译器相比,解释器有以下两个优点:
- 具有较好的动态特性。解释器运行时,由于源程序也参与其中,因此数据对象的类型可以动态改变
- 具有较好的可移植性。
1.4编译器的工作原理与基本组成
以阶段划分编译器
源代码如下:
Var x,y,z:real;
x:=y+z*60
【1】词法分析:
Var id1,id2,id3:real;
id1:id2+id3*60;
【2】语法分析:
【3】语义分析:
为什么增加了一个itr?
答:因为三个变量均是real类型的,而60是integer类型,因此语义分析要增加一个itr操作,把60转换成real类型的60.0;
中间代码优化时就已经完成了60到60.0的转换;
【4】中间代码生成:
中间代码的基本格式:
(序号)(op, arg1, arg2, result)
操作符 左操作数 右操作数 结果
- (itr,60, ,T1)
- (*,id3,T1,T2)
- (+,id2,T2,T3)
- (:=,T3, ,id1)
【5】中间代码优化:
- (*,id3,60.0,T1)
- (+,id2,T1,id1)
作用省略上一步骤中多余的代码
【6】目标代码生成:
MOVF id3,R2
MULF #60.0,R2
MOVF id2,R1
ADDF R2,R1
MOVF R1,id1
注:其中MOVF,MULF,ADDF分别表示浮点数的传送、乘和加操作
ADDF和MULF的含义是:
操作形式:OP source,target OP代表ADDF(加)或者MULF(乘)
它表示target:=source op target 即:source和target进行OP运算,结果存进target
MOVF的含义:
操作形式:MOVF source,target
它表示target:=source 即:将source中的内容移进target中
【7】符号表管理
作用:记录源程序中符号的必要信息,并加以合理组织,从而在各个阶段能对这些符号进行快速、准确的查找和操作
【8】出错处理
错误分为动态错误和静态错误两类
动态错误:源程序中的逻辑错误,发生在程序运行时,也被称为动态语义错误
Example:变量取值为0时做除数or数组元素引用时下标出界
静态错误:又分为语法错误和静态语义错误
语法错误是指有关语言结构的错误
Example:单词拼写错误,缺少操作数等等
静态语义错误是指分析源程序时可以发现的语言意义上的错误、
Example:加法的两个操作数中的一个是整型变量名,一个是数组名
1.4.4编译器的分析/综合模式