编译原理基础(刘坚) 第5章.ppt

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
FORTRAN语言可以完全采用静态存储分配策略,因为FORTRAN满足上述限制。但是,FORTRAN中的等价片与公用区机制,使得分配比较复杂。允许分别编译的程序设计语言,分别编译模块中的数据定义模块(特别是全程引用的数据),也可以采用静态分配策略,因为它们一般在整个程序运行的期间是被共享的。 2.栈分配策略 栈分配策略是一种动态分配的策略,它的基础是活动的控制栈,所有与活动同生存期的数据均可以采用栈分配策略。当活动处在生存期时,相应的数据被分配,生存期结束后,数据被撤销。对于这样的数据,他们的分配与撤销实际上就是控制栈上活动记录的分配与撤销。活动记录被分配在栈数据区中,栈顶由统一的栈顶指针top指示。活动记录的大小如果是L,则活动开始时(确切讲应是开始前),top增加L,活动结束后,top减少L。 对于静态分配策略分配的数据,栈分配策略均可进行分配。因为静态分配数据的特征是编译时可以确定大小,所以栈分配策略可以把这些静态可确定的数据在编译时就安排在栈的底部。而对于静态存储分配无法处理的递归程序调用问题和动态数组问题,均可以采用栈分配的策略来解决,因为递归调用的活动的活动记录的分配和撤销,可以在程序运行时(活动活动时)动态地添加到栈顶,或是从栈顶撤销;动态数组的存储空间大小,也可以根据保存在活动记录中的内情向量信息计算出来,然后动态地添加在当前的栈顶。 虽然栈分配策略是可以进行动态分配的,但是由于可以进行栈分配的数据必须与活动同生存期,所以它对程序设计语言的下述要求也无法满足: ① 当活动停止时,局部活动中名字的值必须保持(否则会出现悬空引用); ② 在程序运行的任意时刻,可以随时生成或撤销的动态数据; ③ 被调用者的活动比调用者的活得更长,此时,活动树不能正确描绘过程间的控制流。 3.堆分配策略 堆分配策略是三种分配策略中最灵活的一种,它对程序设计语言几乎不做什么限制,可以采用静态分配策略或栈分配策略进行分配的数据,均可采用堆分配策略。同时,对于栈分配策略不能分配的数据,堆分配策略也可以进行分配。 堆分配策略采用一个双向链表的结构,将所有可以被分配的自由空间链接在链表中,链表中的每个节点指示一个连续可用空间的信息,典型的如可用空间的起始和结束地址。节点的顺序应与可用空间的地址先后一致。 堆分配的思想并不复杂,当需要空间时,就在链表的节点中找到一块大小合适的区域,将区域中的部分或全部分给需要空间的对象,并将已分配的空间从链表的节点信息中删除,根据是全部还是部分分配,将节点从链中摘除或者修改节点可用空间信息。当空间需要释放时,首先在链表中进行查找,看是否释放的空间与某个(或某两个连续的)节点中的可用空间相邻:若与一个相邻,则修改当前链表中的节点可用信息;若与两个相连,则合并两个节点为一个节点,且修改节点中的可用空间信息;若不与任何可用空间相邻,则在链表的适当位置加入一个新的节点。 一开始,链表中仅有一个节点,它提供的是一个连续的可用空间的全部。随着程序的运行,各活动和动态分配的数据不断地从可用空间中获取存储空间,或者将释放的空间放回可用空间。经过一段时间之后,堆中可能包含交错出现的正在使用和已经释放的区域,使得到一定的时候,堆分配的可用存储空间变成若干个不连续的可用空间(如图5.6(a)、(b)所示)。如果存储空间的分配与撤销算法设计不合理,就会造成程序运行到一定的时刻,所有可用的存储空间被分割成许许多多不连续的碎片,使得无法再进行分配。因此堆分配的空间分配与撤销算法的核心思想之一,就是使可用存储空间尽可能地保持连续。当然,算法的效率也是需要考虑的问题之一。 图5.6 堆分配 (a) 堆分配的存储空间;(b) 堆分配的可用存储空间链 5.3 栈式动态分配 5.3.1 控制栈中的活动记录 前边已经提到,控制栈中的活动记录的作用是为当前的活动提供运行环境,因此它既需要提供活动所操作的数据对象的存储空间,也需要提供适当的信息,以保证活动调用与返回时实现代码的正确转移和活动记录的正确切换,即活动记录中需要保存两类信息:控制信息与访问信息。活动记录的具体内容可如下: 图5.7 活动记录的内容 ① 参数与返回地址:用于存放实参和返回地址,如果是函数,还应有返回值; ② 控制链:指向调用者活动记录的指针,用于当调用返回时,将当前栈顶正确切换到调用者的活动记录;如果是静态分配,该项可以没有; ③ 访问链:用于指示访问非本地数据;当过程不允许嵌套时,该项也可以没有; ④ 调用时需

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档