- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中间代码
何谓中间代码: 源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。 为什么要此阶段 主要优点是可移植(与具体目标程序无关), 且易于目标代码优化 中间代码的几种形式 逆波兰、N-元表示(四元式、三元式)、树、抽象机代码 第8章 中间代码(源程序的中间形式) * 例 : A + B * ( C - D ) + E / ( C - D ) ^N 逆波兰 : A B C D - * + E C D – N ^ / + ? 四元式 : (1) ( - C D T1 ) (2) ( * B T1 T2) (3) ( + A T2 T3) ( - C D T4) ( ^ T4 N T5) (6) ( / E T5 T6) (7) ( + T3 T6 T7) 三元式: (1) ( - C D ) (2) ( * B (1) ) (3) ( + A (2) ) (4) ( - C D ) (5) ( ^ (4) N ) (6) ( / E (5) ) (7) ( + (3) (6) ) * if语句的波兰表示: 有如下if语句:if expr then stmt1 else stmt2 波兰表示为 :exprBZlabel1stmt1BRlabel2stmt2 BZ:二目操作符,如果expr的计算结果为0 false, 则产生一个label1的转移,而label1是stmt2 的头一个符号 BR:一目操作符,它产生一个 label2的转移,而 label2是一个紧跟在stmt2后面的符号(即是 if语句后的第一个语句的头一个符号) 8.1 中间代码的几种形式——波兰表示 * 由if语句的波兰表示可生成如下的目标程序框架: expr BZ label1 stmt1 BR label2 label1:stmt2 label2: 其他语言结构很容易将其翻译成波兰表示, 使用波兰表示优化不是十分方便。 波兰表示为:exprBZlabel1stmt1BRlabel2stmt2 X-y BZ, label1 Z:= X BR, label2 Label: Z:= Y+1 Label2: M=z+2 : 例:If xy then z:=x else z:=y+1; M=z+2; 有如下if语句:if expr then stmt1 else stmt2 * 在该表示中,每条指令由n个域所组成,通常第一 个域表示 运算符,其余操作符。 常用的n元表示是: 三元式 四元式 三元式: 运算符 左操作符 右操作符 表达式的三元式: w*x+(y+z) (1) *, w, x (2) +, y, z (3) +, (1), (2) 第三个三元 式中的操作数(1) (2)表示第(1)和第 (2)条三元式的计 算结果。 8.1 中间代码的几种形式——N-元表示 * 条件语句的三元式: If xy then z:=x; else z:=y+1; -, x, y BZ, (1), (5) :=, Z, X BR, , (7) +, Y, 1 :=, Z, (5) : : 其中: BZ:是二目(元)操作符,测试第 二个域的值,若0, 则按第3个域 的地址转移,若为正值则该指令 作废。 BR:一目(元)操作符,按第3个域 作无条件转移。 * 使用三元式不便于代码优化 因为优化要删除一些三元式,或对某些三元式的位置要进行变更,由于三元式的结果(表示为编号),可以是某个三元式的操作数,随着三元式位置的变更也将作相应的修改,很费事。 间接三元式: 为了便于在三元式上作优化处理,可使用间接三元式 三元式的执行次序用另一张表表示,这样在优化时, 三元式可以不变,而仅仅改变其执行顺序表。 * 例: A:=B+C*D/E F:=C*D 用间接三元式表示为: 操作 三
文档评论(0)