编译原理 第8章 程序运行时的存储组织.ppt

编译原理 第8章 程序运行时的存储组织.ppt

ID:50657191

大小:402.50 KB

页数:41页

时间:2020-03-14

编译原理 第8章 程序运行时的存储组织.ppt_第1页
编译原理 第8章 程序运行时的存储组织.ppt_第2页
编译原理 第8章 程序运行时的存储组织.ppt_第3页
编译原理 第8章 程序运行时的存储组织.ppt_第4页
编译原理 第8章 程序运行时的存储组织.ppt_第5页
资源描述:

《编译原理 第8章 程序运行时的存储组织.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第8章程序运行时的存储组织及管理(P158)8.1程序运行时的存储组织8.2静态存储分配8.3栈式动态存储分配8.4堆式动态存储分配学习重点影响存储分配策略的语言特征静态存储分配动态存储分配活动记录堆式存储分配变长块的方法影响存储分配策略的语言特征:过程能否递归过程能否嵌套过程调用时参数如何传递哪些实体可以作为参数和返回值是否允许动态的为对象分配和撤销存储空间存储空间是否必须显式地释放……第8章程序运行时的存储组织及管理程序运行时,系统将为程序分配一块存储空间。这块空间用来存储程序的目标代码以及目标代码运行时需要或产生的各种数据。从用途上看,这块空间可分为以下几个部分:1

2、)目标程序区:用来存放目标代码。2)静态数据区:用来存放编译时就能确定存储空间的数据。3)运行栈区:用来存放运行时才能确定存储空间的数据。4)运行堆区:用来存放运行时用户动态申请存储空间的数据。8.1程序运行时的存储组织静态存储分配方式:对于源程序中出现的各种数据项,如常量、简单变量、常界数组、非变体记录等,在编译时就给它们分配固定的存储空间,而且在目标程序运行时,总是使用这些在编译时就分配好的存储单元作为它们的数据空间。8.2静态存储分配采用静态存储分配的语言必须满足下列条件:1)不允许过程有递归调用。2)不允许有可变大小的数据项,如可变数组或可变字符串。3)不允许用户

3、动态建立数据实体。FORTRAN语言没有长度可变的串,也没有动态数组,其子程序和函数也不允许递归调用,所以FORTRAN语言采用静态存储分配方式。8.2静态存储分配隐式参数形式参数简单变量、数组及其它程序变量例(P159)一个FORTRAN程序模块静态存储分配的典型数据区格局如右图所示,其中:1)隐式参数主要用于和主调模块的通讯,它可以是主调过程的返回地址,或是函数返回值。2)形式参数存放相应实在参数的地址或值。3)程序变量部分将作为简单变量、数组、记录以及编译程序所产生的临时变量的存储空间。8.2静态存储分配实现静态存储分配策略:编译程序对源程序进行处理时,对每个变量在

4、符号表中创建一个记录,保存该变量的属性,其中包括为变量分配的存储空间地址即目标地址。由于每个变量需要的空间大小已知,可将数据区开始位置的地址A分配给第一个变量,设第一个变量占n1个字节,则A+n1分配给第二个变量,设第二个变量占n2个字节,同理,A+n1+n2分配给第三个变量等。例chararray[16];inti,j;reala,b;假设:数据区开始位置的地址264字符型占2个存贮单元整型占4个存贮单元实型占8个存贮单元8.2静态存储分配目标地址可采用的地址形式:绝对地址如果编写的编译程序是用于单任务环境,那么,通常采用绝对地址作为目标地址。相对地址如果编译程序是在多

5、程序任务的环境中,那么目标地址可采用相对于程序数据区的基地址的相对地址。若使用相对地址方式,那么程序的每一次执行,程序及其数据区可以处在不同的存储区内。8.2静态存储分配动态存储分配方式:有些语言允许有长度可变的串、动态数组,并允许过程递归调用,那么在编译时就无法确定数据空间的具体大小,故其存储分配必须留到目标程序运行时动态地进行。8.3栈式动态存储分配动态存储分配方式的分类:栈式分配方式:主要采用一个栈作为动态存储分配的存储空间。当调用一个程序时,过程中各数据项所需的存储空间动态地分配于栈顶,当过程结束时,就释放这部分空间。C、PASCAL等语言即采用这种存储分配方式。

6、堆式分配方式:主要通过给运行程序分配一个大的存储空间(称为堆),每当运行需要时,就从这片空间中借用一块,用过之后再退还给堆。栈式动态分配方式的实现:1)申请:在程序运行中,当程序模块被调用时,就从总的数据区中请求一个空间作为其数据区(即加入运行栈中),并保留该空间直到执行完整个模块为止。2)释放:当模块执行完毕,退出模块时,释放它所占有的数据空间(即从运行栈中弹出)。3)嵌套调用:从模块被调用到它运行结束之间,还可以通过过程调用或程序块入口进入其他的模块,此时,也按上面所介绍的方法将这些模块的数据区压入或弹出运行栈。当嵌套的被调程序运行结束返回到主调程序中的调用点时,运行

7、栈中的格局和内容会恢复到调用之前的情况。8.3栈式动态存储分配例(P160)设有如下C程序,其运行栈的变化情况如下图所示。realx;…………………块1intm1(intind)……………块2{intx;x=m2(ind+1);}intm2(intj)………………块3{{intf[10];……………块4booltest1;}}main()………………………块5{intx;x=2;printf("%d",m1(x/5));}块4数据区块3数据区块2数据区块5数据区块1数据区块3数据区块2数据区块5数据区块1数据区块2数据区块

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。