第七章 中间代码生成(2)
- 格式:ppt
- 大小:566.00 KB
- 文档页数:42
编译原理中间代码生成在编译原理中,中间代码生成是编译器的重要阶段之一、在这个阶段,编译器将源代码转换成一种中间表示形式,这种中间表示形式通常比源代码抽象得多,同时又比目标代码具体得多。
中间代码既能够方便地进行优化,又能够方便地转换成目标代码。
为什么需要中间代码呢?其一,中间代码可以方便地进行编译器优化。
编译器优化是编译器的一个核心功能,它能够对中间代码进行优化,以产生更高效的目标代码。
在中间代码生成阶段,编译器可以根据源代码特性进行一些优化,例如常量折叠、公共子表达式消除、循环不变式移动等。
其二,中间代码可以方便地进行目标代码生成。
中间代码通常比较高级,比目标代码更具有表达力。
通过中间代码,编译器可以将源代码转换成与目标机器无关的形式,然后再根据目标机器的特性进行进一步的优化和转换,最终生成目标代码。
中间代码生成的过程通常可以分为以下几步:1.词法分析和语法分析:首先需要将源代码转换成抽象语法树。
这个过程涉及到词法分析和语法分析两个步骤。
词法分析将源代码划分成一个个的词法单元,例如标识符、关键字、运算符等等。
语法分析将词法单元组成树状结构,形成抽象语法树。
2.语义分析:在语义分析阶段,编译器会对抽象语法树进行静态语义检查,以确保源代码符合语言的语义规定。
同时,还会进行类型检查和类型推导等操作。
3.中间代码生成:在中间代码生成阶段,编译器会将抽象语法树转换成一种中间表示形式,例如三地址码、四元式、特定的中间代码形式等。
这种中间表示形式通常比较高级,能够方便进行编译器的优化和转换。
4.中间代码优化:中间代码生成的结果通常不是最优的,因为生成中间代码时考虑的主要是功能的正确性,并没有考虑性能的问题。
在中间代码生成之后,编译器会对中间代码进行各种优化,以产生更高效的代码。
例如常量折叠、循环优化、死代码删除等等。
5.中间代码转换:在完成了中间代码的优化之后,编译器还可以对中间代码进行进一步的转换。
这个转换的目的是将中间代码转换成更具体、更低级的形式,例如目标机器的汇编代码。
第七章中间代码生成在第一章已经介绍,编译器的前端把源程序翻译成中间表示,后端从中间代码产生目标代码,与目标语言有关的细节尽可能限制在后端。
使用独立于机器的中间形式的好处是:1. 再目标(retargeting)比较容易。
把针对新机器的后端加到现成的前端上,可以得到另一种机器的编译器。
2. 独立于机器的代码优化器可用于这种中间表示。
第九章将介绍这种代码优化。
因此,虽然可以把源程序直接翻译并生成目标代码,但编译器一般都采用中间语言。
本章将用第四章的语法制导定义方法来说明程序设计语言的结构怎样被翻译成中间形式。
为简单起见,假定对源程序的分析和静态检查已经完成,如图7.1表示的那样。
本章大多数语法制导定义可以用第四章的技术在自下而上或自上而下的分析期间实现,所以,如果愿意的话,中间代码生成可以在分析阶段完成。
图7.1 中间代码生成器的位置7.1中间语言4.2节介绍的语法树是一种图形化的中间表示,本节再介绍几种常用的中间表示:后缀表示、其它图形表示和三地址代码。
本章主要使用三地址代码。
从程序设计语言的各种结构产生三地址代码的语义规则类似于产生语法树或后缀表示的那些规则。
7.1.1后缀表示表达式E的后缀表示可以如下递归定义:(1)如果E是变量或常数,那么E的后缀表示就是E本身。
(2)如果E是形式为E1 opE2的表达式,其中op是任意的二元算符,那么E的后缀表示是E1' E2'op,其中E1'和E2'分别是E1和E2的后缀表示。
(3)如果E是形式为(E1)的表达式,那么E1的后缀表示也是E的后缀表示。
后缀表示不需要括号,因为算符的位置及其运算对象的个数使得后缀表示仅有一种解释。
例如,(8 - 4) + 2 的后缀表示是8 4 -2 +,而8 - (4 + 2)的缀表示8 4 2 + -。
上面的定义很容易拓广到含一元算符的表达式。
后缀表示的最大优点是便于计算机处理表达式。
利用一个栈,自左向右扫描表达式的后缀表示。