第9章 目标代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地记录各寄存器的分配状况 { }
空闲
RVALUE[R]= { A } 分配给某变量A { A,B } 分配给变量A,B
9.3
简单代码生成器
变量地址描述数组AVALUE AVALUE, 4. 建立变量地址描述数组AVALUE,动 态地记录各变量现行值的存放位置 {R} AVALUE[A]= { A } { A,R }
见表1
9.3
简单代码生成器
(2) 从基本块出口到基本块入口由 由 后向前依次处理各四元式。对每个四 后向前 元式 i: A=B op C,依次执行如下骤 ① 把符号表中变量A的待用信息和活 跃信息附加到四元式i上; ② 把符号表中变量A的待用信息栏和 活跃信息栏分别置为“非待用”和 “非活跃”;
见后 见表2
第9章 目标代码生成
编译程序最后一个阶段是目标代码生 成。它通常在语义分析后或者优化后的中 间代码上进行,并将中间代码转化为等价 的目标代码。
本章主要介绍 简单代码生成器的设计和构造方法
9.1 概述
我们知道,编译程序的最终目的是 将源程序翻译成等价的目标程序,为了 达到此目的,编译程序除了对源程序进 行词法分析、语法分析和语义分析外, 还必需将语义分析后或者优化后的中间 代码转换为等价的目标代码。
本章小结
2. 目标代码的形式 (1)能够立即执行的机器语言代码 (2)待装配的机器语言模块 (3)汇编语言代码
本章小结
3. 目标代码生成需要考虑的基本问题 (1) 如何使生成的目标代码最短; (2) 如何充分利用计算机的寄存器, 减少目标代码中访问存储单元的次 数。
本章小结
4. 待用信息和活跃信息的概念 (1) 待用信息 : (i) A=T1 A在(i)定值 : : A在(j)引用 (j) T2 =A OP X (j)为四元式(i)变量A的待用信息
9.3
简单代码生成器
1. 给出寄存器的分配原则 (1)把基本块内还要使用的变量的值 尽可能地保存在寄存器中; (2)在基本块内,把不再使用的变量 所占用的寄存器及时释放掉; (3)当到基本块出口时,将变量的值 存放在内存中。
9.3
简单代码生成器
当翻译一个四元式如A=B op C时, 我们需要知道在基本块中还有哪些四元 式要对变量A、B、C进行引用。 2. 建立每个变量的待用信息和活跃信息 (1)待用信息
9.4 代码生成器的自动生成技术
形式描述技术的主要优点是:把 实现者从选择计算给定构造的代码中 解放出来,实现者只需要以形式化描 实现者只需要以形式化描 述每条目标指令的精确意义,生成器 述每条目标指令的精确意义 将自动地查询机器描述,找出为完成 所需的计算的指令或指令串。
本章小结
1. 目标代码生成的任务 代码生成一般是在语法分析后的 中间代码级上进行,其功能是将中间 代码转换为目标代码。
修改寄存器使用信息 和地址描述信息
9.3
⑴ ⑵ ⑶ ⑷
简单代码生成器
LD R0, A SUB R0, B LD R1, A SUB R1, C ADD R0, R1 ADD R0, R1
T=A-B U=A-C V=T+U D=V+U
9.4 代码生成器的自动生成技术
现阶段代码生成器的自动生成器主 要采用由形式描述进行驱动的技术 采用由形式描述进行驱动的技术,这 采用由形式描述进行驱动的技术 种技术把目标机的每条指令的形式描述 每条指令的形式描述 作为输入,将表示计算的中间语言代码 与这种描述进行匹配 进行匹配来产生相应的指令。 进行匹配
本章小结
(2) 活跃变量 基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
9.3
例
简单代码生成器
A在(i)定值 A在(j)引用
: (i) A=T1 : : (j) T2 =A OP X
(j)为四元式(i)变量A的待用信息
9.3
简单代码生成器
(2) 活跃变量 基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
2. 待装配的机器语言模块,当需 要执行时,由连接装配程序把它们与另 外一些运行子程序连接起来,组合成可 执行的机器语言代码。 3. 汇编语言程序,必须通过汇编 程序汇编成可执行的机器语言代码。
9.1 概述
二. 设计代码生成器时要着重考 虑目标代码的质量 衡量目标代码的质量 1.存储空间: 生成的目标代码短。 2.执行效率: 充分利用寄存器,减少 访问存储单元的次数。
9.3
简单代码生成器
(3) 计算变量待用信息和活跃信息 的算法: 输入:基本块及其入口语句号和 出口语句号 输出:附加待用信息和活跃信息 的基本块
9.3
来自百度文库
简单代码生成器
算法的步骤 假设变量的符号表内有待用信息和 活跃信息栏 (1) 将符号表中每个变量的待用 信息栏初始化 初始化为“非待用”,对活 初始化 跃信息栏则根据该变量在基本块出 口之后是否活跃,将该栏中的信息 置为“活跃”或“非活跃”。
9.2
假想计算机模型
具体设计一个代码生成器需要考虑机 器结构、系统指令格式等方面的问题。 由于计算机体系结构和操作系统的多样 性,我们在这里不做具体介绍,仅仅以 一个假想的计算机模型为例,简单讨论 代码生成的基本原理。 假想计算机的指令格式见P162
9.3
简单代码生成器
简单代码生成器功能 依次把四元式变换成目标代码, 依次把四元式变换成目标代码 , 并在一个基本块内考虑如何充分利用 寄存器。 寄存器。 在设计代码生成器时,为考虑充分 利用寄存器,我们须要考虑下面两点:
A的现行值在寄存器R中 A的现行值在内存中 A的现行值既在寄存器R 中又在内存中
9.3
简单代码生成器
有了上述对寄存器和地址的描述, 我们可以给出一个简单代码生成算法。
调用函数GETREG(i:A=B op C) 得到存放A的现行值的寄存器R 取变量B和C的现行值的存放位置B’和C’ B’⇐AVALUE[B] C’⇐AVALUE[C] Y B’=R? 生成目标代码 OP R, C’ 生成目标代码 LD R, B’ OP R, C’ N
9.1 概述
一. 目标代码生成的任务
中 间 代 码 程 序
代 码 生 成 器
目 标 代 码 程 序
9.1 概述
代码生成器的输入除中间代码外 还包括符号表中的信息,生成的目标 代码一般有如下三种形式 1. 能够立即执行的机器语言代码, 它们通常存放在固定的存储区中,编译 后可直接执行。
9.1 概述
我们根据上述算法得到待用信息链和活 跃信息链如下:
活跃信息 待用信息 初值 待用信息链 初值 活跃信息链 F (3) F F L F F (2) (1) L L L F (1) L L F (2) L L F (4) (3) F F L L F F (4) F F L F F F L F
T A B C U V D
返回3 返回2 返回1
9.3
简单代码生成器
待用信息和活跃信息在四元式上的标记 如下: ⑴ ⑵ ⑶ ⑷ T⑶L=A⑵L-BFL U⑶L=AFL-CFL V⑷L=TFF+U⑷L DFL=VFF+UFF
返回2 返回3
9.3
简单代码生成器
在代码生成中进行寄存器分配, 我们需随时掌握各寄存器的使用情况
3. 建立寄存器描述数组RVALUE,动态 寄存器描述数组RVALUE RVALUE,
9.3
简单代码生成器
③ 把符号表中变量B和C的待用信息 和活跃信息附加到四元式i上; ④ 把符号表中B和C的待用信息置为i, 活跃信息置为“活跃”。 注意,以上①、②、③、④次序不能 注意 颠倒。
见表3 见后
9.3
变 量 名
简单代码生成器
⑴ ⑵ ⑶ ⑷ T=A-B U=A-C V=T+U D=V+U