编译原理 第十一章 目标代码生成

合集下载

编译原理目标代码生成

编译原理目标代码生成

中间代码生成
探讨中间代码的概念、作用和生成方法,包括抽象语法 树、三地址代码等中间表示形式。
代码优化
介绍代码优化的原理和常用技术,如常量折叠、复制传 播、死代码删除等,以提高目标代码的质量。
目标代码生成
详细讲解目标代码生成的过程和方法,包括指令选择、 寄存器分配、汇编语言输出等关键步骤,以及针对不同 目标平台的优化策略。
语义分析
介绍了语义分析的基本任务,如类型 检查、控制流分析、数据流分析等。
中间代码生成
阐述了中间代码的概念、作用及生 成方法,包括抽象语法树、三地址 代码等。
目标代码生成
详细讲解了目标代码生成的过程, 包括指令选择、寄存器分配、优化 等。
对未来编译技术的展望
智能化编译技术
随着人工智能技术的发展,未来编译器可能具备更强的自 主学习能力,能够自动优化代码性能、提高编译效率。
01
指令选择算法
根据目标计算机的指令集和程序语义, 选择最合适的指令来实现程序功能。
02
03
代码优化算法
通过对生成的机器相关代码进行各种 优化(如常量折叠、循环展开等), 提高其执行效率和资源利用率。
06
代码生成器的设计与实现
代码生成器的结构
中间代码生成器
将源程序转换为中间代码形式,便于后续优化和代码生成。
2
编译过程包括词法分析、语法分析、语义分析、 中间代码生成、代码优化和目标代码生成等阶段。
3
编译原理不仅关注如何生成高效的目标代码,还 关注如何提高编译器的可维护性、可移植性和可 扩展性。
目标代码生成的意义
提高程序执行效率
目标代码是计算机直接执行的指令,其执行效率远高于高级语言程序。通过优化目标代码 ,可以提高程序的执行速度。

第十一章 目标代码生成

第十一章  目标代码生成

逻辑 运算
LT(<),GT(>),EQ(==),LE(<=),GE(>=),NE(!=) AND(&&),OR(||),NO(!)
8
基本问题
4.寄存器分配
在一个基本块范围内考虑如何充分利用寄存器的问题: 尽可能地让该变量的值保留在寄存器中 尽可能引用变量在寄存器中的值 待用信息:若在一个基本块中,变量A在四元式i中被定值,在i 后面的四元式j中要引用A值,且从i到j之间没有其它对A的定值 点,这是我们称j是四元式i中对A的待用信息,同时称A是活跃 的。若A被多次引用则可构成待用信息链和活跃信息链。可从 基本块的出口由后向前扫描,对每个变量建立相应的待用信息 链和活跃变量信息链。
程序设计语言编译原理——
第十一章 目标代码生成
编译程序的最后一个阶段。它以源程序 的中间代码作为输入, 并产生等价的目标程序作为输出。
李伟生 信科大厦19楼 Tel:62471342 liws@
1
第11章
目标代码生成
内容提要:
11.1 基本问题 11.2 一个简单代码生成器
2
概述
目标生成是编译的最后一个阶段,其功能可表示如下: 中间代码 目标生成 目标代码
符号表
其中, 中间代码——逆波兰式,三元式,四元式,语义树;… 。 目标代码——机器语言,汇编语言,… 符号表——变量的语义词典,…
3
概述
目标代码的形式 能够立即执行的机器语言代码,左右地址均已定位; 待装配的机器语言模块。当需要执行时,由连接装入程序把它 们和某些运行程序连接起来,转换成能执行的机器语言代码。 汇编程序代码,尚需经过汇编程序汇编,转换成可执行的机器 代码语言。
1.代码生成器的输入

编译原理实验:目标代码的生成

编译原理实验:目标代码的生成

5. 目标代码生成本章实验为实验四,是最后一次实验,其任务是在词法分析、语法分析、语义分析和中间代码生成程序的基础上,将C 源代码翻译为MIPS32指令序列(可以包含伪指令),并在SPIM Simulator上运行。

当你完成实验四之后,你就拥有了一个自己独立编写、可以实际运行的编译器。

选择MIPS作为目标体系结构是因为它属于RISC范畴,与x86等体系结构相比形式简单便于我们处理。

如果你对于MIPS体系结构或汇编语言不熟悉并不要紧,我们会提供详细的参考资料。

需要注意的是,由于本次实验的代码会与之前实验中你已经写好的代码进行对接,因此保持一个良好的代码风格、系统地设计代码结构和各模块之间的接口对于整个实验来讲相当重要。

5.1 实验内容5.1.1 实验要求为了完成实验四,我们建议你首先下载并安装SPIM Simulator用于对生成的目标代码进行检查和调试,SPIM Simulator的官方下载地址为:/~larus/spim.html。

这是由原Wisconsin-Madison的Jame Larus教授(现在在微软)领导编写的一个功能强大的MIPS32汇编语言的汇编器和模拟器,其最新的图形界面版本QtSPIM由于使用了Qt组件因而可以在各大操作系统平台如Windows、Linux、Mac等上运行,推荐安装。

我们会在后面介绍有关SPIM Simulator的使用方法。

你需要做的就是将实验三中得到的中间代码经过与具体体系结构相关的指令选择、寄存器选择以及栈管理之后,转换为MIPS32汇编代码。

我们要求你的程序能输出正确的汇编代码。

“正确”是指该汇编代码在SPIM Simulator(命令行或Qt版本均可)上运行结果正确。

因此,以下几个方面不属于检查范围:1)寄存器的使用与指派可以不必遵循MIPS32的约定。

只要不影响在SPIM Simulator中的正常运行,你可以随意分配MIPS体系结构中的32个通用寄存器,而不必在意哪些寄存器应该存放参数、哪些存放返回值、哪些由调用者负责保存、哪些由被调用者负责保存,等等。

《编译原理-刘善梅》第11章 代码生成

《编译原理-刘善梅》第11章  代码生成
尽可能留:在生成计算某变量值的目标代码 时,尽可能让该变量保留在寄存器中。
尽可能用:后续的目标代码尽可能引用变量 在寄存器中的值,而不访问内存。
及时腾空:在离开基本块时,把存在寄存器 中的现行的值放到主存中。
ppt课件
15
11.3.1 待用信息
如果在一个基本块内,四元式i对A定值, 四元式j要引用A值,而从i到j之间没有A 的其他定值,那么,我们称j是四元式i的 变量A的待用信息。(即下一个引用点)
编译原理
第十一章 代码生成
ppt课件
1
源程序
词法分析器
符 号
语法分析器
错 误



语义分析器



中间代码生成器
代码优化器
代码生成器
ppt课件
2
第十一章 代码生成
基本问题 目标机器模型 一个简单代码生成器
ppt课件
3
代码生成是把语法分析后或优化后的中间代 码变换成目标代码。
目标代码一般有以下三种形式:
(4) W:=V+U (^,y)
(^,^)
(^,^)
(3) V:=T+U (4,y)
(^,^)
(4,y)
(2) U:=A-C (3,y) (1) T:=A-B (3,y)
(^,^) (2,y)
(^,^) (^,^)
变量名 T A B C U V W
初始状态→信息链(待用/活跃信息栏) (^,^) → (3,y) → (^,^) (^,^) → (2,y) → (1,y) (^,^) → (1,y) (^,^) → (2,y) (^,^) → (4,y) → (3,y) → (^,^) (^,^) → (4,y) → (^,^) (^,y) → (^,^)

编译原理中的目标代码生成与优化

编译原理中的目标代码生成与优化

编译原理中的目标代码生成与优化编译原理是计算机科学中的一门重要课程,它研究的是将高级程序语言转化为机器语言的过程。

目标代码生成与优化是编译过程中的两个关键环节,本文将就这两个方面展开讨论。

一、目标代码生成目标代码生成是编译过程中的最后一步,它的任务是将中间代码转化为能够在目标机器上执行的机器代码。

目标代码生成的质量直接影响程序的执行效率和占用的存储空间。

1. 寄存器分配在进行目标代码生成之前,我们需要进行寄存器分配。

寄存器分配的目的是将中间代码中的临时变量分配到机器寄存器中,减少内存读写操作,提高程序的运行速度。

常用的寄存器分配算法有线性扫描算法和图着色法。

2. 目标代码生成技术目标代码生成的技术有很多,下面列举几种常见的技术:(1) 直接生成代码:直接将中间代码翻译为目标机器的指令序列。

这种方法简单直接,但生成的目标代码质量一般较低。

(2) 间接生成代码:先将中间代码翻译为一个中间形式,再将中间形式转化为目标机器的指令序列。

这种方法可以进行一些优化,生成的目标代码质量较高。

(3) 使用代码模板:事先定义一些目标机器的指令模板,并根据中间代码的特征选择合适的指令模板来生成目标代码。

这种方法可以充分利用目标机器的特性,生成的目标代码效率较高。

二、目标代码优化目标代码优化是指对生成的目标代码进行一系列的优化,以提高程序的运行效率和减少代码的空间占用。

1. 基本块优化基本块是由顺序执行的指令组成的,没有前驱指令和后继指令的指令序列。

基本块优化的目的是对基本块中的指令进行优化,以减少执行时间和空间开销。

常见的基本块优化技术有死代码删除、常量传播等。

2. 寄存器优化寄存器是计算机中的一块高速存储器,能够提供快速的数据访问速度。

寄存器优化的目的是将变量尽可能地存放在寄存器中,以减少内存读写操作,提高程序的执行效率。

常用的寄存器优化技术有寄存器分配、寄存器重命名等。

3. 循环优化循环是程序中的重要结构之一,对循环进行优化可以显著提高程序的执行效率。

编译原理代码生成(new)

编译原理代码生成(new)

+ +
:=
:=
i +i +
i 1i 1
:= i+
i1
例题2
按一般的代码生成,i = i +1的计算结果保留在 寄存器中,因此这三个i = i +1的计算次序不会 影响最终的结果。结果应该是6。
结果是7的话,一定是 某个i = i +1的结果未保 留在寄存器中。上层 计算对它的引用落在 计算另一个i = i +1的 后面
的寄存器R(可能产生MOV R,M指令,并修改 M的描述 ) 否则,如果x在基本块中不再引用,或者找不到适当的被占用寄存器,选择x的内存单
元作为L。
11.4 一个简单的代码生成器
赋值语句d := (a b) + (a c) + (a c)
编译产生三地址语句序列: t1 := a b t2 := a c t3 := t1 + t2 d := t3 + t2
代码生成
本章内容 一个简单的代码生成算法 涉及存储管理,指令选择,寄存器分配和计算次序选择等基本问题
源程序
中间 前端 代码
代 码 中间 代码
优 化 代码 生成


目标 程序
11.1 代码生成器的设计中的问题
11.1.1 目标程序 可执行目标模块 可重定位目标模块
允许程序模块分别编译 调用其它先前编译好的程序模块
+ +
:=
:=
i +i +
i 1i 1
:= i+
i1
例题2
如果机器有INC指令的话,编译器极可能产生一条INC指令来完成i = i +1 X86/Linux机器上果真是这么做的

编译原理 目标代码生成 流程代码解析

编译原理 目标代码生成 流程代码解析

N
将栈中元素存到数 组,出栈
目标代码生成流程图:
6
开始 扫描逆波兰式
结束
Y
逆波兰式扫
描完
N
滤掉逆波兰式中 逗号
当前字符串为是否 不为运算分量,逗号
Y
当前字符存入数 组
Y N
当前字符串为是 否不为运算分量
N
当前字符串是 否为运算分量
N是否为寄存器, 用@等字符代表寄存器
MOV
传送字或字节.
算术运算指令
ADD
加法
算术运算指令
SUB
减法
算术运算指令
MUL
无符号乘法
算术运算指令
DIV
无符号除法
……
……
……
5. 实验代码
/******************************************************************************/ #include<iostream> #include<string> #include<stack> using namespace std; string temp1(8,0),temp2(8,0),value1; /******************************************************************************/ bool Ispair(string expre) { bool flag=true; stack<char> s; for(int i=0;i<expre.length();i++) { if(expre[i]=='(') s.push(expre[i]); if(expre[i]==')') { if(s.empty()) { flag=false; return flag; }

编译原理lxy第11章

编译原理lxy第11章

第2页
编译原理 11.1
代码生成器的输入
基本问题
目标程序
指令选择寄存器分配
计算顺序选择
第3页
编译原理 11.2 目标机器模型
假设目标计算机有下列指令形式
第4页
编译原理 指令的意义: 指令的意义:
第5页
编译原理 11.3 一个简单的代码生成器
将每条中间代码变换成目标代码,并在一个基本块范围内考虑充分利用寄存器问题。 将每条中间代码变换成目标代码, 并在一个基本块范围内考虑充分利用寄存器问题。 A:=(B+C)*D+E 例: 高级语言 中间代码 T1:=B+C T2:=T1*D A:=T2+E (1) LD ) R,B (2) ADD R,C (3) ST R,T1 (4) LD R,T1 (5) MUL R,D (6) ST R,T2 (7) LD R,T2 (8) ADD R,E R,A (9)ST 优化: (1) 优化: ) (2) (3) 3 ( 4) (5) LD ADD MUL ADD ST R,B R,C R,D R,E R,A
代码生成算法 假设中间代码形为: 假设中间代码形为: A:=B op C 基本块代码生成算法:对每个中间代码依次执行: 基本块代码生成算法:对每个中间代码依次执行: 315页 (见P315页)
第11页
编译原理 目标代码: 目标代码:
对例11.1假设只有 和R1是可用寄存器,用上算法生成的目标代码和相 假设只有R0和 是可用寄存器 是可用寄存器, 对例 假设只有 应的RVALUE和AVALUE如下表: 如下表: 应的 和 如下表
第7页
编译原理
考察基本块: 考察基本块: T:=A-B U:=A-C V:=T+U W:=V+U W是基本块出口的活跃变量,则有下表

目标代码生成(1)

目标代码生成(1)
表示后面的CB符号((对^^,,^^代))→→替((前21,,yy面)) 的符号对
U (^,^)→(4,y)→(3,y)→(^,^)
V (^,^)→(4,y)→(^,^)
W (^,y)→(^,^)
19
待用信息和活跃信息的表示
(x, x)表示变量的待用信息和活跃信息
第1元
i表示待用信息, ^表示非待用
(^,^)
右操作数
(^,^)
(^,^)
(4,y) (^,^)
2. 从基本块出口到入口由后向前依次处理各个四 元式。对每一个四元式i:A:=B op C,依次执行:
1) 把符号表中变量A的待用信息和活跃信息附加 到四元式i上
2) 把符号表中A的待用信息和活跃信息分别置为 “非待用”和“非活跃”
3) 把符号表中变量B和C的待用信息和活跃信息附 加到四元式i上
4
代码生成
代码生成
把语法分析后或优化后的中间代码变换成目标代码
目标代码的三种形式
绝对指令代码:能够立即执行的机器语言代码,所有地址 已经定位
可重新定位指令代码:待装配的机器语言模块,执行时, 由连接装配程序把它们和某些运行程序连接起来,转换成 能执行的机器语言代码
汇编指令代码:尚须经过汇编程序汇编,转换成可执行的 机器语言代码
4) 把符号表中B和C的待用信息均置为i,活跃信 息均置为“活跃”
23
例:基本块 1. T:=A-B 2. U:=A-C 3. V:=T+U 4. W:=V+U
设W是基本块出口之后的活跃变量。 建立待用信息链表与活跃变量信息链表如下:
24
附加在四元式上的待用/活跃信息表
序号 四元式 左值 左操作数 右操作数

编译原理 目标代码生成

编译原理 目标代码生成

11.1 代码生成器的设计中的问题
若不考虑目标程序的效率,指令的选择是直 截了当的。
三地址语句x := y + z(x,y和z都是静态分配) MOV y, R0 /* 把y装入寄存器R0 */ ADD z, R0 /* z加到R0上 */ MOV R0, x /* 把R0存入x中 */
11.1 代码生成器的设计中的问题
11.1 代码生成器的设计中的问题
11.1.4 计算次序的选择 某种计算次序可能会比其它次序需要较少的 寄存器来保存中间结果
11.2 目 标 机 器
11.2.1 目标机器的指令系统 选择可作为几种微机代表的寄存器机器 四字节组成一个字,有n个通用寄存器R0,R1,
…,Rn-1。 二地址指令 op 源,目的
• 每个入口语句到下一个入口语句之前的语 句序列构成一个基本块
11.3 基本块和流图
(1) prod := 0
(2) i := 1
(3) t1 := 4* i (4) t2:= a[t1] (5 ) t3 := 4* i (6 ) t4 := b[t3] (7 ) t5 := t2 * t4 (8 ) t6 := prod + t5 (9 ) prod := t6 (10) t7 := i +1 (11) i := t7 (12 ) if i <= 20 goto (3)
• 对每个基本块从最后一个语句反向扫描到 第一个语句,可以得到下次引用信息
i: x := y op z
...
--没有对x的赋值
j: … := x …
...
--没有对x的
赋值
k: … := … x
• 利 用 下 次 引 用 信 息 , 可 以 压 缩 临 时 变 量 需

编译原理之代码生成

编译原理之代码生成

03
04
05
1. 语法分析:根据语言 2. 语义分析:对抽象语
的语法规则,将源程序 法树进行语义检查和处
解析成抽象语法树
理,包括类型检查、符
(Abstract Syntax Tree,号表管理等。
AST)。
3. 中间代码生成:根据 抽象语法树和语义分析 结果,生成中间代码。 常见的中间代码形式有 三地址码、静态单赋值 形式(Static Single Assignment,SSA)等。
运行时系统自动管理程序中的内存资源, 通过垃圾回收机制回收不再使用的内存空 间,防止内存泄漏和野指针等问题。
运行时系统对程序性能的影响和优化
性能影响
运行时系统的设计和实现会直接影响程序的性能。例如,垃圾回收算法的选择和实现会 影响内存的回收效率和程序的暂停时间。线程调度策略的选择也会影响程序的并发性能
编译原理是计算机科学的重要分支,对于理解计算机如何执行程序以及如何提高程 序执行效率具有重要意义。
代码生成在编译过程中的作用
代码生成是编译过程的最后阶段, 负责将中间代码或优化后的代码 转换为目标机器上的可执行代码。
代码生成器需要了解目标机器的 指令集、寄存器分配、内存管理 等相关知识,以生成高效且正确
中间代码在编译器中的 作用主要有以下几点
使得编译过程分为相对 独立的前端和后端,降 低了编译器的复杂性。
提供了统一的中间表示, 便于实现不同语言之间 有利于进行各种优化操 的互操作性。 作。
ห้องสมุดไป่ตู้
中间代码生成的算法和步骤
01
02
中间代码生成的主要算 法包括语法分析、语义 分析和中间代码生成三 个步骤。
具体步骤如下
代码生成器的测试和评估方法

编译原理考试知识点复习

编译原理考试知识点复习

第一章:编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。

解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。

编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。

解释程序和编译程序的根本区别:是否生成目标代码第三章:Chomsky对文法中的规则施加不同限制,将文法和语言分为四大类:0型文法(PSG)◊ 0型语言或短语结构语言文法G的每个产生式α→β中:若α∈V*VNV*, β∈(VN∪VT)* ,则G是0型文法,即短语结构文法。

1型文法(CSG)◊ 1型语言或上下文有关语言在0型文法的基础上:若产生式集合中所有|α|≤|β|,除S→ε(空串)外,则G是1型文法,即:上下文有关文法另一种定义:文法G的每一个产生式具有下列形式:αAδ→αβδ,其中α、δ∈V*,A∈VN,β∈V+;2型文法(CFG)◊ 2型语言或上下文无关语言文法G的每个产生式A→α,若A∈VN ,α∈(VN∪VT)*,则G是2型法,即:上下文无关文法。

3型文法(RG)◊ 3型语言或正则(正规)语言若A、B∈VN,a∈VT或ε,右线性文法:若产生式为A→aB或A→a左线性文法:若产生式为A→Ba或A→a都是3型文法(即:正规文法)最左(最右)推导在推导的任何一步α⇒β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换规范推导:即最右推导。

规范句型:由规范推导所得的句型。

句子的二义性(这里的二义性是指语法结构上的。

)文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。

文法的二义性一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。

深入学习:掌握编译原理与目标代码生成

深入学习:掌握编译原理与目标代码生成

深入学习:掌握编译原理与目标代码生成编译原理与目标代码生成是计算机科学与软件工程领域非常重要的一部分。

在这个领域中,我们研究的是将程序代码转换为可执行代码的过程,这涉及到了词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等一系列的技术和算法。

编译器是实现编译过程的工具,它将高级语言源代码转换为机器可执行的目标代码。

而编译过程中的关键环节即为目标代码生成,它是将中间代码转换为特定硬件平台上可执行的机器代码的过程。

编译原理的研究从上世纪50年代开始,经历了多个阶段的发展。

早期的编译器通过逐行读取源代码,然后将其转换为汇编语言或机器码。

随着计算机硬件的发展和编程语言的演化,编译器的设计和实现也发生了重大变化。

编译原理的核心概念之一是语法分析,它将源代码转换为抽象语法树(AST)。

语法分析器通过识别词法单元(如关键字、标识符、操作符等)来构建AST,并使用上下文无关文法来定义语法结构。

常见的语法分析算法有递归下降分析和LR分析。

语义分析是编译过程中的另一个重要环节,它确保程序在语义上是正确的。

语义分析器会检查源代码中的类型错误、作用域错误、类型转换错误等,并为后续的代码生成阶段提供必要的信息和约束条件。

中间代码生成是编译器的一个重要步骤,它将AST转换为一种中间表示形式,例如三地址码或者虚拟机指令。

中间代码是对源代码的一种抽象表示,它简化了后续代码生成和优化的过程,并为优化算法提供了更好的机会。

代码优化是编译过程中的重要环节,它旨在提高目标代码的性能和效率。

代码优化器使用各种技术和算法,例如常量折叠、循环优化、指令调度等,来改进目标代码的执行效率。

最后一个环节是目标代码生成,它将中间代码转化为特定硬件平台的机器代码。

目标代码生成器需要考虑到硬件平台的特点和限制,并根据目标机器的指令集架构来生成高效的机器代码。

目标代码生成是编译器的最终阶段,它决定了程序的最终执行效果。

一个好的目标代码生成器应该可以充分利用硬件资源,减少指令的数目和执行时间,从而提升程序的性能。

第11 章目标代码生成

第11 章目标代码生成

第十一章目标代码生成知识结构:代码生成概述可执行机器代码目标代码的形式汇编语言代码目标代码生成机器语言浮动模块目标机器模型代码生成算法第一节基本问题一、研究目标代码生成的关键问题充分利用硬件的有效资源生成有效的目标代码。

1、生成目标代码时如何选择指令,使生成的目标代码较短。

例:三地址代码a:=a+1翻译为:LD R0, a 或 INC aADD R0, #1ST R0, a2、如何充分利用寄存器,减少目标代码访问内存次数二、目标代码的形式1、可执行机器代码(静态定位)。

特点:①占用存储空间的固定位置,生成目标代码,就可直接执行;②不能进行各模块的独立编译,对源程序只能一次性编译;③灵活性较差。

2、机器语言浮动模块,由连接程序把某些运行程序连接起来,转换成机器语言。

特点:①生成目标代码有较大的灵活性,可以随机分配内存;②连接是消耗一些系统时间。

3、汇编语言代码。

特点:①是从汇编语言到目标代码的转换,实现比较容易,并有利于软件移植;②需要两次翻译过程。

三、代码生成器的输入代码生成器的输入包括源程序的中间表示以及符号表中的信息。

1、利用符号表中的信息来决定在中间代码中的名字所指示的数据对象的运行地址。

目标程序例 X :=Y + Z 其中:X ,Y ,Z 对应的地址分别为t 0,t 0+1,t 0+2。

符号表 t 0 t 0+1 t 0+2 0 ADD R 0 ZST R 0 X —送数2、在语义检查时发现了一些明显的错误,并加入了类型转换操作,可假设代码生成阶段的输入没有错误。

四、指令的选择生成的代码质量取决于它的速度和大小,因此,指令集的一致性和完整性,指令速度和机器用语是非常重要的。

五、寄存器分配如何充分利用寄存器,对于生成好的代码是非常重要的。

1、在寄存器分配期间,为程序的某一点选择驻留在寄存器中的一组变量;2、在随后的寄存器指派阶段,挑出变量将要驻留的具体寄存器。

六、计算顺序选择计算的顺序会影响目标代码的有效性和代码的执行效率。

编译原理 第十一章 目标代码生成

编译原理 第十一章 目标代码生成

在选择指令时应注意以下几方面内容: 指令集的一致性和完整性 指令速度和机器用语 每种类型中间代码的代码框架 生成的代码的质量——取决于代码的速度和大小
充分利用计算机的寄存器对于生成好的代码是非常重要的。
寄存器的使用可分为两个子问题:
(1) 在寄存器分配期间,为程序的某 一点选择驻留在寄存器中的一组变量
所有地址均已定位,通常存放 需在要固执定行的时存,储进区行中连接,转换 为可执行的机器语言代码。
编译后可立即执行。节省时间 需需要要连汇接编装程配序程汇序编的,配产合生,可提执 供行但了的缺较机乏多器灵的语活灵言性活代,性码只用在程序不 现生不而长在成需只时大这按需多种二生数形进成实式制相的用形应代的式的码编生符。译成号程代化序码指都,令, 故最易生成。
(Ri)
(Ri) op (Rj )
(Ri)
(Ri) op ((Rj)+c) (Ri)
(Ri) op ((M)) (Ri)
(Ri) op ((Rj )) (Ri)
(Ri) op (((Rj)Fra bibliotekc)) (Ri)
指令
意义
指令
意义
LD Ri , B 取数指令(B)Ri J < X 如CT为0,转X
ST Ri , B 存数指令Ri (B) J ≤ X 如CT为0或1,转X
3.示例
1 T:= A-BB
序号图例:左值 左操作数
1
(3,y)
(2,y)
2 ( (x3,y), x ()^,^)
3
(4,y)
(^,^)
4 待(用^,信y息) 活跃(^信,^息)
右操作数
(^,^) (^,^) (4,y) (^,^)
2 U:= AA-CC 3 V:= T+U 4 W:=VV+UU

目标代码生成(2)

目标代码生成(2)
7
寄存器分配:GETREG(i: A:=B op C) 返回 一个用来存放A的值的寄存器
1. 尽可能用B独占的寄存器 2. 尽可能用空闲寄存器 3. 抢占非空闲寄存器
1 如 果 B 的 现 行 值 在 某 个 寄 存 器 Ri 中 , RVALUE[Ri]中只包含B,此外,或者B与A是同 一个标识符,或者B的现行值在执行四元式 A:=B op C之后不会再引用,则选取Ri为所需 要的寄存器R,并转4;
10
例:基本块 1. T:=A-B 2. U:=A-C 3. V:=T+U 4. W:=V+U
设W是基本块出口之后的活跃变量,只有R0 和R1是可用寄存器,生成的目标代码和相应 的RVALUE和AVALUE:
11
序号 四元式 左值 左操作数 右操作数
(中4)间代W码:=V+目U 标代(^码,y)
2 如果有尚未分配的寄存器,则从中选取一个Ri 为所需要的寄存器R,并转4;
8
1. 尽可能用B所在的寄存器 2. 尽可能用空闲寄存器 3. 抢占非空闲寄存器
3 从已分配的寄存器中选取一个Ri为所需要的寄 存器R。最好使得Ri满足以下条件: 占用Ri的变量的值也同时存放在该变量的贮存 单元中,或者在基本块中要在最远的将来才会 引用到或不会引用到。
13
作业
P327-1
14
1. 尽可能用B独占的寄存器 2. 尽可能用空闲寄存器 3. 抢占非空闲寄存器
6
寄存器分配:GETREG(i: A:=B op C) 返回 一个用来存放A的值的寄存器
1. 尽可能用B独占的寄存器 2. 尽可能用空闲寄存器ቤተ መጻሕፍቲ ባይዱ3. 抢占非空闲寄存器 1 如 果 B 的 现 行 值 在 某 个 寄 存 器 Ri 中 , RVALUE[Ri]中只包含B,此外,或者B与A是同 一个标识符,或者B的现行值在执行四元式 A:=B op C之后不会再引用,则选取Ri为所需 要的寄存器R,并转4;
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.代码生成算法
对每个四元式 i: A := B op C ,依次执行如下步骤:
1. 对A分配寄存器
2. 确定变量B和C现行 值的存放位置B’和C’
若本也活利AB若调G其变块不跃V’EA用B用T返不量中是变L’RU地函E回为或B不基量EG或[址数值再本,BLo(RCC]描DpiR’的被块和:即述为现引出ARRA为V数,,:行用口AR=所L组BBC值,之U’求’Eo在后[p寄C基的]C存)器
《编译原理和技术》(第二版) 陈意云 中国科学技术大学出版社 第8章 第2节
《编译原理及实践》 Kenneth C. Louden (美) 冯博琴 等 译 机械工业出版社 第8章 第7节
Compilers :principles, techniques, and tools (2001),
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第2节
《编译原理和技术》(第二版) 陈意云 中国科学技术大学出版社 第8章 第5节
《编译原理及实践》 Kenneth C. Louden (美) 冯博琴 等 译 机械工业出版社 第8章 第8节
Compilers :principles, techniques, and tools (2001),
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第6节
如将:(4+(R1))之值所指存储 单L元D内R容0 装, 入#1寄存器R0中
将常数1装入寄存器R0中
类型
指令形式
意义
直接地址型 寄存器型 变址型
间接型
op Ri , M op Ri , Rj op Ri , c(Rj) op Ri , *M op Ri , *Rj op Ri , *c(Rj)
(Ri) op (M)
高目级标语代言码
目标代码 中间代码
A :=(1)(LDB +R,BC ) * D + E
(2)ADD R,C
(1)LD R,B
T(21)A:=DDBR+,C C
(3)ST R,T1 (4)LD R,T1 (5)MUL R,D
T(32)M:=ULT1R,*D D
(4)ADD R,E
A(5):S=T TR2,A+ E
中间 代码优化器
代码
目标程序
中中间间
代代码码 代码生成
符号表
代码生成器的输入包括:
源程序的中间表示
各种中间语言:后缀式、四 元式、图表示法、语法树
符号表中的信息
据此可确定数据区中的 相对地址,
进而可以决定名字所指示的 数据对象的运行时地址
代码生成器的输出为目标程序,其有多种形式:
绝对机器代码 可再定位机器代码 汇编语言程序
Crafting a Compiler with C(1991), Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第3节、第15章 第4节
《现代编译程序设计》 冯博琴等译 第4章 第2节 第4小节
一.引例 二.待用信息 三.寄存器描述和地址描述 四.代码生成算法
3.示例
1 T:= A-BB
序号图例:左值 左操作数
1
(3,y)
(2,y)
2 ( (x3,y), x ()^,^)
3
(4,y)
(^,^)
4 待(用^,信y息) 活跃(^信,^息)
右操作数
(^,^) (^,^) (4,y) (^,^)
2 U:= AA-CC 3 V:= T+U 4 W:=VV+UU
变量i 名待用信息(下待一用个信引息用及点活)跃信息
RVALUE
R0中有T
R0中有T R1中有U R0中有V R1中有U R0中有W
AVALUE
T在R0中
T在R0中 U在R1中 V在R0中 U在R1中 W在R0中
因为VT的当前值在R0中,且RVALUE[R0]只包含TV,, 因为U给之且U后T且因因因分分V不T为为为之配之配再ATAV后寄后寄’被’不存不存为不引不为再器再器R为用为R被0,被,0,RR,引R1引R0故故,0,1用用未未生将生故故,,分分成U成生生故故配占配一一成成将将,用,条条两两RR故的故中0中条0条分将分寄将间间目目配R配存R代代标0标1给给分器分码码代代WV配R配码码1给释给T放U 掉
3. 生成目标代码
则寄令将存B或器删C优除占先A用VA的LU寄E[存B]器或释者
4. 更新A的地址描述
放B出’ 就来AVA是。AVLAULREU[EA[]C=]{中R}的R
RVALoUpE[RR],={AC}’
5. 去除非必要的寄存器占用
2.过程GETREG的算法
314.2..从如给如已果出果分BR有,的配尚返现的未回行寄分值存配在器的某中寄寄选存存取器器,Ri则中从,中RV选AL取UE一[个RiR]i只为包所含需B 的寄存器,转4 满足条件: 或者B与A是同一标识符 占用Ri的变量的值,也同时存放在改变 量或的者主B的存现单行元值中之后不会再引用
1.寄存器描述 寄存器分配时,寄存器的情况有:
空闲
已分配给某个变量
已分配给某几个变量(程序中含有复写时)
故建立寄存器描述数组RVALUE 动态记录各寄存器的上述信息。
1.地址描述 代码生成时,变量所处位置有:
仅在某寄存器中
仅在某内存单元中
既在某寄存器中,也在某内存单元中
故建立变量地址描述数组AVALUE 动态记录各个变量现行值的存放位置。
方法:
从后向前扫描,对每个变量建立相应的待用信息链 和活跃信息链。
2.算法
此处 颠倒原算法(1)、(2), 则会出错
2.1.从初基始本化块:的出口到入口由后向前依次处理各个四元式: i: A := A op C
i:(A1):=处将B理各o引p变用C量A、的C符号此表处C中原1和此处)3的活有处)理、待把跃的(跃完4用符信1待))不信信后号息、用息表附可息A(信2栏待中加颠为)不填息变 到用倒“为可量四与信,活“元A颠活息的否跃非式倒跃待为则待”i,用上信i用丢,信因息”失活息B、
J
X
无条件跳转到X J = X 如CT为1,转X
比较指令,
CMP A , B 并根据结果设置
CT
J ≠ X 如CT不为1,转X J > X 如CT为2,转X J ≥ X 如CT为2或1,转X
《程序设计语言 编译原理》(第二版) 陈火旺等 国防工业出版社 第11章 第2节
《编译原理和技术》(第一版) 陈意云 中国科学技术大学出版社 第8章 第6节
在基本块中要在最远的将来才会引用到 则选取或Ri者为不所会需引的用寄到存器,并转4
尽量避免产生读写内存单元的操作代码
3.示例
中间代码 T:=A-B
U:=A-C
V:=T+U
W:=V+U
目标代码
LD SUB LD SUB ADD
R0, A R0, B R1, A R1, C R0, R1
ADD R0, R1
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. 第9章 第1节
Crafting a Compiler with C(1991),
Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第1节
《现代编译程序设计》 冯博琴等译
(Ri)
(Ri) op (Rj )
(Ri)
(Ri) op ((Rj)+c) (Ri)
(Ri) op ((M)) (Ri)
(Ri) op ((Rj )) (Ri)
(Ri) op (((Rj)+c)) (Ri)
指令
意义
指令
意义
LD Ri , B 取数指令(B)Ri J < X 如CT为0,转X
ST Ri , B 存数指令Ri (B) J ≤ X 如CT为0或1,转X
(6)ST R,T2
(7)LD R,T2 (8)ADD R,E (9)ST R,A
此是引考后处引用虑,入,L了目D的故效标指临S率代令T时和码指是变充较令多量分 优也余,利 。是的此用多,后寄余且不存的由会器于被后T12
1.概念
在一个基本块中,四元式i对A定值,四元式j要 引用A值,而从i到j之间,没有A的其他定值,那 么,我们称j是四元式i的变量A的待用信息(即 下一个引用点)。
Crafting a Compiler with C(1991), Charles N. Fischer, Richard J. LeBlanc Jr. 第15章 第2节
《现代编译程序设计》 冯博琴等译 第4章 第2节 第7小节
一.指令的执行代价 二.计算节省的执行代价 三.目标代码的生成
每条指令的执行代价 = 每条指令访问主存单元次数+1
(2) 在随后的寄存器指派阶段,挑出变 量将要驻留的具体寄存器
选择最优的寄存器指派方案是困难的。这是NP完全问题。
计算完成的顺序会影响目标代码的有效性 可改变计算顺序来优化目标代码
《程序设计语言 编译原理》(第二版) 陈火旺等 国防工业出版社 第11章 第1节
《编译原理和技术》(第一版) 陈意云 中国科学技术大学出版社 第8章 第2节
((21))处处根理理据定定出值值口AA的活跃信息2信3信处))填息息把理活为分把和符完跃B别符活号、信后置号跃表息C到为将表信中也栏“代中息AA有的 非待变附码可代待量加用i上用用到B能信和信”四是息C息和元的Ai附和“式待活非i用加上跃活
(2)处理引用B、C
跃”
即此值时,代此这码A处4置是原)i引为1错有把i用),、误的符代活2的待号)码跃不表。用信i可的中信息B颠定息和均倒C置与的,为活待“否跃用活则信信跃丢息息”均失
相关文档
最新文档