目标代码生成
目标代码生成
代码生成器 根据中间表示(R)生成代码 代码生成器的三个任务 指令选择:选择适当的指令实现R语句 寄存器分配和指派:把哪个值放在哪个寄存器中 指令排序:按照什么顺序安排指令执行 ·生成的目标程序应满足:保持源程序语义、高效 源程序 前端 中间 代码优L中间 代码 目标 代码 --代码 化器 生成器「程序 图8-1代码生成器的位置
代码生成器 • 根据中间表示(IR)生成代码 • 代码生成器的三个任务 • 指令选择:选择适当的指令实现IR语句 • 寄存器分配和指派:把哪个值放在哪个寄存器中 • 指令排序:按照什么顺序安排指令执行 • 生成的目标程序应满足:保持源程序语义、高效
要考虑的问题 代码生成器的输入 由前端生成的源语言的中间表示和符号表信息 ·中间表示形式,在本书中主要是三地址代码、DAG等 目标程序 目标机器的指令集体系结构 常见:RsC(精简指令集计算机),CSC(复杂指令集计 算机),基于堆栈的结构 本章中,采用一个非常简单的类RSC计算机作为目标 机,加入一些类CSC的寻址方式 生成汇编代码
要考虑的问题 • 代码生成器的输入 • 由前端生成的源语言的中间表示和符号表信息 • 中间表示形式,在本书中主要是三地址代码、DAG等 • 目标程序 • 目标机器的指令集体系结构 • 常见:RISC(精简指令集计算机),CISC(复杂指令集计 算机),基于堆栈的结构 • 本章中,采用一个非常简单的类RISC计算机作为目标 机,加入一些类CISC的寻址方式 • 生成汇编代码
要考虑的问题 指令选择 R的层次 指令集体系结构中本身的特性 生成代码的质量,要考虑到目标代码的效率 L d ro, b /R0=b ADd RO, RO, c / RO= R0 + c a =b+c IST a. RO // a=RO ILD RO, a RO ADD RO, Ro, e //Ro =RO+e st d. ro // d= RO LD RO a=a+1 ADD RO, RO, #1 //RO = RO +1 st a. ro /a=R0 INc a / if it's a valid instr
要考虑的问题 • 指令选择 • IR的层次 • 指令集体系结构中本身的特性 • 生成代码的质量,要考虑到目标代码的效率 INC a // if it’s a valid instr
要考虑的问题 寄存器分配和指派 有效地利用寄存器(最“小而快”的存储) 源程序的每个时刻,选择一组将被存放在寄存器中的变量 ·指定一个变量被放在哪个寄存器中 还需要考虑目标机器或操作系统对特定指令使用哪些 寄存器的规则
要考虑的问题 • 寄存器分配和指派 • 有效地利用寄存器(最“小而快”的存储) • 源程序的每个时刻,选择一组将被存放在寄存器中的变量 • 指定一个变量被放在哪个寄存器中 • 还需要考虑目标机器或操作系统对特定指令使用哪些 寄存器的规则