目标代码生成-基本块与流图

合集下载

《编译原理》考试试题及答案

《编译原理》考试试题及答案

《编译原理》考试试题及答案(附录)一、判断题:1.一个上下文无关文法的开始符,可以是终结符或非终结符。

( X )2.一个句型的直接短语是唯一的。

( X )3.已经证明文法的二义性是可判定的。

( X )4.每个基本块可用一个DAG表示。

(√)5.每个过程的活动记录的体积在编译时可静态确定。

(√)6.2型文法一定是3型文法。

( x )7.一个句型一定句子。

( X )8.算符优先分析法每次都是对句柄进行归约。

(应是最左素短语) ( X )9.采用三元式实现三地址代码时,不利于对中间代码进行优化。

(√)10.编译过程中,语法分析器的任务是分析单词是怎样构成的。

( x )11.一个优先表一定存在相应的优先函数。

( x )12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。

( )13.递归下降分析法是一种自下而上分析法。

( )14.并不是每个文法都能改写成LL(1)文法。

( )15.每个基本块只有一个入口和一个出口。

( )16.一个LL(1)文法一定是无二义的。

( )17.逆波兰法表示的表达试亦称前缀式。

( )18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。

( )19.正规文法产生的语言都可以用上下文无关文法来描述。

( )20.一个优先表一定存在相应的优先函数。

( )21.3型文法一定是2型文法。

( )22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。

( )二、填空题:1.( 最右推导 )称为规范推导。

2.编译过程可分为(词法分析),(语法分析),(语义分析和中间代码生成),(代码优化)和(目标代码生成)五个阶段。

3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是()。

4.从功能上说,程序语言的语句大体可分为()语句和()语句两大类。

5.语法分析器的输入是(),其输出是()。

6.扫描器的任务是从()中识别出一个个()。

编译原理中的目标代码生成与优化

编译原理中的目标代码生成与优化

编译原理中的目标代码生成与优化编译原理是计算机科学中的一门重要课程,它研究的是将高级程序语言转化为机器语言的过程。

目标代码生成与优化是编译过程中的两个关键环节,本文将就这两个方面展开讨论。

一、目标代码生成目标代码生成是编译过程中的最后一步,它的任务是将中间代码转化为能够在目标机器上执行的机器代码。

目标代码生成的质量直接影响程序的执行效率和占用的存储空间。

1. 寄存器分配在进行目标代码生成之前,我们需要进行寄存器分配。

寄存器分配的目的是将中间代码中的临时变量分配到机器寄存器中,减少内存读写操作,提高程序的运行速度。

常用的寄存器分配算法有线性扫描算法和图着色法。

2. 目标代码生成技术目标代码生成的技术有很多,下面列举几种常见的技术:(1) 直接生成代码:直接将中间代码翻译为目标机器的指令序列。

这种方法简单直接,但生成的目标代码质量一般较低。

(2) 间接生成代码:先将中间代码翻译为一个中间形式,再将中间形式转化为目标机器的指令序列。

这种方法可以进行一些优化,生成的目标代码质量较高。

(3) 使用代码模板:事先定义一些目标机器的指令模板,并根据中间代码的特征选择合适的指令模板来生成目标代码。

这种方法可以充分利用目标机器的特性,生成的目标代码效率较高。

二、目标代码优化目标代码优化是指对生成的目标代码进行一系列的优化,以提高程序的运行效率和减少代码的空间占用。

1. 基本块优化基本块是由顺序执行的指令组成的,没有前驱指令和后继指令的指令序列。

基本块优化的目的是对基本块中的指令进行优化,以减少执行时间和空间开销。

常见的基本块优化技术有死代码删除、常量传播等。

2. 寄存器优化寄存器是计算机中的一块高速存储器,能够提供快速的数据访问速度。

寄存器优化的目的是将变量尽可能地存放在寄存器中,以减少内存读写操作,提高程序的执行效率。

常用的寄存器优化技术有寄存器分配、寄存器重命名等。

3. 循环优化循环是程序中的重要结构之一,对循环进行优化可以显著提高程序的执行效率。

编译原理目录

编译原理目录

编译原理目录一、引言。

1.1 编译原理概述。

1.2 编译器的作用和原理。

二、词法分析。

2.1 词法分析的任务和原理。

2.2 正规表达式和有限自动机。

2.3 词法分析器的实现。

三、语法分析。

3.1 语法分析的任务和原理。

3.2 自顶向下分析和自底向上分析。

3.3 语法分析器的实现。

四、语义分析。

4.1 语义分析的任务和原理。

4.2 语义动作和语法制导翻译。

4.3 语义分析器的实现。

五、中间代码生成。

5.1 中间代码的作用和原理。

5.2 三地址码和四元式。

5.3 中间代码生成器的实现。

六、代码优化。

6.1 代码优化的目标和原理。

6.2 基本块和流图。

6.3 代码优化器的实现。

七、目标代码生成。

7.1 目标代码生成的任务和原理。

7.2 寄存器分配和指令选择。

7.3 目标代码生成器的实现。

八、汇编与链接。

8.1 汇编的作用和原理。

8.2 静态链接和动态链接。

8.3 汇编器和链接器的实现。

九、实践与应用。

9.1 编译原理在实际开发中的应用。

9.2 前端与后端的协同工作。

9.3 实践案例分析。

十、总结与展望。

10.1 编译原理的发展历程。

10.2 未来编译原理的发展趋势。

10.3 结语。

在编译原理的学习过程中,我们将深入了解编译器的工作原理和实现方法。

从词法分析到目标代码生成,每个环节都承担着特定的任务,而它们又相互协作,共同完成将源代码翻译成目标代码的过程。

通过本文档的学习,读者将能够全面了解编译原理的核心概念和具体实现,为日后的编译器开发和优化工作打下坚实的基础。

程序设计语言编译原理第三版第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. 培养学生的编程能力、分析问题和解决问题的能力。

三、教学大纲1. 编译原理基础1.1 编译器的作用和概念- 编译过程及其阶段- 编译器的核心功能1.2 语言文法和自动机理论- 正则文法和有限自动机- 上下文无关文法和下推自动机1.3 词法分析- 正则表达式和有限自动机实现词法分析器 - 关键字、运算符、标识符、字面量的识别 2. 语法和语义分析2.1 自顶向下语法分析- LL(1)文法及其分析方法- 预测分析表和递归下降分析2.2 自底向上语法分析- LR(0)文法及其分析方法- SLR(1)文法和LR(1)文法分析2.3 语义分析与语法制导翻译- 语义动作和属性文法- 语法制导翻译的实现方法3. 中间代码生成与优化3.1 中间代码的表示和生成- 三地址码和虚拟机- 递归下降翻译的中间代码生成3.2 基本块和流图- 基本块的概念和划分- 控制流的分析和优化3.3 数据流分析与优化- 活性变量分析- 常量传播和复写传播优化4. 目标代码生成和优化4.1 目标代码生成的基本原理- 寄存器分配和指令选择- 代码布局和指令调度4.2 目标代码优化- 数据流分析在目标代码优化中的应用- 循环优化和内存优化四、教学方法本课程采用理论课与实践相结合的教学方法。

理论课重点讲解编译原理的基本概念和原理,实践课通过编写实际编译器项目,培养学生的编程和问题解决能力。

五、考核方式1. 平时成绩占比:40%包括课堂参与、作业完成情况和实验报告等。

精品文档-编译原理基础(第二版)(刘坚)-第6章

精品文档-编译原理基础(第二版)(刘坚)-第6章

第6章 代 码 生 成
【例6.3】 图6.1(b)中有三个循环: (1) B3自身是一个循环。 (2) B6自身是一个循环。 (3) { B2,B3,B4}是一个循环。 前两个循环仅有一个节点和一条指向自身的边。例如 B3构成一个以B3为入口节点的循环。根据定义6.3的第(2) 条性质,循环中必须有一条非空的指向入口节点的路径, 此处是从B3到B3。因为,单一节点B2没有一条从B2到B2的 边,所以它不是循环,因为在{B2}中没有从B2到其自身的 非空路径。
பைடு நூலகம்
第6章 代 码 生 成
为每个基本块构造一个节点,并且若B是C的前驱(或 者说C是B的后继),则从B到C有一条边,最终得到流图如 图6.1(b)所示。
入口指向基本块B1,因为B1包含程序的第一条指令。 B1的唯一后继是B2,因为B1不以无条件跳转结束且B2的头 指令紧随B1的结束之后。
第6章 代 码 生 成
定义6.1 一段顺序执行的语句序列被称为一个基本块, 其中,第一条语句被称为基本块的入口,最后一条语句被称为基本 块的出口。
由于基本块中的语句是被顺序执行的,因此基本块的控制 流总是从入口进入,从出口退出。任何一个复杂的程序控制流,均 可以划分为若干个基本块;极端情况下,一条语句构成一个基本块。 因此可以将一段完整的程序表示为一个程序流图。
候被使用。如果一个变量的值当前在寄存器中并且以后再也 不被使用,则该寄存器就可以分配给其他变量。
第6章 代 码 生 成
定义6.4 在形如(i) x := y op z的三地址码中,出现在 “:=”左边和右边的变量分别被称为对变量的定值和引用,i 被称为变量的定值点或引用点。若变量的值在i之后的代码序 列中被引用,则称变量在i点是活跃的。若变量x在i点被定值, 在j点被引用,且从i到j没有x的其他定值,则称j是i中变量x 的下次引用信息,所有这样的下次引用信息jk(k = 1, 2, …) 构成一个下次引用链。

《编译原理》教学大纲

《编译原理》教学大纲

《编译原理》教学大纲一、课程概述编译原理是计算机科学与技术专业的一门重要课程,也是软件工程领域的基础课程之一、本课程通过对编译器的原理和实现技术的学习,使学生掌握编译器的设计和实现方法,培养学生独立解决实际问题的能力。

二、教学目标1.理解编译器的基本原理和工作流程;2.掌握常见编译器的构建方法和技术;3.能够设计和实现简单的编译器;4.培养分析和解决实际问题的能力。

三、教学内容和教学进度1.第一章:引论1.1编译器的定义和分类1.2编译器的基本工作流程2.第二章:词法分析2.1编译器的基本结构2.2词法单元的定义和识别方法2.3正则表达式和有限自动机3.第三章:语法分析3.1语法分析的基本概念3.2语法规则的定义和表示方法3.3自顶向下的语法分析方法3.4自底向上的语法分析方法4.第四章:语义分析4.1语义分析的基本概念4.2属性文法和语法制导翻译4.3语义动作和符号表管理5.第五章:中间代码生成5.1中间代码的定义和表示方法5.2基本块和控制流图5.3三地址码的生成方法6.第六章:优化6.1优化的基本概念和原则6.2常见的优化技术和方法6.3编译器的优化策略7.第七章:目标代码生成7.1目标代码生成的基本原理7.2目标代码的表示方法和存储管理7.3基本块的划分和目标代码生成算法8.第八章:附加主题8.1解释器和编译器的比较8.2面向对象语言的编译8.3并行编译和动态编译四、教学方法1.理论教学与实践相结合,注重教学案例的分析和实践;2.引导学生主动探索,注重培养学生的自主学习能力;3.激发学生的兴趣,鼓励学生提问和讨论。

五、考核方式1.平时成绩:包括课堂测验、作业和实验报告等;2.期末考试:闭卷笔试,主要考查学生对编译原理的理论知识和实践能力的掌握程度。

六、参考教材1.《编译原理与技术》(第2版),龙书,机械工业出版社,2024年2.《现代编译原理-C语言描述》(第2版),谢路云,电子工业出版社,2024年七、参考资源1. 实验环境:Dev-C++、gcc、llvm等2.相关网站:编译原理教学网站、编译器开源项目等八、教学团队本课程由计算机科学与技术学院的相关教师负责教学,具体安排详见教务处发布的教学计划。

第七章 目标代码的生成PPT

第七章 目标代码的生成PPT

(1)MOV b, R0 ADD c, R0 MOV R0, a
cost=6
(3)假定 R0, R1 和 R2中分别 存放了a, b 和 c 的地址
(2)MOV b, a ADD c, a
cost=6
(4)假定R1和R2中分别包含b 和c的值, 并且b的值在这 个赋值以后不再需要
MOV *R1, *R0 ADD *R2, *R0 cost=2
第七章 目标代码的生成
一个简单代码生成器
目标代码生成在编译程序中的逻辑位置
词法分析
字符流
语法分析
从中间表示 获取的流图
改进的流图
单词流
语义分析和中间代码生成
语法分析树
机器无关的代码优化
指令调度 寄存器分配 窥孔优化
中间表示
目标代码生成
优化的中间表示
针对机器的代码优化
目标代码
优化的目标代码
目标代码生成要考虑的主要问题 一个简单的代码生成算法 由上述算法从 DAG 生成代码 基于树重写的代码生成 简单的图着色物理寄存器分配算法
一个简单的代码生成算法
基本块内 TAC 语句序列的简单代码生成
(假设只有形如 A:=B op C 的TAC 语句序列)
step1:对每个TAC 语句i: A:=B op C,依次执行下述步骤:
• 以 i: A:=B op C 为参数,调用 getreg(i: A:=B op C); 从 getreg 返 回时,得到一寄存器 R(这里先假定 R 为伪寄存器),用它作存 放 A 现行值的寄存器;(函数 getreg 稍后介绍)。
b, R0 c, R0 R0, a
/* b 装入寄存器 R0 */ /* c 加到 R0 */ /* 存 R0 到 a */

编译原理-第十章习题答案

编译原理-第十章习题答案

上一页
下一页
12
P:=0 for I:=1 to 20 do P:=P+A[I]*B[I]
(1)P:=0 (2)I:=1 (1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4
(3)T1:=4*I (4)T2:=addr(A)-4 (5)T3:=T2[T1] (6)T4:=4*I (7)T5:=addr(B)-4 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
例: L1: if a<b goto L2 goto Lnext L2: if c<d goto L3 goto L4 L3: t1 =y+z x =t1 goto L1 L4:t2 = y-z x =t2 goto L1 L1:if a<b goto L2 L2:if c<d goto L3 goto L4 L3:t1 = y + z x = t1 goto L1
编译原理电子教案 第十章 优化
本章的主要内容
基本块的划分和流图的构建 基本块的DAG表示及基于DAG的局部优化 循环优化
上一页
下一页
2
本章要求
知识点:优化的基本概念及方法、基本块及程序流图、 DAG及基于DAG的优化、循环优化 熟练掌握: (1)局部优化:基本块,流图,DAG优化。 (2)循环优化:代码外提,强度削弱,删除归纳变量。
优化后: _tmp0 = 56 ; _tmp1 = _tmp0 – b ; a = _tmp1 ;
上一页 下一页
8
常数传播
_tmp4 = 0 ; f0 = _tmp4 ; _tmp5 = 1 ; f1 = _tmp5 ; _tmp6 = 2 ; i = _tmp6 ;

目标代码结构及生成原理

目标代码结构及生成原理

研究目标代码结构和代码生成的实现原理和技术一、目标代码的结构PL/0编译程序所产生的目标代码是一个假想栈式计算机的汇编语言,可称为类PCODE指令代码,它不依赖任何具体计算机,其指令集极为简单,指令格式也很单纯,其格式如下:图1其中,f代表功能码;l表示层次差,指引用变量或过程的分程序与说明该变量或过程的分程序之间的层次差;a的含义对不同的指令有所不同,见下面对每条指令的解释说明。

目标指令有8条:①LIT:将常量值取到运行栈顶。

a域为常数值。

②LOD:将变量放到栈顶。

a域为变量在所说明层中的相对位置, l为调用层与说明层的层差值。

③STO:将栈顶的内容送入某变量单元中。

a,l域的含意同LOD 指令。

④CAL:调用过程的指令。

a为被调用过程的目标程序入口地址,l为层差。

⑤INT:为被调用的过程(或主程序)在运行栈中开辟数据区。

a 域为开辟的单元个数。

⑥JMP:无条件转移指令,a为转向地址。

⑦JPC:条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。

⑧OPR:关系运算和算术运算指令。

将栈顶和次栈顶的内容进行运算,结果存放在次栈顶,此外还可以是读写等特殊功能的指令,具体操作由a域值给出。

类pcode代码指令的详细解释(指令功能表):二、代码生成的实现原理和技术代码生成是把某种高级程序设计语言经过语法语义分析或优化后的中间代码作为输入,将其转换成特定机器的机器语言或汇编语言作为输出,这样的转换程序称为代码生成器,因此,代码生成器的构造与输入的中间代码形式和输出的目标代码的机器结构密切相关。

代码生成直观解释:PL/0代码生成由过程GEN完成。

GEN过程有三个参数,分别代表目标代码的功能码f、层次差l,和位移量a。

生成的代码顺序放在数组CODE中。

CODE为一维数组,数组元素为记录型数据。

每一个记录就是一条目标指令。

CX为指令的指针,由0开始顺序增加。

实际上目标代码的顺序是内层过程的排在前边,主程序的目标代码在最后。

目标代码生成

目标代码生成
第9章 目标代码生成
编译程序最后一个阶段是目标代码生 成。它通常在语义分析后或者优化后的中 间代码上进行,并将中间代码转化为等价 的目标代码。
本章主要介绍
简单代码生成器的设计和构造方法
9.1 概述
我们知道,编译程序的最终目的是 将源程序翻译成等价的目标程序,为了 达到此目的,编译程序除了对源程序进 行词法分析、语法分析和语义分析外, 还必需将语义分析后或者优化后的中间 代码转换为等价的目标代码。
9.3
简单代码生成器
当翻译一个四元式如A=B op C时, 我们需要知道在基本块中还有哪些四元 式要对变量A、B、C进行引用。 2. 建立每个变量的待用信息和活跃信息 (1)待用信息
9.3

简单代码生成器
A在(i)定值 A在(j)引用
(i) A=T1 (j) T2 =A OP X
(j)为四元式(i)变量A的待用信息
9.3
简单代码生成器
(2) 活跃变量
基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
9.3
简单代码生成器
(3) 计算变量待用信息和活跃信息 的算法:
输入:基本块及其入口语句号和 出口语句号 输出:附加待用信息和活跃信息 的基本块
依次把四元式变换成目标代码, 并在一个基本块内考虑如何充分利用 寄存器。 在设计代码生成器时,为考虑充分 利用寄存器,我们须要考虑下面两点:
9.3
简单代码生成器
1. 给出寄存器的分配原则
(1)把基本块内还要使用的变量的值 尽可能地保存在寄存器中; (2)在基本块内,把不再使用的变量 所占用的寄存器及时释放掉; (3)当到基本块出口时,将变量的值 存放在内存中。

编译原理 代码生成

编译原理 代码生成

3.
重命名临时变量
t := b + c,t——临时变量 u := b +c,u——新临时变量,对t的引用对u的引用, 基本块结果不变 定义临时变量的语句都定义新的临时变量 基本块等价变换,范式基本块
保结构变换(续)
4.
语句交换
t1 := b + c t2 := x + y 两个语句交换位置不影响运算结果 x、y都不是t1,b、c都不是t2 注意:范式基本块允许所有可能的语句交换
/* */ /* 局部数据 */
300: 304:
9.3.2 栈分配
使用相对活动记录起始的偏移
活动记录的地址——栈寄存器,SP
―第一个过程”
MOV #stackstart, SP 第一个过程的代码 HALT
栈分配——函数调用和返回
例9.3
begin prod := 0 i := 1 do begin prod := prod + a[i] * b[i]; i := i + 1 end while i <= 20 end
例9.3(续)
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
t1 := 12 + R3 *t1 := 0 MOV #0, 12(R3)
9.4 基本块和流图

9.4.1 基本块,basic block



连续语句序列,执行过程中没有分支 t1 := a * a t2 := a * b t3 := 2 * t2 t4 := t1 + t3 t5 := b * b t6 := t4 + t5 x := y + z:定义x,使用(引用)y、z

目标代码生成

目标代码生成
R R0 VAR MEM
R1 …
R7
15
寄存器分配算法
• 一般在生成四元式A:=B OP C的代码中,通常把左操作 数B取到寄存器 R 中,再和C 操作( C可在内存中,也可 在寄存中),R中的结果就是A的值,或者说A占用了R. • 寄存器的分配可以用RGEREG(QUAD,R)实现,QUAD是 待分配寄存器的四元式: i: A:=B OP C , (OP,B,C,A) ; R是分配的寄存器。 (算法需查看附在四元式i上的活跃与引用信息及上表中 的结构)
Jrop P’;
7
§9.3 代码生成程序的雏形
• 为每个基本块的生成高质量代码:
– 总的指令条数要少; – 尽可能利用寄存器,少产生访问内存的指令,为 此需要充分合理的利用寄存器:
• 尽可能把后面还要引用的变量仍保存在寄存器中; • 应把不再使用的变量所占用的寄存器及时释放掉; • 为此需引入两个概念:基本块内变量的引用信息和 活跃信息。
end end;
13
四元式的附加信息
序 四元式 号 1 (-, A, B, T) 2 (+ , A, B, A) 3 (-, A, C, U) 4 (+, C, D, V) 5 (+, T, B, V) 6 (+, V, U, W) 结果 (5,Y) (3,Y) (6,Y) 左变 量 (2,Y) 右变 量 (2,Y)
符号表的变化情况
A (N, Y)→(3, Y)→(N, N)→(2, Y)→(1,Y)
B (N, Y)→(5, Y)→(2, Y)→ (1, Y) T (N, N)→(5, Y)→(N, N) C (N, Y)→(4, Y)→(3, Y) U (N, Y)→(6, Y)→(N, N)

第七章代码优化与目标代码生成

第七章代码优化与目标代码生成

第七章代码优化与目标代码生成典型例题 :单项选择题7.1.1. 优化可生成_的目标代码。

(陕西省 2000 年自考题)a. 运行时间较短b. 占用存储空间较小c. 运行时间短但占用内存空间大d. 运行时间短且占用存储空间小7.1.2 .下列—优化方法不是针对循环优化进行的。

a. 强度削弱b. 删除归纳变量c. 删除多余运算d. 代码外提7.1.3. 基本块内的优化为_。

(陕西省 1998 年自考题)a. 代码外提,删除归纳变量b. 删除多余运算,删除无用赋值c. 强度削弱,代码外提d. 循环展开,循环合并7.1.4. 关于必经结点的二元关系,下列叙述中不正确的是 __ 。

a. 满足自反性b. 满足传递性c. 满足反对称性d. 满足对称性7.1.5. 对一个基本块来说,_是正确的。

(陕西省 2000 年自考题)a. 只有一个入口语句和一个出口语句b. 有一个入口语句和多个出口语句c. 有多个入口语句和一个出口语句d. 有多个入口语句和多个出口语句7.1.6. 在程序流图中,我们称具有下述性质_的结点序列为一个循环。

a. 它们是非连通的且只有一个入自结点b. 它们是强连通的但有多个入口结点c. 它们是非连通的但有多个入口结点d. 它们是强连通的且只有一个入口结点7.1.7. _不可能是目标代码。

(陕西省 1997 年自考题)a. 汇编指令代码b. 可重定位指令代码c. 绝对指令代码d. 中间代码7.1.8 ._属于局部优化。

a. 代码外提b. 删除多余运算。

c. 强度削弱d. 删除归纳变量7.1.9. 下面_不能作为一个基本块的入口。

a. 程序的第一个语句b. 条件语句转移到的语句c. 无条件语句之后的下一条语句d. 无条件语句转移到的语句7.1.10 .下列—优化方法是针对循环优化进行的。

a. 复写传播b. 删除归纳变量c. 删除无用赋值d. 合并已知量7.1.11. 属于基本块的优化为_。

(陕西省 1997 年自考题)a. 删除无用赋值b. 删除归纳变量c. 强度削弱d. 代码外提7.1.12. 经过编译所得到的目标程序是—。

目标代码生成

目标代码生成

四元式
目标代码 RVALUE AVALUE
T=A−B U=A−C V=T+U D=V+U
MOV AX, A SUB AX, B MOV BX, A SUB BX, C
ADD AX, BX
ADD AX, BX
AX含有T
AX含有T BX含有U AX含有V BX含有U
AX含有D
T在AX中
T在AX中 U在BX中 V在AX中 U在BX中
处理完基本块中所有的四元式后,对现行只在 某寄存器中的每个变量,如果它在基本块出口之后 是活跃的,则要用MOV指令把它在寄存器中的值存 放到数据区以它命名的内存单元中。
第7章 目标代码生成
为进行这一工作,我们利用寄存器描述数组 RVALUE来决定其中哪些变量的现行值在寄存器中, 再利用地址描述数组AVALUE来决定其中哪些变量 的现行值尚不在其内存单元中,最后利用活跃变量 信息来决定其中哪些变量是活跃的。例如,由例7.2 的表7.2查RVALUE栏可知:U和D的值在寄存器中, 而从AVALUE栏知U和D的值都不在内存单元中, 又由例7.1表7.1知,D在基本块出口之后是活跃变量, 所以,在表7.2所生成的目标代码后面还要生成一条 目标代码:
第7章 目标代码生成
例如,一C语言语句为A=(B+C)*D+E,把它翻 译为四元式G:
T1=B+C T2=T1*D A=T2+E 如果不考虑代码的效率,可以简单地把每条中 间代码(四元式)映射成若干条目标指令,如将x=y+z 映射为:
MOV AX, y /*AX为寄存器*/
ADD AX, z
MOV x, AX 其中,x、y、z均为数据区的内存变量。
例7.1 考察基本块: (1) T=A−B (2) U=A−C (3) V=T+U (4) D=V+U

代码生成

代码生成

量,可以翻译成下述代码序列:
LD R0,y ADD R0,z ST R0,x /*将y放入寄存器R0*/ /*将z与R0相加*/ /*将R0的值存入x*/
7
生成代码的质量取决于它的执行速度和代码序列的长度 例如,如果目标机器有“加1”指令(INC),那么代码 a:=a+1用INC a实现是最有效的,而不是用以下的指令序 列实现: LD R0,a ADD R0,#1 ST R0,a
5
二.设计代码生成程序的基本问题 1.代码生成程序的输入: 代码生成程序的输入由前端所产生的中间表示和符号表 中的信息组成
代码生成程序可以利用符号表中的信息来决定中间代码
中的名字所指示的数据对象的运行时地址
6
2.指令选择: 所谓指令选择,是指寻找一个合适的目标机指令序列以 实现给定的中间表示 例如,对中间代码x:=y+z,其中x,y,z均为静态分配的变
初值 待用信息链 初值 活跃信息链 A
B
C D T U V
F F F F F F F
(2) (2)
(1) (1)
F
(3) (4) (3) (4) F ④ ③ F F ② ①
L L L L F F F
L L F L L F ③
L L
F F ② ①26
L
L ④
三.代码生成算法 寄存器和内存地址的描述: RVALUE[Ri]={A,C} AVALUE[A]={A} AVALUE[A]={Ri,A} 表示Ri的现行值是变量A,C的值 表示A的值在内存中 表示A的值在Ri中又在内存中
from a in R,b in M emit(A a,b) result in R from a in M,b in R emit(A b,a) result in R

编译原理 (11)

编译原理 (11)
S 还可以是: 其他语句块、编译区域(region) 、单条语句等
数据流分析基础
《编译原理》
数据流分析举例
到达-定值(reaching definitions)数据流分析 活跃变量(live variables)数据流分析
数据流分析基础
《编译原理》
到达-定值数据流分析
变量 A 的定值(definition)是一个(TAC)语句, 它赋值或可能赋值给 A
数据流分析基础
《编译原理》
到达-定值数据流分析
数据流方程
OUT [B] = GEN [B] (IN [B] KILL [B])
IN [B] = OUT [p]
pP[B]
其中,P[B] 为 B 的所有前驱基本块; GEN [B] 为 B 中定值并可到达 B 出口处的所有定值点集合; KILL [B] 为 B 之外的那些可以到达 B 的定值点集, 其定值的 变量在 B 中又重新定值; IN [B]为到 B 入口处各变量的所有可到达的定值点的集合; OUT [B]为到达 B 出口处各变量的所有可到达的定值点的集合
{}
{}
《编译原理》
d1 I:=2 d2 J:=I+1
B1
d3 read I B2
d4 J:=J+1 B3 d5 J:=J-4 B4
d6 write I d7 write J
B5
数据流分析基础
到达-定值数据流分析
数据流方程求解过程举例
对于右边的流图,如下是上页 数据流方程的一个求解过程:
GEN KILL
第十一讲
目标代码生成及代码优化
《编译原理》
目标代码生成及代码优化 《编译原理》
二者在编译程序中的逻辑位置 基本块、流图和循环 数据流分析基础 基本块的 DAG 表示 目标代码生成技术 代码优化技术
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

B3 (3) goto B5 B5 (17) ……
7
举例 基本块划分:
(1) i:=m-1
B1
(2) j:=n
(3) t1:=4*n
(4) v:=a[t1]
(5) i:=i+1
B2
(6) t2:=4*i
(7) t3:=a[t2]
(8) if t3<v goto (5)
(9) j:=j-1
B3
(10) t4:=4*j
B4
(14) t6:=4*i
B5
(15) x:=a[t6]
(16) t7:=4*i
(17) t8:=4*j
(18) t9:=a[t8]
(19) a[t7]:=t9
(20) t10:=4*j
(21) a[t10]:=x
(22) goto (B5)2
B6 (23)
(24) (25) (26) (27) (28) (29) (30)
B1
(3) t1:=4*n (4) v:=a[t1]
(5) i:=i+1 (6) t2:=4*i
B2
(7) t3:=a[t2] (8) if t3<v goto (B5)2
(9) j:=j-1
(10) t4:=4*j
B3
(11) t5:=a[t4] (12) if t5>v goto (B9)3
(13) if i>=j goto (B236)
(3)B=1
(4)L1: A=A+B (5)if B≥C goto L2
(6) B=B+1 (7) goto L1
(8)L2: write A (9)halt
4
Pascal程序片断: (1) i:=0
B1
(2) if i<=10 goto (4)
B2
i:=1;
(3) goto (17)
B3
while (i<=10) do
(12) t9:=t5+t8
(13) t2[t1]:=t9
(14) t10:=i+1
(15) i:=t10
(16) goto (2)
(17) …
B5
5
流图
把控制信息加到基本块集合中,形成程序的有向 图,称为流图(控制流图) 流图的结点是基本块 如果一个结点基本块的入口语句是程序的第一条 语句,则称此基本块结点为首结点。 如果在某个执行序列中,基本块B2紧跟在基本块 B1之后执行,则从B1到B2有一条有向边,B1是 B2的前驱,B2是B1的后继。即如果:
(11) t5:=a[t4]
(12) if t5>v goto (9)
(13) if i>=j goto (23) B4
(14) t6:=4*i
B5
(15) x:=a[t6]
(16) t7:=4*i
(17) t8:=4*j
(18) t9:=a[t8]
(19) a[t7]:=t9
(20) t10:=4*j
(4) t1:=4*i (5) t2:=a-4
B4
begin
(6) t3:=4*i
a[i]:=a[i]+b[i];
(7) t4:=a-4
i:=i+1 end
(8) t5:=t4[t3] (9) t6:=4*i (10) t7:=b-4
/* t5=a[i] */
(11) t8:=t7[t6] /* t8=b[i] */
– 有一个条件/无条件转移语句从B1的最后一条语句转移 到B2的第一条语句;
– B1的最后一条语句不是转移语句,并且在程序的语句 序列中,B2紧跟在B1之后。
6
流图示例:
B1 (1) i:=1 B2 (2) if i<=10 goto B4
B4 (4) t1:=4*i (5) t2:=a-4 (6) t3:=4*i (7) t4:=a-4 (8) t5:=t4[t3] (9) t6:=4*i (10) t7:=b-4 (11) t8:=t7[t6] (12) t9:=t5+t8 (13) t2[t1]:=t9 (14) t10:=i+1 (15) i:=t10 (16) goto B2
第9章 目标代码生成
知识点:基本块、程序流图 下次引用信息 代码生成算法
9.2 基本块与流图
基本块:是指程序中一组顺序执行的语句序列,其 中只有一个入口语句和一个出口语句。
– 具有原子性的一组连续语句序列。
– 控制从第一条语句流入,从最后一条语句流出,中途没 有停止或分支
如:
基本块:
t1:=a*a
(2) 转移语句(包括转移语句本
身)
确定基本块,与每一个入口(3语) 停句语相句应(包的括基停本语块句本:身)
– 从一个入口语句(含该语句)到下一个入口语句(不含)
之间的语句序列
入口语句和出口语句之间组成
– 从一个入口语句(含该语句)到一停个止基语本句块(。含该语句)之
间的语句序列
3
例:给以下四元式序列划分基本块。
t1:=a*a
t2:=b*b
t2:=a*b
t3:=t1+t2
t3:=2*t2
t4:=t1+t3
t5:=b*b
t6:=t4+t5
2
基本块的划分方法
确定入口语句,下面的语句是入口语句:
– 三地址代码的第一条语句(若从四元式序列确定基本块的
入口oto语句转移到的语句 2. 确定基本块的出口语句: – 紧跟在goto语句后面的语句(1) 下一个入口语句的前导语句
t11:=4*i x:=a[t11] t12:=4*i t13:=4*n t14:=a[t13] a[t12]:=t14 t15:=4*n a[t15]:=x
9
书312页: 9.1
B4 B5 B2
10
(21) a[t10]:=x
(22) goto (5)
(23) t11:=4*i
B6
(24) x:=a[t11]
(25) t12:=4*i
(26) t13:=4*n
(27) t14:=a[t13]
(28) a[t12]:=t14
(29) t15:=4*n
(30) a[t15]:=x
8
流图:
(1) i:=m-1 (2) j:=n
(1)read C (2)A=0 (3)B=1 (4)L1 : A=A+B (5)if B≥C goto L2 (6)B=B+1 (7)goto L1 (8)L2 : write A (9)halt
根据划分基本块的算法可以 确 定 四 元 式 (1)(4)(6)(8)是 入 口语句; (3)(5)(7)(9)是出口语 句,因此((分12))为rA四e=ad0个C基本块
相关文档
最新文档