西北工业大学编译原理课件第七章 运行时的存储组织与分配.ppt

西北工业大学编译原理课件第七章 运行时的存储组织与分配.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 运行时的存储组织与分配 编译程序必须为源程序中所出现的量(常量,变量及数组等等)分配运行时的存储空间. 分配方案选择的是否得当将关系到资源的合理使用,从而会影响到程序的运行效率. 存储分配的策略有静态分配与动态分配两类. 静态分配适合于无动态申请内存,无可变体积数组,无递归调用的程序.如FORTRAN,BASIC等. 动态存储分配适用面广是目前最常用的分配方案 动态分配又有栈式分配与堆式分配两种. 7.1 存储组织 7.1.1 运行时内存的划分 运行时,系统为目标程序分配的存储空间按用途可划分为下面几个部分: 1.目标程序区 存放目标程序; 2.静态数据区 编译时可确定的占用存 储空间大小的数据; 3.运行栈区 运行时才能分配存储空 间的数据区; 4.堆区 用于用户动态申请存储 空间 存储分配策略 因目标代码的长度在编译时就可确定,可放在静态区内; 对于在编译时已知大小的数据对象(如常量,全局变量,静态变量等等), 也可放在静态区内; 为提高运行效率,应尽可能多地分配静态数据空间. FORTRAN,BASIC的分配一般可全部放在静态区内. 像PASCAL,C这类语言的实现,由于子程序允许递归地调用,因此应用一数据栈来动态地管理内存分配. 另外PASCAL和C还允许动态地申请的内存,这种数据的空间可由堆式分配实现. 7.1.2 活动记录 一个过程的一次执行所需信息的管理,是通过称为活动记录的连续存储块来实现的。 活动记录的内容见右图。 在PASCAL,C语言中,通常采用以过程为单位的动态存储分配方案: 当一过程被调用时,就把其活动记录压入运行时存储栈顶,返回时弹出之。 活动记录的组成 临时变量域 存放目标程序临时变量的值; 局部数据域 存放本次执行中的局部数据、简变、数组内情向量等; 机器状态域 保存在调用该过程前有关机器状态的信息,包括各种寄存器的当前值及返回地址等; 任选的存取链 为访问其它活动记录中所存放的非局部数据提供链地址(PASCAL中用到); 任选的控制链 用于指向主调过程的活动记录; 实在参数 存放主调过程为被调过程提供的实参信息; 返回值域 被调过程用来为主调过程存放返回值的域; 活动记录的组成(续) 每个活动记录都可分为定长部分和可变部分. 定长部分 用于存放在编译时就能确定其体积的量,如简单变量、常界数组等; 可变部分 适用于存放只有在运行时才能确定其体积的量,如可变数组等. 虽然可变数组的体积在动态运行时才能确定,但其地址的访问却在编译时就可确定,即通过活动记录的首地址+偏移量来访问.因为与它的体积有关的信息(如内情向量)是在定长部分存放的. 7.2 运行时的分配策略 7.1节所示的数据区的组织,各自使用了不同的存储分配策略: 静态分配; 栈式分配(亦称栈式动态分配); 堆式分配(亦称堆式动态分配). 7.2.1 静态分配 若在编译阶段就能确定源程序中各个数据实体的存储空间大小,则可以采用较简单的静态存储管理 适合静态管理的语言应具备下述条件: 数组上下界是常数; 过程调用不允许递归; 不允许动态建立数据实体。 满足上述条件的语言有FORTRAN、BASIC等。 由于过程调用无递归,过程的活动记录可直接安排在程序代码之后,执行时不必进行运行时的存储管理。 FORTRAN语言的 静态存储分配 FORTRAN程序中各程序段均可独立进行编译; 在编译时,为程序段中的量分配单元的方法是,为每个量确定一个整数对(m,n),其中m指明数据区编号,n指明该存储单元在数据区相对于首单元的偏移量,并把此对填入符号表中。 各数据区首单元地址暂不确定,待各程序段全部编译完后再由连接程序指定。 FORTRAN局部数据区内容见右图。 各程序段数据区的分配 各段数据区的分配有两种方案: (1)不考虑各段间的调用关系,各自独立占有互不相交的空间; (2)划定一连续空间,在定义各局部数据区时,根据相互间的调用(或不调用)关系,安排最合理的分配方案 7.2.2 栈式分配 栈式分配适用于允许递归调用的程序设计语言; 引入一运行栈,每调用一次过程,就把该过程的相应调用记录压入栈,过程执行完毕后再将其弹出栈; 为让过程能访问本次调用记录中数据,可设一指针SP指向当前正在执行的过程之调用记录的某一特定单元. 访问本过程量X可通过访问地址SP+dx实现.其中, dx是X的相对地址 活动树 综上所述,若A,B是两个过程的活动,则它们的生存期要么是不重叠的,要么是嵌套的。 我们可通过一棵树(称为活动树)来描述控制进入和离开活动的途径,在树中: (1)每个结点代表一过程的一次活动; (2)根结点代表主程序的活动; (3)代表A的结点是B的父结点,iff控制从活动A进入B; (4)A结点在B的左边iff A的生存期在B

文档评论(0)

ormition + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档