- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理ch6
华东师范大学计算机科学技术系 第六章 运行时的存储组织与管理 运行时存储管理是指目标程序对存储空间的使用和再使用的方法。 目的:对内存使用的经济性和对各数据实体访问的方便性及高效率。 为达到这一目的,必须营造一个环境支持存储空间的管理。 §1. 存储分配 一、存储空间 程序再运行时,系统为该目标程序分配一块空间,主要存放代码和数据,一个典型的内存格局为: 注意: 这只是一个逻辑示意图,实际的方案与具体的语言及开发者的习惯而有不同,如FORTRAN语言没有动态区,但却有公用区。 保留区是只读区,其中的存储单元是为目标计算机体系结构特殊使用所保留的。如与寄存器、操作数栈相关的数据等。 栈区存放那些局部于过程的数据实体,它们随过程调用而分配、过程返回而消亡。由于遵循“先调用后返回”的原则,所以采用栈式管理。 堆区存放动态申请存储空间的动态变量及不遵守栈式规则的过程中的数据,如ADA的“task”。 二、变量的存储分配 程序中使用的变量必须为其分配存储空间,称将一个数据实体的名(ID)和存储地址相联系(分配地址)为联编(Binding,绑定) ,变量获得存储区的这种活动称为分配(Allocation)。 联编有二种: 静态联编(早期,early) 编译、链接时进行 动态联编(滞后,late)运行时进行 变量的存储分配,尤其是局部于过程(子程序)的变量的存储分配、绑定的要求和方法对存储分配的管理的实施有着直接的影响。如从这个角度考察变量,通常可将变量分为四类: 静态变量(Static Variable) 所需的存储区大小固定、在编译时可确定大小、编译时分配空间、运行时绑定于一个存储区,不会随所在的程序单元(过程、子程序)调用/返回而改变存储位置。这类变量称为静态变量。 半静态变量(Semistatic Variable) 所需的存储区大小固定、在编译时可确定大小、编译时分配空间,但随所在的程序单元调用而被绑定,返回而失去空间,并可能会在存储空间留有多个副本。在运行时可知(动态可确定),称为半静态变量。 例如:在允许递归语言中的递归过程中的变量。 半动态变量(Semidynamic Variable) 主要指数组。所需存储区大小未知,但维数编译时已知,因此信息向量表的大小确定,是半静态的,数组元素的实际存储区则在运行时分配、绑定。例如:数组元素将被分配在二级存储区中。 动态变量(Dynamic Variable) 存储区大小不能确定、且可能变化。即使到所在程序单元被激活(被调用)仍然未知,或者对数组而言信息向量表的大小未知,只有到使用时才能确定并被绑定。称为动态变量。 一般而言,1)存放在静态区,2)3)在栈区,4)在堆区 §2. 存储管理 编译程序根据不同的语言、不同的数据实体对存储分配的要求,采用不同的管理模式,一般有三类: 一、静态存储管理模式 如果程序语言只允许静态变量,那么变量与存储区域的绑定关系在编译时便可建立,并完成存储分配。这一类语言便是静态语言。它们不允许递归调用,不允许动态数组,不允许动态类型的数据对象,即不允许有非静态变量。FORTRAN、COBOL便是静态语言。 这种方法管理简单,但空间开销大。因为:不存在存储区的再利用、无需进行运行时的管理、过程的进入/退出的代码简单。 特点:每个程序单元可以独立编译,对应于(绑定于)一个数据区。通过数据区首址和位移量为每个静态实体编址,位移在编译时确定,数据区在连接和执行时可以不同。 说明: 在FORTRAN语言中有二类特殊的语句说明数据实体。 COMMON语句与COMMON区。在COMMON区中存放的是COMMON语句所定义的变量,功能上相当于全局变量。 等价语句(EQUIVALENCE)。为降低空间开销,使用的一种覆盖技术,但覆盖会导致出现难以理解的错误。 静态分配也适用于许多语言中的静态变量。如全局变量。 在Modula-2中一个模块的局部量 Ada语言中最高层模块(包)(Top-level packages)中定义的变量 C语言中的外部变量、静态变量 二、堆(heap)存储管理模式 这是一种最灵活也是最昂贵的存储分配方法,数据实体可以在任何时刻以任意的顺序分配和释放。 程序设计语言中堆分配方式有: 隐式 如SNOBOL4语言中的可变长串 显式 如Pascal语言中的new(p) 其他 如C语言中标准函数 malloc(..) 动态分配策略 若分配的存区长度固定,则可以将组织成链,这样分配、释放等操作就成为相应的链操作。 如长度可变,常用的分配策略有: 最优满足法(best-fit method):寻找一块剩余最少的自由块。效率较差:引起小(无用)碎片增多。 首次满足法(first-fit):选择第一个找到的足够大的自由块。 循环首次满足法(
文档评论(0)