编译原理第9章.ppt_第1页
编译原理第9章.ppt_第2页
编译原理第9章.ppt_第3页
编译原理第9章.ppt_第4页
编译原理第9章.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章程序运行期间的存储空间组织 本节内容与要点 运行时存储空间的划分活动记录概念存储空间分配策略1 静态存储分配2 动态存储分配简单栈式存储分配嵌套过程语言的栈式分配典型范例解析 运行时存储空间的划分 编译程序为了使它编译后得到的目标程序能够运行 要从操作系统中获得一块存储空间 对这块提供运行的空间应该进行划分以便存放 生成的目标代码 数据对象和跟踪过程活动的控制栈 目标代码的大小在编译时可以确定 所以编译程序可以把它放在一个静态确定的区域 有一些数据对象的大小在编译时也能确定 因此它们也可以放在静态确定的区域 运行时存储空间的划分 续 返回 活动记录 为了管理过程在一次执行中所需要的信息 使用一个连续的存储块 这样的一个连续存储块称为活动记录 ActivationRecord 当过程调用时 产生一个过程的新的活动 用一个活动记录表示该活动的相关信息 并将其压入栈 当过程返回 活动结束 时 当前活动记录一般包含如下内容 连接数据返回地址动态链 指向调用该过程前的最新活动记录地址的指针 运行时 使运行栈上各数据区按动态建立的次序结成链 链头为栈顶起始位置 静态链 指向静态直接外层最新活动记录地址的指针 用来访问非局部数据 形式单元 存放相应的实在参数的地址或值 局部数据区 局部变量 内情向量 临时工作单元 如存放对表达式求值的结果 指针SP指向现行过程 即最新进入工作的那个过程 的活动记录在栈里的起始位置 活动记录结构图 TOP SP 连接数据 返回 存储分配策略 静态分配策略在编译时对所有数据对象分配固定的存储单元 且在运行时始终保持不变 栈式动态分配策略在运行时把存储器作为一个栈进行管理 运行时 每当调用一个过程 它所需要的存储空间就动态地分配于栈顶 一旦退出 它所占空间就予以释放 堆式动态分配策略在运行时把存储器组织成堆结构 以便用户关于存储空间的申请与归还 回收 凡申请者从堆中分给一块 凡释放者退回给堆 返回 一 静态分配策略 适用范围和特点 1 程序语言不允许递归过程 2 不许含可变体积的数据项目或待定性质的名字 3 在编译时就能够确定一个程序在运行时所需的存贮空间大小 能够安排好目标程序运行的全部数据空间 并能确定每个数据项的单元地址 适于静态存贮分配的语言必须满足以下条件 1 数组的上下界必须是常数 2 过程调用不允许递归 3 不允许采用动态的数据结构 即在程序运行过程中申请和释放的数据结构 由于过程调用不允许递归 数据项的存贮地址就与过程相联系 过程调用所使用的局部数据区可以直接安排在过程的目标代码之后 并把各数据项的存贮地址填入相关的目标代码中 以便在过程运行时访问这个局部数据区 这里 不存在对存贮区的再利用问题 在执行目标程序时不必进行运行时的存贮空间管理 过程的进入和退出变得极为简单 例 一个程序段的局部数据区 返回 返回 二 动态分配策略 适用 程序语言允许递归过程和可变 体积的 数组 其程序数据空间的分配需采用某种动态策略 在程序运行时动态地进行分配 栈式动态分配策略 目标程序可用一个栈作为动态的数据空间 运行时 每当进入一个过程或分程序 它所需的数据空间就动态地分配于栈顶 一旦退出 它所占用的空间就予以释放 堆式动态分配策略 如果程序语言允许用户动态地申请和释放存贮空间 而且申请和释放之间不一定遵守先请后放和后请先放的原则 此时就必须让运行程序持有一个大存贮区 称为堆 凡申请者从堆中分给一块 凡释放者退还给堆 返回 简单的栈式存贮分配 适用于简单程序语言的实现 语言没有分程序结构 过程定义不允许嵌套 但允许过程的递归调用 允许过程含有可变数组 C语言就是这样一种语言 其局部名称的存储分配 可以直接采用栈式存储分配策略 1 栈式存储分配 使用栈式存储分配法意味着把存储组成一个栈 运行时 每当进入一个过程 一个新的活动开始 时 就把它的活动记录压入栈 从而形成过程工作时的数据区 一个过程的活动记录的体积在编译时是可静态确定的 当该活动结束 过程退出 时 再把它的活动记录弹出栈 这样 它在栈顶上的数据区也随即不复存在 C语言的程序结构 全局数据说明Main Main中的数据说明 voidR R中的数据说明 voidR R中的数据说明 C语言程序的存储组织 TOP SP SP 总指向现行过程活动记录的起点 用于访问局部数据 TOP 始终指向 已占用 栈顶单元 2 C的活动记录 C的活动记录有以下四个项目 1 连接数据 两项 1 老SP值 即前一活动记录的起始地址 2 返回地址 2 参数个数 3 形式单元 存放实在参数的值或地址 4 过程的局部变量 数组内情向量和临时工作单元 C过程的活动记录 0 1 2 SP TOP 3 过程的执行 分为三步 1 过程调用 2 过程进入 3 过程返回 1 过程调用 par相应的目标代码 过程调用的四元式序列为 parT1parT2 parTncallp n 每个parTi i 1 2 n 可直接翻译成如下指令 i 3 TOP Ti 传递参数值 或 i 3 TOP addr Ti 传递参数地址 1 过程调用 call相应的目标代码 四元式callp n翻译成 1 TOP SP 保护现行SP 3 TOP n 传递参数个数 JSRP 转子指令 转向P过程的第一条指令 调用过程 P的活动记录 0 1 2 3 4 TOP 3 TOP SP 2 过程进入 转入过程P后 首先要做的工作是定义新活动记录的SP 保护返回地址和定义新活动记录的TOP值 即执行下述指令 SP TOP 1 定义新SP 1 SP 返回地址 保护返回地 TOP TOP L 定义新TOP L是过程P的活动记录所需的单元数 这个数在编译时可静态地计算出来 活动记录的体积在编译时可静态地确定 对每个数组说明 相应的目标指令组将做以下几件工作 计算各维的上 下限 调用数组空间分配子程序 其参数是各维的上 下限和内情向量单元首地址 数组空间分配子程序计算并填好内情向量的所有信息 然后在TOP所指的位置之上留出数组所需的空间 并将TOP调整为指向数组区的顶端 此后 在过程段执行语句的工作过程中 凡引用形式参数 局部变量或数组元素都是以SP为基址进行相对访问的 进入过程P后所做工作示意 SP TOP 调用过程 P的活动记录 长度为L 0 1 3 过程返回 C语言以及其它一些相似的语言含有return E 的返回语句 E为表达式 假定E值已计算出来并已存放在某临时单元T中 可将T只传送到某个特定寄存器 调用过程将从这个特定的寄存器中获得P的结果 剩下的工作就是恢复SP和TOP为进入过程P之前的原值 即指向工作空间 并按返回地址实行无条件转移 过程P返回示意 即执行下述指令序列 TOP SP 1 恢复调用过程的TOP值 SP 0 SP 恢复调用过程的SP值 X 2 TOP 将返回地址送X UJ0 X 无条件转移 按X地址返回 调用过程空间 P空间 SP TOP 返回 嵌套过程语言的栈式分配 由于过程定义是嵌套的 一个过程可以引用包围它的任一外层过程所定义的变量或数组 运行时 一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据 这些数据视为过程Q的非局部量 非局部名字的访问的实现 为了在活动记录中查找非局部名字所对应的存储空间 过程Q运行时必须知道它的所有外层过程的最新活动记录的地址 由于允许递归性 过程的活动记录的位置 即使是相对位置 也往往是变迁的 因此 必须设法跟踪每个外层过程的最新活动记录的位置 跟踪的办法很多 本节讨论两种方法 一种是通过静态链 另一种是通过显示表 display 一 静态链和活动记录 引入一个称为静态链的指针 该指针为活动记录的一个域 指向直接外层的最新活动记录的地址 这就意味着在运行时栈上的数据区 活动记录 之间又拉出一条链 这个链称为静态链 静态链是从一个过程的当前活动记录指向其直接外层的最新活动记录 具有静态链的活动记录结构 SP TOP 假定过程的嵌套关系如下 P vara Q b vari R varc d callR S varc I callQ callS 过程调用试运行栈的变化 SP TOP S过程 P过程 Q过程 例 请见书上P258页嵌套程序 写出递归调用时活动记录的变化 程序见下页 返回 二 嵌套层次显示表 display 和活动记录 为了提高访问非局部量的速度 还可以引用一个指针数组 称为嵌套层次显示表 每进入一个过程后 在建立它的活动记录区的同时建立一张嵌套层次表display 假定现进入的过程的层数为i 则它的display表含有i 1个单元 此表本身是一个小找 自顶向下每个单元依次存放着现行层 直接外层 直至最外层 0层 主程序层 等每一层过程的最新活动记录的基地址 例如 令过程R的外层为Q Q的外层为P 则过程R运行时display表的内容应为 0 1 2 由于过程的层数可以静态确定 因此每个过程的display表的体积在编译时即可知道 由一个非局部量说明所在的静态层数和相对活动记录的相对地址 就可得到绝对地址 绝对地址 display 静态层数 相对地址 活动记录结构 0 1 2 3 d SP TOP d个单元 d 0 1 k 由于每个过程的形式单元的数目在编译时是知道的 因此DISPLAY的相对地址d 相对于活动记录起点 在编译时也是完全确定的 被调用过程为了建立自己的DISPLAY 则必须知道它的直接外层过程的DISPLAY 这意味着必须把直接外层的DISPLAY地址作为连接数据之一 称为 全局DISPLAY地址 传送给被调用过程 于是连接数据变为包含三项 老SP值 返回地址 全局DISPLAY地址 注意 0层过程 主程序 的DISPLAY只含一项 这一项就是在主程序开始工作时建立的第一个SP值 2 过程调用 进入和返回 1 过程调用 过程调用所做工作与简单栈式存贮分配大体相同 只是现在增加了一个连接数据 所以每个parTi相应的指令应改为 i 4 TOP Ti 或者 i 4 TOP addr T callp n所对应的指令应为 1 TOP SP 保护现行SP 3 TOP SP d 将直接外层的DISPLAY始址作为P的全局DISPLAY地址 4 TOP n 传递参数个数 lJSRP 转向P的第一条指令 2 过程进入 在转入过程P后 首先执行和简单栈式存贮分配相同的指令 SP TOP 1 定义新的SP 1 SP 返回地址 保护返回地址 TOP TOP L 定义新的TOP 其次 应按第三项连接数据所提供的全局DISPLAY地址 自底而上地抄录i个单元内容 i为P的层次 然后再添上新的SP值而形成现行过程P的DISPLAY 共i 1个单元 3 过程返回 当过程P工作完毕要返回到调用段时 若return语句含有返回值或P是个函数过程 则把己算好的值传送到某个特定的寄存器 然后执行 TOP SP 1 恢复调用过程的TOP值 SP O SP 恢复调用过程的SP值 X 2 TOP 将返回地址送X UJ0 X 无条件转移 返回 过程返回执行的指令与简单栈式存贮分配的过程返回完全一样 TOP P过程空间 调用过程空间 SP 1 2 3 4 d 定义新的SP 定义新的TOP 按全局display地址复制display表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论