欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 【编译原理】第九章 运行时存储

【编译原理】第九章 运行时存储

2025/11/11 17:24:08 来源:https://blog.csdn.net/wuyufei_sun/article/details/148658062  浏览:    关键词:【编译原理】第九章 运行时存储

目录

目标程序运行时的活动

1. 过程的活动

2.参数传递

运行时存储器的划分

1.存储器的划分

2.活动记录

3.存储分配策略

简单的栈式存储分配

1.C的活动记录

2.C的函数调用、进入、返回

嵌套过程语言的栈式实现

1.带有静态链的活动记录

2.带有Display的活动记录

堆式动态存储分配

1. 堆式动态存储分配的实现

2.  隐式存储回收


目标程序运行时的活动

编译程序必须分配目标程序运行时的数据空间。

一个可执行程序所使用的存储空间被分为两个区:                          

代码区和数据区

1. 过程的活动

       过程的每一次运行(或执行)被称为一次活动 (activation)。活动是一个动态的概念,除了设 计为永不停机的过程(如操作系统等),或者是因 设计错误而出现死循环的过程之外,任何过程的 活动均有有限的生存期(life time)。

  • 为讨论方便,将整个程序、函数均视为过程。
  •  一个过程的活动是指该过程的一次执行。
  •  过程的活动生存期是指从该过程体第一步操作到最后一步操作之间的操作序。两个过程的活动生存期或嵌套或不重叠。

2.参数传递

值传递、地址传递、值结果传递、名传递

运行时存储器的划分

1.存储器的划分

2.活动记录

局部变量存放过程中的简单变量

内情向量存放数组变量

临时单元存放表达式计算的中间结果

形式单元存放实参的值或地址

3.存储分配策略

简单的栈式存储分配

程序运行时递归的过程,其活动会不会被激活?

递归调用的层深是多少?

先分配的,后释放

后分配的,先释放

C语言允许过程递归调用

不允许嵌套定义过程(内部过程有可能访问外部过程的局部变量)

f1

        x:integer;

        ...

                f2

                ...

                x:10;

非局部变量通常是全局变量,采用静态管理

当Main调用Q,Q又调用了R

1.C的活动记录

2.C的函数调用、进入、返回

怎么释放f2的存储空间?

下移TOP和SP这对指针

嵌套过程语言的栈式实现

以Pascal语言为例,由于允许嵌套定义过程,则会 出现“非局部名字的访问”问题。因此简单的栈式存储分配不适用。

活动记录中可配有静态链和嵌套层次表两种方式来实现。

1.带有静态链的活动记录

2.带有Display的活动记录

堆式动态存储分配

    若源程序语言允许用户自由的申请和退还数据空间,则应用堆式存储分配,其管理方式较为复杂,我们仅讨论几个主要问题。

1. 堆式动态存储分配的实现

2.  隐式存储回收

       对各用户存储空间的使用情况进行监控(用则加标 记),对不用、少用(未加标记)的空间及时回收,以提 高空间利用率。

回收过程分为两个阶段:

(1)第一个阶段为标记阶段,对已分配的块跟踪程序中各指针的访问路径。如果某个块被访问过,就给这个块加一个标记。

(2)第二个阶段为回收阶段,所有未加标记的存储块回收到一起,并插入空闲块链表中,然后消除在存储块中所加的全部标记。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词