欢迎来到天天文库
浏览记录
ID:59189517
大小:907.00 KB
页数:53页
时间:2020-09-22
《第8章目标程序运行时存储组织.ppt》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第8章目标程序运行时的存储组织编译程序需进行目标程序运行环境的设计和数据空间的分配。本章主要介绍:静态存储分配策略动态存储分配策略8.1概述我们知道,编译程序的最终目的是将源程序翻译成等价的目标程序,为了达到此目的,编译程序除了对源程序进行词法分析、语法分析和语义分析外,在生成目标代码之前,还必需进行目标程序运行环境的设计和数据空间的分配。所谓运行时的环境是指目标计算机的寄存器和存储器的结构,以及用来管理存储器并保存指导执行过程所需要的信息。一般来讲,如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码和目标代码运行时的数据空间。
2、8.1概述数据空间包括用户定义的各种类型的数据对象所需的存储空间、调用过程所需的连接单元和组织输入/输出所需的缓冲区及保留中间结果和传递参数所需的临时单元等。因此运行时的存储空间通常被划分成:目标区、静态数据区、栈区和堆区,如下图所示。8.1概述运行时存储空间的划分目标代码区静态数据区栈自由空间堆其中,目标代码区用于存放生成的目标代码,它的长度是固定的,即能在编译时确定,静态数据区用于存放编译时所能确定占用空间大小的数据,堆、栈区用于存放可变数据以及管理过程活动的控制信息。8.1概述程序设计语言关于名字的作用域和生成期的定义规则决定了分配目标程序数据空间的基本策略。
3、在大部分现有编译中目标程序数据空间的分配策略有:8.1概述静态存储分配策略分配策略动态存储分配策略栈式动态存储分配堆式动态存储分配8.1概述静态存储分配策略编译时对源程序中各数据项分配固定的存储空间,运行时始终不变。动态存储分配策略运行阶段动态地为源程序中的数据项分配存储空间。8.1概述(1)栈式动态存储分配用一个栈作为动态分配的存储空间。运行时,每当调用一个子程序(过程),所需存储空间就动态地分配于栈顶,退出时释放所占用的空间。(2)堆式动态存储分配运行时把存储区组织成堆,以便用户动态地申请或释放存储空间。8.1概述8.2静态存储分配静态存储分配编译阶段对源程序中
4、各数据项分配固定的存储空间,运行时始终不变。如果在编译时能确定目标程序运行中所需要的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,并确定每个数据项的存储位置(单元地址),则称这种分配策略为静态存储分配。对语言要求(1)程序中每一个数据对象的大小在编译阶段能够确定(即不允许有可变体积的数据如可变数组等);(2)程序运行过程中的给定时刻,每一个数据对象只允许存在一个实例(即不允许有递归等);8.2静态存储分配(3)所有数据的性质是完全确定(即不允许有须在运行时动态确定性质的名字)。像FORTRAN77是满足上述特点的语言。8.2静态存储分配FORTRAN
5、77采用的是静态存储分配,它的程序是段结构的,整个程序由主程序段和若干个子程序段组成,各程序段中定义的名字一般彼此独立,它的每个数据名所需的存储空间大小都是常量,并且不允许递归调用。这样,整个程序所需数据空间的总量在编译时就能完全确定,从而每个数据名的地址就可静态进行分配。8.2静态存储分配下面给出一个FORTRAN77的程序例子(1)PROGRAMCNSUME(2)CHARACTER*50BUF(3)INTEGERNEXT(4)CHARACTERC,PRDUCE(5)DATANEXT/1/,BUF/‘‘/(6)6C=PRDUCE()(7)BUF(NEXT:NEXT
6、)=C(8)NEXT=NEXT+1(9)IF(C.EN.‘‘)GOTO6(10)WRITE(*,‘(A)’)BUF(11)END8.2静态存储分配(12)CHARACTERFUNCTIONPRDUCE()(13)CHARACTER*80BUFFER(14)INTEGERNEXT(15)SAVEBUFFER,NEXT(16)DATANEXT/81/(17)IF(NEXT.GT.80)THEN(18)READ(*,‘(A)’)BUFFER(19)NEXT=1(20)ENDIF(21)PRDUCE=BUFFER(NEXT:NEXT)(22)NEXT=NEXT+1(23)E
7、ND8.2静态存储分配CNSUME的代码PRDUCE的代码CHARACTER*50BUFINTEGERNEXTCHARACTERCCHARACTER*80BUFFERINTEGERNEXT代码静态数据该图描述了程序中局部变量的静态存储位置。8.2静态存储分配动态存储分配策略运行阶段动态地为源程序中的数据项分配存储空间。(1)栈式动态存储分配运行时,每当调用一个子程序(过程),所需存储空间就动态地分配于栈顶,退出时释放所占用的空间。用一个栈作为动态分配的存储空间。8.2静态存储分配8.3动态存储分配(2)堆式动态存储分配运行时把存储区组织成堆,以便用户动态地申请或
此文档下载收益归作者所有