第8章代码优化

合集下载

Python程序设计题库——第八章

Python程序设计题库——第八章

Python程序设计题库——第⼋章关于Python对⽂件的处理,以下选项中描述错误的是( )A. 当⽂件以⽂本⽅式打开时,读写按照字节流⽅式B. Python能够以⽂本和⼆进制两种⽅式处理⽂件C. Python通过解释器内置的open()函数打开⼀个⽂件D. ⽂件使⽤结束后要⽤close()⽅法关闭,释放⽂件的使⽤授权答案:A以下选项中,不是Python对⽂件的读操作⽅法的是( )A. readB. readlineC. readtextD. readlines答案:C以下选项中,不是Python对⽂件的打开模式的是( )A. 'w'B. 'r'C. '+'D. 'c'答案:D关于数据组织的维度,以下选项中描述错误的是( )A. 数据组织存在维度,字典类型⽤于表⽰⼀维和⼆维数据B. ⾼维数据由键值对类型的数据构成,采⽤对象⽅式组织C. ⼀维数据采⽤线性⽅式组织,对应于数学中的数组和集合等概念D. ⼆维数据采⽤表格⽅式组织,对应于数学中的矩阵答案:A关于Python⽂件打开模式的描述,以下选项中错误的是( )A. 追加写模式aB. 只读模式rC. 覆盖写模式wD. 创建写模式n答案:D关于CSV⽂件的描述,以下选项中错误的是( )A. *CSV⽂件的每⼀⾏是⼀维数据,可以使⽤Python中的列表类型表⽰B. 整个CSV⽂件是⼀个⼆维数据C. *CSV⽂件格式是⼀种通⽤的、相对简单的⽂件格式,应⽤于程序之间转移表格数据D. *CSV⽂件通过多种编码表⽰字符答案:D关于Python⽂件的 '+' 打开模式,以下选项中描述正确的是( )A. 与r/w/a/x⼀同使⽤,在原功能基础上增加同时读写功能B. 读模式C. 追加写模式D. 覆盖写模式答案:A表格类型数据的组织维度是( )A. ⾼维数据B. ⼀维数据C. 多维数据D. ⼆维数据答案:D“键值对”类型数据的组织维度是( )A. ⾼维数据B. ⼆维数据C. 多维数据D. ⼀维数据答案:A给定列表ls = {1, 2, 3, "1", "2", "3"},其元素包含两种数据类型,则ls的数据组织维度是( )A. 多维数据B. ⼆维数据C. ⾼维数据D. ⼀维数据答案:D给定字典d = {1:"1", 2:"2", 3: "3"},其元素包含两种数据类型,则字典d的数据组织维度是( )A. ⼆维数据B. 多维数据C. ⾼维数据D. ⼀维数据答案:C以下选项中,不是Python中⽂件操作的相关函数是( )A. open()B. read()C. load()D. write()答案:C以下选项中,不是Python中⽂件操作的相关函数是( )A. write()B. open()C. readlines()D. writeline()答案:D以下选项中,不是Python⽂件处理.seek()⽅法的参数是( )A. 0B. 1C. 2D. -1答案:D以下选项中,不是Python⽂件打开的合法模式组合是( )A. "r"B. "a"C. "+"D. "w"答案:C以下选项中,不是Python⽂件打开的合法模式组合是( )A. "a+"B. "t+"C. "r+"D. "w+"答案:B以下选项中,不是Python⽂件打开的合法模式组合是( )A. "br+"B. "wr"C. ""D. "bw"答案:B以下选项中,不是Python⽂件⼆进制打开模式的合法组合是( )A. "b"B. "x+"C. "bx"D. "bw"答案:B关于⼀维数据存储格式问题,以下选项中描述错误的是( )A. ⼀维数据可以采⽤CSV格式存储B. ⼀维数据可以采⽤直接相连形成字符串⽅式存储C. ⼀维数据可以采⽤分号分隔⽅式存储D. ⼀维数据可以采⽤特殊符号@分隔⽅式存储答案:B关于⼆维数据CSV存储问题,以下选项中描述错误的是( )A. CSV⽂件的每⼀⾏表⽰⼀个具体的⼀维数据B. CSV⽂件的每⾏采⽤逗号分隔多个元素C. CSV⽂件不是存储⼆维数据的唯⼀⽅式D. CSV⽂件不能包含⼆维数据的表头信息答案:D以下选项中,对CSV格式的描述正确的是( )A. CSV⽂件以英⽂特殊符号分隔元素B. CSV⽂件以英⽂逗号分隔元素C. CSV⽂件以英⽂空格分隔元素D. CSV⽂件以英⽂分号分隔元素答案:B关于⽂件关闭的.close()⽅法,以下选项中描述正确的是( )A. ⽂件处理遵循严格的“打开—操作—关闭”模式B. ⽂件处理后可以不⽤.close()⽅法关闭⽂件,程序退出时会默认关闭C. ⽂件处理结束之后,⼀定要⽤.close()⽅法关闭⽂件D. 如果⽂件是只读⽅式打开,仅在这种情况下可以不⽤.close()⽅法关闭⽂件答案:B表达式",".join(ls)中ls是列表类型,以下选项中对其功能的描述正确的是( )A. 将逗号字符串增加到列表ls中B. 在列表ls每个元素后增加⼀个逗号C. 将列表所有元素连接成⼀个字符串,每个元素后增加⼀个逗号D. 将列表所有元素连接成⼀个字符串,元素之间增加⼀个逗号答案:D以下⽂件操作⽅法中,不能从CSV格式⽂件中读取数据的是( )A. readlinesB. readlineC. seekD. read答案:C以下⽂件操作⽅法中,不能向CSV格式⽂件写⼊数据的是( )A. seek和writeB. writelinesC. writeD. writeline答案:D两次调⽤⽂件的write⽅法,以下选项中描述正确的是( )A. 连续写⼊的数据之间默认采⽤逗号分隔B. 连续写⼊的数据之间⽆分隔符C. 连续写⼊的数据之间默认采⽤空格分隔D. 连续写⼊的数据之间默认采⽤换⾏分隔答案:B表达式writelines(lines)能够将⼀个元素是字符串的列表lines写⼊⽂件,以下选项中描述正确的是( )A. 列表lines中各元素之间⽆分隔符B. 列表lines中各元素之间默认采⽤逗号分隔C. 列表lines中各元素之间默认采⽤换⾏分隔D. 列表lines中各元素之间默认采⽤空格分隔答案:A关于open()函数的⽂件名,以下选项中描述错误的是( )A. ⽂件名不能是⼀个⽬录B. ⽂件名对应的⽂件可以不存在,打开时不会报错C. ⽂件名可以是相对路径D. ⽂件名可以是绝对路径答案:BPython语句:f = open(),以下选项中对f的描述错误的是( )A. 将f当作⽂件对象,f.read()可以读⼊⽂件全部信息B. 表达式print(f)执⾏将报错C. *f是⼀个Python内部变量类型D. *f是⽂件句柄,⽤来在程序中表达⽂件答案:B使⽤open()打开⼀个Windows操作系统D盘下的⽂件,以下选项中对路径的表⽰错误的是( )A. D:\PythonTest\a.txtB. D://PythonTest//a.txtC. D:\PythonTest\a.txtD. D:/PythonTest/a.txt答案:A当前程序路径在D:\PythonTest⽬录中,使⽤open()打开D盘根⽬录下⽂件,以下选项中对路径的表⽰错误的是( )A. D:\a.txtB. D:\a.txtC. ../a.txtD. ..答案:B以下选项对应的⽅法可以⽤于从CSV⽂件中解析⼀⼆维数据的是( )A. split()B. format()C. exists()D. join()答案:A以下选项对应的⽅法可以⽤于向CSV⽂件写⼊⼀⼆维数据的是( )A. split()B. strip()C. exists()D. join()答案:D以下选项对应的⽅法可以辅助⽤于从CSV⽂件中解析⼆维数据的是( )A. count()B. strip()C. format()D. center()答案:B关于CSV⽂件的扩展名,以下选项中描述正确的是( )A. 可以为任意扩展名B. 扩展名只能是.txtC. 扩展名只能是.csvD. 扩展名只能是.dat答案:A关于⽂件的打开⽅式,以下选项中描述正确的是( )A. ⽂件只能选择⼆进制或⽂本⽅式打开B. 所有⽂件都可能以⽂本⽅式打开C. ⽂本⽂件只能以⽂本⽅式打开D. 所有⽂件都可能以⼆进制⽅式打开答案:D对于特别⼤的数据⽂件,以下选项中描述正确的是( )A. 选择内存⼤的计算机,⼀次性读⼊再进⾏操作B. *Python可以处理特别⼤的⽂件,不⽤特别关⼼C. 使⽤for .. in..循环,分⾏读⼊,逐⾏处理D. Python⽆法处理特别⼤的数据⽂件答案:C关于⾼维数据,以下选项中描述错误的是( )A. ⾼维数据只能表达键值对数据B. “键值对”是⾼维数据的主要特征C. ⾼维数据可⽤于表达⼀⼆维数据D. ⾼维数据⽤来表达索引和数据之间的关系答案:A当打开⼀个不存在的⽂件时,以下选项中描述正确的是( )A. ⽂件不存在则创建⽂件B. ⼀定会报错C. 根据打开类型不同,可能不报错D. 不存在⽂件⽆法被打开答案:C关于数据维度,以下选项中描述错误的是( )A. ⼀维数据可能存在顺序,也可以没有顺序B. 数据维度包括⼀⼆维、多维和⾼维数据C. 所有数据都能⽤维度⽅式表⽰D. 图像由于存在长宽,所以图像数据是⼆维数据答案:D以下选项中不是⽂件操作函数或⽅法的是( )A. loadB. readC. writelinesD. readlines答案:A对于⽆序的⼀维数据,以下选项中描述错误的是( )A. ⽆序⼀维数据可以采⽤列表类型来表达B. ⽆序⼀维数据可以采⽤字典类型来表达C. ⽆序⼀维数据可以采⽤集合类型来表达D. ⽆序⼀维数据⽆法利⽤Python语⾔有效表达答案:D调⽤open函数可以打开指定⽂件,在open()函数中访问模式参数使⽤( )表⽰只读。

第八章 语法制导翻译和中间代码生成

第八章 语法制导翻译和中间代码生成

目标代码
5
语义分析
语义分析的任务:在词法分析和语法分析的基础上,
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
分析所写源程序的含义,在理解含义的基础上为生成 相应的目标代码作好准备或直接生成目标代码。 1)静态语义检查 例:类型检查、运算、维数、越界 2)语义翻译(具体的动作) 例:语句的翻译(中间代码或目标代码生成)
16
简化定义
对每个产生式,设属性定义性出现的集合为
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
若Xi是产生式左部非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes) 若Xi出现在产生式的右部(即i≠0 ),则称Xi.a是 继承属性(Inherited Attributes)
2
教学内容
第一节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 说明语句的翻译 数组和结构的翻译
3
第二节 第三节 第四节 第五节 第六节 第七节 第八节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
2.组成
语法树上的每个节点的所有属性在依赖图上各有 一个节点,如果属性y依赖于属性x,那么从x的节点 到y的节点有一条有向边。 【注】如果语法树一节点的属性y依赖某个节点的属 性x,那么属性y的语义产生式的计算必须在属性x的 语义产生式的计算之后进行。 24
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
13
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
3、文法规则number→number digit ,表明文法的个 数不止一个。我们必须表示出这个文法规则左边符 号的值和右边符号的值之间的关系。通过使用下标 进行区分,将文法写成如下形式: number1→number2 digit

第8章+语义分析和中间代码生成

第8章+语义分析和中间代码生成
(2)数组形式:三列(操作符或操作对象、左儿子位置和右儿子位置)
的二维数组,一结点一行,行号表示结点的位置。 【例】 a=b*c+b*d
1 2 a = 1 3 4 7 6 5 8 9
3
4 5 6 7 8 9
第8章 语义分析和中间代码生成
b
* c + b * d
8.2 中间代码
8.2.3 三地址码
1. 三地址码 (i)x := y op z (1) (2) (3) (4) t1:=b*c t2:=b*d t3:=t1+t2 a:=t3
(c,real)填入符号表,D.t =real
10
D
#
结束
8.3 自底向上语法制导翻译
第8章 语义分析和中间代码生成
8.3.2 说明语句的翻译
2. 数组说明的翻译
数组内情向量:存放数组的相关信息。
内情向量的地址存于符号表中。
数组引用的关键问题 —— 数组元素的地址计算

第8章 语义分析和中间代码生成
语义: E.val=T1.val+T2.val
E (E.val= T1.val+T2.val=12)
T1(T1.val=5)
第8章 语义分析和中间代码生成
T2(T1.val=7)
8.1 语义分析
8.1.2 语义的描述
(2)继承属性 一个文法符号N在产生式的右边出现,若它的t属性由该产生 式的左部非终结符或右部的其他符号的属性决定,则N.t为N的继 承属性。
第8章 语义分析和中间代码生成
8.1 语义分析
8.1.2 语义的描述
例:变量说明语句的文法 D→TL T→real | int L→id | L1, id T.type由real或int决定; 标识符表类型L.in由T.type确定, 且依次传给表中的每一个标识符。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理及其习题解答(武汉大学出版社)课件chap1

编译原理及其习题解答(武汉大学出版社)课件chap1
问题: 计算机只能识别二进制数0、1表示的 指令和数构成的本计算机系统的机器 语言。如何让计算机执行高级语言程 序呢?
6
1.1 程序的翻译
1.1.2 翻译程序 所谓翻译程序,是指这样一种程
序,它能将用甲语言(源语言)编写 的程序翻译成与之等价的用乙语言 (目标语言)书写的程序。
程序的翻译通常有两种方式:一是 “编译”方式,二是“解释”方式。
(2) (* ,
id3 t1
(3) (+ ,
id2 t2
(4) (= ,
t3 -
t1 ) t2 ) t3 ) id1 )
29
1.2 编译程序的工作过程
1.2.4 代码优化
依据程序的等价变换规则,尽量压缩目标 程序运行所需的时间和所占的存储空间,以提 高目标程序的质量。
30
代码优化
id1= id2 + id3 * 60
3
第一章 引 论
本节内容: 程序的翻译 编译程序的工作过程 编译程序的结构 编译程序的组织方式 编译程序的构造
4
编译程序在计算机系统中的位置
分类
– 软件 – 系统软件 – 语言处理系统
编译系 统 操作系统
裸机
5
1.1 程序的翻译
1.1.1 程序设计语言 机器语言 001110010010 汇编语言 add R1 2 高级语言 begin x:=9+2 end
行分为两大阶段:编译阶段和运行阶段。 ·如果目标程序是汇编语言程序, 则源程序的执
行分为三大阶段:编译阶段、汇编阶段和运行 阶段。 编译方式下,生成了目标代码,且可多次执行。
9
1.1 程序的翻译
4.关于编译程序的几点说明

第8章多目标优化

第8章多目标优化

第8章多目标优化在前面的章节中,我们学习了单目标优化问题的解决方法。

然而,在现实生活中,我们往往面对的不仅仅是单一目标,而是多个目标。

例如,在生产过程中,我们既想要最大化产量,又要最小化成本;在投资决策中,我们既想要最大化回报率,又想要最小化风险。

多目标优化(Multi-objective Optimization)是指在多个目标之间寻找最优解的问题。

与单目标优化不同的是,多目标优化面临的挑战是在有限的资源和约束条件下,使各个目标之间达到一个平衡,不可能完全满足所有的目标。

常见的多目标优化方法有以下几种:1. 加权值法(Weighted Sum Approach):将多个目标函数线性加权组合为一个综合目标函数,通过指定权重来平衡不同目标的重要性。

然后,将这个新的综合目标函数转化为单目标优化问题,应用单目标优化算法求解。

然而,这种方法存在的问题是需要给出权重的具体数值,而且无法保证找到最优解。

2. Pareto优化法(Pareto Optimization):基于Pareto最优解的理论,即在多目标优化问题中存在一组解,使得任何一个解的改进都会导致其他解的恶化。

这些解构成了所谓的Pareto前沿,表示了在没有其他目标可以改进的情况下,各个目标之间的最优权衡。

通过产生尽可能多的解并对它们进行比较,可以找到这些最优解。

3. 基于遗传算法的多目标优化方法:遗传算法是一种基于自然选择和遗传机制的优化算法。

在多目标优化中,遗传算法被广泛应用。

它通过建立一种候选解的种群,并通过适应度函数来度量解的质量。

然后,使用选择运算、交叉运算和变异运算等操作,通过迭代进化种群中的解,逐步逼近Pareto前沿。

4. 约束法(Constraint-based Method):约束法是一种将多目标优化问题转化为单目标优化问题的方法。

它通过添加约束条件来限制可能的解集合,并将多目标优化问题转化为满足这些约束条件的单目标优化问题。

编译原理一些习题答案

编译原理一些习题答案

编译原理⼀些习题答案第2章形式语⾔基础2.2 设有⽂法G[N]: N -> D | NDD -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9(1)G[N]定义的语⾔是什么?(2)给出句⼦0123和268的最左推导和最右推导。

解答:(1)L(G[N])={(0|1|2|3|4|5|6|7|8|9)+} 或L(G[N])={α| α为可带前导0的正整数}(2)0123的最左推导:N ? ND ? NDD ? NDDD ? DDDD ? 0DDD ? 01DD ? 012D ? 0123 0123的最右推导:N ? ND ? N3 ? ND3 N23 ND23 N123 D123 0123268的最左推导:N ? ND ? NDD ? DDD ? 2DDD ? 26D ? 268268的最右推导:N ? ND ? N8 ? ND8 ? N68 ? D68 ? 2682.4 写⼀个⽂法,使其语⾔是奇数的集合,且每个奇数不以0开头。

解答:⾸先分析题意,本题是希望构造⼀个⽂法,由它产⽣的句⼦是奇数,并且不以0开头,也就是说它的每个句⼦都是以1、3、5、7、9中的某个数结尾。

如果数字只有⼀位,则1、3、5、7、9就满⾜要求,如果有多位,则要求第1位不能是0,⽽中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个⽂法分3部分来完成。

分别⽤3个⾮终结符来产⽣句⼦的第1位、中间部分和最后⼀位。

引⼊⼏个⾮终结符,其中,⼀个⽤作产⽣句⼦的开头,可以是1-9之间的数,不包括0,⼀个⽤来产⽣句⼦的结尾,为奇数,另⼀个则⽤来产⽣以⾮0整数开头后⾯跟任意多个数字的数字串,进⾏分解之后,这个⽂法就很好写了。

N -> 1 | 3 | 5 | 7 | 9 | BNB -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B02.7 下⾯⽂法⽣成的语⾔是什么?G1:S->ABA->aA| εB->bc|bBc G2:S->aA|a A->aS解答:B ? bcB ? bBc? bbccB ? bBc? bbBcc ? bbbccc……A ?εA ? aA ? aA ? aA ? aaA ? aa……∴S ? AB ? a m b n c n , 其中m≥0,n≥1即L(G1)={ a m b n c n | m≥0,n≥1} S ? a S ? aA ? aaS ? aaaS ? aA ? aaS ? aaaA ?aaaaS ? aaaaa ……∴S ? a2n+1 , 其中n≥0即L(G2)={ a2n+1 | n≥0}2.11 已知⽂法G[S]: S->(AS)|(b)A->(SaA)|(a)请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。

《工程数值计算Python教程》第8章 过程最优化

《工程数值计算Python教程》第8章 过程最优化


/K
273.15
283.15
293.15
303.15
313.15
323.15
0 /kPa 3.51
6.07
10.03
15.91
24.37
36.17
/K
343.15
353.15
363.15
373.15
383.15
73.44
101.01
136.12
180.05
234.16
333.15
0 /kPa 52.19
设单峰目标函数()在区间 a , c 中存在极小值, ()在三点a < b < c 的函数值
分别为a , b , c ,满足a > b < c ,利用这三点作二次插值,插值函数为:
() = 0 + 1 + 2 2
则:
(a ) = 0 + 1 a + 2 a2 = a
这是一个多参数优化问题,但注意到,当确定时,ln 0 与1/( + )呈线性关系,根
据实验数据,利用线性回归可以确定和,这样就把三参数优化转化为单参数优化,
根据最小二乘法原则,建立优化目标函数:
n−1
() = ෍
lni0 −
i=0


+ i
2
利用黄金分割法优化参数,取搜索区间为 −100,100 。计算结果为:
取 , 内两个特定点的值:
= + ( − )

= + 2 ( − )
并计算其函数值 = 、 = ,比较和,如果 > (参考图8-3a),假定是
单峰的,则的极小值必定位于 , 内, , 就是下一步开始时的输入区间。同时注
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void quicksort (int m, int n){ int i,j; int v, x; if(n<=m) return; /*fragment begins here*/ i=m−1; j=n; v=a[n]; while(1){ do i=i+1; while(a[i]<v); do j=j−1; while(a[j]>v); if(i>=j) break;
8.1 优化概述
②复写传播
图8–3中的B5还可以进
一步改进,四元式T6:=T2把 T6:=T2
T2赋给了T6,而四元式
x:=a[T6]
x:=a[T6]中引用了T6的值, 但这中间并没有改变T6的值。 因此,可以把x:=a[T6]变换
T7:=T6 T8:=T4 T9:=a[T8] a[T7]:=T9
T11 : 4 *i x : a[T11] T12 : 4 *i T13 : 4 * n T14 : a[T13 ] a[T12 ] : T14 T15 : 4 * n a[T15 ] : x
8.1 优化概述
①删除公共子表达式
如果一个表达式E在前 面已计算过,并且在这之后 E中变量的值没有改变,则 称E为公共子表达式。
在图8–2的B5中分别把 公共子表达式4*i和4*j的值 赋给T7和T10,因此这种重 复计算可以消除,即B5中的 代码变换成:
T6:=4*i x:=a[T6] T7:=4*i T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=4*j a[T10]:=x goto B2
T6:=4*i x:=a[T6] T7:=T6 T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=T8 a[T10]:=x goto B2
8.1 优化概述
(5)常用的代码优化的方法
①删除公共子表达式(删除多余运算) ②复写传播 ③删除无用代码(删除无用赋值) ④合并已知量 ⑤代码外提 循环优化 ⑥强度削弱 ⑦删除归纳变量
8.1 优化概述
(6)代码优化举例
我们通过一个高级语言程序的例子来了解代码优化的全过程。下面 是一个用C语言编写的快速排序子程序:
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
B4 if i jgotoB6
B5
B6
T6 : 4*i x : a[T6 ] T7 : 4*i T8 : 4* j T9 : a[T8 ] a[T7 ] : T9 T10 : 4 * j a[T10 ] : x gotoB2
பைடு நூலகம்
x=a[i]; a[i]=a[j]; a[j]=x; } x=a[i]; a[i]=a[n]; a[n]=x; /*fragment ends here*/ quicksort(m, j); quicksort(i+1,n); }
8.1 优化概述
通过第6章的中间代码生成方法可以产生这 个程序的中间代码。图8–2给出了程序中两个注 解行之间的语句翻译成中间代码序列后所对应 的程序流图,对图8–2程序流图的代码优化叙述 如下。
编译原理
第8章 代码优化
安庆师范学院计算机与信息学院
本章目标
❖ 解释优化的基本概念以及代码优化器的地位和结构 ❖ 说明编译程序进行代码变换应遵循的原则 ❖ 通过实例说明代码优化通常采用的基本方法 ❖ 介绍基本块的概念及其划分算法 ❖ 说明程序流图的构造方法 ❖ 介绍基本块的DAG表示方法 ❖ 介绍循环优化一般采用的方法
8.1 优化概述
对B5删除了公共子表达式后,仍然要计算 4*i和4*j ,我们还可以在更大范围内来考虑删除 公共子表达式的问题,即利用B3中的四元式 T4:=4*j可以把B5中的代码T8:=4*j替换为T8:=T4。
同样,利用B2中的赋值句T2:=4*i可以把B5 中的代码T6:=4*i替换为T6:=T2。
B4 if i jgotoB6
B5
T6 : T2 x : a[T6 ] T7 : T6 T8 : T4 T9 : a[T8 ] a[T7 ] : T9 T10 : T8 a[T10 ] : x gotoB2
B6
T11 : T2 x : a[T11] T12 : T11 T13 : T1 T14 : a[T13 ] a[T12 ] : T14 T15 : T1 a[T15 ] : x
对于B6也可以同样考虑,最后,删除公共 子表达式后的程序流图如图8–3所示。
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
为x:=a[T2]。这种变换称为 T10:=T8
复写传播。用复写传播的方 a[T10]:=x
法可以把B5变为:
8.1 优化概述
(3)代码优化器的地位
有很多技术和手段可以用于中间代码这一级上的优化。总体上讲在 一个编译程序中优化器的地位和结构如下图:
编译前端
代码优化器
代码产生
控制流分析
数据流分析
代码变换
8.1 优化概述
(4)代码优化遵循的原则
优化的目的是为了产生更高效的代码。由优化编译程序提供的,对 代码的各种变换必须遵循以下三个原则: ① 等价原则 经过优化后不应改变程序运行的结果。 ② 有效原则 使优化后所产生的目标代码运行时间较短,占用的存储空间较 小。 ③ 合算原则 应尽可能以较低的代价取得较好的优化效果。
教学内容
8.1 优化概述 8.2 局部优化 8.3 循环优化 8.4 本章小结
8.1 优化概述
(1)优化的含义
对程序进行各种等价变换,使得从变换后的程序出发,能生成更有 效的目标代码,称这种变换为优化。
(2)优化分类
①根据编译阶段的不同划分 与机器无关的中间代码优化 依赖于机器的目标代码优化 ②根据优化对象所涉及的程序范围划分 局部优化 循环优化 全局优化
相关文档
最新文档