编译知识
翻译程序
翻译程序是一种程序,其输入是某种语言的一系列语句,而其输出则是另一种语言的一系列语句,二者在逻辑上是等价的。
编译程序
编译程序是一种程序。它把用高级语言写的源程序作为数据接收,经过翻译转换,产生面向机器的代码作为输出。这当中代码还可能要经过由汇编程序或装配程序作进一步加工,得出目标程序,交给计算机执行。
两者的区别
翻译程序是将一种语言转化为另一种语言
编译程序是将一种语言转换为面向机器的代码。
编译过程
编译程序的工作过程一般分为五个阶段:
- 词法分析
- 语法分析
- 语义分析和中间代码的产生
- 优化
- 目标代码生成
词法分析
词法分析的任务:输入源程序,对构成源程序的字符串进行扫描,识别出一个个单词(定义符、标识符、运算符、界符、常数)。
在词法分析阶段的工作中所 依循的是:语言的词法规则(或构词规则)
语法分析
语法分析的任务:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单元( 短语、子句、句子、程序段、程序),并确定整个输入串是否构成语法上正确的程序。
语法分析所依循的是语言的语法规则。
语法规则通常用上下文无关文法描述。
词法分析是一种线性分析,而语法分析是一种层次结构分析。
语义分析和中间代码的产生
任务:对语法分析所识别的各类语法 范畴,分析其含义,并进行初步翻译(产生中间代码)。
通常包含两个方面的工作:
- 对每种语法畴进行静态语义的检查。例如,变量是否定义、类型是否正确。
- 如果语义正确则进行中间代码的翻译。
优化
对于代码(主要是中间代码)进行加工转化,以期能够产生 更为高效(省时间和空间)的目标代码。
优化的主要方面有:公共子表达式的提取、循环优化、删除无用代码等等。
优化所依循的是程序的等价变换规则。
目标代码生成
任务:把中间代码变换成特定机器上的低级语言(绝对指令、可重定位指令、汇编指令)
编译程序的结构
表格与表格的管理
编译程序在工作过程中需要保持一系列的表格,以登记程序的各类信息和编译各阶段的进展状况。
最重要的是符号表,用来等级源程序中出现的每个名字以及名字的各种属性。例如,一个名字是常量还是变量,还是过程名。如果是变量名,类型是什么,占多大内存,地址是多少等等。
编译各阶段均需维持表格并进行表格管理,建表的技术支持数据结构,表格的分类、结构、处理文法决定于语言及机器,还有优化措施。
出错处理
如果源程序有错误,编译程序应设法发现错误,并把有关错误的信息报告给用户。
好的编译程序:
-
全
最大限度发现错误
-
准
准确指出错误的性质
-
局部化
将错误的影响限制在尽可能小的范围
-
自动校正
若程序能自动校正错误则更好,但代价非常高
源程序中的错误一般分为语法错误和语义错误
-
语法错误
指源程序中不符合语法规则的错误,例如单词拼写错误、括号不匹配等等。
-
语义错误
指源程序中不符合语义规则的错误,例如:说明错误、作用域错误、类型不匹配等等。
遍
遍:是对源程序或源程序的中间结果从头到尾的扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
遍数多了,整个编译程序的逻辑就比较清晰,但是会增加输入和输出所消耗的时间。因此,在主存可能的前提下,一般还是遍数少的好。
分遍的依据:
- 源程序的结构
- 选用机型的内存大小
- 设计目标的技术指标
- 参加编译程序人员的数量、素质
好的编译程序的指标:
- 符会语法规则的程序都可执行
- 任何非法的错误都有可能识别,并尽量少的产生连锁反应。
- 错误不至于导致系统 崩溃
- 可维护和可读性
- 模块化和结构化
编译的前端和后端
前端
前端主要与源语言有关但与目标机无关的那些部分组成。
通常包括词法分析、语法分析、语义分析与中间代码的生成,有的代码优化工作也可以包括在前端
后端
后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标代码生成等。
通常后端 不依赖源语言而仅仅依赖于中间语言。