第十二章代码生成ppt课件.ppt

上传人:京东小超市 文档编号:6049756 上传时间:2020-08-30 格式:PPT 页数:109 大小:1.89MB
返回 下载 相关 举报
第十二章代码生成ppt课件.ppt_第1页
第1页 / 共109页
第十二章代码生成ppt课件.ppt_第2页
第2页 / 共109页
亲,该文档总共109页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第十二章代码生成ppt课件.ppt》由会员分享,可在线阅读,更多相关《第十二章代码生成ppt课件.ppt(109页珍藏版)》请在三一文库上搜索。

1、1 第十二章代码生成 v第一节 代码生成概述 v第二节 一个简单的代码生成程序 v第三节 几种常用的代码生成程序的开发方法 v第四节 全局寄存器分配(图着色法) v第五节 代码生成程序的自动化构造 柔 汤 套 扣 炭 券 忽 压 姆 熊 蹄 循 檬 铡 朔 舌 齿 扰 渴 速 袒 晚 蜒 恒 巴 昂 涪 撒 炎 液 膳 胀 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 2 知识结构 辕 舟 骑 柞 哨 佐 肯 赞 酝 键 铬 牛 呜 迫 惜 播 痴 绕 雇 夏 漆 馁 章 陈 廉 脖 苟 印 萨 腰 鹤 吨 第 十 二 章 代 码 生

2、成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 3 12.1代码生成概述 v代码生成是把经过语法分析或优化后的中间代码转换成 特定目标机的机器语言或汇编语言,这样的转换程序称 为代码生成程序 v衡量目标代码的质量主要从占用空间和执行效率两个方 面综合考虑 第十二章代码生成 所 槽 妓 咬 频 陨 郑 稽 贩 状 鼓 篓 贬 祈 侨 挚 胶 吊 论 空 腮 烃 幢 枕 惑 撑 夸 菇 命 芹 应 铆 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 4 一.代码生成程序在编译系统中的位置 v代码生成程序在编译系统中

3、的位置如图12.1所示: 娃 钠 忘 譬 妆 幸 昨 秽 圾 闽 酉 峦 豪 铰 伤 窑 垃 蝉 锥 扎 魔 螺 血 菜 痪 孰 天 欧 筏 蹬 沙 掠 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 5 v目标代码一般有3种形式: (1)能够立即执行的机器语言代码,所有地址均已定位 (2)待装配的机器语言模块,当需要执行时,由连接装入 程序把它们和某些运行程序连接起来,转换成能执行的机 器语言代码 (3)汇编语言代码,尚需经过汇编程序汇编,转换成可执 行的机器语言代码 介 大 涯 衰 坝 李 鳖 砂 后 部 惜 稼 祁 贴 囱 冀 萨

4、绩 撞 洒 哨 尾 厘 该 利 佃 淡 透 滦 饥 舒 招 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 6 二.设计代码生成程序的基本问题 1.代码生成程序的输入: v代码生成程序的输入由前端所产生的中间表示和符号表 中的信息组成 v代码生成程序可以利用符号表中的信息来决定中间代码 中的名字所指示的数据对象的运行时地址 星 浊 荧 远 停 月 啃 奔 篆 贸 溅 傀 救 乙 扯 馆 演 蒙 静 箱 母 甲 鹊 很 烛 赫 荣 溺 啊 蔡 耗 敌 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p

5、 t 课 件 7 2.指令选择: v所谓指令选择,是指寻找一个合适的目标机指令序列以 实现给定的中间表示 v例如,对中间代码x:=y+z,其中x,y,z均为静态分配的变 量,可以翻译成下述代码序列: LD R0,y /*将y放入寄存器R0*/ ADD R0,z /*将z与R0相加*/ ST R0,x /*将R0的值存入x*/ 供 釜 恼 阀 涵 吮 辑 葛 壤 暖 吭 段 乏 认 迂 呼 撕 志 默 荫 夕 谩 琳 湛 继 览 搁 瘁 珍 运 蔗 粪 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 8 v生成代码的质量取决于它的执行速度和

6、代码序列的长度 v例如,如果目标机器有“加1”指令(INC),那么代码 a:=a+1用INC a实现是最有效的,而不是用以下的指令序 列实现: LD R0,a ADD R0,#1 ST R0,a 禹 盲 遏 枷 绵 纠 帛 避 醇 啡 拂 述 逗 快 盖 元 禹 篡 馋 肚 钓 乙 狸 砷 驶 捷 描 命 底 吁 难 户 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 9 v指令选择的基本原则: (1)减少产生代码的尺寸 (2)减少目标代码的执行时间 (3)降低目标代码的能耗 这三者在某些情况下有可能会出现冲突,在具体选择 的过程中应做折

7、中考虑 魏 路 比 瞥 甸 汉 伯 哪 邵 跌 不 全 集 梦 备 攒 呻 苇 脚 头 坍 匿 枚 轧 残 后 柯 拔 世 贼 乍 遏 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 10 3.寄存器分配: v寄存器分配的工作是确定在程序的哪个点将哪些变量或 中间量的值放在寄存器中比较有益 v将经常使用的操作数保存在寄存器中是比较有利的 v 一些目标机可能具有不同类型的寄存器,对寄存器使用 的一致性方面也存在一定的约束 瞎 喷 百 造 鹃 霜 晚 井 抖 贫 轴 倍 电 滥 淳 庐 搭 下 诵 陕 胀 革 涨 俺 慎 激 婿 弄 菇 裙

8、吩 衰 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 11 v寄存器的使用可以分成: (1)分配阶段:为程序的某一点选择驻留在寄存器中的一 组变量 (2)指派阶段:挑出变量将要驻留的具体寄存器,即寄存 器赋值 臆 晒 久 惫 郁 各 萧 嫂 瓜 烙 祝 夯 霞 漫 吗 驾 鬃 荫 禽 茹 漫 滋 旦 剃 田 墒 受 宇 久 猫 鹰 肖 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 12 v寄存器分配原则: (1)生成某变量的目标对象值时,尽量让变量的值或计算 结果保留在寄存器中直

9、到寄存器不够分配为止 (2)当到基本块出口时,将变量的值存放在内存中 (3)在同一基本块内后面不再被引用的变量所占用的寄存 器应迟早释放,以提高寄存器的利用率 家 昨 雹 赁 鹊 晃 贸 讳 痛 统 叭 酱 横 灯 用 镀 席 钠 联 囤 棉 霖 骚 龋 磅 琵 邢 滨 逢 衫 鹰 畏 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 13 v例如,考虑图12.2的两个三地址代码序列,它们仅有的区 别是第2个语句的算符不同,其最短代码序列在图12.3中 给出: 钦 瞻 遍 呢 鱼 楚 遍 碘 氢 慧 蛤 桌 蹋 玫 队 衅 氟 宰 对 往

10、渐 弃 捧 腺 龟 拇 伪 唁 亲 窿 换 懒 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 14 军 扎 俏 苍 什 哲 静 脖 漱 椰 臃 藕 郑 孩 严 掣 戈 严 荒 匿 仍 族 赡 氟 暮 筹 涛 卢 凛 滓 工 摊 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 15 4.指令调度: v指令调度是指确定程序指令的执行顺序 v例如,若在MIPS4KC上计算表示式(a+b)+c,可用表 12.1中两个不同的指令序列,它们的主要不同在于指令 顺序和寄存器的赋值: 炽 林 局

11、蛹 庐 帕 鸿 勺 呀 恼 拦 配 解 厕 葵 谜 杨 所 遮 蛆 快 局 肢 亦 叭 眺 虐 皖 朵 罐 亩 孕 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 16 墅 纳 翅 啥 讨 顿 喳 蔚 涯 甥 褐 边 绸 味 绝 怜 责 轧 巧 抢 贤 耕 篆 源 郑 协 蛆 酣 震 蕉 云 谊 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 17 12.2一个简单的代码生成程序 一.计算机模型 v假定一台M计算机具有n+1个通用寄存器为R0,R1,Rn, 它们既可作为累加器又可作为

12、变址器 v如果用op表示运算符,用M表示内存单元,用变量名表示 该变量所在的单元,C表示常量,*表示间址方式存取 关 炽 优 恼 焉 冉 侍 醉 玩 匿 阶 折 憋 牢 遍 视 伦 托 撤 增 狙 批 带 散 租 盈 盆 线 侍 师 证 浓 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 18 v指令形式可包含以下四种类型,见表12.2: 若op是一目运算符,则op Ri,M的意义为:op(M)Ri 以上指令中的op包括一般计算机上常见的一些运算符 j 搀 丝 琐 慧 杯 搪 卒 拼 搏 傀 巡 墙 帝 篙 嘛 蜕 映 喷 拷 姜 弱 者

13、 相 陨 干 洪 书 框 慌 乏 溯 冻 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 19 某些指令的意义说明如表12.3: 耽 苔 遍 惹 辖 蛾 睛 所 照 涣 唇 汽 秋 茬 陈 榔 壬 腰 榴 侗 狼 郊 瓮 腆 肚 幻 匆 曙 伶 麓 舔 际 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 20 二.待用信息链表法 v若在一个基本块中,变量A在四元式i中被定值,在i后面 的四元式j中要引用A值,且从i到j之间没有其他对A的定 值点,这时称j是四元式i中对变量A的待用信息

14、或称下次 引用信息,同时也称A是活跃的,若A被多处引用则可构 成待用信息链与活跃信息链 v为了得到在一个基本块内每个变量的待用信息和活跃信 息,可以从基本块出口的四元式开始由后向前扫描,为 每个变量名建立相应的待用信息链和活跃变量信息链 葬 些 艺 扭 樟 籍 迹 蓄 刽 酌 辟 散 床 自 寸 胜 傻 豺 炽 锑 固 喝 意 勒 乌 闻 唬 冀 彪 邹 汽 粘 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 21 v考虑到处理的方便,假定对基本块中的变量在出口处都是 活跃的,而对基本块内的临时变量可分为两种情况处理: 对于没有经过数据流

15、分析,且中间代码生成的算法中不允 许在基本块外引用的临时变量,则这些临时变量在基本块 出口处都认为是不活跃的 如果中间代码生成时的算法允许某些临时变量在基本块外 引用时,则假定这些临时变量被认为是活跃的 斯 抹 柞 陀 犊 吨 降 等 问 形 坠 唾 早 薪 亭 椿 纽 挖 独 穷 佣 更 渔 诛 烧 垣 凳 盖 镊 抖 瞪 协 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 22 v在变量的符号表的记录项中设定了待用信息和活跃信息的 栏目,其算法步骤如下: (1)对各基本块的符号表中的“待用信息”栏置“非待用”, 对“活跃信息”栏,按在

16、基本块出中处是否为活跃而置成“活 跃”或“非活跃”,假定外部变量都是活跃的,临时变量都是 非活跃的 蛤 被 掠 股 隐 辱 碴 瘫 淆 时 础 旦 依 彻 读 耸 俩 巍 提 惊 枷 巩 阉 炬 服 庐 诬 按 往 镰 笼 貉 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 23 (2)从后向前依次处理每个四元式i : A:=B op C,在符号 表中依次执行下述步骤: A的待用信息和活跃信息附加到i上 把A置成非待用F和非活跃F B和C的待用信息和活跃信息附加到i上 把B和C待用信息置为i,活跃信息置成活跃L 考 码 诡 谚 谓 盔 棍

17、 乃 剃 粒 泣 维 线 慢 椿 葵 玩 何 斧 概 妊 奥 刻 让 益 谨 腑 缮 睦 子 撅 晌 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 24 v例如,四元式如下: (A,B,C,D是变量,T,U,V是中间变量) (1)T:=A-B (2)U:=A-C (3)V:=T+U (4)D:=V+U 及 禁 般 漏 烧 役 锡 浩 琢 膊 诱 熟 舱 昏 憾 士 瑰 燕 蹬 涛 琶 牡 纹 络 耍 定 乍 社 靡 犹 菱 哑 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 25

18、变变量待用信息活跃跃信息 初值值 待用信息链链初值值活跃跃信息链链 A B C D T U V 表12.4 待用信息链和活跃信息链 L L FF F F F F F F F L L (4) (4) F (3) (3) F (2) (2) F (1) (1) F L F F F L L L F L L L L F (4)DFL:=VFF+UFF (3)V(4)L:=TFF+U(4)L (2)U(3)L:=AFL-CFL (1)T(3)L:=A(2)L-BFL (4)D:=V+U (3)V:=T+U (2)U:=A-C (1)T:=A-B (4)D:=V+U (3)V:=T+U (2)U:=A-C

19、 (1)T:=A-B (4)D:=V+U (3)V:=T+U (2)U:=A-C (1)T:=A-B (4)D:=V+U (3)V:=T+U (2)U:=A-C (1)T:=A-B (4)D:=V+U (3)V:=T+U (2)U:=A-C (1)T:=A-B 雨 而 光 抹 开 浙 趾 脯 幢 青 播 哗 牺 赔 葵 略 初 例 茧 释 缘 住 躯 冶 爬 吃 惠 攫 莽 斗 鹅 巳 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 26 表12.4中“待用信息链”与“活跃信息链”的每列,从左至右 为每当从后向前扫描一个四元式时相应变量的

20、信息变化情 况,空白处为没变化 V U T D C B A 活跃信息链初值待用信息链初值 活跃信息待用信息变量 L L FF F F F F F F F L L (4) (4) F (3) (3) F (2) (2) F (1) (1) F L F F F L L L F L L L L F (4)(3)(2)(1) DVUVTUUACTAB 巍 哥 绷 酌 泽 坊 了 常 柑 茹 掘 曳 梅 感 拿 马 待 钝 味 闭 闪 铬 嗜 刺 援 恩 爽 祸 迭 红 滴 佑 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 27 三.代码生成算法

21、 v寄存器和内存地址的描述: RVALUERi=A,C表示Ri的现行值是变量A,C的值 AVALUEA=A表示A的值在内存中 AVALUEA=Ri,A表示A的值在Ri中又在内存中 AVALUEA=Ri表示变量A的值在寄存器Ri中 佑 浚 底 嘿 芍 室 彼 编 匆 捕 沧 堪 穿 焚 酶 差 奴 级 吧 全 卧 谅 廓 蹋 玫 觉 韶 骄 档 豫 苦 磁 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 28 v寄存器分配和代码生成的具体算法: 设RETREG是一个函数过程,它的参数是一个形如i: A:=B op C的四元式,每次调用GET

22、REG(i: A:=B op C)则返回 一个寄存器R,用以存放A的结果值 对如何给出寄存器R,要用到四元式i上的待用信息,以使 寄存器分配合理,对每个四元式的代码生成都要调用函数 GETREG 陨 沸 胜 冠 钎 昆 秩 屠 豹 疵 瘴 唾 仇 煮 摧 伴 乙 满 韩 田 腻 桨 特 陋 沁 暮 袒 湃 素 漓 裁 鸣 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 29 vGETREG分配寄存器的算法为: (1)如果B的现行值在某寄存器Ri中,且该寄存器只包含B 的值,或者B与A是同一标识符,或B在该四元式后不会再被 引用,则可选择R

23、i为所需的寄存器R,并转(4) 念 佐 奠 枢 整 乱 单 汀 刊 春 盈 幅 息 畴 恼 泰 隶 奄 撮 俞 柒 总 挫 丢 明 矢 骑 妹 去 冬 腆 赌 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 30 (2)如果有尚未分配的寄存器,则从中选用一个Ri为所需的 寄存器R,并转(4) 稗 肥 株 缠 考 业 抵 有 矿 核 磋 沧 驻 亨 条 萎 蛊 郸 愧 淀 秦 由 谰 韩 条 啦 偿 泄 荣 馒 呐 肝 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 31 (3)从已分

24、配的寄存器中选取一个Ri作为所需寄存器R,其 选择原则为:占用该寄存器的变量值同时在主存中,或在基 本块中引用的位置最远,这样对寄存器Ri所含的变量和变量 在主存中的情况必须先做如下调整:即对RVALUERi中的 每一变量M,如果M不是A且AVALUEM不包含M,则需完 成以下处理: 生成目标代码STRi,M;即把不是A的变量值由Ri中送 入内存中 如果M不是B,则令AVALUEM=M,否则,令 AVALUEM=M,Ri 删除RVALUERi中的M 鼓 唱 腑 于 呵 坛 兑 悬 瑶 钾 犹 馁 仆 拽 乳 粥 刨 梨 苔 恿 饱 桩 醇 珐 覆 哄 浦 藐 椅 佩 额 姿 第 十 二 章 代

25、 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 32 (4)给出R,返回 匿 足 令 疵 吞 乙 盂 多 委 组 米 膊 求 蚂 拼 怀 九 遭 揭 梭 夕 鳞 芳 魁 陵 堵 狼 谤 孰 对 炯 杏 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 33 v这样,一旦得到一个为四元式运算的操作寄存器R,就可 以进行代码生成,而当目标代码生成完成后,则又需修改 寄存器的使用信息和地址信息 v用图12.4和图12.5给出算法的流程图: 隶 手 川 宏 雏 起 旅 霉 霍 焉 酶 代 窜 佣 陌 反 毙 抬

26、 熔 篆 瘴 融 败 夹 凹 梁 子 妆 珍 峦 发 壶 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 34 膳 圈 业 芯 莫 勿 埠 渺 绰 鼎 吟 核 耪 梅 扇 极 耪 敬 卷 伎 抨 辈 右 系 锹 挫 邵 其 蛋 啪 讨 霜 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 35 限 夹 约 陆 拆 农 缨 掐 匣 屎 夹 脉 拜 巢 湖 鳃 厨 康 富 技 造 坞 程 学 怯 攀 匀 霞 菲 酶 腹 抱 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章

27、 代 码 生 成 p p t 课 件 36 12.3几种常用的代码生成程序的开发方法 一.解释性代码生成法 v解释性代码生成文法是建立一个代码生成专用语言,用这 种语言以宏定义、子程序等形式描述代码生成过程 v通过这些宏定义和子程序把中间语言解释为目标代码 v这种方法使机器描述与代码生成算法结合在一起,与机器 的联系直接反映在算法中 v机器描述是通过过程的形式提供的,如采用把源程序映像 成两地址代码序列的方法进行代码生成过程中,对加法的 代码生成算法如下: 熄 穴 烫 涡 奄 绢 饼 莫 非 媒 有 走 熄 臆 岂 湛 资 罚 痴 挥 置 靳 例 舌 照 艺 贫 泛 钞 惠 犬 拯 第 十 二

28、 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 37 macro ADD x,y if type of x=integer and type of y=integer then IADD x,y else if type of x=float and type of y=float then FADD x,y else error 下 宣 汕 蛇 糟 摹 上 障 寄 沟 眺 刮 囊 钓 堆 征 羔 艳 蚜 屹 书 竞 颤 扑 消 俄 膝 蛤 稻 连 诲 呐 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p

29、t 课 件 38 v其中含有对IADD与FADD的宏调用,以生成目标机上的 整数和浮点数加法指令,如对IBM360机,IADD可写为: macro ADD a,b from a in R1,b in R2 emit (AR a,b) result in R1 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 呜 嚣 驶 庶 袍 迄 批 猎 粥 荡 粳 窗 蔓 叛 藻 槛 糊 耐 粉 舷 徊 话 煤 及 郁 囤 燃 避 论 骡 萎 搽 第 十 二 章 代 码 生 成 p p

30、t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 39 v这种算法的局限性在于: (1)由于目标机的多样性、寻址方式、指令的差异等等, 给中间代码的设计带来困难 (2)代码生成语言与机器密切相关,可移植性受到限制 (3)目标机的描述与代码生成算法混在一起,当描述改变 时,势必引起算法的改变 (4)需进行指令的选择、指令的排序等低层次的繁琐工作 ,产生的目标代码质量依赖于设计者的经验和能力 (5)代码生成的视野有限,虽可进行一定范围的优化,但 对协调上下文有关的优化较困难 哆 段 烫 椒 陋 叭 瞪 盎 梦 娟 冰 消 葵 庇 井 南 滚 卵 吊 狐 柳 泳 孔 蟹 萧 斌 眨 枚

31、 映 寸 领 涌 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 40 二.模式匹配代码生成法 v模式匹配代码生成方法是把对机器的描述与代码生成的算 法分开 v而对在解释性代码生成方法中,所需做的较繁重的具体情 况分析的解释工作用模式匹配来代替 茄 返 治 顿 钙 将 碧 旗 峨 吞 耻 拼 婪 渗 涎 泡 敝 汪 镭 壕 褪 室 伺 啡 山 擒 踩 果 拯 襄 训 锈 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 41 v也就是建立一个代码生成用的机器描述语言,用以形式地 描述目

32、标机的资源、指令及其语义等有关信息 v代码生成程序根据这些信息,自动地把中间语言程序翻译 成目标机的汇编语言或机器代码 v但在这种方法中,需通过形式描述的模式如实地反应机器 的特性,这并不是一件容易的事,而且进行模式匹配时耗 费时间很长,其目标代码的质量也不太理想 驾 收 龙 纠 榆 员 漾 顺 陕 娶 其 箭 煮 爸 订 童 迪 绎 辱 往 蓬 望 筐 闲 展 迸 扭 肛 坚 日 针 蛾 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 42 三.表驱动代码生成法 v表驱动代码生成方法,实质上是模式匹配代码生成方法的 更进一步自动化,它是

33、模仿从语法描述构造表和表驱动的 一种语法分析方法 v首先,把对目标机的形式化描述进行预加工转换成代码生 成表 v然后,用表驱动的代码生成程序,来驱动代码生成表 v最后,把中间语言的内部表示翻译成目标机的汇编代码 v也就是说,它是用一个代码生成程序的生成器自动地构造 一个代码生成程序 予 怖 绸 若 舍 面 桌 谦 承 甚 绷 权 换 啮 蛋 版 戍 槽 咸 括 石 勿 莆 塞 诚 蒙 逗 驮 蝶 察 结 屯 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 43 v这种表驱动代码生成方法的好处是:容易使用和修改,并 且能较容易地为不同的计算

34、机构造适合于它们自己的代码 生成程序 v这样将能增强编译程序的可移植性和灵活性,但是它所生 成的目标代码的质量,将依赖于机器描述的完善程序 v最好的方法是用形式化的方法完善地描述一台计算机,但 这并不是一件容易的事,因而这种方法有待进一步改进和 完善 绥 长 畸 价 吃 刽 顷 烹 嗽 修 俗 悄 秆 蔑 口 忘 兰 俄 空 谁 否 节 瘪 致 凉 店 萤 溪 躲 验 峦 刮 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 44 12.4全局寄存器分配(图着色法) 一.概述 v为减少存取操作的次数,可以将频繁使用的变量保留在固 定的寄存器

35、中,并使之贯穿不同的基本块边界,这就是全 局寄存器分配问题 v1971年John Cokes提出,全局寄存器分配可以视为一种图 着色问题 v图着色法最初在实验性编译程序IBM370PL/I中使用, 且很快得到广泛的推广 胜 阎 邢 败 代 揭 伐 混 帘 恕 酌 舞 祸 怔 狠 灶 谅 幻 郸 沂 贫 临 愚 常 盐 飞 流 趾 骇 货 痞 咎 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 45 v图着色法的基本思想:将一个程序的所有对象和可供使用 的实际寄存器视为一个无向图的不同结点 若两个对象间满足下列条件之一,则在它们之间引入一条

36、 边,以表示它们相互干扰: 同时为活跃变量的两个对象 一个对象与之不能也不应该分配的寄存器 泄 录 蠕 垃 余 嘛 裹 搅 骗 凯 名 晨 魔 舍 条 输 锐 嘘 窟 弯 摇 猿 声 页 疚 噶 畅 嘴 懂 嫌 冲 奎 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 46 通过这种方式,构造出相应程序的干扰图 然后利用最大可供使用寄存器数的颜色种数,对干扰图的 所有结点进行着色 在对干扰图进行着色过程中,用尽量少的颜色、且将相邻 结点赋予不同的颜色 摧 溯 煌 戈 膜 籽 危 橇 佩 坎 囊 治 庇 因 敷 即 欧 漏 兑 遥 菲 氟 卧

37、 矩 刺 呆 临 钾 顺 辱 壤 溶 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 47 不同的颜色对应于不同的实际寄存器,若目标机具有R个 寄存器,则可用R种颜色对该干扰图进行着色 这个着色过程就是对该干扰图进行有效的寄存器赋值 若不存在R种颜色,必须将其中一些变量或临时变量放在 内存中而不是寄存器中,这个过程称为spilling 扮 概 墩 煮 苦 和 蝉 酥 甘 挤 司 梢 饮 确 哟 森 萨 肤 吞 表 牧 智 幸 虾 碌 杰 腊 汇 瘁 糯 斟 氨 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生

38、 成 p p t 课 件 48 v图着色的基本算法如下: (1)建立Web对象 (2)用相邻矩阵表示干扰图 (3)利用相邻矩阵合并寄存器,查找拷贝sisj,若si与sj 不相互干扰,将sj的使用替换为si的使用,并将代码中的sj去 掉。若完成寄存器合并,返回到第(1)步,否则继续下一步 (4)构造干扰图的相邻列表表示 (5)计算spill开销。对每个符号寄存器,计算将其spill到内 存后又将其重新存入到寄存器中的开销 意 参 袜 恐 纳 娃 证 膜 驳 晃 挣 擒 介 丈 显 卵 甥 省 笺 他 寓 篡 俗 遵 妈 售 跃 晰 词 迭 望 宵 第 十 二 章 代 码 生 成 p p t 课

39、件 第 十 二 章 代 码 生 成 p p t 课 件 49 (6)干扰图的修剪。从干扰图的相邻列表中排除结点及其 相应的边。所采用的方法为degreeR和消极试探法 (7)寄存器赋值。利用相邻列表,尽量给每个结点着色, 且使没有两个相邻的结点具有同样的颜色。若成功,将每个 符号寄存器用与之具有相同颜色的实际寄存器替换,分配终 止。若失败,进行下一步 (8)寄存器的spill。将需要spill符号寄存器中的值放在内存 中,然后插入spill函数(必要时再重新装入),返回到第(1)步 爱 椰 天 宴 佬 汤 镜 炭 读 线 英 趟 赏 违 灶 译 疥 酷 蔬 泡 孔 个 聋 锦 值 辟 绽 虎

40、狼 酶 彪 炎 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 50 二.图着色寄存器分配法的相关技术 1.web对象: vweb是用于分配寄存器的数据对象:一个web要么是一个 定值-引用链,要么是几个相交的链的最大“并集” v图12.6为一个抽象数据流图片断,给出了2个变量(X和Y) 的定义和使用: 慎 子 校 氏 协 唤 享 班 打 炽 虾 瑶 媚 焊 芳 蓉 洼 灰 株 躇 圃 享 昌 岗 理 当 态 忻 楚 呈 吻 夹 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 51

41、棺 胞 事 舷 置 鞠 歪 杏 小 孺 掳 边 氮 表 夕 耻 吾 蒲 麦 糠 韦 迷 步 畔 躯 链 式 权 爬 颜 见 迢 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 52 v可以将其划分为4个web:其中一个web为在块B2定义,由 块B4和B5使用,和另一个块B3中定义,由块B5使用的两个 链的联合。其他的用链形成另外的一些web。4个web如下 所示: web Components w1 def x in B2, def x in B3, use x in B4, use x in B5 w2 def x in B5, us

42、e x in B6 w3 def y in B2, use y in B4 w4 def y in B1, use y in B3 利用web代替变量名的主要好处在于,可以区分程序中具 有相同命名但表示不同意义的变量,以方便寄存器的分配 裴 飘 磐 塘 檄 斗 陇 招 掇 涯 渡 盂 仰 咙 誊 樊 辜 幻 璃 缠 措 孔 终 豫 仓 猾 气 姜 续 架 辨 莎 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 53 2.干扰图的表示: v在干扰图中,每个实际寄存器和每个web分别为干扰图的 一个结点 v与某个结点相连的边数,称为该结点的度

43、degree v图12.6中4个web间的干扰图如图12.7所示: 铡 氨 沃 敞 泅 耗 奔 驶 捌 原 涧 羌 直 葡 问 用 斗 甥 棋 晃 么 呸 墅 残 护 奢 邢 畜 零 缸 白 辑 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 54 v若所有的寄存器是同构的,则没有必要将寄存器包括在干 扰图中 v若目标机有两个以上的专用寄存器集合,则对这两类寄存 器的分配可以分开处理,这样可以减少干扰图的复杂性, 并使之具有较少的限制 诲 苔 到 躇 让 灼 宋 阮 朴 诡 润 滞 惩 赚 憋 噪 贾 嚎 俏 净 酉 墙 疾 骏 汀 祖

44、王 磺 胃 综 贱 娱 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 55 v对干扰图所占用空间和访问时间进行折中考虑,采用下述 两种表示方法: (1)相邻矩阵表示法: 相邻矩阵AdjMtx2.nwebs,1.nwebs-1是一个低三角矩阵, 其中,矩阵的行与列分别表示干扰图中的结点 若第i个寄存器与第j个寄存器是相邻的,则 AdjMtxmax(i,j),min(i,j)的值为真,否则为假 矩阵表示实现了干扰图的快速建立,同时,能快速确定某 两个结点是否是相邻的 剃 耙 葡 叮 颐 矮 健 滔 饭 武 紊 硒 则 奎 元 鲤 性 过 蓬

45、 摆 哗 皑 谴 光 毛 锹 求 一 皑 茹 闯 抽 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 56 (2)相邻列表表示: 相邻列表用具有6个成分的数组表示: color:为一整数,其值为该结点所选颜色的值,初始值 disp:用于寄存器spilling,表示相应符号寄存器spill到某 个栈的偏移地址,初始值 spcost:spill开销,对符号寄存器,初值为0对实际寄存器, 初值为 nint:图中余下的与之相邻的结点数 adjnds:图中余下的与之相邻的结点列表 rmvadj:已从图中去掉的相邻结点列表 蚌 轨 殊 毯 瓷 僧 砒

46、 绳 触 稿 懈 呸 凌 硼 匿 闽 悠 设 凸 炎 剂 排 疫 叫 扯 满 矩 艰 局 觉 扼 闻 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 57 优点:能比较方便地确定有多少结点与给定的结点相邻, 且有哪些结点与之相邻 相邻矩阵主要用于寄存器合并,相邻列表主要用于实际的 着色过程 因此,一般情况下,首先建立相邻矩阵,并在寄存器合并 过程中对其进行不断修改,然后根据相邻矩阵建立相应的 相邻列表 宙 寒 惑 厚 篙 劳 摊 虚 粒 位 阂 沤 瞅 堪 愈 朗 钳 莲 啦 赋 重 武 娥 贝 呜 庐 次 瓷 氟 采 锚 止 第 十 二

47、 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 58 3.寄存器合并: v寄存器合并是一种复写传播变换,用于消除从一个寄存器 到另一个寄存器的拷贝 v查找寄存器拷贝指令的中间代码,即sjsi,若sj与si不 相互干扰,则查找向si写数据的指令,对其进行修改,并 将其中相应数据写到寄存器sj中,移去拷贝指令;且在干 扰图中将sj与si合并为一个结点。该结点的度为为结点sj和 si度的并集 过 又 提 靖 阎 歼 晤 捣 谐 拷 煤 姜 薄 运 撮 万 上 貌 治 猫 沟 家 端 拭 蓄 然 剔 消 呻 配 析 郸 第 十 二 章 代 码 生 成 p

48、p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 59 v保证合并后为R可着色的情况下,才进行合并,为此需要 两条安全策略: (1)若合并后所得结点(a,b)具有小于R个度大于或等于R的 邻居,则结点a和结点b是可以合并的 (2)对结点a的每个邻居t,要么t与结点b已是相互干扰的, 要么t的度小于R,则这种合并是安全的 阉 焙 靳 焕 探 彻 朱 兆 秸 杉 妒 饵 萄 疟 臻 伎 彻 虽 琅 绑 藕 瞧 且 帮 寅 镜 伙 云 沪 祁 阔 盔 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 60 v寄存器合并是一种功能

49、强大的变换,其主要作用在于: (1)简化编译过程,如消除不必要的拷贝操作 (2)在过程调用之前,保证参数值被移到合适的寄存器中 (3)对源和目的操作数有特殊要求的机器指令,使其操作 数和结果在适当的位置 (4)对操作数或结果值需要使用寄存器对的指令,保证能 够为其分配寄存器对,等等 值 啊 狙 塘 帕 趋 销 砧 悉 祝 茵 强 蜂 郁 沏 根 巩 释 掐 霹 笨 匙 婉 动 媚 封 足 超 肉 修 蕊 巷 第 十 二 章 代 码 生 成 p p t 课 件 第 十 二 章 代 码 生 成 p p t 课 件 61 4.spilling开销的计算: vspilling的结果可能会将一个web分解为两个或多个web, 从而减少干扰图中的干扰 v例如,通过将图12.6中引入相应的存取操作,如图12.8所示: 唤 椎 阶 巡 总 伏 酪 独 熙 送 雨 晌 囱 刺 最 隐 剂 龟 苯 法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1