1.2 编译过程和编译程序结构
1.2.1 编译过程
图 1.3 编译的各个阶段
- 词法分析: 从左到右一个一个字符地读入源程序,对构成源程序的字符进行扫描和分解,从而识别出一个个单词。
- 语法分析: 在词法分析的基础上将单词序列分解成各类语法短语,这些语法短语也称为语法单位,可以表示成语法树。
语法分析依据的是语言的语法规则,即描述程序结构的规则
例如 id1 := id2 + id3 * 10
图 1.5 语句 id1:=id2+id3*10的语法树
- 语义分析: 审查源程序有无语义错误,为代码生成阶段收集类型信息。
- 中间代码生成: 有的编译程序将源代码变成一种内部表示形式,是一种结构简单、含义明确的记号系统,具有容易生成、容易翻译成目标代码的特点。
例如 id1 := id2 + id3 * 10 可以表示为如下表
| num | 运算符 | 运算对象1 | 运算对象2 | 结果 |
|---|---|---|---|---|
| 1 | inttoreal | 10 | - | t1t_1t1 |
| 2 | * | id3 | t1t_1t1 | t2t_2t2 |
| 3 | + | id2 | t2t_2t2 | t3t_3t3 |
| 4 | := | t3t_3t3 | - | id1 |
- 代码优化: 对前一阶段的中间代码进行变幻或进行改造,目的是使生成的目标代码更为高效,以省时间和空间。
上面的表可以优化为下面的表
| num | 运算符 | 运算对象1 | 运算对象2 | 结果 |
|---|---|---|---|---|
| 1 | * | id3 | 10.0 | t1t_1t1 |
| 2 | + | id2 | t1t_1t1 | id1 |
- 目标代码生成: 把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
编译最后阶段,它的工作与硬件系统结构和指令含义有关
并不是所有过程都是必须的,有的不需要中间代码,有的不需要优化,不一而足
1.2.2 编译程序的结构
1.2.3 编译阶段
前端: 主要依赖于源语言而与目标机器无关
通常包括 词法分析,语法分析, 语义分析,中间代码生成,代码优化
后端: 主要值依赖于目标机器而一般不依赖与源语言
只与中间代码有关的那些阶段的工作,即目标代码生成,以及相关出错处理和符号表操作
遍或者趟 : 一个编译过程可由一遍、两遍或多遍完成,是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。
优点: 1.编译程序少占内存,2编程程序的逻辑结构更加清晰;
缺点: 增加编译过程时间
1.3 解释程序和一些软件工具
编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编语言程序或者二进制代码程序,这个二进制代码程序在机器上运行以生成结果。
1.4 PL/0 语言编译系统
PL/0 语言编译系统由编译程序和解释程序两部分组成。
使用T形图来表示一个编译程序设计的三个方面的语言
PL/0
+-----------------------------+
|PL/0 类 P-code|
+----+ +----------+
|C/Pascal/Ja^a|
+-------------+
2828

被折叠的 条评论
为什么被折叠?



