编译原理 第六章运行时存储空间管理 上海交通大学 张冬茉 Email:Zhang-dm@cssjtu.edu.cn 2004年5月
1 编译原理 第六章运行时存储空间管理 上海交通大学 张冬茉 Email:zhang-dm@cs.sjtu.edu.cn 2004年5月
第六章运行时存储空间管理 §6.1变量及存储分配 个用高级语言写的程序要投入运行,首先要有一组 可运行的代码,这组代码应与高级语言的程序等价; 其次还需要一个运行环境,对程序中的变量作存储分 配,提供各种运行信息。前者涉及程序语言的编译系 统,我们已在前几章中作了概要介绍。后者涉及变量 以及变量的存储分配和存储管理的问题。本章主要讨 论运行时的存储管理问题,也涉及了符号表的组织与 管理。 2
2 第六章 运行时存储空间管理 §6.1 变量及存储分配 一个用高级语言写的程序要投入运行,首先要有一组 可运行的代码,这组代码应与高级语言的程序等价; 其次还需要一个运行环境,对程序中的变量作存储分 配,提供各种运行信息。前者涉及程序语言的编译系 统,我们已在前几章中作了概要介绍。后者涉及变量 以及变量的存储分配和存储管理的问题。本章主要讨 论运行时的存储管理问题,也涉及了符号表的组织与 管理。
、程序的存储空间 个程序要运行,至少应有这样两个存储空间: (1)代码空间这是经翻译后生成的目标代码的存储区域, 线性存放着目标指令序列。对三地址代码来说,当前执行 的指令位置由指令指针ip指示。因此,只要将印指向程序的 第一个语句,程序便处于开始执行的状态,以后每执行 个语句,i便加4(我们约定,三地址代码的每个语句占4个 字节),指向下个语句。要改变程序控制顺序,只要将转向 点赋给p即可。 3
3 一、程序的存储空间 一个程序要运行,至少应有这样两个存储空间: (1) 代码空间 这是经翻译后生成的目标代码的存储区域, 线性存放着目标指令序列。对三地址代码来说,当前执行 的指令位置由指令指针ip指示。因此,只要将ip指向程序的 第一个语句,程序便处于开始执行的状态,以后每执行一 个语句,ip便加4(我们约定,三地址代码的每个语句占4个 字节),指向下个语句。要改变程序控制顺序,只要将转向 点赋给ip即可
(2)数据空间每个程序都定义一定数量的各种类型的变量 和常数,翻译程序必须为之分配相应的存储空间。初等类 型的数据,如逻辑、整型、实型变量,通常以存储器的基 本存储单元如字节、字、双字来存储。集合数据,如数组 串、记录结构等,一般用若干个连续的字节或字来存储 这便使变量绑定( Biding)于一个存储区域。变量获得存储区 的这种活动称为分配( Allocation)。一个变量一旦被建立, 就获得了相应的存储区,完成了存储区与变量的绑定。除 了这些变量与常数外,数据空间还保存了程序的一些控制 和管理信息(例如,反映程序间调用关系的控制链,反映程 序间变量引用关系的引用链等)、说明程序实体的绑定信息 的描述符以及其他等等。 4
4 (2) 数据空间 每个程序都定义一定数量的各种类型的变量 和常数,翻译程序必须为之分配相应的存储空间。初等类 型的数据,如逻辑、整型、实型变量,通常以存储器的基 本存储单元如字节、字、双字来存储。集合数据,如数组、 串、记录结构等,一般用若干个连续的字节或字来存储。 这便使变量绑定(Biding)于一个存储区域。变量获得存储区 的这种活动称为分配(Allocation)。一个变量一旦被建立, 就获得了相应的存储区,完成了存储区与变量的绑定。除 了这些变量与常数外,数据空间还保存了程序的一些控制 和管理信息(例如,反映程序间调用关系的控制链,反映程 序间变量引用关系的引用链等)、说明程序实体的绑定信息 的描述符以及其他等等
对一个程序来说,它的代码长度可以在编译时刻完全确定 下来,因此,编译时便可安排代码空间。但对数据空间来 说,不仅程序实体的属性影响了存储分配(例如变量类型影 响了每个数据元素的存储长度,作用域决定了变量绑定于 某存储区的空间范围,生存期决定了这种约束的时间范围), 而且语言的运行特性也决定了数据空间的分配和管理应采 用的方法和策略。有的语言在运行前就能确定数据空间的 大小,因而在编译时刻就能进行存储分配,这种分配策略 称之为静态分配( Static Allocation),有的语言则必须在运行 时刻才能作分配,称之为动态分配( Dynamic Allocation) 有的语言因变量生存期具嵌套特性而采用栈分配( Stack Allocation)策略,有的语言因生存期的随机交叉特性而采用 堆分配( Heap allocation)策略
5 对一个程序来说,它的代码长度可以在编译时刻完全确定 下来,因此,编译时便可安排代码空间。但对数据空间来 说,不仅程序实体的属性影响了存储分配(例如变量类型影 响了每个数据元素的存储长度,作用域决定了变量绑定于 某存储区的空间范围,生存期决定了这种约束的时间范围), 而且语言的运行特性也决定了数据空间的分配和管理应采 用的方法和策略。有的语言在运行前就能确定数据空间的 大小,因而在编译时刻就能进行存储分配,这种分配策略 称之为静态分配(Static Allocation),有的语言则必须在运行 时刻才能作分配,称之为动态分配(Dynamic Allocation)。 有的语言因变量生存期具嵌套特性而采用栈分配(Stack Allocation)策略,有的语言因生存期的随机交叉特性而采用 堆分配(HeapAllocation)策略