全套电子课件:编译原理 第四套.ppt

  1. 1、本文档共308页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
过程声明的例子 procedure Q( x: real ); var u : real ; function f(k:real):real; begin f := k +k end; begin u := f(50); y:= u * x end; (EntryQ,LabelQ,SizeQ,LQ) (Entryf,Labelf,Sizef,Lf) (ADDF, k, k, t0) (ASSIG, t0,f) (ENDFUNC,……) (VALACT, 50,?1,1) (CALL, Labelf,true,t1) (ASSIG, t1, u) (MULTF, u,x, t2) (ASSIG, t2, y) (ENDPROC, ……) * * 过程/函数声明的语法制导 ProcFunDec → ProcDec | FunDec ProcDec → Procedure id (ParamList) Declaration #Entry ProgramBody #EndProc FunDec → Function id (ParamList): Type Declaration #Entry ProgramBody #EndFunc #Entry (1) 给子程序Q分配新标号LevelQ,并将它填到Q的符号表项中 (2) 产生入口中间代码 (ENTRY, LabelQ, SizeQ, LevelQ) #EndProc 和 #EndFunc 在遇到end时产生出口中间代码 (ENDPROC, _, _, _) 或 (ENDFUNC, _, _, _) * * 第八章 中间代码优化 引言 常量表达式优化 公共表达式优化 循环不变式外提 * * 优化的目标: 优化的要求: 优化的对象:深层循环和下标变量地址的计算 优化的种类: 常表达式优化(合并常数项) 公共表达式优化(消除重复操作) 循环不变表达式外提 削减运算强度等等 优化方法: 全局优化:全局信息 局部优化:局部信息 * * 基本块和程序流图 基本块:单入口单出口的程序段。 程序流图:以基本块为结点的有向图,有向边表示 程序执行的流程。 中间代码基本块的划分: ? 初始代码为第一个基本块的入口 ? 遇转移性中间代码时,结束当前基本块,下一条 代码作为新基本块的入口 ? 遇标号性代码结束当前基本块,代码本身作为新 基本块的入口。 ? 遇(ASSIG, A, X)时,如果X为引用型形参时结 束当前块,并作为该块的出口。 * * 基本块划分的例子 y := 1 ; L: if A and B then x := 0 else y := 0 ; x := x + 1 ; y := y – 1 ; while x + y 0 do x := x - 1 ; z := 0 ; * * 基本块划分的例子 B1:(ASSIG ,1,_,y) B2:(LABEL,L) (AND, A, B, t) (THEN,t,_,_) B3:(ASSIG,0,_,x) (ELSE,_,_,_) B4:(ASSIG,0,_,y) (ENDIF,_,_,_) B5:(ADDI,x,1,t1) (ASSIG,t1,_,x) (SUBI,y,1,t2) (ASSIG,t2,_,y) B1 B2 B4 B3 B5 B6 B8 B7 程序流图例 B6:(WHILE,_,_,) (ADDI,x,y,t3) (GT,t3,0,t4) (DO,t4,_,_) B7:(SUBI,x,1,t5) (ASSIG,t5,_,x) (ENDWHILE,_,_,_) B8:(ASSIG,0,_,z) * * 常表达式局部优化 常表达式:任何时候都取固定常数值的表达式 处理思想:针对每个基本块,如果一个多元式的两 个分量的值已知,则计算其值,并删掉 相应的中间代码。 原理:常量定值表ConsDef:(Var,Val)。 ? 基本块入口置ConstDef为空; ? 对当前多元式的分量利用ConstDef表进行值代换; ? 新多元式形如(?,A, B,t):如果A和B是常数, 则计算A?B的值v,并将(t,v)填入ConsDef表。并 删除该多元式 ? 形如(ASSIG,A, B

您可能关注的文档

文档评论(0)

pehalf + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7201060146000004

1亿VIP精品文档

相关文档