运行环境
1. 过程的动态特性
1.1 过程与活动
- 活动:过程的每一次运行(或执行)
- 生存期:任何过程的活动均有有限的生存期
- 活动树:用来描述控制进入和离开活动方式的树结构
1.2 控制栈与活动记录
- 控制栈:运行环境的最佳数据结构应该是一个栈
- 活动记录:栈上的每个节点是每个活动的运行环境
1.3 名字的绑定
- 绑定:运行时为名字X分配存储空间S,这一过程称为绑定
2.运行时数据空间的组织
2.1 运行时内存的划分与数据空间的存储分配策略
- 静态分配:简单的分配策略、对语言机制的限制。
- 栈分配:基于控制栈、可被分配数据的特点、对语言机制的限制、与静态分配的关系。
- 堆分配:可以任意动态分配和撤销数据空间,用双链表保持可用空间信息,对语言机制不作限制,分配策略的实现较为复杂。
2.2 静态与动态分配简介
-
静态分配策略
在静态分配中,名字在程序编译时与存储空间结合,运行时不再改变,每次过程活动时,过程中的名字映射到同一存储单元。这种性质允许局部名字的值在活动停止后仍能保持,即当控制再次进入活动时,变量的值和控制上一次离开时相同。 -
栈分配策略
栈分配策略是一种动态分配策略,它的基础是活动的控制栈,所有与活动同生存期的数据均可以采用栈分配策略。当活动处在生存期时,相应的数据被分配,生存期结束后,数据被撤销。对于这样的数据,其分配与撤销实际上就是控制栈上活动记录的分配与撤销。 -
堆分配策略
堆分配策略是三种分配策略中最灵活的一种,它对程序设计语言几乎不做什么限制,可以采用静态分配策略或栈分配策略进行分配的数据,均可采用堆分配策略。同时,对于栈分配策略不能分配的数据,堆分配策略也可以分配。
堆分配策略采用一个双向链表的结构,将所有可以被分配的自由空间链接在链表中,链表中的每个节点指示一个连续可用空间的信息,典型的如可用空间的起始和结束地址。节点的顺序应与可用空间的地址先后一致。
3. 栈式动态分配策略
- 控制栈中活动记录的具体内容
- 调用序列与返回序列:调用序列和返回序列的作用、内容;调用序列与返回序列功能的划分;如何设计调用序列与返回序列,以保证控制流的正确转移和活动记录的正确切换。
- 控制链与访问链:控制链与访问链的作用与区别;控制链用于活动记录的正确切换,体现活动的嵌套关系;访问链用于访问非本地数据,体现过程的嵌套关系;
- 访问链的不同实现方法:通过访问链访问非本地数据,通过显示表访问非本地数据;两种方法对访问链的维护。