第6章 运行时存储空间组织

合集下载

第六章运行时存储空间的组织和管理

第六章运行时存储空间的组织和管理

➢通常的命令式编程语言的程序表现为多个函数的实现与互相调用➢有一个函数作为入口函数,通常为main()➢代码执行过程,实际上是依据过程调用关系形成一个调用结构图➢每个过程的执行需要一定的存储空间来辅助➢过程的代码需要一定的存储空间➢过程中的局部变量需要存储空间来暂时保存1➢编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。

➢在程序的执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。

➢在程序语言中,程序使用的存储单元都是由标识符来表示的。

它们对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。

➢对于编译程序来说存储组织与管理是一个复杂而又十分重要的问题。

2➢两个概念➢过程的活动➢过程的一次执行被称为过程的一次活动➢活动记录➢过程活动时用于存放所需信息的存储空间➢本章内容➢讨论一个活动记录中的数据安排➢程序执行过程中,所有活动记录的组织方式3➢过程P一次活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作时间,包括执行P时调用其它过程花费的时间。

➢过程可以是递归的➢一个过程可对应多个活动4影响存储分配策略的语言特征➢过程能否递归➢当控制从过程的活动返回时,局部变量的值是否要保留➢过程能否访问非局部变量➢过程调用的参数传递方式➢过程能否作为参数被传递➢过程能否作为结果值传递➢存储块能否在程序控制下动态地分配➢存储块是否必须显式地释放5本章在逻辑地址空间讨论6.1.1 过程过程定义、过程调用、形式参数、实在参数、活动的生存期6Procedure f(int a, bool b){int c;…}过程定义void main(){f(3,true);…}过程调用实在参数6.1.2 名字的作用域和绑定名字的作用域➢一个声明起作用的程序部分称为该声明的作用域。

组织设计-运行时存储空间的组织和管理教材(PPT97页)

组织设计-运行时存储空间的组织和管理教材(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 局部数据的安排 字节是可编址内存的最小单位。 变量所需的存储空间可以根据其类型而静态 确定。 一个过程所声明的局部变量,按这些变量声 明时出现的次序,在局部数据域中依次分配 空间。 局部数据的地址可以用相对于某个位置的地 址来表示。

编译原理——运行时存储空间组织课件

编译原理——运行时存储空间组织课件

优化程序性能
通过优化运行时存储空间的分配 和管理,可以提高程序的执行效 率,减少不必要的内存访问和数 据拷贝。
保障数据安全
合理地管理运行时存储空间可以 避免数据溢出、缓冲区溢出等安 全问题,提高程序的安全性。
02
栈式存储管理
栈的定义与特性
栈的定义
栈是一种特殊的线性表,只允许在表的一端进行插入和删除 操作。
运行时存储空间的分类
静态存储区
01
存储程序中的常量、字符串常量和全局变量等,在程序运行期
间始终占用固定的内存空间。
堆区
02
动态分配的内存区域,用于存储程序运行过程中动态分配的内
存。
栈区
03
பைடு நூலகம்
存储函数调用的局部变量和函数参数等,具有先进后出的特点

运行时存储空间的重要性
提高内存利用率
合理地组织和管理运行时存储空 间,可以提高内存的利用率,避 免内存浪费和冲突。
05
运行时存储空间的优化
内存使用分析
内存占用情况
分析程序在运行过程中占用的内存大小,包括 堆内存、栈内存等。
内存使用模式
研究程序在运行时的内存使用模式,如峰值内 存、平均内存等。
内存泄漏检测
通过工具和技术检测程序是否存在内存泄漏问题。
内存优化策略
内存管理策略
制定合理的内存管理策略,如内存分配、回收和再利用等。
堆内存碎片问题与解决方法
内存碎片问题
由于频繁的动态分配和回收操作,堆中的空闲单元可能会分散在整个存储空间中,导致 无法有效地利用这些空闲单元。
解决方法
为了解决内存碎片问题,可以采用各种策略来重新组织堆,例如合并空闲单元、移动元 素以形成连续的空闲区域等。此外,还可以使用内存池等数据结构来管理内存,以减少

运行时存储空间组织

运行时存储空间组织

2020/7/1
运行时存储空间管理
1
§ 9.1 目标程序运行时的活动
活动: 过程的一次执行。 活动的生存期:从执行该过程体第一步操作到最后 一步操作之间的操作序列,包括执行P时调用其他 过程花费的时间,不同活动的生存期或者是不重叠 的,或者是嵌套的。 递归:如果一个过程在没有退出当前的活动时又开 始其新的活动。 作用域:一个说明在程序里能起作用的范围。
8
像FORTRAN这样的语言
程序是段结构的,即由主程序段和若干子程序段组成。
程序 = 主程序段 + 若干子程序段 各程序段中定义的名字一般是彼此独立的。
(除公共块和等价语句说明的名字以外),也即各段的数据对象名的作用域 在各段中,同一个名字在不同的程序段表示不同的存储单元,不会在不同段 间互相引用、赋值。 每个数据名所需的存储空间大小都是常量 (即不许含可变体积的数据,如可变数组),且所有数据名的性质是完全确 定的。
•过程是否允许引用非局部名字?
•过程调用时,如何传递参数;过程是否可以作为参 数被传递和作为结果被返回?
•存储空间可否在程序控制下进行动态分配?
•存储空间是否必须显示地释放?
2020/7/1
运行时存储空间管理
4
§9.2 运行时存储器的划分
9.2.1 运行时存储器的划分
目标代码 静态数据 栈 ↓ ↑ 堆
2020/7/1
运行时存储空间管理
2
9.1.1 参数传递
参数:形参(哑元),实参(实元) 参数传递(形实匹配) 方式:
(1)传地址 (2)传值 (3)传名 (4) 得结果
2020/7/1
运行时存储空间管理
3
组织存储空间应考虑的几个问题
•过程是否允许递归?

第6章运行时存储空间组织

第6章运行时存储空间组织
静态存储分配是一种最简单的存储管理。一般而言, 适于静态存储分配的语言必须满足以下条件:
PPT文档演模板
第6章运行时存储空间组织
(1) 数组的上下界必须是常数; (2) 过程调用不允许递归; (3) 不允许采用动态的数据结构(即在程序运行过程中申请
和释放的数据结构)。
PPT文档演模板
第6章运行时存储空间组织
PPT文档演模板
第6章运行时存储空间组织
对C语言来说,由于其不含可变数组,因而它的活 动记录本身包含了局部数组的空间。图6–2和图6–3分 别给出了C语言和含可变数组的某简单语言程序运行时 的数据空间结构,即显示了主程序在调用了过程Q,Q 又调用了过程R,且在R投入运行后的存储结构。
SP指示器总是指向执行过程活动记录的起点,而 TOP指示器则始终指向(已占用)栈顶单元。当进入一个 过程时,TOP指向为此过程创建的活动记录的顶端; 在分配数组区之后(如果有的话),TOP又改为指向数组 区(从而是该过程整个数据区)的顶端。
PPT文档演模板
第6章运行时存储空间组织
6.2.2 过程的执行 1.过程调用 过程调用的四元式序列为:
par T1
par T2
par Tn call P,n
PPT文档演模板
第6章运行时存储空间组织
由于此时TOP是指向被调用过程P之前的栈顶,而P 的形式单元和活动记录起点之间的距离是确定的(等于 3,参见图6–4),因而由调用者过程给将要调用的过程 P的活动记录(正在形成中)的形式单元传递实参值或实 参地址,即每个par Ti (i=1,2,…,n)可直接翻译成如下指 令:
SP= TOP+1
/*定义新SP*/
1[SP]=返回地址
/*保护返回地址*/

第6章运行时存储空间的组织和管理

第6章运行时存储空间的组织和管理
第6章运行时存储空间的组织和管理
6.2 全局栈式存储分配
•1、过程p调用过程q的调用序列
•top_s •baspe_s
p
•控制链和返回地址
•返回值和参数
•临时数据局部数 •控制链 据 • 和保存的机器状 态 •返回值和参数

•(2) p把返回地址 和当前base_sp的 值存入q的活动记 录中,建立q的访 问链,增加 base_sp的值
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章运行时存储空间的组织和管理
6.2 全局栈式存储分配
• 即使是同一种语言,过程调用序列、返回序 列和活动记录中各域的排放次序,也会因实
现而异 • 设计这些序列和活动记录 的一些原则
– 以活动记录中间的某个 位置作为基地址
– 长度能较早确定的域放在 活动记录的中间
•返 回 值 •参 数 •控 制 链 •访 问 链 •机 器 状 态 •局 部 数 据 •临 时 数 据
第6章运行时存储空间的组织和管理
6.2 全局栈式存储分配
• 即使是同一种语言,过程调用序列、返回序
列和活动记录中各域的排放次序,也会因实
现而异 • 设计这些序列和活动记录 的一些原则
– 一般把临时数据域放在 局部数据域的后面

运行时存储空间组织

运行时存储空间组织

垃圾回收:自动检测并清 除不再使用的内存空间, 释放内存资源,保证系统 正常运行
运行时存储空间的优化
内存优化策略
内存分区管理:将内存划分为不同的区域,以便更有效地管理数据和程序。
内存压缩技术:通过压缩数据来减少内存占用和提高内存利用率。
内存优化算法:采用高效的算法来管理内存,例如垃圾回收、内存分配等。
运行时存储空间的分配和管理
内存分配方式
静态内存分配:在编译时确定,程序执行期间一直存在
动态内存分配:在程序运行时根据需要分配,可以动态地增加或减 少 栈内存分配:由操作系统自动管理,用于存储局部变量和函数调用的 信息
堆内存分配:通过指针管理,用于存储动态分配的变量和数据结构
内存管理机制
内存分区:将内存划分为不同的区域,如代码区、数据区、堆区和栈区
内存优化工具:使用专业的工具来检测和优化内存使用情况,例如内存分析器、性能分析 器等。
内存使用分析工具
内存泄漏检测工具:用于检测程 序中的内存泄漏
内存压力测试工具:用于测试程 序在内存压力下的表现
添加标题
添加标题
添加标题
添加标题
内存使用分析器:用于分析程序 运行时的内存使用情况
内存碎片整理工具:用于整理内 存碎片,提高内存使用效率
安全防护措施
访问控制:限 制对存储空间 的访问权限, 防止未经授权
的访问。
数据加密:对 存储空间中的 数据进行加密, 确保数据在传 输和存储过程 中的安全性。
定期审计:对 存储空间的访 问和使用情况 进行定期审计, 及时发现和解 决安全问题。
Hale Waihona Puke 安全更新:及 时更新存储空 间的安全补丁 和漏洞修复, 提高存储空间

第6章运行时存储空间组织

第6章运行时存储空间组织
Байду номын сангаас
过程P调用之前,先构造出P的活动记录部分内容,见图 6–5所示。
第6章 运行时存储空间组织

4 3 TOP+ 3 2 1 0 TOP
SP

T2 T1 参数个数n
现 行 SP值
P的 活 动 记 录 调用过程
图6–5 过程P调用前先构造P的活动记录部分内容
第6章 运行时存储空间组织
2.过程进入
转入过程P后,首先要做的工作是定义新活动记录的 SP,保护返回地址和定义新活动记录的TOP值,即执 行下述指令:
SP= TOP+1
/*定义新SP*/
1[SP]=返回地址
/*保护返回地址*/
TOP=TOP+L
/*定义新TOP*/
其中,L是过程P的活动记录所需的单元数,这个 数在编译时可静态地计算出来。
第6章 运行时存储空间组织
对含可变数组(非C语言)的情况来说,因为过程可含 可变数组且所有数组都分配在活动记录的顶上,所以 紧接上述指令之后应是对数组进行存储分配的指令(如 果含有局部数组),这些指令是在翻译数组说明时产生 的。对每个数组说明,相应的目标指令组将做以下几 件工作:
第6章 运行时存储空间组织
对FORTRAN语言来说,其特点是不允许过程有递 归性,每个数据名所需的存储空间大小都是常量(即不 允许含可变体积的数据,如可变数组),并且所有数据 名的性质是完全确定的(不允许出现在运行时再动态确 定其性质的名字这种情况)。这些特点确保整个程序所 需数据空间的总量在编译时是完全确定的,从而每个 数据名的地址就可静态地进行分配。
第6章 运行时存储空间组织
一个FORTRAN程序段的局部数据区可由图6–1所示 的项目组成。其中,隐参数是指过程调用时的连接信 息(不在源程序中明显出现),如调用时的返回地址、调 用时寄存器的保护等;形式单元用来存放过程调用时 形参与实参结合的实参地址或值。

第6章 运行时存储空间组织

第6章  运行时存储空间组织

3.栈
6.1 静态存储分配
• 静态存储空间分配:
在编译时就确定一个程序在运行时所需的存储空间大小,安排好目标
程序运行时的全部数据空间,并确定每个数据项的单元地址,这种存 储空间分配方法叫做静态分配。
• 使用静态存储空间分配的高级语言FORTRAN特点:
• 不允许过程有递归性 • 每个变量的存储空间大小都是常量(即不允许含可变体积的数据,
SP
0
(4) 过程的局部变量、数组 的内 情 向 量 和 临时工作 单元。
图6–4 C过程的活动记录
• C语言的过程局部变量或形参的存储单元地址计算:
由图 6–4 可知,过程的每一局部变量或形参在活动记录中的 位置都是确定的;这些变量或形参所分配的存储单元其地址 都是相对于活动记录的基址SP的。变量和形参运行时在栈上 的绝对地址是: 绝对地址=活动记录基址(SP,可变)+相对地址(X,编译时可确定)
TOP SP R的 活 动 记 录 Q的 活 动 记 录 main 的 活 动 记 录 全 局 数 据 区
图6–2 C语言程序的栈数据区的存储组织
TOP
在分配数组区之后, TOP又改为指向数组区 的顶端。
R的 数 组 区 SP R的 活 动 记 录 Q的 数 组 区 Q的 活 动 记 录 主 程 序 全 局 数 据 区
}
6.2.1 栈式存储分配与活动记录
栈式存储分配策略下的活动记录的建立和销毁: • 使用栈式存储分配法意味着程序运行时,每当进入一 个过程(或函数)就有一个相应的活动记录累筑于栈顶, 此记录含有连接数据、形式单元、局部变量、局部数 组的内情向量和临时工作单元等; • 当一个过程工作完毕返回时,它在栈顶的活动记录随 过程结束而被弹出,即不复存在。

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (4)

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (4)
试用图表示 ex 调用 PP(a)前后活动记录的过程。
第六章 运行时存储空间组织 【解答】 按照嵌套过程语言栈式实现方法,ex调用PP(a)
前后活动记录的过程如图6-2所示。
图6-2 ex调用PP(a)前后的活动记录
第六章 运行时存储空间组织
6.5 类 PASCAL 结构(嵌套过程)的程序如下,该语言的编 译器采用栈式动态存储分配策略管理目标程序数据空间:
第六章 运行时存储空间组织 第六章 运行时存储空间组织
第六章 运行时存储空间组织
6.1 完成下列选择题:
(1) 分配目标程序数据空间的基本策略分为

A.栈式分配和堆式分配

B.局部分配和整体分配
C.静态分配和动态分配
D.程序运行之前分配
(2) 过程的DISPLAY表中记录了

A.过程的连接数据
B.过程的嵌套层次
第六章 运行时存储空间组织 图6-1 递归过程的活动记录
第六章 运行时存储空间组织
过程进入指令为
SP=TOP+1 1[SP]=返回地址
TOP=TOP+L 建立 DISPLAY 表 P; 返回指令为 TOP=SP-1
/*执行 P 过程*/
SP=0[SP]
X=2[TOP]
UJ 0[X]
(2) 对于 return 后的直接递归情况,可简化为
后放”和“后请先放”的原则,即申请和释放的顺序是任意的。 故选D。
第六章 运行时存储空间组织
(5) 栈式动态分配与管理在过程返回时应做的工作有:① 恢复老TOP;② 恢复老SP;③ 根据返回地址无条件返回。故 选B。
(6) 如果活动记录中没有DISPLAY表,则说明程序中不允 许有嵌套定义的过程。故选B。

运行时的存储组织

运行时的存储组织
编译时能确定的 全程/静态数据区用以存放编译时能确定所占用空间
的数据 堆/栈区用于可变数据以及管理过程活动的控制信息
目标代码区
全程/静态数据 区

↑ 自由空间
↓ 堆
8.1 运行时存储空间的划分
过程的活动记录
过程的活动记录是一段连续的存储区,用来 存放过程的一次执行所需要的信息。 自变量(参数空间) 返回地址 用作局部数据的空间 用作局部临时变量的空间
8.2 过程活动记录
v编译程序分配目标程序运行时的数据空间的基本依据是 程序语言设计时对程序运行中存储空间的使用和管理办 法的规定
v在程序设计语言语义学中,使用environment表示将一个 名字映射到一个存储位置的函数,state表示存储位置到 值的映射,如图所示:
数据空间的使用和管理方法分成三种: 静态存储分配 栈式动态存储分配 堆式动态存储分配
运行时的存储组织
知 识 结 构
8.1 概述
从逻辑上看,代码生成前,编译程序必须进行 目标程序运行环境的设计和数据空间的分配
所谓运行时的环境是指目标计算机的寄存器和 存储器的结构,以及用来管理存储器并保存执 行过程所需要的信息。
几乎所有的程序设计语言都使用3种类型的存 储环境:完全静态环境、基于栈的存储环境和 基于堆的存储环境中的一种或几种。
这种分配策略是将整个程序的数据空间 图给出了进入过程exchange之后运行栈的示意,仅
图中描述了该程序中局部变量的静态存储位置:
设计为一个栈 用作局部临时变量的空间
SP:总是指向现行过程活动记录的起点
(19) NEXT=1
Program TEST 那么当运行程序要求一块体积为N的空间时,需要决定应该从哪个空闲块得到这个空间。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章 运行时存储空间组织
6.3.1 嵌套层次显示表(DISPLAY)和活动记录
第6章 运行时存储空间组织
全局数据说明
main( ) { main中的数据说明 }
void R( )
{ R中的数据说明 }
第6章 运行时存储空间组织
void Q( ) { Q中的数据说明 }
第6章 运行时存储空间组织
例如,下面计算n!的C语言程序就是一个递归调用的程
序,它的执行过程可以用栈来实现。 # include “stdio.h” long factorial (int n) {
其中,L是过程P的活动记录所需的单元数,这个 数在编译时可静态地计算出来。
第6章 运行时存储空间组织
对含可变数组(非C语言)的情况来说,因为过程可含
可变数组且所有数组都分配在活动记录的顶上,所以 紧接上述指令之后应是对数组进行存储分配的指令(如 果含有局部数组),这些指令是在翻译数组说明时产生 的。对每个数组说明,相应的目标指令组将做以下几 件工作: (1) 计算各维的上、下限; (2) 调用数组空间分配子程序,其参数是各维的上、
下限和内情向量单元首地址。
第6章 运行时存储空间组织
数组空间分配子程序计算并填好内情向量的所有信
息,然后在TOP所指的位置之上留出数组所需的空间, 并将TOP调整为指向数组区的顶端。 进入过程P后所 做的工作如图6–6所示。 此后,在过程段执行语句的工作过程中,凡引用形 式参数、局部变量或数组元素都将以SP为基址进行相 对访问。
第6章 运行时存储空间组织
TOP= SP–1
SP=0[SP] X=2[TOP] UJ 0[X] 返回到调用过程*/
/*恢复调用过程的TOP值*/
/*恢复调用过程的SP值*/ /*将返回地址送X*/ /*无条件转移,即按X的地址
一个过程也可通过它的end语句(对C语言则是该过
程(函数)体结束时的“}”)自动返回。如果此过程是一 个函数过程,则按上述办法传递结果值,否则仅直接 执行上述返回指令序列。过程P的返回示意如图6–7所 示。
适于静态存储分配的语言必须满足以下条件:
第6章 运行时存储空间组织
(1) 数组的上下界必须是常数;
(2) 过程调用不允许递归; (3) 不允许采用动态的数据结构(即在程序运行过程中申请 和释放的数据结构)。
第6章 运行时存储空间组织
满足这些条件的语言除了FORTRAN之外,还有
BASIC等语言。在这些语言中,编译程序可以完全确 定程序中数据项所在的地址(通常为相对于各数据区起
第6章 运行时存储空间组织
TOP R的 活 动 记 录 SP Q的活动记录 m a i n的 活 动 记 录 全局数据区
图6–2 C语言程序的存储组织
第6章 运行时存储空间组织
TOP R的 数 组 区 SP R的 活 动 记 录 Q的数组区 Q的活动记录 主程序全局数据区
图6–3 含可变数组程序的存储组织
第6章 运行时存储空间组织
P 的数组区

P的活动记录 (长 度 为 L )
1 0 TOP
返回地址
调用过程 SP
图6–6 进入过程P后所做的工作示意
第6章 运行时存储空间组织
3.过程返回
C语言以及其它一些相似的语言含有return(E)形式 的返回语句,其中E为表达式。假定E值已计算出来并 存放在某临时单元T中,则此时即可将T值传送到某个 特定的寄存器中(调用过程将从这个特定的寄存器中获 得被调用过程P的结果)。剩下的工作就是恢复SP和 TOP为进入过程P之前的原值(即指向调用过程的活动 记录及工作空间),并按返回地址实行无条件转移,即 执行下述指令序列:
简单变量 形式单元 隐 参 数 返回地址 寄存器保护区
图6–1 一个FORTRAN程序段 的局部数据区
第6章 运行时存储空间组织
6.2 简单的栈式存储分配
我们首先考虑一种简单程序语言的实现,这种语言 没有分程序结构,过程定义不允许嵌套,但允许过程 的递归调用,允许过程含有可变数组。例如,C语言除 不允许含有可变数组外,就是这样一种语言。C语言的 程序结构如下:
if (n>1)
return (n*factorial (n−1)); else return (1); }
第6章 运行时存储空间组织
main ( )
{ int num; do{ scanf (“%d” , &num);
if (num>=0 && num <15)
printf (“%d\n”, factorial (num)); else printf (“error!\n”); }while (num>=0);
始地址的位移量)。由于过程调用不允许递归,因此数
据项的存储地址就与过程相联系。过程调用所使用的 局部数据区可以直接安排在过程的目标代码之后,并 把各数据项的存储地址填入相关的目标代码中,以便 在过程运行时访问这个局部数据区。在此,不存在对 存储区的再利用问题;目标程序执行时不必进行运行 时的存储空间管理,过程的进入和退出变得极为简单。
}
第6章 运行时存储空间组织
6.2.1 栈式存储分配与活动记录
使用栈式存储分配法意味着程序运行时,每当进入 一个过程(或函数)就有一个相应的活动记录累筑于栈顶, 此记录含有连接数据、形式单元、局部变量、局部数 组的内情向量和临时工作单元等;在进入过程和执行 过程的可执行语句之前,再把局部数组所需空间累筑 于栈顶,从而形成过程工作时的完整数据区。
TOP
现 行 SP值


调用过程
SP
图6–5 过程P调用前先构造P的活动记录部分内容
第6章 运行时存储空间组织
2.过程进入
转入过程P后,首先要做的工作是定义新活动记录的 SP,保护返回地址和定义新活动记录的TOP值,即执 行下述指令: SP= TOP+1 1[SP]=返回地址 TOP=TOP+L /*定义新SP*/ /*保护返回地址*/ /*定义新TOP*/
P的活动记录(正在形成中)的形式单元传递实参值或实
参地址,即每个par Ti (i=1,2,…,n)可直接翻译成如下指 令: (i+3)[TOP]=Ti 或 (i+3)[TOP]=addr[Ti] /*传递参数值*/ /*传递参数地址*/
第6章 运行时存储空间组织
而四元式call P,n则翻译成:
第6章 运行时存储空间组织
对C语言来说,由于其不含可变数组,因而它的活
动记录本身包含了局部数组的空间。图6–2和图6–3分 别给出了C语言和含可变数组的某简单语言程序运行时
的数据空间结构,即显示了主程序在调用了过程Q,Q
又调用了过程R,且在R投入运行后的存储结构。 SP指示器总是指向执行过程活动记录的起点,而 TOP指示器则始终指向(已占用)栈顶单元。当进入一个 过程时,TOP指向为此过程创建的活动记录的顶端; 在分配数组区之后(如果有的话),TOP又改为指向数组 区(从而是该过程整个数据区)的顶端。
1[TOP]=SP 3[TOP]=n JSR P 一条指令*/ /*保护现行SP*/ /*传递参数个数*/ /*转子指令,转向P过程的第
过程P调用之前,先构造出P的活动记录部分内容,见图
6–5所示。
第6章 运行时存储空间组织
4 3 T OP+ 3 2 1 0
T2 T1 参数个数n P的 活 动 记 录
第6章 运行时存储空间组织
注意,每个过程的活动记录的体积在编译时可以静
态地确定。但由于允许含有可变数组,所以数组的大 小只有在运行时才能知道。因数组区的大小不能预先 获知,为了扩充方便,所以只能将数组区累筑于活动 记录之上的当前栈顶。当一个过程工作完毕返回时, 它在栈顶的数据区(包括活动记录和数组区)也随即不复 存在。
部变量或形参X的引用均可表示为变址访问X[SP]。此 处X代表X相对于活动记录基址的偏移量,这个偏移量 (即相对数)在编译时可完全确定下来。过程的局部数组 的内情向量的相对地址在编译时也同样可完全确定下 来,一旦数据空间在过程里获得分配后,对数组元素 的引用也就容易用变址的方式进行访问。
第6章 运行时存储空间组织
6.2.2 过程的执行 1.过程调用 过程调用的四元式序列为: par T1 par T2
..........
par Tn
call P,n
第6章 运行时存储空间组织
由于此时TOP是指向被调用过程P之前的栈顶,而P
的形式单元和活动记录起点之间的距离是确定的(等于 3,参见图6–4),因而由调用者过程给将要调用的过程
第6章 运行时存储空间组织
一个FORTRAN程序段的局部数据区可由图6–1所示 的项目组成。其中,隐参数是指过程调用时的连接信 息(不在源程序中明显出现),如调用时的返回地址、调 用时寄存器的保护等;形式单元用来存放过程调用时 形参与实参结合的实参地址或值。
第6章 运行时存储空间组织
临时变量 数 组
第6章 运行时存储空间组织
第6章 运行时存储空间组织
6.1 静态存储分配 6.2 简单的栈式存储分配
6.3 嵌套过程语言的栈式实现
6.4 堆式动态存储分配
6.5 参数传递补遗
第6章 运行时存储空间组织
6.1 静态存储分配
如果在编译时就能够确定一个程序在运行时所需的 存储空间大小,则在编译时就能够安排好目标程序运 行时的全部数据空间,并能确定每个数据项的单元地 址,存储空间的这种分配方法叫做静态分配。
第6章 运行时存储空间组织
FORTRAN语言的静态存储管理特点是FORTRAN程 序中的各程序段均可独立地进行编译。在编译过程中, 给程序中的变量或数组分配存储单元的一般做法是: 为每一个变量(或数组)确定一个有序的整数对;其中, 第一个整数用来指示数据区(局部数据区或公用区)的编 号,第二个整数则用来指明该变量(或数组)所对应的存 储起始单元相对于其所在数据区起点的位移(即相对于 数据区起点的地址);并将这一对整数填入符号表相应 登记项的信息栏中。至于各数据区的起始地址在编译 时可暂不确定,待各程序段全部编译完成之后,再由 连接装配程序最终确定,并将各程序段的目标代码组 装成一个完整的目标程序。
相关文档
最新文档