编译程序与解释程序
解释程序:以源程序为输入,在执行过程中不再产生目标程序,而是边解释边执行。(效率不高)
编译程序:先编译,后执行。
翻译
过程:输入并扫描源程序 → 词法分析 → 语法分析 → 代码优化 → 目标代码生成
编译程序主要由八个部分构成
- 词法分析程序(扫描器scanner)
- 语法分析程序(分析器parser)
- 语义分析程序
- 中间代码生成程序
- 代码优化程序
- 目标代码生成程序
- 错误检查和处理程序
- 各种信息表格的管理程序
词法分析程序(扫描器)
词法分析程序的任务
1)识别出源程序的各个基本语法单位(单词或语法符号)
2)删除无用的空白字符及其他与输入介质相关的非实质字符(空格、回车等)
3)删除注释
4)进行语法检查,报告所发现的错误
单词流的内部表示
为了让计算机能够方便地识别和使用,在实际中的常用方法是将单词计算机内部表示为一个有序对(Class, Value)
· Class为一整型数,用于标识该单词的类别
· Value用于存放单词的值
例:(1, ‘PROGRAM’)(3, ‘source’)(2, ‘;’)(1, ‘VAR’)
语法分析程序(分析器)
语法分析程序以词法分析程序的单词流为输入,分析源程序的结构,判断它是否为相应程序设计语言的合法程序。
方法
试图为源程序构造一个语法树。
语法树只是逻辑概念上的(逻辑结构),并不是在机器内真正存在的物理结构
语义分析程序
两个特征:语法特征、语义特征
语法特征描述各成分的形式或结构
语义特征描述各语法成分的含义与功能,即规定它们的属性或在执行应进行的运算或操作
因此,只有进行了语义分析,才能让计算机知道,应进行何操作或运算
在进行语义分析时还应进行相应的语义检查(类型匹配、矛盾说明、参数匹配)
语义处理尚无公认的方法来系统地描述,当前较通用的方法是半机械化的“语法制导翻译”方法
语法分析任务
对识别出的各种语法成分进行语义分析,并产生相应的中间代码
中间代码:一种介于源语言和目标语言之间的中间语言形式
生成中间代码的目的
1)便于做优化处理
2)便于编译程序的移植
代码优化程序和目标代码生成程序
a = b + c * 60 (c为float类型)
60 → 60.0 → T1
c * T1 → T2
b + T2 → T3
T3 → a
优化如下:
c * 60.0 → T1
b + T1 → a
然后进行目标代码生成(汇编语言)
错误检查和处理程序
程序中出现错误是难免的,一完善的编译程序应具有很强的差错能力,并能准确地报告源程序中错误的种类及位置
除报错外,编译程序还可以生成一些另外的注释信息,有助于程序设计人员调试程序
信息表管理程序
编译过程中,需经常收集、记录或查询程序中所出现的各种量的有关属性(信息)。
为此,编译程序需要建立一批不同用处的表格。