编译原理实践—运行时的存储组织与分配剖析.pptVIP

编译原理实践—运行时的存储组织与分配剖析.ppt

  1. 1、本文档共29页,可阅读全部内容。
  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文档。上传文档
查看更多
编译原理实践 --运行时的存储组织与分配 在程序的执行过程中,程序中数据的存取是通过对应的存储单元进行的。在早期的计算机上,这个存储管理工作是由程序员自己来完成。在程序执行以前,首先要将用机器语言或汇编语言编写的程序输送到内存的某个指定区域中,并预先给变量和数据分配相应的内存地址。而有了高级语言之后,程序员不必直接和内存地址打交道,程序中使用的存储单元都由逻辑变量(标识符)来表示,它们对应的内存地址都是由编译程序在编译时分配或由其生成的目标程序运行时进行分配。所以,对编译程序来说,存储的组织及管理是一个复杂而又十分重要的问题。另外,有些程序设计语言允许有递归过程,有的允许有可变长度的串,有的允许有动态数组,而有些语言则不允许有这些,为什么呢?这都是因为采用了不同的存储分配方式。 1、存储组织概述 程序运行时,系统将为程序分配一块存储空间。这块空间用来存储程序的目标代码以及目标代码运行时需要或产生的各种数据: 1)? 目标程序区:用来存放目标代码。 2)? 静态数据区:用来存放编译时就能确定存储空间的数据。 3)? 运行栈区:用来存放运行时才能确定存储空间的数据。 4)? 运行堆区:用来存放运行时用户动态申请存储空间的数据。 运行时存储空间的划分 存储分配策略 静态存储分配 在运行前就能确定数据空间的大小,因而在编译时就能分配各种数据项的空间,如FORTRAN语言 动态存储分配 不能在编译时完全确定所有数据项的存储空间,只能在编译时产生各种必要的信息,而在运行时,再动态地分配数据项的存储空间。包括栈式动态存储分配和堆式动态存储分配 1)栈式动态存储分配: 运行时,每当进入一个分程序或过程,其中各项数据项所需的存储空间就动态地分配于栈顶,退出时,则释放所占用的空间 特点:效率很高,但是分配的内存容量有限 2)堆式动态存储分配: 允许用户动态申请存储空间,每当需要时可从堆中分得一块,用完之后再退还给堆 特点:动态内存的生存期由我们决定,使用非常灵活,但问题也最多 注意:我们接下来只讨论栈式动态存储分配 栈式动态存储分配 在允许递归调用的语言中,每次递归调用都要重新分配局部变量。对于这种语言应该采用“栈式动态存储分配”,其分配策略是将整个程序的数据空间设计为一个栈,每当调用一个过程时就将其活动记录压入栈,在栈顶形成该过程工作时的数据区,而当过程结束时再将其活动记录弹出栈。在这种分配方式下,过程的调用关系是先进后出的栈模型,每个过程都可能有若干个不同的活动记录,每个活动记录代表了一次不同的调用。当前的AR首地址由栈指针SP指出。AR中通常应包含如下内容: 被调用过程非局部变量存储区的首地址(静态链、Display表) 调用过程的AR首址(动态链,oldSP) 调用点的机器状态 形实参数通讯区 返回值 被调用过程的局部量和临时变量存储区 main p Q call Q call Q call p 1)简单语言的栈式存储分配 简单语言:无分程序结构,过程定义不嵌套,但允许过程的递归调用。如C语言。 C语言不允许过程嵌套定义,即不允许在一个过程内定义另一个过程。C语言的全局变量只能出现在源程序的开头,可采用静态存储分配,编译时候就确定它们的地址 计算局部变量或形参绝对地址的公式为: 绝对地址=SP+相对地址 比较简单,具体不再讨论 2)嵌套过程语言的栈式存储分配 嵌套过程语言:允许过程嵌套,如pascal,PL/0。AR中必须有一些内容,用于解决对非局部变量的引用问题 “嵌套层次”,或称层数。主程序为0,过程S在层数为i的过程R定义,则S层数为i+1 一个过程可以引用包围它的任一外层过程所定义的变量,解决方法很多,常见的方法:双指针方法和Display表方法 双指针方法简单直接,但当嵌套层次较多时,对非局部量的访问效率较低! Display表方法效率较高,实现略复杂 对于PL/0的编译程序,采用的是双指针方法 PL/0数据动态存储采用的技术措施 编译时为每一变量名、过程名和程序段确定一个反映静态嵌套深度的级别level 调用一个过程时,把他的活动记录压入运行时的栈顶,返回时弹出相应的活动记录。活动记录包括: 静态链接SL:指向定义该过程的直接外层过程的活动记录的基地址,以确保变量的正确存取 动态链接DL:指向调用该过程前正在运行的那个过程的活动纪录的基地址,以确保能返回到调用过程段 返回地址RA:保存该被调用过程返回后的地址,也就是调用过程指令的下一条指令的地址 为过程局部变量预留的存储单元 所有运算操作都从栈顶找到它的操作数,并以计算结果代之 编译原理实践 --目标计算机及其解释程序 当前任务:将PL/0源程序翻译成为目标代码程序 通常先将源程序

文档评论(0)

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

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

版权声明书
用户编号:5341224344000002

1亿VIP精品文档

相关文档