06-第6章-运行时存储空间的组织和管理-编译原理-中国科技大学(共13讲)
组织设计-运行时存储空间的组织和管理教材(PPT97页)

本章内容:
讨论一个活动记录中的数据安排 程序执行过程中,所有活动记录的组织方式 存储器的组织与存储分配的策略 非局部名称的访问 参数传递
6.1 局部存储分配策略
过程的每一次运行称为一次活动(activation)。 活动是一个动态的概念,它有有限的生存期。 活动的生存期是指从进入活动的第一条指令执行 到离开此活动前的最后一条指令执行的这段时间, 其中包括调用其它过程时其它活动的生存期。
静 态 过程的定义 名字的声明 声明的作用域 符号表
动 态 过程的活动 名字的绑定 绑定的生存期 活动记录变量与值的两步映射环境( Nhomakorabea定) 名字
状态(赋值) 右值
环境(绑定) 名字 右值
左值 (a) 变量名字的映射
(b) 常量名字的映射
环境改变存储,状态改变值。 例5.3 若有变量声明x: real和常量声明const pi=3.14,则赋 值句中变量和常量的映射关系: 环境 状态 环境
x S (c) x := 3.14的映射 3.14
pi
3.14 (d) pi=3.14的映射
常量没有左值(存储空间),所以不能被赋值。
6.1.3 活动记录
为了管理过程在一次执行中所需要的信息, 使用一个连续的存储块,我们把这样的一个连续 存储块称为活动纪录。
返 回 值 参 数 控 制 链 访 问 链 机器状态 局部数据 临时数据
6.1.4 局部数据的安排 字节是可编址内存的最小单位。 变量所需的存储空间可以根据其类型而静态 确定。 一个过程所声明的局部变量,按这些变量声 明时出现的次序,在局部数据域中依次分配 空间。 局部数据的地址可以用相对于某个位置的地 址来表示。
编译原理教案运行时存储空间经济组织课件

内存生长方向
堆的生长方向向上,即地址由低到高;栈的生长方向向下 ,即地址由高到低。
效率
由于堆需要手动管理,其操作相对复杂,效率较低;栈由 编译器自动管理,操作简便,效率高。
应用场景
堆适用于需要灵活、动态分配内存的场景,如数据结构、 算法等;栈适用于函数调用、局部变量等短暂、固定大小 的内存需求场景。
以上是关于编译原理中运行时存储空间经济组织的课件内容。通过深入了解数据的存储布局 、动态内存分配与管理以及运行时堆的管理策略,可以更好地优化程序的内存使用,提升程 序性能,并减少潜在的内存相关错误。
04
程序执行过程中的内存变化
函数调用与返回时的内存变化
栈帧生成
参数传递
当函数被调用时,会为该函数创建一个栈 帧,用于存储该函数的局部变量、返回地 址以及临时数据。
运行时堆的管理策略
堆的分配策略:堆区通常采用链表、树等数据结构来管理空闲内存块。常见的堆分配策略包 括首次适配(first-fit)、最佳适配(best-fit)和最坏适配(worst-fit)等。
垃圾回收:为了减轻程序员手动管理内存的负担,一些编程语言(如Java和Python)采用 了自动垃圾回收机制。垃圾回收器会定期检测程序中不再被引用的对象,并自动回收其占用 的内存空间。
课程目标和期望
01
02
03
04
知识掌握
深入理解编译原理中各个阶段 ,及它们如何影响存储空间经
济。
能力培养
能够设计和实现具有高效存储 空间管理的编译器。
思维拓展
通过编译原理的学习,培养计 算思维和问题解决能力。
实用技能
掌握一些实用的编译优化技术 和存储空间管理方法。
02
运行时存储空间基础概念
编译原理运行时存储空间经济组织

《编译原理运行时存储空间经济组织ppt》2023-10-26CATALOGUE目录•编译原理概述•运行时存储空间概述•存储空间的经济组织•存储空间的扩展与维护•编译原理与存储空间的结合应用•总结与展望01编译原理概述1 2 3编译原理是研究如何将高级语言程序翻译成低级语言程序的一门科学。
编译原理定义编译原理关注如何将程序翻译成更低级的语言,以优化程序的运行效率和减小存储空间的使用。
编译原理的关注点编译原理包括词法分析、语法分析、语义分析、优化和代码生成等多个环节。
编译原理的基本组成语法分析根据语言的语法规则,将单词或符号组成语法结构。
词法分析将源程序分解成一个个的单词或符号。
语义分析对语法结构进行语义检查,确保其符合语言的语义规则。
代码生成将优化后的程序翻译成目标机器语言。
优化对已通过语义检查的程序进行优化,以提高程序的运行效率。
编译原理的应用编译器设计编译原理是设计编译器的基础,编译器是实现程序从高级语言到低级语言转换的关键工具。
要点一要点二程序优化利用编译原理中的优化技术,可以提高程序的运行效率,减少存储空间的使用。
语言设计编译原理在语言设计中也有重要的应用,它可以帮助设计者更好地理解语言的语法和语义规则。
要点三02运行时存储空间概述运行时存储空间的概念运行时存储空间指在程序运行过程中,用于存储程序中的变量、函数、类等数据和信息的空间。
运行时存储空间的分类根据存储空间的位置,可以分为内存空间和外存空间。
内存空间包括RAM、Cache等,外存空间包括硬盘、固态硬盘等。
在程序编译时,根据程序中使用的变量、函数、类等信息,分配相应的内存空间。
这种方式适用于程序中数据和函数的使用情况在编译时已知的情况。
在程序运行时,根据实际需要动态地分配内存空间。
这种方式适用于程序中数据和函数的使用情况在编译时无法确定的情况。
静态分配动态分配内存管理单元(MMU)用于管理内存空间的分配和释放。
MMU根据程序的请求,分配相应的内存空间,并在程序结束时释放相应的内存空间。
编译原理运行时存储空间组织

主程序P
TOP 4
3
2
1
SP 0
x a 0 返回地址
0
主程序P过程 S
TOP 10
9 8 7 6
SP 5
4 3 2 1 0
动态链
i c 0(形参个数) 0 返回地址
0 x a 0 返回地址
0
?第N层过程调用
第 N+1层过程,如何 确定被调用过程(第 N+1层)过程的静态链?
A:调用过程(第N层
每个过程的活动记录内容如图:
TOP
2 1 SP 0
临时单元 内情向量 局部变量 形式单元 参数个数 返回地址
老SP
对任何局部变量X的 引用可表示为变址访 问:
dx[SP] dx: 变量X相对于活 动记录起点的地址, 在编译时可确定。
9.5 嵌套过程语言的栈式实现
假定语言不仅允许过程的递归调用(和可变 数组),而且允许过程定义的嵌套,如 PASCAL,PL语言。
临时单元 内情向量 局部变量 形式单元
静态链 动态链 返回地址
连接数据
➢返回地址 ➢动态链:指向调用该 过程前的最新活动记 录地址的指针。
➢静态链:指向静态直 接外层最新活动记录 地址的指针,用来访 问非局部数据。
每个过程的活动记录内容
TOP
2 1 SP 0
临时单元 内情向量 局部变量 形式单元
静态链 动态链 返回地址
procedure quicksort(m, n:integer); var i:integer; begin if (n>m) then begin i:=partition(m, n ); quicksort(m, i-1 ); quicksort(i+1, n ) end; end;
编译原理第6章 运行时存储空间组织

SP=0[SP] /*恢复调用过程的SP值*/
X=2[TOP] /*将返回地址送X*/
UJ 0[X] /*无条件转移,即按X的地址返回到调用过程*/
23
第6章 运行时存储空间组织
如果过程是一 个函数过程,则 按上述办法传递 结果值,否则仅 直接执行上述返 回指令序列。
第一个整数:用来指示数据区(局部数据区或公用区) 的编号;
第二个整数:用来指明该变量(或数组)所对应的存储 起始单元相对于其所在数据区起点的位移;
这一整数对填入符号表相应登记项的信息栏中。各 数据区的起始地址在编译时可暂不确定,待各程序段全 部编译完成之后,再由连接装配程序最终确定,并将各 程序段的目标代码组装成一个完整的目标程序。
数
返回地址
图6–1 一个FORTRAN程序段的局部数据区
5
第6章 运行时存储空间组织
6.2 简单的栈式存储分配
考虑一种简单程序 语言的实现:这种语言 没有分程序结构,过程 定义不允许嵌套,但允 许过程的递归调用,允 许过程含有可变数组。
C语言除不允许含有 可变数组外,就是这样 一种语言。
C程序结构如下:
因此,过程Q运行时必须知道它的所有外层的最新 活动记录的地址。由于允许递归和可变数组的存在,过 程的活动记录位置(即使是相对位置) 往往也是变迁的, 因而必须设法跟踪每个外层过程的最新活动记录位置。
27
第6章 运行时存储空间组织
跟踪每个外层过程最新活动记录位置的办法: 每进入一个过程后,在建立它的活动记录区的同时,
过程P的返回 示意如图6–7。
TOP
…
返回地址
P空 间
SP
老 SP
编译原理运行时存储空间组织

5
&b:
3
&a:
2
调用者数据区
z_val : 2 z_add : &a
y_val : 3 y_add : &a x_val : 5 x_add: T
被调用者数据区
被调用者数据区
参数传递方式为传结果
语句z:=z+x后
临时单元T:
(a+b的值)
5
&b:
3
&a:
2
调用者数据区
z_val : 7 z_add : &a
TOP 12
i
procedure Ru:integer; v:integer;
2 var c;d:integer;
11
c
begin
if u=1 then Ru+1;v ……
10
5
display
v:=a+cbd;
9
0
…… end R
8 0(形参个数)
begin ……
7 2(全局display)
R1;x; ……
y_val : 3 y_add : &a x_val : 5 x_add: T
程序结束;调用返回后:
被调用者数据区
临时单元T:
(a+b的值)
5
&b:
3
&a:
7
程序输出结果a为7
调用者数据区
参数传递方式为传值
临时单元T:
(a+b的值)
5
&b:
3
&a:
2
z:
2
y:
2
x:
5
调用者数据区
编译原理教案运行时存储空间经济组织课件

测试代码生成器,验证其正确 性。
实验结果分析与总结
分析实验过程中遇到 的问题和解决方法。
思考如何将编译原理 应用到实际的软件开 发中。
总结实验中的收获和 不足之处。
THANKS
感谢观看
存。
栈区
存储函数调用时的局部变量和 返回地址。
堆与栈的运行机制
堆
通过动态内存分配机制,程序在运行时向操作系统申请一定大小的内存空间,用 于存储动态分配的数据。堆的大小通常不受限制,但需要注意内存泄漏和碎片化 问题。
栈
由操作系统自动分配和释放内存,用于存储函数调用时的局部变量和返回地址。 栈的大小通常受限于操作系统和硬件,当超过栈大小时会导致栈溢出。
存空间。
标记清除
通过标记活动对象和清 除未标记对象来回收内
存。
分代收集
将内存分为新生代和老 生代,根据对象的存活 周期采用不同的回收策
略。
并行回收
利用多核处理器并行处 理垃圾回收任务,以提
高回收效率。
03 编译原理中的经 济组织问题
经济组织问题的定义与重要性
定义
经济组织问题是指在编译原理中,如何有效地管理和利用运行时存储空间,以满足程序的运行需求,同时避免空 间浪费和性能瓶颈。
实验内容与步骤
实验一
词法分析器的实现
步骤一
了解词法分析器的作用和工作原理。
步骤二
编写词法分析器的代码,实现词法分析器的功能 。
实验内容与步骤
步骤三
01
测试词法分析器,验证其正确性。
实验二
02
语法分析器的实现
步骤一
03
了解语法分析器的作用和工作原理。
实验内容与步骤
步骤二
编译原理第6章 运行时存储空间组织和符号表

运行时存储空间组织和符号表
3
当前活动记录一般包含如下内容: 连接数据: ①返回地址 ②动态链:指向调用该过程前的运行活动记录地 址的指针。运行时,使运行栈上各数据区按动态 建立的次序连成链。链头为栈顶起始位置。 ③静态链:指向静态直接外层最新活动记录地址 的指针,用来访问非局部数据。 形式单元:存放相应实在参数的地址或值。 局部数据区:局部数据、内情向量、临时单元。 ( P164 图6.7 )
2013-6-28
运行时存储空间组织和符号表
35
1
14
例:n=13 32
2013-6-28
运行时存储空间组织和符号表
36
三、 名字的作用范围 1、Fortran的符号表组织
2013-6-28
运行时存储空间组织和符号表
37
2、Pascal符号表组织
最近嵌套作用域原则:一个名字的作用 域是那个包含了这个名字的说明的最小 函数。 设计符号表: ①采用栈符号表:新的名字从栈顶填入, 每当进入一个过程时建立一张子符号表, 退出时释放。 ②引入过程的嵌套层次表(DISPLAY)
2013-6-28
运行时存储空间组织和符号表
14
§2 静态存储分配
FORTRAN77采用的是静态存储分配,它 的程序是段结构,整个程序由主程序段和若 干个子程序段组成,它的每个数据名所需的 存储空间大小都是常量,并且不允许递归调 用,这样,整个程序所需存储空间的总量在 编译时就能完全确定,所以,可以采用静态 存储分配方式。
2013-6-28
运行时存储空间组织和符号表
42
2013-6-28
运行时存储空间组织和符号表
43
2013-6-28
运行时存储空间组织和符号表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.2 全局栈式存储分配
2、运行栈:把控制栈中的信息拓广到包括过程 活动所需的所有局部信息(即活动记录) m a : array r i: integer m
r
6.2 全局栈式存储分配
2、运行栈:把控制栈中的信息拓广到包括过程 活动所需的所有局部信息(即活动记录) m a : array q (1, 9) k: integer m
(2) p把返回地址和 当前base_sp的值 存入q的活动记录 中,建立q的访问 链,增加base_sp 的值
6.2 全局栈式存储分配
1、过程p调用过程q的调用序列
top_sp base_sp
控制链 和保存的机器状态 返回值和参数 临时数据局部数据 控制链 和保存的机器状态 返回值和参数
top_sp top_sp base_sp 返回值和参数 临时数据局部数据 控制链 和保存的机器状态 返回值和参数
6.2 全局栈式存储分配
1、过程p调用过程q的调用序列
top_sp base_sp top_sp
控制链和返回地址
返回值和参数 临时数存的机器状态 返回值和参数
a0 b0 b1 a2, b3 重叠分配存储单元
6.2 全局栈式存储分配
本节介绍 • 介绍程序运行时所需的各个活动记录在存储 空间的分配策略 • 描述过程的目标代码怎样访问绑定到局部名 字的存储单元 • 介绍三种分配策略
– 静态分配策略 – 栈式分配策略 – 堆式分配策略
6.2 全局栈式存储分配
6.1 局部存储分配
main() / 例 / { / begin of B0 / int a = 0; int b = 0; { / begin of B1 / int b = 1; {/ begin of B2 / int a = 2; }/ end of B2 / {/ begin of B3 / int b = 3; }/ end of B3 / }/ end of B1 / }/ end of B0 / 声 明 int a = 0; int b = 0; int b = 1; int a = 2; int b = 3; 作 用 域 B0 B2 B0 B1 B1 B3 B2 B3
6.2 全局栈式存储分配
1、过程p调用过程q的调用序列
top_sp 临时数据局部数据 base_sp 控制链 和保存的机器状态 返回值和参数
6.2 全局栈式存储分配
1、过程p调用过程q的调用序列 (1) p计算实参,依 次放入栈顶,并在 栈顶留出放返回值 的空间。top_sp的 值在此过程中被改 变
r
q(1,9)
6.2 全局栈式存储分配
2、运行栈:把控制栈中的信息拓广到包括过程 活动所需的所有局部信息(即活动记录) m a : array q (1, 9) k: integer q (1, 3) k: integer m
r
q(1,9)
p(1,9) q(1,3) p(1,3) q(1,0)
6.2 全局栈式存储分配
访 问 链 机器状态 局部数据 临时数据
6.2 全局栈式存储分配
• 即使是同一种语言,过程调用序列、返回序 列和活动记录中各域的排放次序,也会因实 现而异 返 回 值 • 设计这些序列和活动记录 参 数 的一些原则 控 制 链
–一般把临时数据域放在 局部数据域的后面 –把参数域和可能有的返回 值域放在紧靠调用者活动 记录的地方
–用树来描绘控制进入和离开活动的方式 m
r
p(1,9)
q(1,9) q(1,3)
q(5,9) p(5,9) q(5,5) q(7,9)
p(1,3) q(1,0) q(2,3)
p(2,3) q(2,1) q(3,3)
p(7,9) q(7,7) q(9,9)
6.2 全局栈式存储分配
• 活动树的特点
–每个结点代表某过程的一个活动 –根结点代表主程序的活动 –结点a是结点b的父结点,当且仅当控制流从a的 活动进入b的活动 –结点a处于结点b的左边,当且仅当a的生存期先 m 于b的生存期
第六章 运行时存储空间的组织和管理
• 影响存储分配策略的语言特征
– 过程能否递归 – 当控制从过程的活动返回时,局部变量的值是否 要保留 – 过程能否访问非局部变量 – 过程调用的参数传递方式 – 过程能否作为参数被传递 – 过程能否作为结果值传递 – 存储块能否在程序控制下动态地分配 –存储块是否必须显式地释放
6.1 局部存储分配
2、环境和状态 • 环境把名字映射到左值,而状态把左值映射 到右值(即名字到值有两步映射) • 赋值改变状态,但不改变环境 • 过程调用改变环境 • 如果环境将名字x映射到存储单元s,则说x被 绑定到s 环境 状态 名字 存储单元 值
6.1 局部存储分配
3、静态概念和动态概念的对应 静态概念 过程的定义 动态对应 过程的活动
(3) q保存寄存器的 值和其它机器状态 信息
6.2 全局栈式存储分配
1、过程p调用过程q的调用序列
top_sp base_sp
临时数据局部数据 控制链 和保存的机器状态 返回值和参数 临时数据局部数据 控制链 和保存的机器状态 返回值和参数
(4) q根据局部数据 域和临时数据域的 大小增加top_sp的 值,初始化它的局 部数据,并开始执 行过程体
6.1 局部存储分配
• 例 在SPARC/Solaris工作站上下面两个结构 体的size分别是24和16,为什么不一样? typedef struct _a{ typedef struct _b{ char c1; char c1; long i; char c2; char c2; long i; double f; double f; }a; }b; 对齐:char : 1, long : 4, double : 8
6.1 局部存储分配
6.1.5 程序块 • 本身含有局部变量声明的语句 • 可以嵌套 • 最接近的嵌套作用域规则 • 并列程序块不会同时活跃 • 并列程序块的变量可以重叠分配
6.1 局部存储分配
main() / 例 / { int a = 0; int b = 0; { int b = 1; { int a = 2; } { int b = 3; } } } / begin of B0 / / begin of B1 / / begin of B2 / / end of B2 / / begin of B3 / / end of B3 / / end of B1 / / end of B0 /
6.2.3 调用序列 • 过程调用和过程返回都需要执行一些代码来 管理活动记录栈,保存或恢复机器状态等 • 过程调用序列
过程调用时执行的分配活动记录,把信息填入它的 域中,使被调用过程可以开始执行的代码
• 过程返回序列
被调用过程返回时执行的恢复机器状态,释放被调 用过程活动记录,使调用过程能够继续执行的代码
6.1 局部存储分配
• 例 在X86/Linux机器的结果和SPARC/Solaris 工作站不一样,是20和16。 typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 12 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 4
6.1 局部存储分配
6.1.1 过程 语言概念: 过程定义、过程调用、形式参数、实在参 数、活动的生存期
6.1 局部存储分配
6.1.2 名字的作用域和绑定 1、名字的作用域 • 一个声明起作用的程序部分称为该声明的作 用域 • 即使一个名字在程序中只声明一次,该名字 在程序运行时也可能表示不同的数据对象
r p(1,9)
q(1,9)
q(1,3) ....
q(5,9) ....
6.2 全局栈式存储分配
• 当前活跃着的过程活动可以保存在一个栈中
– 例 控制栈的内容:m, q (1, 9), q (1, 3), q (2, 3) m
r p(1,9)
q(1,9) q(1,3)
q(5,9) p(5,9) q(5,5) q(7,9)
6.1 局部存储分配
• 例 在SPARC/Solaris工作站上下面两个结构 体的size分别是24和16,为什么不一样? typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 16 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 8
• 调用序列和返回序列常常都分成两部分,分 处于调用过程和被调用过程中
6.2 全局栈式存储分配
• 即使是同一种语言,过程调用序列、返回序 列和活动记录中各域的排放次序,也会因实 现而异 返 回 值 • 设计这些序列和活动记录 参 数 的一些原则 控 制 链
–以活动记录中间的某个 位置作为基地址 –长度能较早确定的域放在 活动记录的中间
6.2.1 运行时内存的划分 代 码 静态数据 堆
栈
6.2 全局栈式存储分配
1、静态分配 • 名字在程序被编译时绑定到存储单元,不需 要运行时的任何支持 • 绑定的生存期是程序的整个运行期间
6.2 全局栈式存储分配
2、静态分配给语言带来限制 • 递归过程不被允许 • 数据对象的长度和它在内存中位置的限制, 必须是在编译时可以知道的 • 数据结构不能动态建立
6.1 局部存储分配
3、静态概念和动态概念的对应 静态概念 过程的定义 名字的声明 动态对应 过程的活动 名字的绑定