编译原理第9.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第9

第九章 程序运行期间的存储空间组织 本节内容与要点 运行时存储空间的划分 活动记录概念 存储空间分配策略 1、静态存储分配 2、动态存储分配 简单栈式存储分配 嵌套过程语言的栈式分配 典型范例解析 运行时存储空间的划分 编译程序为了使它编译后得到的目标程序能够运行,要从操作系统中获得一块存储空间。 对这块提供运行的空间应该进行划分以便存放:生成的目标代码、数据对象和跟踪过程活动的控制栈。目标代码的大小在编译时可以确定,所以编译程序可以把它放在一个静态确定的区域。 有一些数据对象的大小在编译时也能确定,因此它们也可以放在静态确定的区域。 运行时存储空间的划分(续) 活动记录 为了管理过程在一次执行中所需要的信息,使用一个连续的存储块,这样的一个连续存储块称为活动记录(Activation Record)。 当过程调用时,产生一个过程的新的活动,用一个活动记录表示该活动的相关信息,并将其压入栈。 活动记录结构图 存储分配策略 静态分配策略在编译时对所有数据对象分配固定的存储单元,且在运行时始终保持不变。 栈式动态分配策略在运行时把存储器作为一个栈进行管理,运行时,每当调用一个过程,它所需要的存储空间就动态地分配于栈顶,一旦退出,它所占空间就予以释放。 堆式动态分配策略在运行时把存储器组织成堆结构,以便用户关于存储空间的申请与归还(回收),凡申请者从堆中分给一块,凡释放者退回给堆。 一、静态分配策略 适用范围和特点: 1、程序语言不允许递归过程; 2、不许含可变体积的数据项目或待定性质的名字; 3、在编译时就能够确定一个程序在运行时所需的存贮空间大小,能够安排好目标程序运行的全部数据空间,并能确定每个数据项的单元地址。 例:一个程序段的局部数据区 二、动态分配策略 适用:程序语言允许递归过程和可变(体积的)数组,其程序数据空间的分配需采用某种动态策略(在程序运行时动态地进行分配)。 栈式动态分配策略:目标程序可用一个栈作为动态的数据空间。运行时,每当进入一个过程或分程序,它所需的数据空间就动态地分配于栈顶,一旦退出,它所占用的空间就予以释放。 堆式动态分配策略:如果程序语言允许用户动态地申请和释放存贮空间,而且申请和释放之间不一定遵守先请后放和后请先放的原则,此时就必须让运行程序持有一个大存贮区(称为堆),凡申请者从堆中分给一块,凡释放者退还给堆。 简单的栈式存贮分配 适用于简单程序语言的实现:语言没有分程序结构,过程定义不允许嵌套,但允许过程的递归调用,允许过程含有可变数组。 C语言就是这样一种语言。其局部名称的存储分配,可以直接采用栈式存储分配策略。 1、栈式存储分配 使用栈式存储分配法意味着把存储组成一个栈。 运行时,每当进入一个过程(一个新的活动开始)时,就把它的活动记录压入栈,从而形成过程工作时的数据区,一个过程的活动记录的体积在编译时是可静态确定的。 当该活动结束(过程退出)时,再把它的活动记录弹出栈,这样,它在栈顶上的数据区也随即不复存在。 C语言的程序结构 全局数据说明 Main ( ) { Main中的数据说明 } void R ( ) { R中的数据说明 } void R ( ) { R中的数据说明 } C语言程序的存储组织 2、C的活动记录 C的活动记录有以下四个项目。 1、连接数据(两项): (1)老SP值,即前一活动记录的起始地址; (2)返回地址。 2、参数个数。 3、形式单元(存放实在参数的值或地址)。 4、过程的局部变量、数组内情向量和临时工作单元。 C过程的活动记录 3.、 过程的执行 分为三步: (1) 过程调用 (2)过程进入 (3)过程返回 (1) 过程调用---par相应的目标代码 过程调用的四元式序列为: par T1 par T2 … par Tn call p , n 每个par Ti (i=1,2,…,n)可直接翻译成如下指令: (i+3) [TOP]: =Ti /*传递参数值*/ 或 (i+3) [TOP]: =addr[Ti] /*传递参数地址*/ (1) 过程调用---call相应的目标代码 四元式 call p,n 翻译成: 1 [TOP]: =SP /*保护现行SP*/ 3[TOP]: =n /*传递参数个数*/ JSR P /*转子指令,转向P过程的第一条指令*/

文档评论(0)

173****7830 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档