编译 第八章 代码生成.ppt
《编译 第八章 代码生成.ppt》由会员分享,可在线阅读,更多相关《编译 第八章 代码生成.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 8 章章 代码生成代码生成n学习目标学习目标n掌握掌握中间代码生成的基本结构中间代码生成的基本结构n理解理解三地址码三地址码;三元式三元式;四元式四元式n代码生成回顾代码生成回顾n代码生成的任务是生成目标机器的可执行代码,代码生成的任务是生成目标机器的可执行代码,这个可执行代码是源代码的忠实体现。这个可执行代码是源代码的忠实体现。n代码生成依赖于代码生成依赖于n源语言的特征源语言的特征n目标结构的细节信息目标结构的细节信息n运行时环境的结构运行时环境的结构n代码生成一般分为以下几步:代码生成一般分为以下几步:1)中间代码生成中间代码生成2)生成某种形式的汇编代码:没有生成真正生成某种形式
2、的汇编代码:没有生成真正的可执行代码的可执行代码3)优化优化为了改进目标代码的速度和大小为了改进目标代码的速度和大小词法分析词法分析语法分析语法分析语义分析语义分析中间代码生成中间代码生成目标代码生成目标代码生成中间代码优化中间代码优化目标代码优化目标代码优化n源程序虽然可以被直接翻译成目标语源程序虽然可以被直接翻译成目标语言,但是使用与机器无关的中间代码言,但是使用与机器无关的中间代码的好处在于:的好处在于:方便于不同目标机的代码生成方便于不同目标机的代码生成:只需为新的只需为新的机器加一个后端即可以生成不同机器的编机器加一个后端即可以生成不同机器的编译器了。译器了。与机器无关的代码优化可应
3、用于中间代码与机器无关的代码优化可应用于中间代码我们将讨论代码生成的一般技术,而不是我们将讨论代码生成的一般技术,而不是针对某种特定的目标机器的详细描述针对某种特定的目标机器的详细描述8.1 中间代码和用于代码生成的数据结构中间代码和用于代码生成的数据结构8.2 基本的代码生成技术基本的代码生成技术8.3控制语句和逻辑表达式的代码生成控制语句和逻辑表达式的代码生成8.4 代码优化技术考察代码优化技术考察8.1 中间代码和用于代码生成的数据结构中间代码和用于代码生成的数据结构n中间表示中间表示(IR)在翻译期间,中间表示代表了源程序的数在翻译期间,中间表示代表了源程序的数据结构据结构例如例如:抽
4、象语法树抽象语法树n中间代码中间代码中间代码的需求中间代码的需求抽象语法树与目标代码极不相像,在控制抽象语法树与目标代码极不相像,在控制流构造的描述上尤为如此流构造的描述上尤为如此中间代码中间代码是语法树用顺序形式表示,更接近目标代是语法树用顺序形式表示,更接近目标代码码中间代码的优点中间代码的优点v当编译器的目标是产生非常高效的代码时,中间当编译器的目标是产生非常高效的代码时,中间代码是极其有用的。代码是极其有用的。v用于生成不同目标机的编译器用于生成不同目标机的编译器中间代码的普遍形式中间代码的普遍形式三地址码三地址码8.1.1 三地址码三地址码n三地址码的最基本用法形如三地址码的最基本用
5、法形如 x=y op z表示算术表达式的求值表示算术表达式的求值x,y,z 是名字,常量或编译器产生的临时变是名字,常量或编译器产生的临时变量名量名op 表示任何一个算术运算符或逻辑运算符,表示任何一个算术运算符或逻辑运算符,例如例如+,and形如这样的形如这样的“三地址码三地址码”,一般来说,一般来说 x,y 和和 z 表示的是三个内存地址。表示的是三个内存地址。例如例如表达式的计算用三地址码表示为:表达式的计算用三地址码表示为:2*a+(b-3)相应的三地址码是相应的三地址码是t1=2*at2=b-3t3=t1+t2其中其中 t1,t2,t3 是临时变量名,它们对应语法树的内是临时变量名,
6、它们对应语法树的内部结点,并表示计算值部结点,并表示计算值+*-2ab3n三地址码的其他用法说明三地址码的其他用法说明标准程序语言的每种结构的三地址码标准程序语言的每种结构的三地址码1.赋值语句形如赋值语句形如“x=y op z”,其中其中op 为二元运为二元运算符算符2.赋值语句形如赋值语句形如“x=op y”,其中其中 op 是一元运算是一元运算符符3.赋值语句形如赋值语句形如“x=y”,其中将,其中将 y赋值给赋值给 x4.无条件跳转无条件跳转“goto L”5.条件跳转条件跳转,例如例如“if B goto L”,“if_false B goto L”和和“if A rop B got
7、o L”6.语句语句“Label L”表示转移地址的位置表示转移地址的位置7.“read x”8.“write x”9.语句语句“halt”表示代码的结束表示代码的结束例如例如Sample TINY programread x;If 0 x then fact:=1;repeat fact:=fact*x;x:=x-1;until x=0;write factend它的三地址码:它的三地址码:read xt1=0 id=exp|aexpaexp -aexp+factor|factorfactor-(exp)|num|id假设记号假设记号 id 和和 num 已经有一个预先计算已经有一个预先计算
8、过的过的 strval 属性,是属性,是 token的串值。的串值。n生成三地址码的属性文法生成三地址码的属性文法属性属性vtacode 表示三地址码表示三地址码vname 表示表达式中生成的中间结果的临时变表示表达式中生成的中间结果的临时变量名量名符号符号v+表示其间插有换行符的串连接表示其间插有换行符的串连接v|表示其间有空格的串连接表示其间有空格的串连接函数函数vnewtemp():返回一个新的临时变量名返回一个新的临时变量名文法规则文法规则 语义规则语义规则exp1-id=exp2exp1.name=exp2.nameexp1.tacode=exp2.tacode+id.strval|
9、“=”|exp2.nameexp-aexpexp.name=aexp.nameexp.tacode=aexp.tacodeaexp1-aexp2+factor aexp1.name=newtemp()aexp1.tacode=aexp2.code+factor.tacode+aexp1.name|”=”|exp2.name|”+”|factor.nameaexp-factoraexp.name=factor.nameaexp.tacode=factor.tacodefactor-(exp)factor.name=exp.namefactor.tacode=exp.tacodefactor-nu
10、mfactor.name=num.strvalfactor.tacode=“”factor-idfactor.name=id.strvalfactor.tacode=“”表达式表达式“(x=x+3)+4”的的tacode 属性属性name=xname=xname=3name=t1;tacode=“t1=x+3”name=t1;tacode=“t1=x+3 x=t1”name=t1;tacode=“t1=x+3 x=t1”name=4name=t2;tacode=“t1=x+3 x=t1 t2=t1+4”expaexpfactor(exp )id =expaexp +factoraexp +fa
11、ctorfactorid(x)num(3)num(4)aexp(x)name=t1;tacode=“t1=x+3”8.3 控制语句和逻辑表达式的代码生成控制语句和逻辑表达式的代码生成 一个程序包含声明和语句一个程序包含声明和语句声明不会生成中间代码,为每个已声明的名字,声明不会生成中间代码,为每个已声明的名字,我们生成一个符号表入口我们生成一个符号表入口赋值语句和简单算术表达式的代码生成赋值语句和简单算术表达式的代码生成(8.2)控制语句和逻辑表达式的代码生成控制语句和逻辑表达式的代码生成(8.3)8.3.1 If-和和 While-语句的代码生成语句的代码生成nIf-和和 While-语句语
12、句if-stmt-if(exp)stmt|if(exp)stmt else stmtwhile-stmt-while(exp)stmtn这样语句的代码生成的主要问题是:将结这样语句的代码生成的主要问题是:将结构化的控制特性翻译成等价的非结构化转构化的控制特性翻译成等价的非结构化转移移.n典型的代码排列典型的代码排列nIf-语句语句if-stmt-if(exp)stmt|if(exp)stmt else stmtIf语句前的代码语句前的代码if 测试的代码测试的代码条件跳转条件跳转TRUE情况下的代码情况下的代码无条件跳转无条件跳转FALSE情况下的代码情况下的代码If语句后的代码语句后的代码T
13、RUEFALSEnWhile-语句语句while-stmt-while(exp)stmtWhile语句前的代码语句前的代码while 测试的代码测试的代码条件跳转条件跳转While体的代码体的代码无条件跳转无条件跳转While语句后的代码语句后的代码TRUEFALSE注释注释:仅有两种跳转仅有两种跳转v无条件跳转无条件跳转(goto L)v条件为假时跳转条件为假时跳转(if_falsegoto L)条件为真时无需跳转。条件为真时无需跳转。这减少了编译器要产生的跳转的数量。这减少了编译器要产生的跳转的数量。n控制语句的三地址码控制语句的三地址码n“if (E)S1 else S2”的代码模式:的
14、代码模式:if_false t1 goto L1goto L2label L1label L2n“while(E)S”的代码模式:的代码模式:label L1if_false t1 goto L2goto L1label L28.3.2 逻辑表达式的代码生成逻辑表达式的代码生成1 逻辑表达式逻辑表达式(或布尔表达式或布尔表达式)n逻辑表达式有两个主要的作用:逻辑表达式有两个主要的作用:n用来计算逻辑值用来计算逻辑值n作为控制语句的测试而使用,如作为控制语句的测试而使用,如if-then 或或 while-don逻辑表达式的构成逻辑表达式的构成由布尔运算符由布尔运算符(and,or,not)及布
15、尔遍历或关及布尔遍历或关系表达式组成系表达式组成关系表达式关系表达式 形如形如“E1 relop E2”,其中其中E1 和和 E2 是是 算术表达式算术表达式,relop 是比较运算符,例是比较运算符,例如如 ,=布尔表达式布尔表达式 由下面文法生成:由下面文法生成:E-E or E|E and E|not E|(E)|id relop id|true|falsevor 和和 and 是左结合,且运算优先级是是左结合,且运算优先级是 or and if E then S1|if E then S1 else S2|while E do S1E 是布尔表达式是布尔表达式n翻译方法翻译方法当布尔表
16、达式用于控制条件时,并不需要计算表当布尔表达式用于控制条件时,并不需要计算表达式的值,而是一旦确定了表达式为真或为假,达式的值,而是一旦确定了表达式为真或为假,就将控制转向相应的代码序列。就将控制转向相应的代码序列。代码生成中用到的函数代码生成中用到的函数newlabel()返回每次调用的新标号返回每次调用的新标号属性属性vE.true(E.false)是是E为真(或假)时的控制转为真(或假)时的控制转向标号向标号vS.next 表示表示S后面的代码即将被执行的三地址后面的代码即将被执行的三地址指令的标号指令的标号vS.begin 是是S代码生成的第一条指令标号代码生成的第一条指令标号1 S-
17、if E then S1S1.codeE.codeto E.trueto E.falseE.true:E.false:E.true 指向指向S1代码的第代码的第一条指令一条指令E.false 指向指向S后面的代后面的代码即将被执行的第一条指码即将被执行的第一条指令令语义规则语义规则 E.true=newlabel;E.false=S.next;S.code=E.code|Label E.true|S1.code2 S-if E then S1 else S2E.true 指向指向S1代码的代码的第一条指令第一条指令E.false指向指向S2代码的代码的第一条指令第一条指令语义规则语义规则E.t
18、rue=newlabel;E.false=newlabel;S1.next=S.next;S2.next=S.nextS.code=E.code|Label E.true|S1.code|goto S.next|Label E.false|S2.code to E.trueto E.falseE.true:E.false:S2.codegoto S.nextS1.codeE.codeS.next3 S-while E do S1E.true 指向指向S1代码的代码的第一条指令第一条指令E.false指向指向S后面的代后面的代码即将被执行的第一条码即将被执行的第一条指令指令语义规则语义规则S.b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 第八章 代码生成 第八 代码 生成
限制150内