编译原理第10章-目标代码生成

合集下载

编译原理目标代码生成

编译原理目标代码生成

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

计算机基础知识点编译原理代码生成

计算机基础知识点编译原理代码生成

计算机基础知识点编译原理代码生成编译原理是计算机科学中非常重要的一门学科,它研究的是如何将高级语言编写的程序转化为机器可以执行的指令序列。

在编译过程中,代码生成是其中一个关键的步骤。

本文将介绍编译原理中的代码生成基础知识点。

一、代码生成概述代码生成是编译过程中的最后一个阶段,它的任务是将中间表示形式(如抽象语法树或中间代码)转化为目标机器代码,使得程序可以在计算机上运行。

代码生成的目标是产生高效且正确的机器指令序列,以最大程度地利用计算机的硬件资源。

代码生成的过程可以分为以下几个步骤:1. 寄存器分配:将变量和临时值分配到计算机的寄存器中,以便在指令中进行操作。

2. 指令选择:根据中间表示的特点和目标机器的指令集,选择适当的机器指令来实现所需的操作。

3. 指令调度:对指令进行重新排序,以减少指令相关性和提高执行效率。

4. 内存分配:将变量和临时值存储到内存中,以便在需要时可以进行访问。

5. 代码优化:对生成的机器指令进行优化,以减少执行时的开销和资源占用。

二、寄存器分配在代码生成的过程中,寄存器分配是一个非常重要的环节。

寄存器是计算机中的一种高速存储设备,可以用于存储和执行指令操作。

在生成的机器代码中,寄存器通常用于存储临时值和计算结果。

寄存器分配的目标是将变量和临时值存储到寄存器中,并进行相应的寄存器的分配和释放。

常见的寄存器分配算法有线性扫描分配算法、图着色分配算法等。

寄存器分配算法的选择通常取决于目标机器的寄存器数量和寄存器之间的互斥关系。

三、指令选择指令选择是代码生成的关键一环,它的任务是根据中间表示和目标机器的指令集,选择合适的机器指令来实现所需的操作。

指令选择的准则通常是从操作数和操作符的角度考虑,以及考虑目标代码的执行效率和可读性。

指令选择的过程中,需要考虑目标机器的指令格式、寻址方式、寄存器约束等因素。

对于一些特殊的操作,如函数调用、跳转指令等,还需要考虑目标代码的控制流程和程序执行的正确性。

优化和目标代码生成(PPT课件)

优化和目标代码生成(PPT课件)

• 代码优化在整个编译过程的位置
源程序 编译前端 中间代码 中间代码生成 中间代码 目标代码生成 目标程序 中间代码 中间代码优化 目标代码优化
程序员和编译器可能改上程序的位置
源程序 编译前端 中间代码 目标代码生成 目标程序
程序员可以改进 算法,改变循环
编译器可以改进过程调 用、循环和地址计算
编译器可以利用寄存器, 选择指令和窥孔优转换
3
7.1.1 数据类型
类型的合法性检查是判断数据类型是否与上下文的要求一致 数据类型是对该类型数据(变量或常量)的取值是否合法以 及对该类型数据的运算是否合法的一种说明。
4
7.1.2 数据结构
一个程序设计语言如允许使用的数组、记录、字符串、 表、栈等形式的数据结构,在编译程序中应为它们提供相 应的翻译。 为了能对数据结构中的元素进行引用,必须完成从逻辑结 构到能够访问这些数据元素的物理结构的映射。应考虑: 1映射算法相对简单,根据逻辑结构容易计算出物理地址 2从逻辑结构投影到物理结构时,不至于超界或存储溢出 3使用的数据结构承担这种程序设计语言的主要功能 4在这些数据结构定义相关的运算
25
• 指令选择
– 一个编译程序可以看成是一个转换系统,它把源程序转换成 等价的目标代码,也就是说,对源语言种各种语言结构,依 据语义确定相应的目标代码结构,即确定源语言于目标语言 之间的对应关系,确保正确实现语义。显然,能否建立这样 的关系直接影响到编译程序的质量。 – 目标机器指令系统的性质决定了指令选择的难以程度,指令 系统的一致性和完备性直接影响到这种对应关系的建立。如 果目标机器能一致地支持各种数据类型和寻址方式,不需特 别处理例外,这种对应关系的建立就容易得多。 – 指令执行速度和机器特点对产生目标代码的质量也十分重要。 显然,如果指令集合丰富的目标机器对于某种操作可提供集 中处理的时候,应该选择效率高、执行速度快的一种。

编译原理作业参考答案

编译原理作业参考答案
(2)
最左推导:NNDDD3D34
NNDNDDDDD5DD56D568
最右推导:NNDN4D434
NNDN8ND8N68D68568
2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。
答:
SCAB|B(考虑了正负号)
A1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 |
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序:能够把某一种语言程序(源语言程序)改变成另一种语言程序(目
标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。
{2,4}a = {1,0},{2,4}b = {3,5},无需划分
{3,5}a = {3,5},{3,5}b = {2,4},无需划分
{0,1}a = {1},{0,1}b = {2,4},无需划分
因此,最终的划分为:{0,1}、{2,4}和{3,5},化简后的结果:
5.(P65,14)构造一个DFA M,它接受={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。
T*(i+i)F*(i+i)i*(i+i)
⑵构造语法树
E最左推导构造语法树
E + T
E + T i
T i
i
3.(P36, 9)证明下面的文法是二义的:
SiSeS | iSi
答:对于句子iiiei有两棵不同的语法树。因此该文法是二义的。
SiSeSiiSeSiiieSiiiei

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

程序设计语言编译原理第三版第10章

程序设计语言编译原理第三版第10章

§10.2 局部优化
举例:考察下面的三地址代码程序
(1)Read X
(2)Read Y
B1
(3)R:=X mod Y (4)if R=0 goto (8) B2
(5)X:=Y
(6)Y:=R
B3
(7)goto(3)
(8)write Y B4
(9)halt
B1
B2
B3
B4
§10.2 局部优化
3.流图及其生成
标识符(包括常数)-结点 NODE(A)-描述上述对应关系的函数,其值或者是一个结点的编号,
或者无定义
(2)中间代码的三种形式:A:=B A:=op B A:=B op C 或 A:=B[C]
(3)构造算法: ①开始,DAG为空 ②对基本块中每一条中间代码式,依次执行以下步骤:
§10.2 局部优化
步骤: 1.如果NODE(B)无定义,则构造一标记为B的叶结点并定义
NODE(B)为这个结点 如果当前代码是0型,则记NODE(B)的值为n,转4 如果当前代码是1型,则转2(1) 如果当前代码是2型,则(ⅰ)如果NODE(C)无定义,则构造一标 记
为C的叶结点并定义NODE(C)为这个结点;(ⅱ)转2(2)
(1)T0:=3.14 (2)T1:=2*T0 (3)T2:=R+r (4)A:=T1*T2 (5)B:=A (6)T3:=2*T0 (7)T4:=R+r (8)T5:=T3*T4 (9)T6:=R-r (10)B:=T5*T6
(4)代数变换
§10.2 局部优化
二、基本块的DAG表示及其应用
1.基本块的DAG:
一种结点带有下述标记或附加信息的DAG
(1)图的叶结点以一标识符(变量名)或常数作为标记,表示该 结点代表该变量或常数的值。

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

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

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; }

编译原理-第十章--代码优化

编译原理-第十章--代码优化

第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。

所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。

优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。

一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。

中间代码的优化是对中间代码进行等价变换。

目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。

另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。

局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。

循环优化对循环中的代码进行的优化。

全局优化是在整个程序范围内进行的优化。

本章重点:局部优化基本块的DAG表示第一节优化技术简介为了说明问题,我们来看下面这个例子,源程序是:P :=0For I :=1 to 20 doP :=P+A[I]*B[I];经过编译得到的中间代码如图10-1-1所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。

那么,对于这个中间代码段,可进行如下这些优化。

1、删除多余运算(删除公共子表达式)优化的目的在于使目标代码执行速度较快。

图10-1-1中间代码(3)和(6)中都有4*I的运算,而从(3)到(6)没有对I赋值,显然,两次计算机的值是相等的。

所以,(6)的运算是多余的。

我们可以把(6)变换成:T4 :=T1。

这种优化称为删除多余运算或称为删除公共子表达式。

2、代码外提减少循环中代码总数的一个重要办法是代码外提。

这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。

使之只在循环外计算一次,上例中,我们可以把(4)和(7)提到循环外。

经过删除多余运算和代码外提后,代码变成图10-1-2。

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

编译原理第十篇目标代码生成
2020/12/4
过程、函数调用语句的翻译
• 过程、函数调用语句 (CALL , f , —, t ) 1. 生成填写变量访问环境指令 2. 把机器状态(寄存器内容)保存到活动记录的机 器状态区中,一般应生成一组存的指令 3. 要填写管理信息.首先填写过程层数.从过程f的 语义信息中取其层数,填入到2(top)中,生成指令 为 LD R , sem[f].level ST 2(top), R
// A+4
8. 如果是函数调用,则把函数值读到寄存器中
LD R , 4(top)
// A+5
ST t , R
2020/12/4
LD R , A OUT R
2020/12/4
条件语句四元式的翻译
• (THEN, t,_ , _)生成的目标代码为: LD R , t JUMP0 R , __
• (ELSE,_,_,_)生成的目标代码为: JMP __ 同时回填JUMP0指令的目的地
址 • (ENDIF,_,_,_)不产生目标代码,只负
(+,a,b,t1) LD R a; Add R b (*,X,t1,t2) ST R t1; Mult R X (*,t2,Y,t3) Mult R Y (*,t3,t1,t4 Mult R t1 )
输入/输出语句的翻译
• 输入语句:(READ, A )
IN R ST A , R
• 输出语句:(WRITE,A )
第十章 目标代码生成
目标代码
虚拟目标代码:虚拟机上的目标程序。 在本地机器上具备虚拟机的解释器。
实际目标代码:实际机器上的指令序列 绝对地址机器代码: 可重定位的机器代码: 汇编代码:
三种硬件地址模式
指令格式:

2021-2022学年编译原理之目标代码生成(2)

2021-2022学年编译原理之目标代码生成(2)

⑴(> a(y) b(y) t1(y)) ①LD R,a ②GT R,b
⑵(if t1(n) _ _ ) ③FJ R,? ⑨
RDL SEM t1

⑶(+ a(y) b(y) t2(y)) ④LD R,a ⑤ADD R,b t2
⑷(* t2(n) c(y) x(y)) ⑥MUL R,c
x
⑸(el _ _ _ ) ⑦ST R,x ⑧JMP_,? 15
【习题9.5】简要叙述代码生成器(控制器)的过程; 【习题9.6】已知下列语句:
if(a+b<c) x=(a+b)/(c-d)+(a+b); ※ 试分别解答:
⑴ 写出优化的四元式序列; ⑵ 标记变量的活跃信息; ⑶ 描述单寄存器R下的目标代码生成过程。
※ 条件语句的四元式结构:
设 条件语句: if(E)S1 ; else S2 ;
⑹(+ t4(n)t5(n) x(y))


需要随时观察寄存器状态 !
①LD R,a ②ADD R,b
③ST R,t1 ④LD R,c ⑤SUB R,d
⑥MUL R,t1 ⑦ ST R,t3 ⑧LD R,a ⑨SUB R,t3 ⑩ST R,t
11 LD R,t1 12 DIV R,2 13 ADD R,t4

⑹(* a(y) b(y) t3(y))

⑺(- 5 t3(n) x(y))

⑻(ie _ _ _ ) 注 需要及…时处理跳转地址返填 !
①LD R,a ②GT R,b
待返 填1
③FJ R,⑨? ④LD R,a ⑤ADD R,b
⑥MUL R,c ⑦ST R,x ⑧JMP_,1?5 ⑨ LD R,a ⑩MUL R,b

编译原理-清华大学-第10章1-代码优化

编译原理-清华大学-第10章1-代码优化

(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3‘)T1:=T1+4 (12)if I<=20 goto(5)
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
(1)P:=0 (2)I:=0
(3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I&l经过变换循环的控制条件后,有些变 量不被引用,可以从循环中删除。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3’)T1:=T1+4 (12)if I<=20
2)在运行基本块时,只能从其入口进入, 从出口退出。
2、划分基本块算法
(1)求出各基本块的入口语句 1)程序的第一个语句 ; 2)能由条件转移语句和无条件转移语句转
移到达的语句; 3)紧跟在条件转移语句后面的语句。
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句) 之间的语句序 列组成的。

编译原理之代码生成

编译原理之代码生成

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

目标代码生成

目标代码生成
第9章 目标代码生成
编译程序最后一个阶段是目标代码生 成。它通常在语义分析后或者优化后的中 间代码上进行,并将中间代码转化为等价 的目标代码。
本章主要介绍
简单代码生成器的设计和构造方法
9.1 概述
我们知道,编译程序的最终目的是 将源程序翻译成等价的目标程序,为了 达到此目的,编译程序除了对源程序进 行词法分析、语法分析和语义分析外, 还必需将语义分析后或者优化后的中间 代码转换为等价的目标代码。
9.3
简单代码生成器
当翻译一个四元式如A=B op C时, 我们需要知道在基本块中还有哪些四元 式要对变量A、B、C进行引用。 2. 建立每个变量的待用信息和活跃信息 (1)待用信息
9.3

简单代码生成器
A在(i)定值 A在(j)引用
(i) A=T1 (j) T2 =A OP X
(j)为四元式(i)变量A的待用信息
9.3
简单代码生成器
(2) 活跃变量
基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
9.3
简单代码生成器
(3) 计算变量待用信息和活跃信息 的算法:
输入:基本块及其入口语句号和 出口语句号 输出:附加待用信息和活跃信息 的基本块
依次把四元式变换成目标代码, 并在一个基本块内考虑如何充分利用 寄存器。 在设计代码生成器时,为考虑充分 利用寄存器,我们须要考虑下面两点:
9.3
简单代码生成器
1. 给出寄存器的分配原则
(1)把基本块内还要使用的变量的值 尽可能地保存在寄存器中; (2)在基本块内,把不再使用的变量 所占用的寄存器及时释放掉; (3)当到基本块出口时,将变量的值 存放在内存中。

(完整版)编译原理名词解释

(完整版)编译原理名词解释

1. 源语言:书写源程序所使用的语言2. 源程序:用程序设计语言书写的程序3. 目标语言:计算机的机器指令。

目标语言可以是机器语言,也可以是汇编语言,或者是其他中间语言,但最终结果必是机器语言。

4. 目标程序:由机器指令构成的程序。

目标程序是经过翻译程序加工后用目标语言表示的程序。

5. 翻译程序:能够把某一种语言程序(源程序)改造成另一种语言程序(目标程序)将源程序译成逻辑上等价的目标程序的程序。

翻译程序有两种工作方式:编译和解释。

6. 编译程序:也称翻译程序7. 解释程序:有些翻译程序在翻译过程中并不产生完整的目标程序,而是翻译一句,解释执行一句,这样的称为解释程序。

8. 汇编程序:由汇编语言写成的程序9. 词法分析:执行词法分析的程序成为词法分析器,词法分析依据的是语言构词规则。

词法分析器从文件读入源程序,由字符拼接单词。

每当识别出一个单词,词法分析器就输出这个单词的内部码。

10. 语法分析:执行语法分析的程序叫做语法分析器。

语法分析的任务就是根据语言的规则,将词法分析器所提供的单词种别分成各类语法范畴。

11. 中间代码生成:中间代码产生有时称为语义分析,执行中间代码产生的程序称为中间代码生成器。

他的任务时按照语法分析器所识别出的语法范畴产生相应的中间代码,并建立符号表、常数表,等各种表格。

12. 目标代码生成:执行目标代码生成的程序称为目标代码生成器。

他的任务是根据中间代码和表格信息,确定各类数据在内存中的位置,选择合适的指令代码,将中间代码翻译成汇编语言或机器指令,这部分工作与计算机硬件有关。

13. 符号表:用于记录源程序中出现的标识符,一个标识符往往具有一系列的语义值,她包括标识符的名称、种属、类型、值存放的地址等等。

14. 常数表:用于记录在源程序中出现的常数。

15. 编译程序前端:是由词法分析器、语法分析器和中间代码产生器组成的。

她的特点是依赖于被编译的源程序,输出结果用中间代码描述,和目标机器无关。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第十章目标代码生成前面几章我们介绍了从词法分析到中间代码生成的各个部分内容,这部分的内容只与被编译的源代码有关,因此称之为编译器的前端;而代码生成部分则主要与目标机有关,因此称之为编译器的后端。

目标代码生成的好坏直接影响编译器的性能,因此代码生成器的作用是至关重要的。

目标代码生成阶段的最主要任务是如何生成高质量的目标代码的问题,而目标代码的好坏跟寄存器的使用方法密切相关。

最难处理和开销最大的问题就是寄存器的分配问题。

这一章的主要内容包括,临时变量处理,寄存器的分配与释放,窥孔优化,基于寄存器状态追踪的代码生成技术等。

10.1目标代码10.1.1虚拟目标代码一个好的编译器的设计,应考虑到便于移植到新的机器上,考虑到便于在现存机器上产生新的版本。

如果编译器采用的是先产生中间代码后产生目标代码的结构,那么想改变目标机,只需重新设计或修改目标代码的生成器部分,因此便于编译器的移植。

甚至一个编译器也可设计成其目标机不是真正的目标机。

有些情况下可能需要构造一个只产生中间表示的编译器,而不是构造产生真正目标机代码的编译器。

一个典型的例子是Berkeley Pascal 解释器Pi , 它产生能够被解释执行的树结构的中间表示(IR)。

另一个产生中间表示,而不产生目标代码的编译器的好例子是Pascal P-编译器,这个P-编译器被设计成具有很高的移植性,它产生一种假想栈式机器(称为虚拟栈式机VSM)上的所谓P-代码。

P-代码被设计成简单而紧凑的形式。

Pascal P-编译器是用Pascal语言写成的,而且是一遍扫描的递归下降子程序来实现的。

当需要把P-编译器移植到一个新的机器上时,需要实现P-代码的代码生成器。

估计当前Pascal编译器的(50-75)%是来自P-编译器。

把中间表示(IR)转换成目标代码的最简单的方法是把每一个多元式或树结构的中间表示宏扩展成等价的目标机器指令序列。

具体做法可以是对每一个多元式或树结构写出单独的代码生成器。

编译原理第10章-目标代码生成

编译原理第10章-目标代码生成

(MULTI,t2,Y,t3) LD R,t2; MUlT R,Y; ST t3,R
(MULTI,t3,t1,t4) LD R,t3; MUlT R,t1;ST t4,R;
(ASSIG,t4,-,Z) LD R, t4; ST Z,R
输入/输出语句的翻译
输入语句四元式形如:(READ, A,-,-) 汇编指令:IN R; ST A , R
几个常见指令的含义 :
Load Source R
从Source 读出送入R
Op Source R Source op R结果 送入R
Store Target R R的内容送入Target.
临时变量
特点: 寿命短; 一次定义一次使用 存储空间分配:尽可能采用共享办法
随用随分配的动态分配:
调用一个过程时,分配一个新的AR空间(不包括临 时变量部分),每当要保存一个临时变量时,动态 分配到栈区的可用单元中
循环语句的翻译
(WHILE,_,_,_)不产生目标代码,只用来标记 while语句的入口地址,将地址A入栈S;
(DO , t ,_ ,_)产生的目标代码为: LD R , t JUMP0 R , _
将“JUMP0 R , _” 入栈Q;
(ENDWHILE, _, _, _)产生的目标代码: JMP A
变量是否在寄存器中: 变量的现行值是否在内存中:
变量的值在其后是否还使用: 变量的下次引用距离:
状态描述形式(DL, SNS)
DL: 如果从下一位置开始,到变量A重新被赋值或基本 块结束,没有A的当前值的引用,则定义当前该变量的 DL为D;否则定义为L。表示此后变量的状态。 SNS: 如果A的值在寄存器但不在内存,而且当该寄存 器被剥夺时需要保存变量的值,则当前该变量的SNS的 值为S(Store),否则取NS。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变量是否在寄存器中: 变量的现行值是否在内存中:
变量的值在其后是否还使用: 变量的下次引用距离:
状态描述形式(DL, SNS)
DL: 如果从下一位置开始,到变量A重新被赋值或基本 块结束,没有A的当前值的引用,则定义当前该变量的 DL为D;否则定义为L。表示此后变量的状态。 SNS: 如果A的值在寄存器但不在内存,而且当该寄存 器被剥夺时需要保存变量的值,则当前该变量的SNS的 值为S(Store),否则取NS。
第十章 目标代码生成
目标代码 临时变量的存储空间分配 寄存器的分配和释放 基于三地址中间代码的目标代码生成
目标代码生成概述
目标代码生成器的输入和输出
输入:中间代码/TokenList+[符号表] 输出:
• 绝对机器代码:执行速度快,缺乏灵活性 • 可重定位机器代码:可分模块编译,需连接和装入 • 汇编代码:必须经过汇编程序汇编
循环语句的翻译
(WHILE,_,_,_)不产生目标代码,只用来标记 while语句的入口地址,将地址A入栈S;
(DO , t ,_ ,_)产生的目标代码为: LD R , t JUMP0 R , _
按共享法静态分配:
先计算出临时变量的空间,在过程调用时和源变量 一起申请空间。即调用时将临时变量安排在AR中
临时变量的静态分配
定值点:如果i中间代码给临时变量T定值, 则称i为临时变量T的定值点。
引用点:如果j中间代码使用T,则称j为T的 引用点。
活动区间:如果i是T的定值点,j是T的最后 引用点,则称[i, j]是T的活动区间。
的寄存器
四元式到目标代码的翻译
翻译过程:从头到尾逐条扫描四元式,每扫描完一条四元式就把它 翻译成对应的目标代码(一条四元式可能会对应若干条目标指令)
限定条件:目标机只有一个寄存器、不考虑效率、当前地址为A
表达式和赋值语句的翻译
表达式四元式:形如(Op,A,B,T): 汇编指令:LD R,A; Op R,B;
从Source 读出送入R Source op R结果 送入R R的内容送入Target
三种硬件地址模式
硬件地址模式:#c d(R) R
指令格式:
Op #C R
----立即式 ----变址式 ----寄存式
(立即-பைடு நூலகம்---寄存器)
Op d(R1) R2 (存储器-----寄存器)
Op R1 R2
(寄存器-----寄存器)
Load A,B Op B,R 时: 把T(L, NS) 加入R的状态表中,从R中删除A项 申请寄存器时R的状态表为空,释放时表也为空 (可能生成一些store指令)。
寄存器的分配
分配原则:选择代价最小的寄存器 寄存器的选择代价:Store代价、Load代价
把寄存器中的现行值回送内存的Store指令总代价; 由于寄存器被剥夺,下次重新装入寄存器的Load指令 的总代价; 如果申请到的是未分配过的新寄存器,则代价为0。 释放代价: X (D, NS) ----0 X(D, S) ----0 X(L, NS) ----2 X(L, S) ----4 分配算法: 选择最小释放代价,下次引用距离最远
输出语句四元式形如:(WRITE,A,-,-) 汇编指令:LD R , A; OUT R
条件语句四元式的翻译
(THEN, t,_ , _)生成的汇编代码为: LD R,t JUMP0 R,__
(ELSE,_,_,_)生成的汇编代码为: JMP __ 同时回填JUMP0指令的目的地址
(ENDIF,_,_,_)不产生目标代码,只负责完成ELSE子句的地址 回填工作 。
活动区间[i, j]和[m, n]不严格相交:如果mj或i n。 空间分配:
如果两个临时变量的活动区间不严格相交,则可以 共享单元
例:
T1 T2
T3 T4
T5
Offset = m Offset = m+1
Offset = m+1 Offset = m Offset = m+1
变量的状态描述
变量:源变量和临时变量 描述内容:
几个常见指令的含义 :
Load Source R
从Source 读出送入R
Op Source R Source op R结果 送入R
Store Target R R的内容送入Target.
临时变量
特点: 寿命短; 一次定义一次使用 存储空间分配:尽可能采用共享办法
随用随分配的动态分配:
调用一个过程时,分配一个新的AR空间(不包括临 时变量部分),每当要保存一个临时变量时,动态 分配到栈区的可用单元中
寄存器
寄存器的分类:
可分配寄存器 保留寄存器 零用寄存器
寄存器的使用准则:
寄存器先行准则 寄存器活跃准则 寄存器多载准则
寄存器的状态描述:
占有该寄存器的所有变量状态描述的集合。
寄存器的状态变化
如果现行值已在内存中,则不需回送 现行值不在内存,但该值没有下次引用。不需回送
生成代码 Load B, R 时:构造R:{B(L/D, NS)} 生成(Op , A, B, T)的目标代码为:
衡量目标代码质量的标准
在保证语义相等的情况下,生成的目标指令的条数越少和执行速度越快
虚拟机
指令格式为:op destination source
其中destination和source不能同为存储字
虚拟机的寻址方式和相应的汇编语言表示形式
虚拟机的指令系统
LD R,Source Op R,Source ST Target,R
ST T, R 赋值语句四元式:形如(ASSIG,A,-,B):
汇编指令:LD R,A; ST B,R
例:Z:= X*(a+b)* Y* (a+b)
(ADDI,a,b,t1)
LD R,a; Add R,b; ST t1,R
(MULTI,X,t1,t2) LD R,t1; MUlT R,X; ST t2,R
(MULTI,t2,Y,t3) LD R,t2; MUlT R,Y; ST t3,R
(MULTI,t3,t1,t4) LD R,t3; MUlT R,t1;ST t4,R;
(ASSIG,t4,-,Z) LD R, t4; ST Z,R
输入/输出语句的翻译
输入语句四元式形如:(READ, A,-,-) 汇编指令:IN R; ST A , R
相关文档
最新文档