编译原理第三版 第十章 代码优化
- 格式:ppt
- 大小:389.50 KB
- 文档页数:31
编译原理中的目标代码生成与优化编译原理是计算机科学中的一门重要课程,它研究的是将高级程序语言转化为机器语言的过程。
目标代码生成与优化是编译过程中的两个关键环节,本文将就这两个方面展开讨论。
一、目标代码生成目标代码生成是编译过程中的最后一步,它的任务是将中间代码转化为能够在目标机器上执行的机器代码。
目标代码生成的质量直接影响程序的执行效率和占用的存储空间。
1. 寄存器分配在进行目标代码生成之前,我们需要进行寄存器分配。
寄存器分配的目的是将中间代码中的临时变量分配到机器寄存器中,减少内存读写操作,提高程序的运行速度。
常用的寄存器分配算法有线性扫描算法和图着色法。
2. 目标代码生成技术目标代码生成的技术有很多,下面列举几种常见的技术:(1) 直接生成代码:直接将中间代码翻译为目标机器的指令序列。
这种方法简单直接,但生成的目标代码质量一般较低。
(2) 间接生成代码:先将中间代码翻译为一个中间形式,再将中间形式转化为目标机器的指令序列。
这种方法可以进行一些优化,生成的目标代码质量较高。
(3) 使用代码模板:事先定义一些目标机器的指令模板,并根据中间代码的特征选择合适的指令模板来生成目标代码。
这种方法可以充分利用目标机器的特性,生成的目标代码效率较高。
二、目标代码优化目标代码优化是指对生成的目标代码进行一系列的优化,以提高程序的运行效率和减少代码的空间占用。
1. 基本块优化基本块是由顺序执行的指令组成的,没有前驱指令和后继指令的指令序列。
基本块优化的目的是对基本块中的指令进行优化,以减少执行时间和空间开销。
常见的基本块优化技术有死代码删除、常量传播等。
2. 寄存器优化寄存器是计算机中的一块高速存储器,能够提供快速的数据访问速度。
寄存器优化的目的是将变量尽可能地存放在寄存器中,以减少内存读写操作,提高程序的执行效率。
常用的寄存器优化技术有寄存器分配、寄存器重命名等。
3. 循环优化循环是程序中的重要结构之一,对循环进行优化可以显著提高程序的执行效率。
第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。
所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。
优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。
一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。
中间代码的优化是对中间代码进行等价变换。
目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。
另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。
局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。
循环优化对循环中的代码进行的优化。
全局优化是在整个程序范围内进行的优化。
本章重点:局部优化基本块的DAG表示第一节优化技术简介为了说明问题,我们来看下面这个例子,源程序是:P :=0For I :=1 to 20 doP :=P+A[I]*B[I];经过编译得到的中间代码如图10-1-1所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。
那么,对于这个中间代码段,可进行如下这些优化。
1、删除多余运算(删除公共子表达式)优化的目的在于使目标代码执行速度较快。
图10-1-1中间代码(3)和(6)中都有4*I的运算,而从(3)到(6)没有对I赋值,显然,两次计算机的值是相等的。
所以,(6)的运算是多余的。
我们可以把(6)变换成:T4 :=T1。
这种优化称为删除多余运算或称为删除公共子表达式。
2、代码外提减少循环中代码总数的一个重要办法是代码外提。
这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。
使之只在循环外计算一次,上例中,我们可以把(4)和(7)提到循环外。
经过删除多余运算和代码外提后,代码变成图10-1-2。
编译原理优化
编译原理优化是指在编译过程中对程序进行优化,以提高程序的执行性能和效率。
优化可以在不改变程序的功能和语义的前提下,通过改变程序的结构和算法,以及使用各种编译技术来提高程序的执行速度和资源利用率。
在编译过程中,优化的主要目标是减少程序的执行时间和提高计算资源的利用效率。
为了达到这个目标,编译器可以对程序进行各种优化,包括代码重排、循环展开、常量传播、消除冗余代码等。
代码重排是一种常见的优化技术,它通过改变程序中指令的顺序,以提高指令的局部性和并行度。
例如,通过将频繁执行的指令放在一起,可以减少指令的Cache Miss次数,从而提高
程序的执行速度。
循环展开是一种针对循环结构的优化技术,它可以将循环中的多次重复计算的指令展开成多个相同的指令,从而减少循环的迭代次数,提高程序的执行效率。
常量传播是一种优化技术,它通过将程序中的变量替换为其常量值,以避免运行时的计算开销。
如果变量的值在程序中是不变的,那么在编译的过程中可以将其替换为常量,从而减少了变量的内存访问和计算开销,提高了程序的执行速度。
消除冗余代码是一种优化技术,它通过删除程序中没有实际作用的代码,以减少程序的执行时间和内存占用。
例如,如果一个变量在程序中没有被使用,那么可以将其从程序中删除,从而减少了内存的占用和程序的执行时间。
除了上述的优化技术之外,编译原理还有很多其他的优化技术,如代码传递优化、局部变量优化、全局变量优化等。
这些优化技术都可以通过改变程序的结构和算法,以及使用各种编译技术来提高程序的执行性能和效率。
1.与机器有关的代码优化有那些种类,请分别举例说明。
解答:与机器有关的优化有:寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。
冗余指令删除假设源程序指令序列a:=b+c; c:=a-d;编译程序为其生成的代码很可能是下列指令序列:MOV b, R0ADD c, R0MOV R0,aSUB d, R0MOV R0,c假如第四条指令没有标号,上述两个赋值语句在一个基本块内,则第四条指令是多余的,可删除。
特殊指令的使用例如,如果目标机器指令系统包含增1指令INC,对于i:=i+1的目标代码MOV i, R0ADD #1, R0MOV R0, i便可被代之以1条指令Inc i说明:优化的特点是每个改进可能会引发新的改进机会,为了得到最好的改进,一般可能需要对目标代码重复扫描进行优化。
2.设有语句序列a:=20b:=a*(a+10);c:=a*b;试写出合并常量后的三元式序列。
解答:该语句序列对应的三元式序列为:(1)(:=, 20,a)(2)(+, a, 10)(3)(*, a, (2) )(4)(:=, a, b)(5)(* a, b)(6)(:=, (5), c)合并常量后的三元式序列为:(1)(:=, 20,a)(2)(:=, 600, b)(3)(:=, 12000, c)3、试写出算术表达式a+b*c-(c*b+a-e)/(b*c+d)优化后的四元式序列。
解答:该表达式的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(*,c,b,T3)(4)(+,T3,a,T4)(5)(-,T4,e,T5)(6)(*,b,c,T6)(7)(+,T6,d,T7)(8)(/,T5,T7,T8)(9)(-,T2,T8,T9)可对该表达式进行删除公共子表达式的优化。
优化后的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(-,T2,e,T5)(4)(+,T1,d,T7)(5)(/,T5,T7,T8)(6)(-,T2,T8,T9)4.设有算术表示式(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)试给出其优化后的三元式序列。