编泽原理 适于静态存贮分配的语言必须满足以下条件: (1数组的上下界必须是常数; 量(2)过程调用不允许递归; (3)不允许采用动态的数据结构(即在程序 运行过程中申请和释放的数据结构)。 第引|
编译原理 第11页 适于静态存贮分配的语言必须满足以下条件: (1)数组的上下界必须是常数; (2)过程调用不允许递归; (3)不允许采用动态的数据结构(即在程序 运行过程中申请和释放的数据结构)
编译原理 由于过程调用不允许递归,数据项的存贮地 址就与过程相联系。过程调用所使用的局部 数据区可以直接安排在过程的目标代码之后, 并把各数据项的存贮地址填入相关的目标代 码中,以便在过程运行时访问这个局部数据 区。 墨这里,不存在对存贮区的再利用问题。在执 行目标程序时不必进行运行时的存贮空间管 理,过程的进入和退出变得极为简单。 第2贡
编译原理 第12页 由于过程调用不允许递归,数据项的存贮地 址就与过程相联系。过程调用所使用的局部 数据区可以直接安排在过程的目标代码之后, 并把各数据项的存贮地址填入相关的目标代 码中,以便在过程运行时访问这个局部数据 区。 这里,不存在对存贮区的再利用问题。在执 行目标程序时不必进行运行时的存贮空间管 理,过程的进入和退出变得极为简单
编泽原理 亟回 例:一个程序段的局部数据区 临时变呈 数组 简单变呈 形式单元 寄存器保护区 返回地址 图9.4局部数据区 第3
编译原理 第13页 例:一个程序段的局部数据区 返回
编译原理 返回 二、动态分配策略 适用:程序语言允许递归过程和可变(体积的) 数组, 其程序数据空间的分配需采用某种动态策略(在程序运 行时动态地进行分配)。 重栈式动态分配策略:目标程序可用一个栈作为动态的数 据空间。运行时,每当进入一个过程或分程序,它所需 的数据空间就动态地分配于栈顶,一旦退出,它所占用 的空间就予以释放。 堆式动态分配策略:如果程序语言允许用户动态地申请 和释放存贮空间,而且申请和释放之间不一定遵守先请 后放和后请先放的原则,此时就必须让运行程序持有一 个大存贮区(称为堆),凡申请者从堆中分给一块,凡 释放者退还给堆。 第14页
编译原理 第14页 二、动态分配策略 适用:程序语言允许递归过程和可变(体积的)数组, 其程序数据空间的分配需采用某种动态策略(在程序运 行时动态地进行分配)。 栈式动态分配策略:目标程序可用一个栈作为动态的数 据空间。运行时,每当进入一个过程或分程序,它所需 的数据空间就动态地分配于栈顶,一旦退出,它所占用 的空间就予以释放。 堆式动态分配策略:如果程序语言允许用户动态地申请 和释放存贮空间,而且申请和释放之间不一定遵守先请 后放和后请先放的原则,此时就必须让运行程序持有一 个大存贮区(称为堆),凡申请者从堆中分给一块,凡 释放者退还给堆。 返回
编泽原理 简单的栈式存贮分配 适用于简单程序语言的实现:语言没有分程序结构, 过程定义不允许嵌套,但允许过程的递归调用,允许 过程含有可变数组。 墨C语言就是这样一种语言。其局部名称的存储分配, 可以直接采用栈式存储分配策略。 第5
编译原理 第15页 简单的栈式存贮分配 适用于简单程序语言的实现:语言没有分程序结构, 过程定义不允许嵌套,但允许过程的递归调用,允许 过程含有可变数组。 C语言就是这样一种语言。其局部名称的存储分配, 可以直接采用栈式存储分配策略