网站大量收购独家精品文档,联系QQ:2885784924

柳青《编译技术》Comp-Cha10.pptVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下一页 上一页 目录 退出 * * 10.1 数据空间的使用方法和管理方法 第10章 目标程序运行时的存储组织 10.2 栈式存储分配的实现 本章要点 10.3 嵌套过程语言的栈式实现实例 * * 在生成目标代码之前,必须弄清楚将来在运行时刻,源程序中各变量、常量存贮在什么地方,怎样访问它们。 数据空间应包括: 用户定义的各种类型的数据对象,所需的存储空间,作为保留中间结果和传递参数的临时工作单元,调用过程时所需的连接单元。组织输入/输出所需的缓冲区。 第10章 目标程序运行时的存储组织 * * 运行时的存储区常常划分为:目标区、静态数据区、栈区和堆区。 如下图所示: 本章将介绍存储空间的使用管理方法,重点针对栈式动态存储分配的实现进行讨论。 第10章 目标程序运行时的存储组织 * * 10.1 数据空间的使用方法和管理方法 在大部分现有编译程序中采用的数据空间使用和管理方法主要有两种,即静态存储分配和动态存储分配。 而动态存储分配中又分:栈式动态存储分配、堆式动态存储分配。 10.1.1 静态存储分配 在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项目的存储位置,存储空间的这种分配方法称为静态存储分配。 对语言的要求: (1)不含可变体积数据,如动态数组。 (2)不含递归过程。 (3)数据名的性质完全确定,即不能运行时才确定。 如FORTRAN语言,就可用静态存储分配。例:图10.4(P218) * * 10.1.2 动态存储分配 在目标代码运行时,动态地为源程序中的数据对象分配存储空间,则称为动态存储分配。 对不能满足静态存储分配的语言,则需用动态存储分配。但并非所有分配工作都放在运行时刻做,在编译阶段就要设计好存储组织形式,并反映在生成的目标代码中。 有两种动态存储方式:栈式和堆式。 10.1.3 栈式动态存储分配 将整个程序的数据空间设计为一个栈(Stack),每当调用一个过程时,它所需空间就分配在栈顶,每当过程工作结束时,就释放这部分空间。 如PASCAL、ALGOL和C语言。 * * 10.1.4 堆式动态存储分配 对于有些语言,如SNOBOL语言中的可变长串,PL/1语言和PASCAL语言的受程序员控制的存储分配语句(new),它们对存储空间的需求量,只能在创建它们或给它们赋新值时才知道,且对空间的使用未必服从“先申请后释放,后申请先释放”的原则,这种情况需要采用堆式存储分配。 所谓堆式动态存储分配,就是在存储空间里专门保留一片连续的存储块(称为堆Heap),在运行程序过程中,对于类似上述情况的语法成分,需要空间时,就由一个运行时刻存储管理程序从堆中分配一块区域给它,不再需要时,又可由此堆管理程序释放该区域,供以后重新分配使用。 * * 10.2 栈式存储分配的实现 过程的活动记录(AR):是一段连续的存储区,用以存放过程的一次执行所需要的信息。如下图: 10.2.1 简单的栈式存储分配的实现 假设语言没有分程序结构,过程定义不允许嵌套,但允许过程的递归调用,如C语言。这样的语言可以直接采用栈式存储分配。 * * 无嵌套定义的过程活动记录内容见下表(设该过程含可变数组) 若主程序调用了过程Q,Q又调用了R, 设R含有可变数组,在R进入运行后运行栈的存储结构如下图所示:(P235 图10.8) * * 10.2.2 嵌套过程语言的栈式实现 假设语言的过程定义允许嵌套,例如PASCAL语言。 由于过程定义是嵌套的,一个过程可以引用包围它的任一外层过程所定义的变量或数组,为了在活动记录中查找非局部量名字所对应的存储空间,必须设法跟踪每个外层过程的最新活动记录的位置。常用的跟踪方法有两种: 一种方法:建立静态链,活动记录的形式如下: 静态链处指向直接外层过程的最新活动记录的地址,这就意味着在运行时栈上的数据区(活动记录)之间又增加一条链,这个链称为静态链,通过静态链可实现对过程中非局部变量名称的访问。 * * 另一种方法;建立显示表(display) 为了提高访问速度,引进一个指针数组——嵌套层次显示表(display),假定现进入的过程的层数为i,则它的display表含有i+1个单元,表中自顶向下每个单元依次存放着现行层、直接外层、……,直至最外层(0层,主程序层)等每一层过程的最新活动记录的基地址,为了便于组织存储区和处理,将display作为活动记录的一部分。

文档评论(0)

***** + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8135026137000003

1亿VIP精品文档

相关文档