编译原理代码优化

合集下载

编译原理的应用场景有几种

编译原理的应用场景有几种

编译原理的应用场景有几种1. 优化程序性能编译原理在优化程序性能方面具有重要的应用场景。

编译器可以对程序进行静态分析,并根据程序的结构和语义来优化代码。

以下是几种常见的编译原理应用场景:•代码优化: 编译器可以通过优化算法对程序进行优化,如减少运行时的计算量、降低内存使用、减少指令数等。

这些优化可以显著提高程序的性能和效率。

•并行化: 编译器可以自动将串行程序转换为并行程序,以便在多核处理器上并行执行。

这种并行化可以提高程序的运行速度和吞吐量。

•内存优化: 编译器可以通过内存分析和优化,减少程序对内存的访问次数和内存空间的使用,从而提高程序的性能。

2. 语言设计与编译编译原理在语言设计与编译方面也发挥着关键作用。

以下是几种常见的应用场景:•语言设计: 编译原理可以帮助设计新的编程语言,并定义该语言的语法和语义。

通过编译原理,可以将新设计的语言转化为可执行的机器代码。

•编译器构建: 编译原理提供了构建编译器的基础理论和方法,例如词法分析、语法分析、语义分析等。

这些理论和方法使得可以开发出高效、可靠的编译器,用于将高级语言转换为低级语言。

•翻译和解释器: 编译原理还用于构建翻译器和解释器,将源代码转换为目标代码或直接执行源代码。

这种应用场景在开发跨平台软件和脚本语言解释器时非常常见。

3. 系统开发与优化编译原理在系统开发和优化中也有广泛的应用场景。

以下是几种常见的应用场景:•操作系统开发: 编译原理用于开发操作系统的编译器和解释器,将高级语言转换为机器代码或直接执行源代码,以实现操作系统的各种功能和服务。

•嵌入式系统优化: 编译原理可以用于嵌入式系统的优化,包括减少程序的存储空间和运行时间,提高系统的响应速度和能耗效率。

•数据库查询优化: 编译原理可以用于数据库查询优化,通过对查询语句进行语义分析和优化,提高数据库查询的执行效率和资源利用率。

4. 人工智能与机器学习最后,编译原理在人工智能和机器学习方面也有应用场景。

编译原理与程序编译过程

编译原理与程序编译过程

编译原理与程序编译过程编译原理是计算机科学中一个重要的领域,它研究的是将程序转化为计算机可执行的形式。

程序编译过程则是实现编译原理的具体步骤和方法。

本文将介绍编译原理的基本概念和程序编译过程的主要阶段。

一、编译原理基础知识编译原理是计算机科学中的一个重要分支,它研究的是程序的转化过程。

编译原理主要涉及的概念有词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。

编译原理的核心目标是将高级语言程序转化为机器语言的可执行文件,以便计算机能够正常运行。

1. 词法分析词法分析是编译过程中的第一个阶段,它将程序的源代码划分为一个个的词法单元。

词法单元可以是关键字、标识符、运算符、常数等,它们是程序中的最小语法单位。

词法分析器会根据事先定义好的语法规则,对程序进行识别和标记。

2. 语法分析语法分析是编译过程中的第二个阶段,它根据词法分析的结果,对程序的语法结构进行分析。

语法分析器会根据事先定义的文法规则,将程序转化为语法树或者抽象语法树。

语法树表示了程序的语法结构,便于后续的语义分析和中间代码生成。

3. 语义分析语义分析是编译过程中的第三个阶段,它对程序的语义进行分析。

语义分析器会根据事先定义的语义规则,对语法树或者抽象语法树进行检查。

语义分析的目标是检测和修复程序中的语义错误,以确保程序在执行过程中的正确性。

4. 中间代码生成中间代码生成是编译过程中的第四个阶段,它将程序转化为中间代码。

中间代码是一种介于源代码和目标代码之间的存在形式,它具有高级语言的抽象特性,同时又具有接近机器语言的可执行性。

中间代码生成的目标是提供一种统一的中间表示形式,便于后续的代码优化和目标代码生成。

5. 代码优化代码优化是编译过程中的一个重要环节,它对中间代码进行分析和优化。

代码优化的目标是改善程序的执行效率和内存利用率,减少程序的执行时间和空间消耗。

常见的代码优化技术包括常量传播、代码替换、循环展开等。

6. 目标代码生成目标代码生成是编译过程中的最后一个阶段,它将中间代码转化为特定体系结构的机器代码。

编译器编译原理详解

编译器编译原理详解

编译器编译原理详解编译器是一种将源代码转换为目标代码的程序。

它的作用是将人类可读的源代码翻译成计算机可执行的目标代码。

编译器的编译原理是一门关于如何设计和实现编译器的研究领域。

下面详细介绍编译器的编译原理。

编译器的编译原理主要包括以下几个部分:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。

词法分析是编译器的第一步,它将源代码分解成一系列的词法单元。

词法单元是编译器的最小处理单位,比如关键字、标识符、运算符和常数等。

词法分析器通常通过正则表达式来识别这些词法单元,然后生成一个词法分析表,用于语法分析。

语法分析是编译器的第二步,它根据词法分析器生成的词法单元序列,将其组合成抽象语法树。

抽象语法树是一种以树状结构表示源代码语法结构的数据结构。

语法分析使用的主要技术是上下文无关文法和语法分析算法,如LL算法和LR算法等。

语义分析是编译器的第三步,它主要负责对抽象语法树进行语义检查和类型推导。

语义检查是验证源代码是否符合语言规范的过程,比如检查变量是否定义、函数调用是否正确等。

类型推导是确定表达式的类型的过程,比如确定算术表达式的结果类型。

中间代码生成是编译器的第四步,它将抽象语法树转换成一种中间表示形式,通常是三地址代码或类似的形式。

中间代码是一种与具体机器无关的代码表示形式,它可以简化后续的代码优化和目标代码生成。

代码优化是编译器的第五步,它对中间代码进行优化,以提高目标代码的执行效率和空间利用率。

代码优化可以包括常量折叠、公共子表达式消除、循环不变表达式移动等优化技术。

目标代码生成是编译器的最后一步,它将中间代码转换成目标机器的机器代码。

目标代码生成主要包括指令选择、寄存器分配和代码布局等过程。

指令选择将中间代码转换成目标机器的指令序列,寄存器分配将临时变量分配到目标机器的寄存器或内存位置,代码布局将指令按照一定的顺序排列,以提高指令的缓存命中率。

综上所述,编译器的编译原理涉及词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个主要部分。

编译原理在编程中的应用

编译原理在编程中的应用

编译原理在编程中的应用编译原理是计算机科学中的重要分支,是计算机技术的基础和核心之一。

它主要研究如何将高级程序语言翻译成为低级机器语言,以便让计算机能够理解和执行。

在程序设计和开发过程中,编译原理扮演着至关重要的角色。

本文将从编译原理在编程中的应用角度来探讨其重要性和作用。

一、编译原理的基本概念编译原理是一门关于如何将高级语言转换为机器语言的学科。

它主要由三部分组成:词法分析、语法分析和语义分析。

其中,词法分析是将程序中的字符流划分为词素的过程;语法分析是根据语言的文法规则,将词素组成语法树,以便进行语法分析;语义分析是在语法树的基础上,对程序进行意义分析,以便进行代码生成和优化。

在编译过程中,还有一个重要的环节,即目标代码生成和优化,它是将高级语言翻译成为机器语言的最终结果。

编译器将每个语句翻译成为一组机器指令,然后将这些指令打包成为可执行程序或目标代码,以便计算机可以运行它们。

在目标代码生成的过程中,还需要进行代码优化,以提高程序的执行效率和速度。

二、编译原理在编程中具有广泛的应用。

它不仅可以提高代码的效率和速度,还可以减小程序的体积,降低资源的消耗和开发成本。

下面从几个方面来讲述其具体应用。

1. 语言设计编译原理可以用于设计新的编程语言。

通过分析常用的编程语言的特点和缺陷,可以设计出更加高效、简洁、易用的编程语言,以便将来的程序员可以更加方便地开发和维护代码。

同时,基于编译原理的词法分析、语法分析和语义分析技术,可以使设计出的编程语言变得更加具有可读性、可维护性和可扩展性。

2. 编译器和解释器开发编译原理可以用于编译器和解释器的开发。

编译器是将高级语言翻译成为低级机器语言的程序,而解释器则是将高级语言翻译成为中间代码或解释执行。

编译器和解释器是程序设计中的基础组成部分,它们对程序的执行效率、速度和可移植性都有着重要的影响。

通过使用编译原理技术,可以设计出高效、稳定、易维护的编译器和解释器,以便更加方便地开发和维护代码。

程序设计语言编译原理第三版第10章

程序设计语言编译原理第三版第10章

§10.2 局部优化
举例:考察下面的三地址代码程序
(1)Read X
(2)Read Y
B1
(3)R:=X mod Y (4)if R=0 goto (8) B2
(5)X:=Y
(6)Y:=R
B3
(7)goto(3)
(8)write Y B4
(9)halt
B1
B2
B3
B4
§10.2 局部优化
3.流图及其生成
标识符(包括常数)-结点 NODE(A)-描述上述对应关系的函数,其值或者是一个结点的编号,
或者无定义
(2)中间代码的三种形式:A:=B A:=op B A:=B op C 或 A:=B[C]
(3)构造算法: ①开始,DAG为空 ②对基本块中每一条中间代码式,依次执行以下步骤:
§10.2 局部优化
步骤: 1.如果NODE(B)无定义,则构造一标记为B的叶结点并定义
NODE(B)为这个结点 如果当前代码是0型,则记NODE(B)的值为n,转4 如果当前代码是1型,则转2(1) 如果当前代码是2型,则(ⅰ)如果NODE(C)无定义,则构造一标 记
为C的叶结点并定义NODE(C)为这个结点;(ⅱ)转2(2)
(1)T0:=3.14 (2)T1:=2*T0 (3)T2:=R+r (4)A:=T1*T2 (5)B:=A (6)T3:=2*T0 (7)T4:=R+r (8)T5:=T3*T4 (9)T6:=R-r (10)B:=T5*T6
(4)代数变换
§10.2 局部优化
二、基本块的DAG表示及其应用
1.基本块的DAG:
一种结点带有下述标记或附加信息的DAG
(1)图的叶结点以一标识符(变量名)或常数作为标记,表示该 结点代表该变量或常数的值。

理解编译原理和优化技术对代码执行的影响

理解编译原理和优化技术对代码执行的影响

理解编译原理和优化技术对代码执行的影响编译原理和优化技术是程序执行过程中非常重要的环节,它们可以对代码执行产生深远的影响。

编译原理主要负责将源代码转化为机器可以执行的指令,而优化技术则负责提高代码执行效率和性能。

本文将探讨编译原理和优化技术对代码执行的影响,并分析它们的作用和原理。

一、编译原理对代码执行的影响编译原理是计算机科学中的一个重要概念,它主要研究源代码如何转化为可执行代码的过程。

编译原理包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段,每个阶段都对代码执行有着直接的影响。

1.词法分析词法分析是源代码的第一步解析过程,它负责将源代码分解为词法单元,比如标识符、关键字、操作符等。

词法分析的结果直接决定了后续语法分析和语义分析的顺利进行,因此词法分析的质量直接影响了代码执行的效率和正确性。

2.语法分析语法分析是编译原理中非常重要的一个环节,它负责将词法单元组成的字符串解析为语法结构,并生成语法树或者语法图。

语法分析的质量决定了程序的结构是否合理,进而影响了后续的优化和生成代码的过程。

3.语义分析语义分析是编译原理中的关键环节,它负责检测源代码中的语法错误和语义错误,比如类型错误、作用域错误等。

语义分析的质量直接决定了程序的执行正确性和可靠性,因此它对代码执行有着直接的影响。

4.中间代码生成中间代码是指在源代码和目标代码之间的一种抽象表示,它可以是三地址码、四元式、抽象语法树等形式。

中间代码生成的质量直接影响了后续的代码优化和生成代码的效果,因此它对代码执行有着深远的影响。

5.代码优化代码优化是编译原理中非常重要的一个环节,它负责提高程序执行的效率和性能。

代码优化可以分为多个层次,比如局部优化、全局优化、线程级优化、并行优化等。

代码优化的质量决定了程序的执行效率和性能,对代码执行有着直接的影响。

6.目标代码生成目标代码生成是编译原理中的最后一个环节,它负责将中间代码转化为目标机器可以执行的指令。

编译原理有什么用

编译原理有什么用
编译原理是计算机科学中的一个重要领域,它研究的是将高级程序语言转化为低级机器语言的过程。

它的主要用途包括以下几个方面:
1. 提升程序的执行效率:通过编译原理中的优化技术,编译器可以对程序进行优化,使得最终生成的机器语言代码能够更高效地执行。

这样可以节省计算机的资源,提高计算速度。

2. 实现跨平台编程:不同的计算机系统使用不同的机器语言,而高级程序语言往往是与计算机系统无关的。

通过编译原理,可以将高级程序语言翻译成适应不同计算机系统的机器语言代码,实现跨平台编程。

3. 简化程序开发过程:高级程序语言往往比机器语言更易于理解和编写。

通过编译原理,可以将程序员编写的高级程序语言代码转化为机器语言代码,从而简化了程序的开发过程。

4. 错误检测和代码优化:编译器在进行代码翻译的过程中,会检测代码中的错误,并给出错误提示。

同时,编译器还会对代码进行优化,比如删除冗余代码、重构代码结构等,提高程序的质量和性能。

综上所述,编译原理在计算机科学中具有重要的应用价值,它能够帮助程序员更高效地开发程序,并且能够提升程序的执行效率和性能。

它的研究和应用对于计算机领域的发展和进步非常重要。

编译原理-第十章--代码优化

第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。

所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。

优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。

一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。

中间代码的优化是对中间代码进行等价变换。

目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。

另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。

局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。

循环优化对循环中的代码进行的优化。

全局优化是在整个程序范围内进行的优化。

本章重点:局部优化基本块的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。

编译原理 第5章--代码优化


(2) 确定满足以下条件的出口语句: 确定满足以下条件的出口语句 出口语句: 下一个入口语句的前导语句 入口语句的前导语句; ① 下一个入口语句的前导语句; 转移语句 包括转移语句自身); 语句(包括转移语句自身 ② 转移语句 包括转移语句自身 ; 停语句 包括停语句自身 包括停语句自身)。 ③ 停语句(包括停语句自身 。
第5章
代码优化
(3) 图中各个结点上可能附加一个或多个标识符,表示这些 图中各个结点上可能附加一个或多个标识符 附加一个或多个标识符, 变量具有该结点所代表的值。 变量具有该结点所代表的值。
一个基本块由一个四元式 序列组成 四元式都可以用相应的 一个 基本块由一个四元式序列 组成 , 且 每一个 四元式都可以用 相应的 基本块 由一个四元式序列组成, 每一个四元式都可以用 DAG结点表示。 结点表示。 结点表示 给出了不同四元式和与其对应的DAG结点形式。图中,各结点圆圈 结点形式。 图5–1给出了不同四元式和与其对应的 给出了不同四元式和与其对应的 结点形式 图中, 中的ni是构造 构造DAG过程中各结点的编号, 过程中各结点的编号, 中的 过程中各结点的编号 而各结点下面的符号(运算符、标识符或常数)是各结点的标记, 是各结点的标记 而各结点下面的符号 运算符、标识符或常数 是各结点的标记,各结点右 运算符 边的标识符是结点上的附加标识符。 边的标识符是结点上的附加标识符。 附加标识符 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外, 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外,其余 对应转移语句的结点右边可附加一语句位置来指示转移目标外 各类结点的右边只允许附加标识符。 各类结点的右边只允许附加标识符。 除对应于数组元素赋值的结点 标记为 继外, 除对应于数组元素赋值的结点(标记为 ]=)有三个后继外,其余结点最多只 应于数组元素赋值的结点 标记为[ 有三个后继外 有两个后继。 两个后继。 后继

编译原理-清华大学-第10章1-代码优化


(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3‘)T1:=T1+4 (12)if I<=20 goto(5)
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
(1)P:=0 (2)I:=0
(3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I&l经过变换循环的控制条件后,有些变 量不被引用,可以从循环中删除。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3’)T1:=T1+4 (12)if I<=20
2)在运行基本块时,只能从其入口进入, 从出口退出。
2、划分基本块算法
(1)求出各基本块的入口语句 1)程序的第一个语句 ; 2)能由条件转移语句和无条件转移语句转
移到达的语句; 3)紧跟在条件转移语句后面的语句。
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句) 之间的语句序 列组成的。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

B1
x=1
B3
B2 (2)lb a (3)t1=x*5 (4)r=t1 (5)t2=x<10 (6) if(t2)_ B4
(10) ie _
(11) r=0
(7)t3=x+1 (8)x=t3 (9) gt a
※ 基本块内四元式的局部优化过程示例
优化后 【例8.2】 设 B=5; A=2*3.14/(R+r); 有语句片断: B=2*3.14/(R+r)*(R-r); (1) ( = 5 _ B ) (2) ( * 2 3.14 _ t1) (3) ( + R r t2 ) (4) ( / t1 t2 t3 ) (5) ( = t3 _ A ) (6) (* 2 3.14t1t4 ) t2 (7) ( + R r t5 ) (8) ( / t4 t5 t6 ) (9) ( - R r t7 ) (10)( * t6 t7 t8 ) (11)( = t8 _ B ) t1= 6.28 A=2*3.14/(R+r); B=A*(R-r); (1) (= 5 _ B )
基于DAG的局部优化练习答案
优化的DAG: + 9 L|M 根据优化的DAG重组的四元式:
L=A-B
8 24|T8 * 6 T4|T7 7 6|T5 - 4 L|T2 + 5 T3|T6 1 2|T1 2A 3 B T3=A+B T4=L*T3 L=24+T4
• 常值表达式节省 (例8.2中的 (2)(6)):
方法: ① 先进行常值计算; ② 将常值的变量以常值代替;
• 公共子表达式节省 (例8.2中的 (7)(8)): 方法: ① 找公共表达式,建立结果变量等价关系; ② 等价变量以老变量代替新变量; • 删除无用赋值 (例8.2中的(1)): 方法: ① 确认一个变量两个赋值点间无引用点; ② 前一赋值点为无用赋值;
n1 …
ni …B…
n A
ni …B… nj …C…

n A
ni …B… n2 …|…A…
③ 若 A 在 n2 已定义过,则删除之:
8.2.3 基于DAG的局部优化方法
2. 根据基本块内优化的 DAG,重组四元式:
【假设】(1) 临时变量的作用域是基本块内; (2) 非临时变量的作用域可以是基本块外。
若:a=5+3;…;a=x…; a=a+1; 则 a+1不是常值表达式! 2. 公共子表达式节省(删除多余运算)

如:a=b*d+1;e=b*d-2; …… b*d是公共表达式! 则可优化为 t=b*d; a=t+1; e=t-2; 若:b=b*d+1; e=b*d-2; 则 b*d不是公共表达式!

5. 消减运算强度(循环优化之二) 即把强度大的运算换算成强度小的运算。 如:i=1; while ( i<100 ){ t=4*i; b=a↑2;…; i++; }
则可优化为
t,i 线性 关系
i=1;t=0; while (i<100){t=t+4; b=a*a;…;i++;}
8.2.2 基本块及其划分
【开始】按结点编码顺序,依次读取每一结点 n1 信息: (1) 若 n1 为带有附加标记的叶结点: • 若 Ai 为非临时变量,则 生成: q1: Ai=B (i=1,2,…)
(2) 若 n1 为带有附加标记的非叶结点: ① 生成 q1: A=BC 或生成 q1: A=B ② 若Ai为非临时变量,则生成: q2: Ai=A (i=1,2,…) n1 B|A1,A2,… n1 A|A1,A2,… ni B|… nj C|… 以主标记 参加运算
※ 局部优化算法是以基本块为单位进行的,基本块 也是目标代码生成的基本单位。
【定义】基本块是程序中一段顺序执行的语 句序列,其中只有一个入口和一个出口。
基本块划分算法: 1.确定基本块的入口语句,它们是: (1) 程序的第一个语句或转向语句转移到的语句; (2) 紧跟在转向语句后面的语句。 2.确定基本块的出口语句,它们是: (1) 下一个入口语句的前导语句; (2) 转向语句(包括转向语句本身); (3) 停语句(包括停语句本身);
(3) (+ R r t2 ) (4) (/ 6.28 t2 t3 ) (5) (= t3 _ A )
t4≡t1 t5≡t2 t6≡t3 B 没有引用! (9) (- R r t7 ) (10) (* t3 t7 t8 ) (11) (= t8 _ B )
※ 基本块内四元式的局部优化过程示例 优化的基本内容和方法:
删除 无用 赋值
常值 表达 式节 省
8.2.3 基于DAG的局部优化方法
(3) 若其它表达式 A = B C 或 A = B; ① 若在 n1 存在公共表达式: BC 或 B
n1 …
ni …B… nj …C…
则把A附加于n1上:
删除 公共 表达 式
n 1 … ,A
② 若不存在公共表达式, 则申请新结点n:
③ 循环优化 — 对循环语句实施的优化。
(2) 与机器有关的优化(目标代码级上的优化):
包括:① 寄存器分配的优化; ② 消除无用代码。
8.2.1 常见的局部优化方法
1. 常值表达式节省(常数合并)

如:a=5+3;b=a+1; ……. 5+3,a+1 皆为常值表达式! 则可优化为 a=8;b=9;
第 8 章 代码优化
优化处理是指产生更高效的目标代码所做的工作。 目标代码所占空间和执行速度
【内容提要】 8.1 优化的分类 8.2 局部优化
8.2.1 常见的局部优化方法 8.2.2 基本块及其划分 8.2.3 基于DAG的局部优化方法
8.1 优化的分类
根据代码优化是否涉及具体的计算机来划分: (1) 与机器无关的优化(在源代码或中间代码级上进行); 又分三种: ① 全局优化 — 针对整个源程序。 ※ ② 局部优化 — 除全局优化外皆属此类。
3. 删除无用赋值 如:a=b+c;x=d-e;y=b;a=e-h/5; 则 a=b+c 为无用赋值! 则可优化为 x=d-e;y=b;a=e-h/5; a 未有应用!!
8.2.1 常见的局部优化方法(续1)
4. 不变表达式外提(循环优化之一) 即把循环不变运算,提到循环外。 如:i=1; while(i<100){x=(k+a)/i;…;i++;} 则可优化为 循环不变表达式 i=1;t=k+a; while (i<100){x=t/i;…;i++;}

8.2.3 基于DAG的局部优化方法
DAG(Directed Acyclic Graph)是指无环有向图;这 里用来对基本块内的四元式序列进行优化。
Ⅰ. 四元式序列的DAG表示
1. DAG的结点内容及其表示: n1 n2 n4 n3 n5
前驱 ni M|A1,A2,A3,… 后继
DAG
: 运算符; ni: 结点的编码; M : 主标记(运算结果变量,叶结点时,是变量或常 数的初值);
数组变量赋值运算 A=B[C]
[ ] n3 A
n1

n1
n2
A

n1
n3
A
n2
B
B
C
B[C]=D
n4
转向 ( [B] _ A ) 可选
n2
A
B
n2
C
n1
B
n2
C
n3
D
ni A
n1 B
Ⅱ. 基于DAG的局部优化算法
1. 构造基本块内优化的 DAG:
【假设】 (1) ni 为已有结点号;n为新结点号; (2) 访问各结点信息时,按结点号逆序进行; 【开始】 ① DAG 置空;依次读取一四元式 A=B C ; ② 分别定义 B , C 结点(若已定义过,则免); (1) 若 赋值四元式 A=B n1…B… ,A ① 把 A 附加于 B 上: ② 若 A 在 n2 已定义过,则: n2 …|…A… (2) 若 常值表达式 A=C1C2 或 A=C1; n1 C|… ,A ① 计算常值 C = C1 C2 ; ② 若 C 在 n1 已定义过,则: n C| A 否则 申请新结点,且: n2 …|…A… ③ 若 A 在 n2 已定义过,则:
8.2.3 基于DAG的局部优化方法
【例8.3】 对下述语句片断进行基于DAG的优化: B=5; A=2*3.14*(R+r); B=2*3.14*(R+r)/(R-r); 1. 根据四元式序列构造优化的DAG: (1)B=5 (2)t1=2*3.14 (3)t2=R+r (4)t3=t1*t2 (5)A=t3 (6)t4=2*3.14 (7)t5=R+r (8)t6=t4*t5 (9)t7=R-r (10)t8=t6/t7 (11)B=t8 t3 |A * 6 A|t3,t6 为什 么要 位置 交换?
Ai :附加标记(运算结果变量,表示它具有该节点所代 表的值,可设置多个)i=1,2,3,…。
8.2.3 基于DAG的局部优化方法
2. 单个四元式的 DAG表示: 赋值 ( = B _ A ) 或 A = B ni B|A
双目运算 ( B C A ) 或 A = B C
单目运算 ( B _ A ) 或 A=B
8.2.2 基本块及其划分(续1)
【例8.1】设有源程序片段如下,划分出基本块;
对应的四 元式序列 x=1; a:r=x*5; r=0; if(x<10){x=x+1;goto a;} ※以基本块为结点的程 序流图,如下所示:
相关文档
最新文档