不考大题

静态性质 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

栈式分配的三条限制

  1. 不允许在过程返回后访问其局部变量(AR 已弹出)
  2. 不允许过程内定义的过程作为结果返回(内层过程 AR 随外层返回消失)
  3. 不允许过程内定义的过程作为参数传递(静态链指向的 AR 可能已失效)

重点 活动记录 AR 的组成内容、栈式存储分配(会画栈帧)。

环境(Environment)vs 状态(State)

  • 环境:名字 存储位置(左值)的映射,静态确定作用域
  • 状态:存储位置 值的映射,动态变化

重点 环境 vs 状态的区分概念题。

嵌套过程语言中非局部量的访问通过 SL/DL 链和 Display 表实现,详见 嵌套过程与Display表