编译原理第19讲(第十章)
编译原理ppt

B1
(1) (2) (3)
B2
(4) (5) (6) (7) (8) (9)
B3
B4
基本块内实行的优化: 合并已知量 删除多余运算 删除无用赋值 等 (1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
第十章 代码优化
10.1 优化技术简介 10.2 局部优化 10.3 循环优化
上海电力学院 彭源
优化的概念
编译时刻为改进目标程序的质量而进行的各项工 作。
空间效率 时间效率
空间效率和时间效率有时是一对矛盾,有时不能 兼顾。 优化的基本要求:
必须是等价变换 为优化的努力必须是值得的(有效、合算)。
优化的分类
7.2 局部优化
局部优化是指基本块内的优化 基本块是指程序中一顺序执行的语句序列,其 中只有一个入口语句和一个出口语句。执行时 只能从入口语句进入,从其出口语句退出
7.2.1 基本块的划分
1.
1) 2) 3)
把程序(中间代码形成)划分成基本块的算法: 求基本块的入口语句,它们是: 程序的第一个语句;或者 条件转移或无条件转移语句的转移目标语句; 或者 紧跟在条件转移语句后面的语句。
例:划分基本块 (1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
编译原理讲义编译原理讲义

实验教学内容: 1)要求学生完成实验二
第二讲
实验方式及学时分配: 采用教师讲授+学生动手实验的方式,以学生实验为主 总共 2 学时,教师讲解不超过 15 分钟,先对上一次的实验进行小结,指出问题
教学目标及基本要求: 1)要求学生掌握状态转换图及其为其编写程序; 2)要求学生编写识别标识符、数、界符、字符常数、注释的函数; 3)要求学生理解单词的分隔
主要教学参考书目: 1.自编《编译原理实验指导书》V2.1 2.陈火旺等编《程序设计语言编译原理》第 3 版,国防工业出版社
思考题和习题: 在实验报告册上回答教材实验二后面提出的问题。
教学内容: 1. 回忆课堂上状态转换图的含义,以及如何编写识别函数; 2. 回忆什么是单词,单词之间是如何分隔的;什么是 token 字串。 3. 用编写识别标识符的函数 recogid 举例讲解具体方法
编写填入符号表的函数 ins_sym 填入方法可以采用顺序增加序号的方法加入到表的尾部。将字符串 sym 填入符号表
symbol 的函数描述如下: ins_sym(char *sym, struct node *symbol[]) { 找到符号表的最后一条记录; strcpy( , sym ); 设置 symbol 的其它属性; }
教学的重点和难点: 1)重点:符号表,token 文件的理解 2)难点:定义符号表,token 文件的相关数据结构及相关操作函数的编写
实验组织形式: 主要采取教师先介绍实验的目的,实验内容和实验达到的要求,再让学生根据自己的情 况完成实验,实验结束后要求学生填写实验报告册。
实验过程中应注意的问题: 主要要求学生巩固以前学习的高级语言程序设计知识,并完成符号表,token 文件相关数 据结构及相关操作函数的编写。若上课无法完成,必须下课补充做完,否则完不成进度; 若学生对高级语言不熟悉,督促学生查阅相应资料,或学习查阅帮助,熟练掌握一门高 级语言。
《编译原理》重点知识总结

《编译原理》知识点总结目录第一章引论第二章高级语言及其语法描述第三章语法分析——自上而下分析第四章属性文法和语法制导翻译第五章语义分析和中间代码产生第六章优化第一章引论一.编译程序(compiler):把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序二.编译程序的工作的五个阶段:词法分析、语法分析、中间代码产生、优化、目标代码产生1.词法分析任务: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。
依循的原则:构词规则描述工具:有限自动机FOR I := 1 TO 100 DO保留字标识符等符整常数保留字整常数保留字2.语法分析任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。
依循的原则:语法规则述工具:上下文无关文法3.语义分析与中间代码产生任务:对各类不同语法范畴按语言的语义进行初步翻译。
(变量是否定义、类型是否正确等)依循的原则:语义规则中间代码:三元式,四元式,逆波兰记号,树形结构等。
是一种独立于具体硬件的记号系统。
例:将Z:=X + 0.618 * Y 翻译成四元式为(1) * 0.618 Y T1(2) + X T1 T2(3) := T2 _ Z4. 优化任务:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:程序的等价变换规则FOR K:=1 TO 100 DOBEGINM := I + 10 * K;N := J + 10 * K;END4.目标代码产生任务: 把中间代码变换成特定机器上的目标代码。
依赖于硬件系统结构和机器指令的含义目标代码三种形式:a)绝对指令代码: 可直接运行b)可重新定位指令代码: 需要连接装配c)汇编指令代码: 需要进行汇编第二章高级语言及其语法描述2.1.1语法词法规则:单词符号的形成规则。
a)单词符号是语言中具有独立意义的最基本结构。
编译原理精选全文完整版

可编辑修改精选全文完整版1什么事编译程序?:什么是解解释程序?它们的区别?编译程序就是指这样的一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序。
解释程序也是一种翻译程序,它将原程序作为输入,一条语句一条语句地读入并解释执行。
区别:编译程序将源程序翻译成目标程序后在执行该目标程序:解释程序则逐条读出源程序中的语句并解释执行。
2什么是扫描器?:扫描器就是词法分析器,他接受输入的源程序,队源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
通常把此法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。
每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。
3.正规表达是到上下无关文法的转换方法是什么?:正规表达式所描述的语言结构均可以用上下文无关文法描述,反之则不一定。
方法如下:1.构造正规表达式的NFA;2.若0为初始状态,则A为开始符号;3.如果存在映射关系f(i,a)=J,则定义产生式Ai→aAj 4. 如果存在映射关系f(i,ξ)=J,则定义产生式Ai→Aj。
5.若1为终态,,则定义产生式Ai→ξ。
4.什么是语法树?:对文法G[s]:(Vt,Vn,S, )满足下列条件的树称为G[s]的语法树。
(1)每个结点用G[s]的一个终结符或非终结符标记。
(2)根据点用文法开始符S标记。
(3)内部结点一定是非终结符,如果某内部结点A有n个分支,它的所有子结点从左至右依次标记为X1,X2,X3……. Xn,则A→X1,X2,X3……. Xn一定是文法G[s]的一条产生式。
(4)如果某节点标记为ξ,则它必为叶结点是父结点的唯一子结点。
5.自下而上分析原理是什么?:自下而上是就是自左至右扫描输入串,自下而上进行分析:通过反复查找当前句型的句柄(最左直接短语),并使用产生式规则将找到的句柄归约为相应的非终结符。
编译原理精选版演示课件.ppt

预测分析表
3
表驱动的预测分析程序模型
khk
4
实现步骤:
(1) 判断文法是否为LL(1)文法。 如果文法中含有左递归,必须先消除 左递归
(2)构造预测分析表 : Select(A ) (3)列出预测分析过程
khk
5
第6章:自底向上分析方法
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符逐个 移入一个后进先出栈中,边移入边分析,一旦栈顶 符号串形成某个句型的可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,称为 归约。重复这一过程,直到归约到栈中只剩下文法 的开始符号时,则分析成功。
关键问题
khk
6
移进—规约分析(Shift-reduce parsing)
+
A a
可得 b <. a
由A→( B 且B+ ( B… 可得 (<. (
+
B aa…
可得 (<. a
+
B Aa )
可得 (<. A
khk
18
A(B(Aa) …)
(3) 求> .关系:
A(B…B
+
Aa
由S→bAb,且A…) 可得 ) > . b
A+…B 可得 B > . b
khk
88
例1:文法
SaAcBe A b A Ab B d
输入串abbcde#分析
khk
9
归约分析过程(移进归约):
步骤 1 2 3 4 5 6 7 8 9 10 1kh1k
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
编译原理总结-编译原理-10-(一)

T的过程调 lookhead:当前符号 当前符号等 处理终结符+ T的过程调用
29
5
自底向上语法分析
思想 从输入串出发,反复利用产生式进行归约,如果最 后能得到文法的开始符号,则输入串是句子,否则 输入串有语法错误 核心 寻找句型中的当前归约对象——“句柄”进行归约, 用不同的方法寻找句柄,就可获得不同的分析方法 方法
栈内栈外、优先函数
算符优先文法
素短语和最左素短语
句型#N1a1 N2a2… Nnan #的最左素短语是满足下列条件 的最左子串 Niai Ni+1ai+1… Njaj Nj+1 其中:ai-1≮ai≡ai+1≡…≡aj-1≡aj≯aj+1
33
LR 分析法
关键概念 规范句型活前缀——规范句型(右句型)的不
2
“编译原理”是一门非常好的课程
掌握“编译原理”中的基本概念、基本理论、
基本方法,在系统级上再认识程序和算法, 提升计算机问题求解的水平,增强系统能 力,体验实现自动计算的乐趣 实验情况
递归子程序、LL(1)、SLR(1)、LR(1) 多种形式的输入 LR(1)分析表的自动生成 错误处理与续编译
→ε →ε
→*FT' *FT →(E)
26
→ε
→ε
→ε
4
语法图
自顶向下语法分析
简化语法图 递归子程序法 为每个语法变量编写一个处理子程序
27
+ E T * T F
E→T(+T)*
简化的语法图
T→F(*F)*
F
(
E id
)
F→(E)|id
简单算术表达式的分析器
《编译原理》课件

六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
编译原理讲义全范文

编译原理讲义全范文编译原理是计算机科学中的一门重要课程,它研究如何将高级语言程序转化为可执行代码的过程。
在编译原理的学习过程中,我们需要掌握一系列的理论知识和实践技巧,以便正确地设计和实现编译器。
下面是一份全面的编译原理讲义,主要包括词法分析、语法分析、语义分析、优化与目标代码生成等内容。
一、词法分析1.编译原理概述2.词法分析的定义和作用3.词法分析器的实现方法4.正则表达式和有限自动机5.正则表达式到NFA的转化6.NFA到DFA的转化7.最小化DFA8.正则表达式到DFA的转化9.词法分析器生成器的使用二、语法分析1.上下文无关文法的定义和作用2.语法分析的定义和作用3.自顶向下语法分析方法4.递归下降分析方法5.预测分析方法6.LL(1)文法和LL(1)分析方法7.自底向上语法分析方法8.LR分析方法和SLR分析方法LR分析方法和LR分析方法10.LR分析器生成器的使用三、语义分析1.语义分析的定义和作用2.语义动作和语法制导定义3.语法制导翻译和语义树的构建4.属性文法和符号表管理5.语义分析的错误处理6.语义分析器的实现方法四、中间代码生成1.中间代码的定义和作用2.中间代码的表示方法3.中间代码生成的基本原理4.三地址码的生成方法5.语法树的线性化6.优化技术在中间代码生成中的应用7.中间代码生成器的实现方法五、代码优化1.代码优化的概述2.代码的局部优化技术3.代码的全局优化技术4.数据流分析和优化5.控制流优化和代码调度6.代码优化器的实现方法六、目标代码生成1.目标代码的定义和作用2.目标机器的特性和指令系统3.指令选择和寄存器分配4.目标代码生成的基本原理5.基本块和流图的生成6.目标代码的生成方法7.目标代码生成器的实现方法七、构建编译器1.编译器整体架构与设计2.词法分析器的实现3.语法分析器的实现4.语义分析器的实现5.中间代码生成器的实现6.代码优化器的实现7.目标代码生成器的实现8.编译器的调试和测试技巧通过学习以上内容,我们将全面了解编译原理的基本理论和实践技术,掌握编译器的设计和实现方法。
编译原理课件(龙书为教材)

temp2=b+temp1
a=temp2
2014-9-4计算机学院
辛明影
13
代码生成阶段
生成可重定位的机器代码或汇编代码 Movf R2,c
Mult R2,d
Movf R1,b
Addf R2,R1
Movf a,R2
2014-9-4计算机学院
辛明影
14
1.3符号表管理 int a,b;
float e,f
语法分析
在词法分析的基础上,根据语言的语法规则, 把单词符号串组成各类语法单位. 具体的说,语法分析是在单词流的基础上建立 一个层次结构-----建立语法树
标识符 a
赋值语句 =
表达式 标识符 b
表达式 + 表达式 表达式 * 表达式
标识符 c
辛明影
标识符
d
10
2014-9-4计算机学院
语义分析阶段
2014-9-4计算机学院
辛明影
27
上述的定义是用文字来描述的,当设 计编译程序时,就要把它用形式的方式描 述出来,就要用到形式语言。 在现今多数程序设计语言中,单词符 号一般包括: 标识符、 基本字、 各类型的常数、 算符和界符等 正规式和有穷自动机是描述词法结 构和进行词法分析的有效工具
2014-9-4计算机学院
符号表是一个数据结构。 每个标识符在符号表中都有 一条记录 例:int a,b; 名字 a 记号 id1(25) 类型 int 种属 …… 简变 addr 0
b
id2(25)
int
辛明影
简变
4
16
2014-9-4计算机学院
符号表的接口: 符号表的作用就是存放字符串或词素 当一个字符串或词素被保存时,与之相对 应的记号也被保存
最新编译原理(课后习题答案ppt课件

10
(b) 试对于句子 not ( true or false) 构造一棵分析树.
bexpr bterm bfactor not bfactor
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
(a) 0 ( 0 | 1)* 0 由0和1组成且以0开始和结束的符号串全体.
(b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
16
3.4 对于下列语言分别写出它们的正规表达式:
(a) 英文字母组成的所有符号串, 要求符号串中顺序包含 五个元音字母. 令letter={非元音的英文字母} letter* (a|A) letter* (e|E) letter* (i|I) letter* (o|O) letter* (u|U) letter*
18
(e) 带有偶数个0和奇数个1的由0和1组成的符号串全体. E为带有偶数个0和1的由0和1组成的符号串全体. 即 ( 00 | 11)* ( ( 01 | 10 ) ( 00 | 11)* ( 01 | 10 ) ( 00 | 11)* )* E1E|E0E1E0E
《编译原理课件》PPT课件

容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
编译原理(很全哦)

37
扫描程序的设计
编译原理
38
编译原理
39
编译原理
词法分析程序可以通过状态转换图构造
40
编译原理
状态转换图的实现:使每个状态对应一小段子程序, 通过case语句将各段程序连成一个完整的程序 一些工作变量和子程序的定义
41
编译原理
42
编译原理
43
编译原理
44
标识符的处理
标识符的处理主要包括
7
例3.10由正规文法构造自动机
编译原理
字母表={+, -, d},状态Q={S, N, F}
8
编译原理
正规文法:规则形式
V VN, VT.
AV或A 其中A,
由有穷自动机A可以直接构造一个正规文法
G A,使L(G)=L(A).
9
由FSA到正规文法的构造步骤
(1)
编译原理
例3.16 构造(+|-| )dd*的对应的自动机
编译原理
22
NDFSA M到正规表达式的转换
(1)
编译原理
(2)
对NDFSA M进行拓广,新设置一个 唯一的开始状态S和一个唯一的终止 状态Z,并允许状态转换图弧上可以 为正规表达式; 从S到原来所有的开始状态连接弧, 从原来所有的终止状态连接弧到Z; 利用图3.23的替换规则,逐步消去状 态转换图中的节点和有关连线,直到 只剩下状态S和Z.
14
等价正规集
定义3.10
编译原理
设e1和e2是上的两个正规表 达式,若L(e1)=L(e2),则称e1与e2等价, 记为e1 = e2 . 例如: e1= (a|b), e2 = b|a 又如: e1= b|(ab)* ,e2 =(ab)*| b 再如: e1= (a|b)* ,e2 =(a* |b* )*
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过说明语句或隐或显规则 而定义,则称这种性质是 “静态”确定的。 动态:如果名字的性质只有 在程序运行时才能知道,则 称这种性质为“动态”确定 的。
10.2 数据表示各种数据对象的存储分配
简单变量: cts: 4 to 16 bytes booleans: 1 bit (but usually 1 byte)
概述
运行时的存储区常常划分成:目标区、静态数据区、栈区和堆 区,如下图就是一种典型划分,代码(code)区用以存放目标代码, 这是固定长度的,即编译时能确定的;静态数据区(static data)用以 存放编译时能确定所占用空间的数据;堆栈区(stack and heap)用于 可变数据以及管理过程活动的控制信息。
10.3目标程序运行时的存储组织
存储分配策略: 静态存储分配 动态存储分配——栈式 和 堆式 注:可以混合使用
简单的栈式分配方案 嵌套过程的栈式分配方案 分程序结构的存储分配方案 堆式存储
静态存储分配
这种存储分配非常简单,如果在编译时能确 定目标程序运行中所需的全部数据空间的大小, 编译时安排好目标程序运行时的全部数据空间, 确定每个数据对象的存储位置,称这种分配策略 为静态存储分配。
1. 允许的数据类型的多少 2.语言中允许的数据项是
静态确定 动态确定 3.程序结构 (决定名字的作用域的规则和结构) A.段结构(Fortran) B. 过程定义不嵌套,只允许过程递归调用 C.分程序结构 分程序嵌套 过程定义嵌套 静态:如果一个名字的性质
4.存储类别的多少
Global Static Local dynamic
目标机支持的概念 bits bytes words Registers Stack address Routine(sub routine)
概述
在代码生成前,编译程序必须进行目标程序运行环 境的配置和数据空间的分配。 一般来讲,假如从操作系统中得到一块存储区以使 目标程序在其上运行,该存储区需容纳生成的目标代码 和目标代码运行时的数据空间。 数据空间应包括:用户定义的各种类型的数据对象(变 量和常数)所需的存储空间,作为保留中间结果和传递 参数的临时工作单元,调用过程时所需的连接单元,以 及组织输入/输出所需的缓冲区。 目标代码所占用空间的大小在编译时能确定。有些数据 对象所占用的空间也能在编译时确定,其地址可以编译 进目标代码中。而有些数据对象具有可变体积和待分配 性质,无法在编译时确定存储空间的位置。
例子1(简略图)
//sort的例程体的简略视图 begin var a: array [0..10] of integer;x: integer; ……… 只要一个函数在调用点前出 现过,则可以对该函数进行 调用。 sort可以调用r,e,q(在哪里?) quicksort中可以调用partition (在哪里? ) partition中可以调r,e,q 但是在s,r,e中都不能调用p, 因为它是q私有的。 因此一个函数被激活的时候, 它的外层都处于激活状态, 也就是说在栈中有活动记录。 因此不会出现p被调用时, 找不到quicksort的活动记录。 (p只可能在q中被调用)
第十章 目标程序运行时的组织 10.1 10.2 10.3 10.4 10.5 概述 数据表示 目标程序运行时的栈式存储组织 参数传递 堆式存储概述
10.1概述-代码生成解决语义gap
高级语言支持的概念 Type value expression Variable procedure Function parameters
例子1
(1) program sort(input, output); //sort的过程头 (2) var a: array [0..10] of integer; (3) x: integer; (4) procedure readarray; //sort内嵌套定义的readarray的过程头 (5) var i: integer; (6) begin…a…end{readarray}; //readarray的过程体 (7) procedure exchange(i,j: integer); //sort内嵌套定义的exchange的过程头 (8) begin (9) x∶=a[i]; a[i]∶=a[j]; a[j]∶=x; //exchange的过程体 (10) end{exchange}; (11) procedure quicksort(m,n: integer); //sort内嵌套定义的quicksort的过程头 (12) var k,v: integer; (13) function partition(y,z:integer):integer; //quicksort内嵌套定义的partition的函数头 (14) var i.j:integer; (15) begin //partition的函数体 (16) …a… (17) …v… (18) exchange(i,j); (19) end{partition}; (20) begin…end{quicksort}; //quicksort的过程体 (21) begin…end{sort} //sort的例程体
术语--过程活动记录AR
为说明方便,假定源程序是由过程组成,运行时称 作过程的激活。 一个过程的一次执行所需要的信息,使用一个连续 的存储区来管理这个区(块),叫做一个活动记录AR或 frame帧
一般这个区AR要记录: (运行栈的存储分配) l 临时值(如计算表达式时的中间工作单元。) l 局部变量(数据) l 保存运行过程前的状态 (返回地址,寄存器值……) l 形参 (形式单元) l 返回值(RA 对函数,有时可使用寄存器存放返回值) l 存取链(SL 可选,对于非局部量的引用。) l 控制链(DL 可选,指向调用者的活动记录,释放栈。)
目标代码的解释执行(运行栈S)
M调用过程P
t
. . P
RA DL SL
b t
b
M
10.3.1简单的栈式分配方案
程序结构特点:过程定义不嵌套,过程可递归调用,含
可变数组; 例: main 全局变量的说明 • proc R • …… • end R; • proc Q • …… • end Q; • 主程序执行语句 end main
演示函数调用退出时sp和top的变化
Main---->Q----> R
TOP-----> R的数组区
Main--->Q---->Q
Q的数组区 Q的活动记录 Q的数组区 Q的活动记录 主程序全局 数据区
SP------>
R的活动记录 Q的数组区 Q的活动记录 主程序全局 数据区
TOP----> 临时工作单元 局部简单变量 局部数组的内情向量 保存运 行过程前的状态 (返回地址,寄存器值……) 实参(形式单元)和参数个数 SP-----> 控制链(老 SP)
10.3.2嵌套过程语言的栈式分配方案
主要特点: (语言)一个过程可以引用包围它的任一外层过程所 定义的标识符(如变量,数组或过程等)。 (实现)一个过程执行时可以引用它的任一外层过程 的最新活动记录中的某些数据。 我们所熟悉的PASCAL语言程序结构的特点是允许 过程嵌套定义,一个过程可以引用包围它的任一外层过 程所定义的标识(如变量,数组或过程等)。它的存储 分配也看成是采用栈式动态分配策略,只是它的过程活 动记录中应增设一些内容,用以解决对非局部变量的引 用问题。 (回忆简单栈式存储分配:局部量+全局量)
目标代码区 静态数据区
Stack
heap
概述
代码生成前如何安排目标机资源 运行时组织的几个问题 数据表示-如何在目标机中表示每个源语言类型的值 表达式求值-如何组织表达式的计算 存储分配-如何组织不同作用域变量的存储 过程实现-如何以例程实现过程,函数,参数传递
决定运行管理复杂程度的因素—源语言本身
数据对象的属性 name 名字/名称 type 类型 location 内存地址 value 值 component 成分
指针:unsigned integers 一维数组:一块连续的存储区 多维数组:一块连续的存储区,按行存放 结构(记录):把所有域(field)存放在一块连续的存储区 对象:类的实例变量象结构的域一样存放在一块连续的存 储区,但方法(成员函数)不存在该对象里 指令:
静态存储分配举例
(1) PROGRAM CNSUME (2) CHARACTER * 50 BUF //程序体所拥有的静态量BUF (3) INTEGER NEXT //程序体所拥有的静态量NEXT (4) CHARACTER C, PRDUCE //程序体所拥有的静态量C (5) DATA NEXT /1/, BUF / ‘ ’ / (6) 6 C=PRDUCE() (7) BUF(NEXT:NEXT)=C (8) NEXT=NEXT+1 (9) IF(C .EN. ‘ ’ )GOTO 6 (10) WRITE ( * ,‘ (A)’ )BUF (11) END (12) CHARACTER FUNCTION PRDUCE() (13) CHARACTER * 80 BUFFER (14) INTEGER NEXT (15) SAVE BUFFER, NEXT //PRDUCE函数体所拥有的静态量BUFFER, NEXT (16) DATA NEXT /81/ (17) IF (NEXT .GT.80)THEN (18) READ ( * ,‘ (A)’ )BUFFER (19) NEXT=1 (20) END IF (21) PRDUCE=BUFFER(NEXT:NEXT) 在Fortran 90 之前的Fortran 版本 (22) NEXT=NEXT+1 都没有递归.有递归则不能进行静态 (23) END
存储分配
动态存储分配
如果一个程序设计语言允许递归过程、可变 数组或允许用户自由申请和释放空间,那么,就 需要采用动态存储管理技术。因为对于这种程序 在编译时无法知道它在运行时需要多大的存储空 间,它所需要的数据空间的大小需待程序运行时 动态地确定。