1.2   编 译 过 程 和 编 译 程 序 的 基 本 结 构

1.2 编 译 过 程 和 编 译 程 序 的 基 本 结 构

编译程序的功能是把用高级语言编写的源程序翻译成等价的机器语言或汇编语言表示的目标程序

编译程序是将一种语言形式翻译成另一种语言形式,因此其工作过程一般可划分为下列 5 个阶段:词法分析、语法分析、语义分析及中间代码生成、代码优化和目标代码生成

下面,我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。
例如,计算圆柱体表面积的程序段如下:
float r , h , s ;
s=23.1416r* ( h+r )

第 1 阶段 词法分析
词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词(也称单词符号,简称符号)
词法规则是单词符号的形成规则,它规定了哪些字符串构成一个单词符号。上述源程序
通过词法分析识别出如下单词符号:
基本字 float
标识符 r , h ,s
常数 3.1416 ,2
运算符 * , +
界符 ( ) ; , =

第 2 阶段 语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法规则从单词符号串中识别出各种语法单位(如表达式、说明、语句等)并进行语法检查,即检查各种语法单位在语法结构上的正确性

语言的语法规则规定了如何从单词符号形成语法单位,换言之,语法规则是语法单位的形成规则。
上述源程序,通过语法分解,根据语言的语法规则识别单词符号串 s=23.1416r* ( h+r ),其中“ s ”是<变量>,单词符号串“ 23.1416r* ( h+r )”组合成<表达式>这样的语法单位,则由<变量> = <表达式>构成<赋值语句>这样的语法单位。在识别各类语法单位的同时进行语法检查,可以看到,上述源程序是一个语法上正确的程序。

第 3 阶段 语义分析及中间代码生成
定义一种语言除要求定义语法外,还要求定义其语义,即对语言的各种语法单位赋予具体的意义。语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标语言)来描述这种语义

例如,上述源程序中,赋值语句的语义为:计算赋值号右边表达式的值,并把它送到赋值号左边的变量所确定的内存单元中。语义分析时,先检查赋值号右边表达式和左边变量的类型是否一致,然后再根据赋值语句的语义,对它进行翻译可得到如下形
式的四元式中间代码:
( 1 ) ( * , 2 , 3.1416 , T 1 )
(2 ) ( * , T 1 , r , T 2 )
(3 ) ( + , h , r , T 3 )
(4 ) ( * , T 2 , T 3 , T 4 )
(5 ) ( = , T 4 , —, s )
其中,
T 1 , T 2 , T 3 , T 4 是编译程序引进的临时变量,存放每条指令的运算结果。上述每一个四元式所表示的语义为:
2 * 3.1416 ⇒ T 1
T 1 * r ⇒ T 2
h + r ⇒ T 3
T 2 * T 3 ⇒ T 4
T 4 ⇒ s
这样,我们将源语言形式的赋值语句翻译为四元式表示的另一种语言形式,这两种语言在结构形式上是不同的,但在语义上是等价的。

第 4 阶段 代码优化
代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,即省时间和空间的目标代码。优化主要包括局部优化和循环优化等,例如上述四元式经局部
优化后得:
( 1 ) ( * , 6.28 , r , T 2 )
(2 ) ( + , h , r , T 3 )
(3 ) ( * , T 2 , T 3 , T 4 )
(4 ) ( = , T 4 ,—, s )
其中,2 和 3.1416 两个运算对象都是编译时的已知量,在编译时就可计算出它的值 6.28 ,而不必等到程序运行时再计算,即不必生成( * ,2 , 3.1416 , T 1 )的运算指令。

第 5 阶段 目标代码生成
目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码

在编译程序的各个阶段中,都要涉及表格管理和错误处理。
编译程序的重要功能之一,是记录源程序中所使用的变量的名字,并且收集与名字属性相关的各种信息。名字属性包括一个名字的存储分配、类型、作用域等信息。如果名字是一个函数名,还会包括其参数数量、类型、参数的传递方式以及返回类型等信息。符号表数据结构可以为变量名字创建记录条目,来登记源程序中所提供的或在编译过程中所产生的这些信息,编译程序在工作过程的各个阶段需要构造、查找、修改或存取有关表格中的信息,因此在编译程序中必须有一组管理各种表格的程序。

如有侵权请联系删除。欢迎大家的关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值