代码生成PPT演示课件_第1页
代码生成PPT演示课件_第2页
代码生成PPT演示课件_第3页
代码生成PPT演示课件_第4页
代码生成PPT演示课件_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.西北工业大学软件与微电子学院 machunyan,1,machunyan,西北工业大学软件与微电子学院,1,词法分析程序,语法分析程序,语义分析程序,中间代码生成,代码优化程序,目标代码生成,源代码,目标代码,常数表,符号表,错误处理器,编译器逻辑结构的组成,.西北工业大学软件与微电子学院 machunyan,2,machunyan,西北工业大学软件与微电子学院,2,第6章 代码生成,6.1 中间代码概览,6.2 基本的代码生成技术,6.3 数据结构引用的代码生成,6.4 控制语句和逻辑表达式的代码生成,6.5 过程和函数调用的代码生成,.西北工业大学软件与微电子学院 machunyan,3,machunyan,西北工业大学软件与微电子学院,3,6.1 中间代码概览,编译程序的任务是把源程序翻译成等价的目标程序。所谓等价,是指两者之间的语法结构不同,但它们表述的功能和结果是完全相同的,即语义相同。中间代码,也称中间语言,是复杂性介于源程序和目标程序之间的一种机内表达形式,它是编译程序产生的中间临时结果。中间代码程序同源程序和目标程序的关系也同样是等价的,即结构不同,但语义相同。,.西北工业大学软件与微电子学院 machunyan,4,machunyan,西北工业大学软件与微电子学院,4,尽管源程序可以直接翻译成目标语言,但使用与机器无关的中间代码形式具有如下优点:,使编译程序的算法清晰,便于分工、修改、维护和移植等;中间代码使编译器更容易重定向:不同机器上的编译器可以在已有前端的基础上附加一个适合这这台新机器的后端来生成;可以在中间代码上进行与机器无关的代码优化,优化过程实际上是对程序的操作过程,对程序进行操作必须首先把程序转换成其结构便于操作的数据,而中间代码正是为此设计的一种程序的数据结构表示。,两种常见的中间代码的普遍形式:三地址码和P-代码,6.1 中间代码概览(续),.西北工业大学软件与微电子学院 machunyan,5,machunyan,西北工业大学软件与微电子学院,5,6.1.1 三地址码,6.1.2 用于实现三地址码的数据结构,6.1.3 P-代码,6.1 中间代码概览(续),.西北工业大学软件与微电子学院 machunyan,6,machunyan,西北工业大学软件与微电子学院,6,6.1.1 三地址码(续),相应的三地址码为:,t1=2*at2=b-3t3=t1+t2,三地址码是下列一般形式的语句序列:x:=y op z 其中,x,y及z是名字、常量或编译器生成的临时变量, op代表任何操作符。例6.1:算术表达式的2*a+(b-3) 语法树如下:,.西北工业大学软件与微电子学院 machunyan,7,machunyan,西北工业大学软件与微电子学院,7,6.1.1 三地址码(续),三地址码是语法树的从左到右的线性化表示,三地址码的生成所依据的是语言的语义规则。为适应标准程序语言的使用结构,在具体为每个结构生成三地址码时,必须为每个结构改变三地址码的形式。例如:为了生成数组引用的三地址码可以引入两个新的三地址指令: 获取数组元素值的三地址指令:t2=at1 给数组元素赋值的三地址指令:at2=t1,.西北工业大学软件与微电子学院 machunyan,8,machunyan,西北工业大学软件与微电子学院,8,6.1.1 三地址码,6.1.2 用于实现三地址码的数据结构,6.1.3 P-代码,6.1 中间代码概览(续),.西北工业大学软件与微电子学院 machunyan,9,machunyan,西北工业大学软件与微电子学院,9,6.1.2 用于实现三地址码的数据结构,三地址码是中间代码的一种抽象形式。在编译器中,这些语句可以以带有操作符和操作数域的记录来实现。三地址码常见的实现有四元式和三元式。四元式是带有四个域的记录结构,即op,arg1,arg2,result,可以写成(op,arg1,arg2,result) 。arg1,arg2及result域的内容正常情况下是指这些域所代表的名字在符号表表项的指针。临时名字result在生成时一定要被填入符号表。四元式之间的联系是通过临时变量实现的,便于优化处理;,.西北工业大学软件与微电子学院 machunyan,10,machunyan,西北工业大学软件与微电子学院,10,三元式:为了避免临时名字被填入符号表中,可以通过临时值的语句位置来引用临时变量。可以用只包含三个域的记录表示,即用三元式来表示。三元式之间的联系是通过三元式编号实现的,对三元式表变动较为困难,花费较大的代价。,6.1.2 用于实现三地址码的数据结构(续),.西北工业大学软件与微电子学院 machunyan,11,machunyan,西北工业大学软件与微电子学院,11,例6.2:6.1中算术表达式:2*a+(b-3)的三地址码:t1=2*at2=b-3t3=t1+t2四元式实现: (*,2,a,t1) (-,b,3,t2) (+,t1,t2,t3),三元式实现: (0)(*,2,a) (1)(-,b,3) (2)(+,(0),(1)),6.1.2 用于实现三地址码的数据结构(续),.西北工业大学软件与微电子学院 machunyan,12,machunyan,西北工业大学软件与微电子学院,12,6.1.1 三地址码,6.1.2 用于实现三地址码的数据结构,6.1.3 P-代码,6.1 中间代码概览(续),.西北工业大学软件与微电子学院 machunyan,13,machunyan,西北工业大学软件与微电子学院,13,6.1.3 P-代码,在20世纪70年代和60年代早期,P-代码作为由许多Pascal编译器产生的标准目标汇编代码被设计成称作P-机器(P-machine)的假想栈机器(Stack machine)的实际代码。P-机器在不同的平台上由不同的解释器实现。该思想使得pascal编译器变得容易移植,只需对新平台重写P-机器解释器即可。,.西北工业大学软件与微电子学院 machunyan,14,machunyan,西北工业大学软件与微电子学院,14,例6.3:算术表达式:2*a+(b-3)的P-代码如下:,ldc 2 ; load constant 2lod a ; load value of variable ampi ; integer multiplicationlod b ; load value of variable bldc 3 ; load constant 3sbi ; integer subtractionadi ; integer addition,6.1.3 P-代码(续),.西北工业大学软件与微电子学院 machunyan,15,machunyan,西北工业大学软件与微电子学院,15,6.1 中间代码概览,6.2 基本的代码生成技术,6.3 数据结构引用的代码生成,6.4 控制语句和逻辑表达式的代码生成,6.5 过程和函数调用的代码生成,第6章 代码生成(续),.西北工业大学软件与微电子学院 machunyan,16,machunyan,西北工业大学软件与微电子学院,16,6.2 基本的代码生成技术,6.2.1 作为合成属性的中间代码或目标代码生成方法,6.2.2 实际的代码生成方法,6.2.3 从中间代码生成目标代码,.西北工业大学软件与微电子学院 machunyan,17,machunyan,西北工业大学软件与微电子学院,17,6.2.1 作为合成属性的中间代码或目标代码生成方法,中间代码生成(或直接目标代码生成)可被看作属性计算,这类似于第5章中研究的许多属性问题。假如将生成的代码看作一个字符串属性(每条指令用换行符分隔),这个代码就成了一个合成属性并能用属性文法定义,并且能在语法分析期间直接生成或者通过语法树的后序遍历生成。,.西北工业大学软件与微电子学院 machunyan,18,machunyan,西北工业大学软件与微电子学院,18,例6.4:为表达式文法expid = exp|aexpaexpaexp + factor|factorfactor(exp) | num | id写出计算三地址码的属性文法。,tacode属性:表示文法的三地址码属性;name属性: 表示参与三地址码运算的标示符、常量或编译器生成的临时变量;用+表示所连的符号串换行表示;|表示相连的符号串之间用空格相隔。,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,19,machunyan,西北工业大学软件与微电子学院,19,exp.tacode=t1 = x + 3 x = t1,exp.tacode=t1 = x + 3,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),表达式x=x+3的tacode属性计算:,.西北工业大学软件与微电子学院 machunyan,20,machunyan,西北工业大学软件与微电子学院,20,exp1id=exp2,expaexp,文法规则,语义规则,= ,exp1.tacode= exp2.tacode+,id.strval |”=” | ,= ,exp.tacode=aexp.tacode,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,21,machunyan,西北工业大学软件与微电子学院,21,aexp1aexp2+factor,=newtemp(),aexp1.tacode= aexp2.tacode+,factor.tacode +,|”=”| |”+”|,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,22,machunyan,西北工业大学软件与微电子学院,22,aexpfactor,factor(exp),factornum,factorid,文法规则,语义规则,= ,aexp.tacode=factor.tacode,=,factor.tacode=exp.tacode,=num.strval,factor.tacode=“”,=id.strval,factor.tacode=“”,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,23,machunyan,西北工业大学软件与微电子学院,23,exp.tacode=t1 = x + 3 x = t1,根据上述属性文法,表达式(x=x+3)+4的tacode属性计算如右:,factor,exp,=,exp,aexp,factor,factor,num(3),aexp,factor,exp,factor,aexp,+,+,id(x),id(x),num(4),(,),exp.tacode=t1 = x + 3,aexp.tacode=t1 = x + 3 x = t1t2 = t1 + 4,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,24,machunyan,西北工业大学软件与微电子学院,24,其中语义动作使用函数emit() 将三地址语句输出到文件中。,为其产生三地址码的翻译模式如下:,对于表达式文法expid=exp|aexpaexpaexp+factor|factorfactor(exp)|num|id,对于将文法符号同属性相关联的上下文无关文法,也可以将语义动作(包含在 中)插入产生式右部的某个位置。,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,25,machunyan,西北工业大学软件与微电子学院,25,exp1id=exp2,expaexp,aexp1aexp2+factor,= emit(id.strval =),= , =newtemp() emit(= aexp2 .name + ),6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,26,machunyan,西北工业大学软件与微电子学院,26,aexpfactor,factor(exp),factornum,factorid,=,= ,=id.strval,=num.strval,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,27,machunyan,西北工业大学软件与微电子学院,27,为表达式文法expexp+term|exp-term|termtermterm*factor|factor factor(exp)|number写出计算三地址码的属性文法。tacode属性:表示文法的三地址码属性name属性: 表示相应的标示符、常量或编译器生成的临时变量,6.2.1 作为合成属性的中间代码或目标代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,28,machunyan,西北工业大学软件与微电子学院,28,6.2.1 作为合成属性的中间代码或目标代码生成方法,6.2.2 实际的代码生成方法,6.2.3 从中间代码生成目标代码(自学内容),6.2 基本的代码生成技术,.西北工业大学软件与微电子学院 machunyan,29,machunyan,西北工业大学软件与微电子学院,29,6.2.2 实际的代码生成方法,实际代码生成的基本算法由下面的递归过程描述(用于二叉树,但容易将其推广到节点子树多于2的情况):void genCode ( T: treenode ) ; if T is not nil ;/generate code to prepare for code of left child of T;genCode (left child of T ) ;/generate code to prepare for code of right child of T;genCode (right child of T ) ;generate code to implement the action of T;注:中间代码生成所依据的是语言的语义规则,即在遍历树生成代码之前,应该首先规定各节点对应代码生成的语义规则。,.西北工业大学软件与微电子学院 machunyan,30,machunyan,西北工业大学软件与微电子学院,30,对于上述简单表达式文法expid=exp|aexpaexpaexp+factor|factorfactor(exp)|num|id考虑其三地址码的代码生成过程实现。,6.2.2 实际的代码生成方法(续),.西北工业大学软件与微电子学院 machunyan,31,machunyan,西北工业大学软件与微电子学院,31,例6.5:表达式(x=x+3)+4相应的语法树如下:,+,x=,4,x,3,+,生成的相应的三地码如下:t1 = x + 3 x = t1t2 = t1 + 4,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,32,machunyan,西北工业大学软件与微电子学院,32,typedef enum Plus, Assign Optype;typedef enum OpKind, ConstKind, IdKind NodeKind;typedef struct streenode NodeKind kind; Optype op; struct streenode lchild, rchild; char strval; STreeNode;typedef STreeNode *SyntaxTree;,简单算术表达式抽象语法树的C语言定义:,每个节点都有个名字属性,用该节点的strval域来存储其名字,假设数字也当作字符串保存在strval域中,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,33,machunyan,西北工业大学软件与微电子学院,33,left operand,right operand,上述表达式的语法树结构和节点中间代码的生成规则如下:,t1 = t.leftchild.strval+t.rightchild.strval,t.strval = t1,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,34,machunyan,西北工业大学软件与微电子学院,34,left operand,t.strval = t.leftchild.strval,6.2.2 实际的代码生成(续),t.strval = t.leftchild.strval,生成的三地址码,赋值运算,.西北工业大学软件与微电子学院 machunyan,35,machunyan,西北工业大学软件与微电子学院,35,中间代码生成的辅助函数:emit():函数emit() 将三地址语句输出到文件中;Newtemp():函数Newtemp()产生一个临时名字系列t1,t2,t3,;,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,36,machunyan,西北工业大学软件与微电子学院,36,Void genCode(SyntaxTree t)if(t!=NULL) switch(t kind) case OpKind: switch(t op) case Plus: genCode(t lchild); genCode(t rchild); t strval=newtemp(); emit(t strval= t lchild strval +t rchild strval) break;,简单算术表达式的三地址码生成过程的实现:,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,37,machunyan,西北工业大学软件与微电子学院,37,case Assign: genCode(t lchild); emit(t strval= t lchild strval); t strval= t lchild strval; break; default: emit(“error”); break; ,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,38,machunyan,西北工业大学软件与微电子学院,38,break;case ConstKind: break;case IdKind: break;default: emit(“error”); break; ,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,39,machunyan,西北工业大学软件与微电子学院,39,+,x=,4,x,3,+,根据上述三地址码的生成过程,表达式(x=x+3)+4相应的三地码如下:,t1 = x + 3x = t1t2 = t1 + 4,6.2.2 实际的代码生成(续),.西北工业大学软件与微电子学院 machunyan,40,machunyan,西北工业大学软件与微电子学院,40,6.2 基本的代码生成技术,6.2.1 作为合成属性的中间代码或目标代码生成方法,6.2.2 实际的代码生成方法,6.2.3 从中间代码生成目标代码(自学内容),.西北工业大学软件与微电子学院 machunyan,41,machunyan,西北工业大学软件与微电子学院,41,6.2.3 从中间代码生成目标代码(续),如果编译器从一棵语法树产生了中间代码,下一步就是产生最后的目标代码(通常在对中间代码的进一步处理之后);目标代码的生成相当复杂,特别是当中间代码高度抽象,且只包含了很少或根本没包含目标机器和运行时环境的信息。在上述情况下,目标代码的生成必须支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。现在仅讨论这个处理的通用技术。,.西北工业大学软件与微电子学院 machunyan,42,machunyan,西北工业大学软件与微电子学院,42,通常,从中间代码到目标代码的生成涉及了两个标准技术:宏扩展(macro expansion)和静态模拟,宏扩展涉及到用一系列等效的目标代码指令代替每一种中间代码指令。静态模拟包括中间代码效果的直线模拟和生成匹配这些效果的目标代码。,6.2.3 从中间代码生成目标代码(续),.西北工业大学软件与微电子学院 machunyan,43,machunyan,西北工业大学软件与微电子学院,43,用宏扩展来完成将三地址码到P-代码的翻译。 例如一个三地址指令 a=b+c 可翻译成如下的P-代码指令序列: lda a lod b; /or ldc b if b is a const lod c; /or ldc c if c is a const adi sto,6.2.3 从中间代码生成目标代码(续),.西北工业大学软件与微电子学院 machunyan,44,machunyan,西北工业大学软件与微电子学院,44,用静态模拟来完成将P-代码到三地址码的翻译。例如: 表达式(x=x+3)+4的P-代码如下: lda x lod x ldc 3 adi stn ldc 4 adi执行一个P-机器栈的静态模拟用以发现P-代码的三地址码等效式:,6.2.3 从中间代码生成目标代码(续),.西北工业大学软件与微电子学院 machunyan,45,machunyan,西北工业大学软件与微电子学院,45,3,栈顶,x,x的地址,现在当处理adi操作时,产生三地址指令 t1=x+3 栈的状态为:,假定前三条P-代码语句执行后,栈的状态如下:,栈顶,t1,x的地址,6.2.3 从中间代码生成目标代码(续),.西北工业大学软件与微电子学院 machunyan,46,machunyan,西北工业大学软件与微电子学院,46,下一条stn指令翻译为如下的三地址指令:x=t1栈变成:,下一条指令ldc 4 将常量4压入栈:,最后指令adi生成三地址指令:t2=t1+4栈变成:,6.2.3 从中间代码生成目标代码(续),.西北工业大学软件与微电子学院 machunyan,47,machunyan,西北工业大学软件与微电子学院,47,第6章 代码生成,6.1 中间代码概览,6.2 基本的代码生成技术,6.3 数据结构引用的中间代码生成,6.4 控制语句和逻辑表达式的中间代码生成,6.5 过程和函数调用的中间代码生成,.西北工业大学软件与微电子学院 machunyan,48,machunyan,西北工业大学软件与微电子学院,48,6.3 数据结构引用的中间代码生成,6.3.1 地址计算,6.3.2 数组引用的三地址码生成,6.3.3 记录结构和指针引用(自学内容),.西北工业大学软件与微电子学院 machunyan,49,machunyan,西北工业大学软件与微电子学院,49,6.3.1 地址计算,为了定位实际地址,对于数组、记录域和指针引用的中间代码生成通常需要执行地址计算。引入用于地址计算的三地址码:假设把2存放在变量x所在位置加上10个字节的地址处,用三地址码表示如下: t1=&x+10 t1=2,.西北工业大学软件与微电子学院 machunyan,50,machunyan,西北工业大学软件与微电子学院,50,6.3 数据结构引用的代码生成,6.3.1 地址计算,6.3.2 数组引用的三地址码生成,6.3.3 记录结构和指针引用(自学内容),.西北工业大学软件与微电子学院 machunyan,51,machunyan,西北工业大学软件与微电子学院,51,6.3.2 数组引用的三地址码生成,例6.6: C数组引用ai的地址是: base_address(a) + i * sizeof(int),赋值语句:t2 = a t1翻译成如下的三地址码:t3 = t1 elem_size (a)t4 = &a + t3t2 = t4,赋值语句: at2 = t1翻译成如下的三地址码:t3 = t2 elem_size(a)t4 = &a + t3t4 = t1,返回数组元素所占字节数,.西北工业大学软件与微电子学院 machunyan,52,machunyan,西北工业大学软件与微电子学院,52,考虑一维数组引用的简单算术表达式文法 expsubs = exp|aexp aexpaexp + factor|factor factor(exp)|num|subs subsid|idexp对应的三地址码的生成过程实现。,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,53,machunyan,西北工业大学软件与微电子学院,53,表达式(ai+1=2)+aj的语法树结构如下:,i,+,1,a,2,=,+,a,j,6.3.2 数组引用的三地址码生成(续),t1 = i+1,t2 = t1*elem_size(a),t3 = &a+t2,t4 = j*elem_size(a),t5 = &a+t4,t6 = *t5 +2,*t3 = 2,.西北工业大学软件与微电子学院 machunyan,54,machunyan,西北工业大学软件与微电子学院,54,typedef enum OpKind, ConstKind, IdKind NodeKind;typedef enum Plus, Assign,Subs Optype;typedef struct streenode NodeKind kind; Optype op; struct streenode lchild, rchild; char strval; STreeNode;typedef STreeNode SyntaxTree;,其语法树的c语言定义如下:,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,55,machunyan,西北工业大学软件与微电子学院,55,left operand,right operand,t1 = t.leftchild.strval+t.rightchild.strval t.strval = t1t.leftchild.strval = t.rightchild.strval t.strval = t.rightchild.strval,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,56,machunyan,西北工业大学软件与微电子学院,56,t1 = t.lchild.strval * elem_size (t.strval)t2 = &t.strval + t1t.strval = *t2,subsidexp,6.3.2 数组引用的三地址码生成(续),id,根节点进一步参与运算的名字属性,.西北工业大学软件与微电子学院 machunyan,57,machunyan,西北工业大学软件与微电子学院,57,表达式(ai+1=2)+aj的语法树结构如下:,i,+,1,a,2,=,+,a,j,t1 = i+1,t2 = t1elem_size(a),t3 = &a+t2,t4 = jelem_size(a),t5 = &a+t4,t6 = t5 +2,t3 = 2,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,58,machunyan,西北工业大学软件与微电子学院,58,数组引用的算术表达式文法对应的三地址码的生成过程实现:,Void genCode(SyntaxTree t)if(t!=NULL) switch(t kind) case OpKind: switch(t op) case Plus: genCode(t lchild);genCode(t rchild);t.strval=newtemp();emit(t strval = t lchild strval +t rchild.strval)break;,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,59,machunyan,西北工业大学软件与微电子学院,59,case Assign: genCode(t lchild); genCode(t rchild); emit(t lchild.strval = t rchild strval); t strval= t rchild strval; break;,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,60,machunyan,西北工业大学软件与微电子学院,60,case Subs:genCode(tlchild);temp1=newtemp();emit(temp1 =tlchildstrval *elem_size(tstrval);temp2=newtemp();emit(temp2 = ,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,61,machunyan,西北工业大学软件与微电子学院,61,break; case ConstKind: break; case IdKind: break; default: emit(“error”); break; ,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,62,machunyan,西北工业大学软件与微电子学院,62,根据上述三地址码的生成过程,表达式(ai+1=2)+aj相应的三地码如下:,t1 = i+1,t2 = t1*elem_size(a),t3 = &a+t2,t4 = j*elem_size(a),t5 = &a+t4,t6 = *t5 +2,*t3 = 2,6.3.2 数组引用的三地址码生成(续),.西北工业大学软件与微电子学院 machunyan,63,machunyan,西北工业大学软件与微电子学院,63,subscript exp1,subscript exp2,6.3.2 数组引用的三地址码生成(续),思考题:撰写下述简单算术表达式文法对应的三地址码生成的递归程序.expsubs=exp|aexpaexpaexp+factor|factorfactor(exp)|num|subssubsid|idexp,exp二维下标运算的语法树:,.西北工业大学软件与微电子学院 machunyan,64,machunyan,西北工业大学软件与微电子学院,64,6.3 数据结构引用的代码生成,6.3.1 地址计算,6.3.2 数组引用的三地址码生成,6.3.3 记录结构和指针引用(自学内容),.西北工业大学软件与微电子学院 machunyan,65,machunyan,西北工业大学软件与微电子学院,65,6.3.3 记录结构和指针引用,计算记录结构的域地址提出了一个同计算下标数组地址相同的问题。首先,计算结构变量的基地址,然后,找到域偏移量,两者相加得到结果地址。例如,考虑C语言声明:typedef struct rec int i ; char c; int j ; Rec;. . .Rec x;,.西北工业大学软件与微电子学院 machunyan,66,machunyan,西北工业大学软件与微电子学院,66,第一个参数是结构变量名,第二个参数是域名;函数的返回值是x.j的偏移量,6.3.3 记录结构和指针引用(续),用于域地址计算的三地址码:为了计算x.j的地址并存入临时变量t1,使用如下的三地址指令:t1 =被翻译成如下的三地址码:t1=&x+field_offset(x,j)t2 =&x+field_offset(x,i)t1= t2,.西北工业大学软件与微电子学院 machunyan,67,machunyan,西北工业大学软件与微电子学院,67,6.3.3 记录结构和指针引用(续),对于指针引用,例如假设x被定义成整型指针:int x;假设i是一个普通整型变量,C赋值语句: x = i; 翻译成三地址指令: x = i 赋值语句i = x; 翻译成三地址指令i = x,.西北工业大学软件与微电子学院 machunyan,68,machunyan,西北工业大学软件与微电子学院,68,C变量声明如下:typedef struct treeNode int val; struct treeNode * lchild, * rchild;TreeNode; .TreeNode *p;,6.3.3 记录结构和指针引用(续),.西北工业大学软件与微电子学院 machunyan,69,machunyan,西北工业大学软件与微电子学院,69,现在考虑两个典型的赋值p-lchild=p;p=p-rchild;这些语句翻译成三地址码如下:t1=p+field_offset(p,lchild)t1=pt2=p+field_offset(p,rchild )p= t2,6.3.3 记录结构和指针引用(续),.西北工业大学软件与微电子学院 machunyan,70,machunyan,西北工业大学软件与微电子学院,70,第6章 代码生成,6.1 中间代码概览,6.2 基本的代码生成技术,6.3 数据结构引用的代码生成,6.4 控制语句和逻辑表达式的代码生成,6.5 过程和函数调用的代码生成,.西北工业大学软件与微电子学院 machunyan,71,machunyan,西北工业大学软件与微电子学院,71,6.4 控制语句和逻辑表达式的代码生成,6.4.1 if和while语句的代码生成6.4.2 逻辑表达式的代码生成(自学内容)6.4.3 if和while语句的代码生成过程举例,.西北工业大学软件与微电子学院 machunyan,72,machunyan,西北工业大学软件与微电子学院,72,6.4.1 if和while语句的代码生成,考虑下面两种if和while语句,他们的语法结构在很多不同的语言中都是相似的(现在给出的是类C语法): if-stmtif(exp)stmt |if(exp)stmt else stmtwhile-stmtwhile (exp) stmtIf和while语句代码生成的主要问题:将结构化的控制特性翻译成涉及转移的非结构化等价物,以被目标代码直接实现。,.西北工业大学软件与微电子学院 machunyan,73,machunyan,西北工业大学软件与微电子学院,73,编译器通常以一种标准次序安排if和while语句的中间代码生成,这种次序可以高效地使用转移子集,而且这种转移子集是目标系统所允许的。将if语句翻译为中间代码的典型代码排列如下:,6.4.1 if和while语句的代码生成(续),.西北工业大学软件与微电子学院 machunyan,74,machunyan,西北工业大学软件与微电子学院,74,if-stmtif(exp)stmt |if(exp)stmt else stmt,真,if 语句生成的中间代码的典型排列:,.西北工业大学软件与微电子学院 machunyan,75,machunyan,西北工业大学软件与微电子学院,75,为了生成控制语句的三地址码,引入如下的三地址码指令:产生标号的三地址语句:label .例如:label L1; label L2;当测试条件为假时转移的三地址语句:if-falsegoto例如:if-false t1 goto L1无条件转移的三地址语句: goto例如: goto L1,6.4.1 if和while语句的代码生成(续),.西北工业大学软件与微电子学院 machunyan,76,machunyan,西北工业大学软件与微电子学院,76,if语句生成下面的代码模式:/求逻辑表达式E的值的三地址码序列if_false t1 goto L1 / true情况下执行的三地址码序列 goto L2label L1 / false情况下执行的三地址码序列label L2 / if语句后的代码,if-stmtif(E) S1 |if(E) S1 else S2,6.4.1 if和while语句的代码生成(续),.西北工业大学软件与微电子学院 machunyan,77,将while语句翻译为中间代码的典型代码排列如下:,machunyan,西北工业大学软件与微电子学院,77,6.4.1 if和while语句的代码生成(续),while-stmtwhile (exp) stmt,.西北工业大学软件与微电子学院 machunyan,78,machunyan,西北工业大学软件与微电子学院,78,while-stmtwhile (exp) stmt,真,6.4.1 whil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论