【编译原理】第九章 运行时存储
目录
目标程序运行时的活动
1. 过程的活动
2.参数传递
运行时存储器的划分
1.存储器的划分
2.活动记录
3.存储分配策略
简单的栈式存储分配
1.C的活动记录
2.C的函数调用、进入、返回
嵌套过程语言的栈式实现
1.带有静态链的活动记录
2.带有Display的活动记录
堆式动态存储分配
1. 堆式动态存储分配的实现
2. 隐式存储回收
目标程序运行时的活动
编译程序必须分配目标程序运行时的数据空间。
一个可执行程序所使用的存储空间被分为两个区:
代码区和数据区
1. 过程的活动
过程的每一次运行(或执行)被称为一次活动 (activation)。活动是一个动态的概念,除了设 计为永不停机的过程(如操作系统等),或者是因 设计错误而出现死循环的过程之外,任何过程的 活动均有有限的生存期(life time)。
- 为讨论方便,将整个程序、函数均视为过程。
- 一个过程的活动是指该过程的一次执行。
- 过程的活动生存期是指从该过程体第一步操作到最后一步操作之间的操作序。两个过程的活动生存期或嵌套或不重叠。
2.参数传递
值传递、地址传递、值结果传递、名传递
运行时存储器的划分
1.存储器的划分
2.活动记录
3.存储分配策略
简单的栈式存储分配
1.C的活动记录
2.C的函数调用、进入、返回
嵌套过程语言的栈式实现
以Pascal语言为例,由于允许嵌套定义过程,则会 出现“非局部名字的访问”问题。因此简单的栈式存储分配不适用。
活动记录中可配有静态链和嵌套层次表两种方式来实现。
1.带有静态链的活动记录
2.带有Display的活动记录
堆式动态存储分配
若源程序语言允许用户自由的申请和退还数据空间,则应用堆式存储分配,其管理方式较为复杂,我们仅讨论几个主要问题。
1. 堆式动态存储分配的实现
2. 隐式存储回收
对各用户存储空间的使用情况进行监控(用则加标 记),对不用、少用(未加标记)的空间及时回收,以提 高空间利用率。
回收过程分为两个阶段:
(1)第一个阶段为标记阶段,对已分配的块跟踪程序中各指针的访问路径。如果某个块被访问过,就给这个块加一个标记。
(2)第二个阶段为回收阶段,所有未加标记的存储块回收到一起,并插入空闲块链表中,然后消除在存储块中所加的全部标记。