1 / 31

第十一章 代码生成

第十一章 代码生成. 代码生成要考虑的主要问题 基本块的代码生成 ( 在一个基本块范围内考虑如何充分利用寄存器的问题 ) 从 dag 生成代码. 11.1 代码生成要考虑的主要问题. —— 具体细节依赖于目标机器和操作系统. 共同的问题:. 充分利用寄存器基本块中全局寄存器分配: 不把寄存器平均分配给各个变量使用,而是从可用的寄存器中分出几个,固定分配给几个变量单独使用。 标准: 以各变量在 循环内 需要访问 主存单元 的 次数 为标准。 选择计算机指令系统 选择计算次序. 目标代码的三种形式. 地址代真的机器代码 待装配的机器代码模块

haley
Télécharger la présentation

第十一章 代码生成

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十一章 代码生成 • 代码生成要考虑的主要问题 • 基本块的代码生成(在一个基本块范围内考虑如何充分利用寄存器的问题) • 从dag生成代码

  2. 11.1 代码生成要考虑的主要问题 ——具体细节依赖于目标机器和操作系统 共同的问题: • 充分利用寄存器基本块中全局寄存器分配: 不把寄存器平均分配给各个变量使用,而是从可用的寄存器中分出几个,固定分配给几个变量单独使用。 标准:以各变量在循环内需要访问主存单元的次数为标准。 • 选择计算机指令系统 • 选择计算次序

  3. 目标代码的三种形式 • 地址代真的机器代码 • 待装配的机器代码模块 • 汇编语言(宏汇编) 机器指令开销 (cost) MOV R,M 开销 2 ADD #1 ,R 开销 2 MOV R0,R1 开销 1 机器指令形式 (op source ,destination) ADD s,d // d+s SUB s,d //d-s MOV s,d //s  d

  4. 地址方式 汇编形式 地址 增加的开销 目标机器的地址方式 M M 1 直接地址方式 R R 0 寄存器方式 *R contents(R) 0 间接寄存器方式 c(R) c+contents(R) 1 索引方式 *c(R) contents( c+contents(R)) 1 间接索引方式

  5. 例1:a:=b+c 1. MOV b, R0 ADD c, R0cost=6 MOV R0, a 2. MOV b, a ADD c, a cost=6 假定R0, R1和R2中分别存放了a, b和c的地址, 采用: 3. MOV *R1, *R0 ADD *R2, *R0cost=2 假定R1和R2中分别包含b和c的值, 并且b的值在这个赋值以后不再需要, 则还可有 4. ADD R2, R1 MOV R1, a cost=3

  6. 例2: T4:=A+B-(E-(C+D)) T1:= A+B T2:= C+D T3:= E-T2 T4:= T1-T3 MOV A,R0 ADD B,R0 MOV C,R1 ADD D,R1 MOV R0,T1 MOV E, R0 SUB R1,R0 MOV T1,R1 SUB R0,R1 MOV R1, T4 MOV C,R0 ADD D,R0 MOV E,R1 SUB R0,R1 MOV A,R0 ADD B, R0 SUB R1,R0 MOV R0,T4 或 T2:= C+D T3:= E-T2 T1:= A+B T4:= T1-T3

  7. 11.2 简单的代码生成器 (基本块内) 在一个基本块范围内考虑如何充分利用寄存器的问题: • 尽可能地让该变量的值保留在寄存器中 • 尽可能引用变量在寄存器中的值 待用信息:若在一个基本块中,变量A在四元式i中被定值,在i后面的四元式j中要引用A值,且从i到j之间没有其它对A的定值点,这时我们称j是四元式i中对变量A的待用信息或称下次引用信息,同时也称A是活跃的,若A被多次引用则可构成待用信息链与活跃信息链。 可从基本块的出口由后向前扫描,对每个变量建立相应的待用信息链和活跃变量信息链。

  8. 计算待用信息的算法: 1 符号表中增加“待用信息”栏和“活跃信息”栏 对各基本块的符号表中的“待用信息”栏和“活跃信息”栏置初值,即把“待用信息”栏置“非待用”,对“活跃信息”栏按在基本块出口处是否为活跃而置成“活跃”或“非活跃”。 这里假定变量都是活跃的,临时变量都是非活跃的。

  9. 2 从基本块出口到基本块入口由后向前依次处理每个四元式。对每个四元式i: A:=B op C,依次执行下述步骤: • 把符号表中变量A的待用信息和活跃信息附加到四元式上。 • 把符号表中变量A的待用信息栏和活跃信息栏分别置为“非待用”和“非活跃”。(由于在i中对A的定值只能在i以后的四元式才能引用,因而对i以前的四元式来说A是不活跃也不可能是待用的) • 把符号表中变量B和C的待用信息和活跃信息附加到四元式i上。 • 把符号表中变量B和C的待用信息栏置为“i”,活跃信息栏置为“活跃”。 • 注意,以上1)和2),3)和4)的次序不能颠倒。

  10. 例: 若用A,B,C,D表示变量,用T,U,V表示中间变量,有四元式如下: • (1)T:=A-B • (2)U:=A-C • (3)V:=T+U • (4)D:=V+U • 其名字表中的待用信息和活跃信息如下表, • 用“F”表示“非待用”“非活跃”, • 用“L”表示活跃。 • (1)(2)(3)(4)表示四元式序号。

  11. 变量名 待用信息 活跃信息 初值 待用信息链 初值 活跃信息链 A F (2) (1) L L L B F (1) L L C F (2) L L D F F L F T F (3) F F L F U F (4) (3) F F L L F V F (4) F F L F 待用信息和活跃信息 • 表中“待用信息链”与“活跃信息链”的每列从左至右为每从后向前扫描一个四元式时相应变量的信息变化情况,空白处为没变化。 • 待用信息和活跃信息在四元式上的标记如下所示: • (1) T(3)L:=A(2)L-BFL (2) U(3)L:=AFL-CFL • (3) V(4)L:=TFF+U(4)L (4) DFL:=VFF+UFF

  12. 寄存器描述和地址描述 • 为随时掌握各寄存器的情况, • 寄存器描述数组RVALUE: 描述每个寄存器当前的状况 • 变量地址描述数组AVALUE:表示变量的存放情况 • 基本块的代码生成算法 • 假设只有A:=B op C的四元式序列 • A) 对每个四元式i: A:=B op C,依次执行下述步骤: • a)以四元式i: A:=B op C为参数,调用过程getreg(i: A:=B op C)。从getreg返回时,得到一寄存器R,用它作存放A现行值的寄存器; • b)利用AVALUE[B]和AVALUE[C],确定出B和C现行值存放位置B`和C`,如果其现行值在寄存器中,则把寄存器取作B`和C`;

  13.        1) 如B`≠R,则生成目标代码 • LD R , B` • op R , C` • 否则,生成目标代码 op R,C` • 如B`或C`为R,则删除AVALUE[B]或AVALUE[C]中的R • 2) 令AVALUE[B]={R},并令RVALUE[R]={A},以表示变量A的现行值只在R中并且R中的值只代表A的现行值; • 3) 如B或C的现行值在基本块中不再被引用,它们也不是基本块出口之后的活跃变量(由四元式i上的附加信息知道),并且其现行值在某个寄存器Rk中,则删除RVALUE[Rk]中的B或C以及AVALUE[B]或AVALUE[C]中的Rk,使该寄存器不再为B或C所占用。 • B) 处理完基本块中所有四元式之后,对现行值在某寄存器R中的每个变量M,若它在出口之后使活跃的,则生成STR, M,放到主存中。

  14. d:=(a-b)+(a-c)+(a-c) t:=a-b u:=a-c v:=t+u d:=v+u 其中假定d在基本块的出口是活跃的。

  15. 语句 生成的代码 寄存器描述器 地址描述器 t: = a-b MOV a,R0 SUB b,R0 空寄存器 R0包含t t在R0中 u: = a-c MOV a,R1 SUB c,R1 R0包含t R1包含u t在R0中 u在R1中 v: = t+u ADD R1,R0 R0包含v R1包含u u在R1中 v在R0中 d: = v+u ADD R1,R0 MOV R0,d R0包含d d在R0中 d在R0中和存储器中 代码序列

  16. 11. 3 从dag生成目标代码 例:赋值语句T4:=A+B-(E-(C+D)) 四元式序列G T1:=A+B T2:=C+D T3:=E-T2 T4:=T1-T3 MOV A,R0 ADD B,R0 MOV C,R1 ADD D,R1 MOV R0,T1 MOV E, R0 SUB R1,R0 MOV T1,R1 SUB R0,R1 MOV R1, T4 DAG n9 T4 - n8 n3 T1 T3 - + n1 n7 n6 n2 T2 + A B E n4 n5 C D

  17. T2:=C+D MOV C,R0 T3:=E-T2 ADD D,R0 T1:= A+B MOV E,R1 T4:=T1-T3 SUB R0,R1 MOV A,R0 ADD B, R0 SUB R1,R0 MOV R0,T4 T4的计算紧跟在T1之后

  18. 尽可能使一个结点的求值紧接着它的最左变量的求值之后尽可能使一个结点的求值紧接着它的最左变量的求值之后 启发式排序算法 (1) while存在未列入表的内部结点do (2) begin选取一个未列入表的但其全部父结点均已列 入表的结点n; (3) 将n列入表中; (4) while n的最左子结点m不是叶结点并且其所有 父结点均已列入表中do (5) begin将m列入表中; (6) n: =m (7) end (8) end

  19. 基于树重写的代码生成 例: : = ind + + Memb const1 + ind consta regsp + regsp consti

  20. regi + {ADD Rj,Ri} regi regj

  21. : = ind + Memb const1 + ind reg0 + consti regSP

  22. MOV #a, R0 ADD SP, R0 ADD i(SP),R0 MOV b,R1 INC R1 MOV R1, *R0

  23. 编译程序要求: 1. 概述: 源、目标语言 实现工具(平台) 运行平台 2. 结构设计说明 各功能模块描述 3. 主要成分描述 (1) 符号表 (2) 运行时存储组织和管理 (3) 语法分析方法 (4) 中间代码表示 4. 开发过程和完成情况

  24. 补充1:程序设计语言的计算模型 l命令式或过程式语言 l应用式(Applicative)或函数式 应用式语言:Lisp和ML 语法:function n(……function 2(function 1(data))……) 一个个函数应用在数据上的变换,最终得到一个结果。 l基于规则(rule_based)的和面向对象的(object_oriented) 程序的执行式通过检查使能条件,决定执行一个适当的动作。如prolog,yacc 语法:使能条件1 →动作1 使能条件2 →动作2 .. 使能条件 n →动作n

  25. O-O程序设计已经变成越来越重要的计算模式;面向对象的程序设计语言支持抽象数据类型和继承性,即将数据和对数据的操作放在一起,定义一组具有公共行为属性和数据类型的对象,由类机制将这组对象给予抽象表示。O-O程序设计已经变成越来越重要的计算模式;面向对象的程序设计语言支持抽象数据类型和继承性,即将数据和对数据的操作放在一起,定义一组具有公共行为属性和数据类型的对象,由类机制将这组对象给予抽象表示。

  26. 补充2:语言应用环境 四种应用环境:批处理环境,交互环境,嵌入式系统和编程环境 l批处理环境:一个程序输入一组数据文件,处理这些数据,然后生成一组输出文件。 l交互环境:程序在执行过程中直接和用户在显示控制台上交互,不断从键盘或鼠标接受输入,将输出发送到显示器上。 l嵌入式系统环境: 1.没有操作系统,没有文件,直接和非标准的I/O设备交互; 2.出错处理非常重要; 3.常常是实时地操作; 4.常常是一个分布式系统(并行) 描述并行任务的语言——并行编译系统

  27. l程序设计实现环境 环境包括 编辑器(editors) 调试器(debuggers) 验证(verifiers) 测试数据(test data generator) 打印 (pretty printers) 语言设计: 1.帮助独立编译(seperate compilation)和成分(component)汇编(assemblly) 2.可设断点,追踪执行,帮助程序测试和debugging

More Related