编译-第06章-运行时的存储组织及管理

编译-第6章-运行时的存储组织及管理

目标程序运行时所需要存储空间的组织与管理以及源程序中变量存储空间的分配

  • 静态存储分配
    • 在编译阶段由编译程序实现对存储空间的管理
    • 在编译时能够确定源程序中变量在运行时的数据空间大小,且运行时不改变
    • 现在时兴的语言几乎无法用
  • 动态存储分配
    • 在目标程序运行阶段由目标程序实现
    • 编译的时候要生成动态分配的目标指令

6.1 静态存储分配

6.1.1 分配策略

image

相对地址,实际上还要加入初始地址

6.1.2 模块的完整数据区

image

编译程序除了要给源程序(模块)中的各种变量分配数据区以外,对子程序来说还要在数据区中保留返回地址,对形式参数也要分配存储以存放相应的实参的信息。另外在编译时还要分配临时变量空间(如存放表达式计算的中间结果等)。

6.2 动态存储分配

栈式动态存储分配——分程序,允许递归调用

6.2.1 分配策略

image

函数的形参和局部变量等放在同一个数据区里

image

当进入M1时:

image

6.2.2 活动记录(AR - activation record)

分为三个部分:局部数据区,参数区,display区

  • 参数区

    • 形参数据区
    • 隐参
      • prev abp:存放调用模块记录基地址,知道哪个模块调用的你。函数执行完,释放数据区,数据区之中只想调用钱的位置
      • ret addr:返回地址,调用语句的下一条执行指令地址
      • ret value:函数返回值
  • display区:存放各外层模块活动记录的基地址

    • eg.

    image

    • 变量二元地址(BLON
      • BL:变量声明所在的层次。可以用它找到该层数据区开始地址。(注意为嵌套层次,并列过程具有相同层次)
      • ON:相当于显示参数区开始位置的位移(相对地址)

image

6.2.3 建造display区的规则

从第i进入第j层

image

6.2.4 运行时的地址计算

image

6.3 内存垃圾回收器