不考大题
静态性质 vs 动态性质
| 概念 | 静态(编译时) | 动态(运行时) |
|---|---|---|
| 声明/绑定 | 声明(declaration)确定属性 | 绑定(binding)分配存储 |
| 作用域/生存期 | 作用域(scope):名字可见范围 | 生存期(lifetime):存储存在时间 |
三种运行环境
- 完全静态(Fortran):所有数据在编译时分配固定地址
- 基于栈(C/C++/Pascal):过程调用时压栈、返回时弹栈
- 完全动态(Lisp):所有数据在堆上分配,运行时动态管理
存储空间划分
| 区域 | 内容 |
|---|---|
| 目标代码区 | 编译生成的机器指令 |
| 静态数据区 | 全局变量、静态变量(固定地址) |
| 栈 | 活动记录(过程调用/返回) |
| 堆 | 动态分配(malloc/free, new/delete) |
活动记录(AR, Activation Record)
每次过程调用在栈上分配一个 AR,包含:
- 实参空间:存放调用时传递的参数
- 局部数据:局部变量、临时变量
- 临时变量:表达式求值的中间结果
- 机器状态:寄存器内容、程序计数器等
- 返回地址:调用点后第一条指令地址
- 存取链(SL):访问外层作用域非局部量
- 控制链(DL):链接调用者的 AR
栈式存储分配
- 过程调用 栈顶压入 AR
- 过程返回 栈顶弹出 AR
- SP(栈指针)始终指向当前 AR
栈式分配的三条限制
- 不允许在过程返回后访问其局部变量(AR 已弹出)
- 不允许过程内定义的过程作为结果返回(内层过程 AR 随外层返回消失)
- 不允许过程内定义的过程作为参数传递(静态链指向的 AR 可能已失效)
重点 活动记录 AR 的组成内容、栈式存储分配(会画栈帧)。
环境(Environment)vs 状态(State)
- 环境:名字 存储位置(左值)的映射,静态确定作用域
- 状态:存储位置 值的映射,动态变化
重点 环境 vs 状态的区分概念题。
嵌套过程语言中非局部量的访问通过 SL/DL 链和 Display 表实现,详见 嵌套过程与Display表。