第一章 引论
了解 : 编译过程及编译程序总框图
熟悉 : 表格与表格管理
掌握 : 编译程序的结构, 编译程序的生成
1.1 什么是编译程序
-
编译程序
- 能够把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标程序),而后者与前者在逻辑上等价,这种程序称为编译程序。
源程序和数据是在不同时间(即分别在编译阶段和运行阶段)进行处理的。
链接程序两个主要任务:
1
. 装入
- 读入可重定位的机器代码
- 修改重定位地址
- 把修改后的指令和数据放在内存的适当地方或形成可执行文件
2
. 连接
把几个可重定位的机器代码文件连接成一个可执行的程序。
解释程序同时处理源程序和数据。
- 解释程序解释执行源程序,但并不生成目标程序。
- 边解释边执行。
1.2 编译过程概述
词法分析
语法分析
语义分析与中间代码产生
优化
目标代码生成
第一阶段
词法分析
-
词法分析的任务
-
- 输入源程序,对构成程序的字符串进行扫描和分解,识别出一个个的单词符号。 把需要存放的单词放到符号表中,如变量名,标号,常量等。
单词符号
-
构成语言的最小单元。如基本字
if
,标识符,常数123
,算符+
和界符;
工具或方法
- 描述词法构词规则的有效工具是 正规式和 有限自动机。
第二阶段
语法分析
-
语法分析的任务
- 在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。 工具或方法
- 语法规则,通常用 上下文无关文法描述。 例如
-
对赋值语句
Z=x+0.18*y
的分析结果为:
Z=
为赋值语句,x+0.18*y
为表达式。
语义分析就是要识别一句话所表达的实际意义。即弄清楚“干什么了”,“谁干的”,“这个行为的原因和结果是什么”以及“这个行为发生的时间、地点及其所用的工具或方法”等。
原因是语法分析,仅是在句法范围内根据词性信息来分析自然语言中句子的文法结构的。由于它没有考虑句子本身的含义,也就不能排除在语法结构上正确,但实际意义上错误的句子。
第三阶段
语义分析与中间代码产生
-
这一阶段通常包括两个方面的工作
-
对每种语法范畴进行静态语义检查。如:变量是否定义,类型是否正确等等。
根据语义规则进行中间代码的翻译。
中间代码
- 是一种含义明确、便于处理的记号系统,并独立于硬件系统。 工具或方法
- 属性文法
中间代码应具有两个重要的特点:
- 易于产生
- 易于翻译成目标代码中间代码有多种形式
编译程序设计者可以自己设计,常用的有四元式、三元式、逆波兰表示等。
第四阶段
优化
-
优化的任务
- 对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。
优化的主要方面有:
- 公共子表达式的提取
- 循环优化
- 删除无用代码等等
第五阶段
目标代码生成
-
这一阶段的任务是
- 把中间代码变换成特定机器上的低级语言代码。这阶段实现最后的翻译,它的工作依赖于硬件系统结构和机器指令含义。 目标代码的形式
- 绝对指令代码或可重定位的指令代码或汇编指令代码。如目标代码是绝对指令代码,则这种代码可立即执行。
涉及到的两个重要问题:
- 对程序中使用的每个变量要指定存储单元
- 对变量进行寄存器分配
1.3.1 编译程序总框
1.3.2 表格与表格管理
-
表格作用
- 编译程序在工作过程中需要保持一系列的表格,以登记源程序的各类信息和编译各阶段的进展状况。 表格管理的主要工作
- 编译各阶段都涉及到构造、查找或更新有关的表格。
1.3.3 出错处理
-
语法错误
- 源程序中不符合语法规则的错误,它们可在词法分析或语法分析时检测出来。 语义错误
- 源程序中不符合语义规则的错误,这些错误一般在语义分析时检测出来,有的语义错误要在运行时才能检测出来。语义错误通常包括:说明错误、作用域错误、类型不一致等等。
1.3.4 遍(PASS)
-
五个基本阶段
- 是将源程序翻译为目标程序在逻辑上要完成的工作。 遍
- 是指完成上述5个基本阶段的工作,要经过几次扫描处理。