编译程序
作为一个语言翻译程序,
也要在翻译过程中检查源程序的语法和语义,
报告一些出错和警告信,帮助程序员更正源程序
编译程序的整个工作过程
划分
成词法分析、语法分析、语义分析、
中间代码生成,代码优化、目标代码生成
六个阶段
另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系
编译过程中源程序的各种信息被保留在种种不同的表格里,
编译各阶段的工作都涉及到构造、查找或更新有关的表格,
因此需要有表格管理的工作;
如果编译过程中发现源程序有错误,
编译程序应报告错误的性质和错误发生的
地点,并且将错误所造成的影响限制在尽可能小的范围内,
使得源程序的其余部分能继续被编译下去,
有些编译程序还能自动校正错误,这些工作称之为出错处理
=====================我是分割线====================
●〖词法分析阶段是编译过程的第一个阶段.〗
此阶段的任务:从左到右一个字符一个字符地读入源程序。
对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。
PS:[这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义]
例如:一个C源程序片断:
int a;
a = a + 2;
词法分析后可能返回:
单词类型 单词值
保留字 int
标识符 a
界符 ;
标识符 a
算符(赋值) =
标识符 a
算符(加) +
整数 2
界符 ;
●〖语法分析是编译过程的第二个阶段〗
语法分析的任务
是在词法分析的基础上将单词序列分解成各类语法短语,
如"程序","语句","表达式"等等。
一般这种语法短语,也称语法单位可表示成语法树,
比如上述程序段中的单词序列:
id1∶=id2+id3*10经语法分析得知其是PASCAL语言的"赋值语句",
语言树为:
|__id1∶=id2+id3*10___|
|___:=___|
/ \
|__id1__| |__+___|
/ \
|__ id2 __| |__*___|
/ \
|__id3___| |__10___|
●〖语义分析〗
阶段的任务是审查源程序有无语义错误
比如使用了没有声明的变量;
或者给一个过程名赋值;
或者调用函数时参数类型不合适或者参加运算的两个变量类型不匹配等等
语义分析主要的任务----
完成静态语义审查和处理
上下文相关性审查
类型匹配审查
类型转换
●〖中间代码生成阶段 〗
有的编译程序将源程序变成一种内部表示形式,
这种内部表示形式叫做中间语言或中间代码。
所谓"中间代码"是一种结构简单、含义明确的记号系统,
这种记号系统可以设计为多种多样的形式,
重要的设计原则为两点:
一是容易生成;二是容易将它翻译成目标代码。
很多编译程序采用了一种近似"三地址指令"的"四元式"中间代码,
这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)。
a = b * c + b * d 的四元式序列为
(1) t1 = b * c
(2) t2 = b * d
(3) t3 = t1 + t2
(4) a = t3
再有:
if ( a <= b)
a = a – c;
c = b * c;
翻译成的四元式:
t1 = a > b
if t1 goto l
t2 = a – c
a = t2
l : t3 = b * c
c = t3
●〖代码优化〗
代码优化阶段的任务是
对前阶段产生的中间代码进行变换或进行改造,
目的是使生成的目标代码更为高效,即省时间和省空间
●〖目标代码生成〗
目标代码生成阶段的任务是
把中间代码变换成特定机器上的
绝对指令代码或可重定位的指令代码或汇编指令代码
(1)MOVF id3 R2
(2)MOLF #10.0 R2
(3)MOVF id2 R1
(4)ADDF R1 R2
(5)MOV R1 id1
第一条指令将id3的内容送至寄存器R2,
第二条指令将其与实常数10.0相乘,这里用#表明10.0处理为常数,
第三条指令将id2移至寄存器R1,
第四条指令加上前面计算出的R2中的值,
第五条指令将寄存器R1的值移到id1的地址中。
●〖 高级语言解释系统〗
为了实现在一个计算机上运行高级语言的程序,主要有两个途径:
第一个途径是把该程序翻译为这个计算机的指令代码序列,
这就是我们已经描述的编译过程。
第二个途径是编写一个程序,
它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,
这样的程序就叫解释程序。
作为一个语言翻译程序,
也要在翻译过程中检查源程序的语法和语义,
报告一些出错和警告信,帮助程序员更正源程序
编译程序的整个工作过程
划分
成词法分析、语法分析、语义分析、
中间代码生成,代码优化、目标代码生成
六个阶段
另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系
编译过程中源程序的各种信息被保留在种种不同的表格里,
编译各阶段的工作都涉及到构造、查找或更新有关的表格,
因此需要有表格管理的工作;
如果编译过程中发现源程序有错误,
编译程序应报告错误的性质和错误发生的
地点,并且将错误所造成的影响限制在尽可能小的范围内,
使得源程序的其余部分能继续被编译下去,
有些编译程序还能自动校正错误,这些工作称之为出错处理
=====================我是分割线====================
●〖词法分析阶段是编译过程的第一个阶段.〗
此阶段的任务:从左到右一个字符一个字符地读入源程序。
对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。
PS:[这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义]
例如:一个C源程序片断:
int a;
a = a + 2;
词法分析后可能返回:
单词类型 单词值
保留字 int
标识符 a
界符 ;
标识符 a
算符(赋值) =
标识符 a
算符(加) +
整数 2
界符 ;
●〖语法分析是编译过程的第二个阶段〗
语法分析的任务
是在词法分析的基础上将单词序列分解成各类语法短语,
如"程序","语句","表达式"等等。
一般这种语法短语,也称语法单位可表示成语法树,
比如上述程序段中的单词序列:
id1∶=id2+id3*10经语法分析得知其是PASCAL语言的"赋值语句",
语言树为:
|__id1∶=id2+id3*10___|
|___:=___|
/ \
|__id1__| |__+___|
/ \
|__ id2 __| |__*___|
/ \
|__id3___| |__10___|
●〖语义分析〗
阶段的任务是审查源程序有无语义错误
比如使用了没有声明的变量;
或者给一个过程名赋值;
或者调用函数时参数类型不合适或者参加运算的两个变量类型不匹配等等
语义分析主要的任务----
完成静态语义审查和处理
上下文相关性审查
类型匹配审查
类型转换
●〖中间代码生成阶段 〗
有的编译程序将源程序变成一种内部表示形式,
这种内部表示形式叫做中间语言或中间代码。
所谓"中间代码"是一种结构简单、含义明确的记号系统,
这种记号系统可以设计为多种多样的形式,
重要的设计原则为两点:
一是容易生成;二是容易将它翻译成目标代码。
很多编译程序采用了一种近似"三地址指令"的"四元式"中间代码,
这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)。
a = b * c + b * d 的四元式序列为
(1) t1 = b * c
(2) t2 = b * d
(3) t3 = t1 + t2
(4) a = t3
再有:
if ( a <= b)
a = a – c;
c = b * c;
翻译成的四元式:
t1 = a > b
if t1 goto l
t2 = a – c
a = t2
l : t3 = b * c
c = t3
●〖代码优化〗
代码优化阶段的任务是
对前阶段产生的中间代码进行变换或进行改造,
目的是使生成的目标代码更为高效,即省时间和省空间
●〖目标代码生成〗
目标代码生成阶段的任务是
把中间代码变换成特定机器上的
绝对指令代码或可重定位的指令代码或汇编指令代码
(1)MOVF id3 R2
(2)MOLF #10.0 R2
(3)MOVF id2 R1
(4)ADDF R1 R2
(5)MOV R1 id1
第一条指令将id3的内容送至寄存器R2,
第二条指令将其与实常数10.0相乘,这里用#表明10.0处理为常数,
第三条指令将id2移至寄存器R1,
第四条指令加上前面计算出的R2中的值,
第五条指令将寄存器R1的值移到id1的地址中。
●〖 高级语言解释系统〗
为了实现在一个计算机上运行高级语言的程序,主要有两个途径:
第一个途径是把该程序翻译为这个计算机的指令代码序列,
这就是我们已经描述的编译过程。
第二个途径是编写一个程序,
它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,
这样的程序就叫解释程序。