版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章目标程序运行时的组织
教学要求:本章介绍目标程序运行时的存储组织方式,包括静态存储分配和动态存储分配。要求掌握各种存储组织形式的基本方法。教学重点:静态分配策略和动态分配策略的基本思想,嵌套过程语言栈式分配,活动记录、运行时栈的组织。
10.1概述从逻辑上看,代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配数据空间包括:用户定义的各种类型的数据对象(变量和常量)所需的存储空间,作为保留中间结果和传递参数的临时工作单元,调用过程时所需的连接单元,组织输入/输出所需的缓冲区。存储管理复杂度取决于源语言本身,具体包括:允许的数据类型的多少?语言中允许的数据项是:静态确定?动态确定?程序决定名字的作用域的规则和结构段结构?过程定义不嵌套?只允许过程递归调用?分程序结构:分程序嵌套?过程定义嵌套?
目标代码区
静态数据区
Stackheap 1、存储组织:编译程序对目标程序运行时的组织(运行环境和分配存储)。如通常存储区布局可为:目标代码区用以存放目标代码,这是固定长度的,即编译时能确定的。静态数据区用以存放编译时能确定所占用空间的数据。堆/栈用于存放可变数据以及管理过程活动的控制信息。三种数据区对应着下述三种不同的分配策略2、存储分配策略:(1)静态存储分配——在编译时能确定目标程序运行中所需的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置。注:1、程序结构特点:不允许递归调用,而且不含有可变数组。(如FORTRAN语言)。
2、基本策略:在编译时,根据各类数据所需的存储空间大小以及存储方式规定,在符号表中建立“名字-地址”对应关系,然后根据这些对应关系进行变量名的地址分配。(2)动态存储分配——在运行阶段动态地为源程序中的量分配存储空间。(栈式、堆式)注:1)若某程序设计语言允许过程递归调用,而且允许使用可变数组,那么在编译时就不可能完全为其数据项目分配存储单元,必须采取动态存储分配策略。
2)动态分配数据单元时一般使用栈,即栈式存储管理。栈式:简单的栈式分配方案嵌套过程的栈式分配方案分程序结构的存储分配方案3、过程活动:一个过程的活动指的是该过程的一次执行。4、活动记录(AR):一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区(块)叫做一个活动记录。此记录含有连接数据、形式单元、局部变量、局部数组的内情向量和临时工作单元等。对任何局部变量X的引用可表示为变址访问:dx[SP]dx:变量X相对于活动记录起点的地址,在编译时可确定。SP012TOP每个过程的活动记录内容(非嵌套语言)临时单元内情向量局部变量形式单元参数个数动态链返回地址连接数据返回地址动态链:指向调用该过程的最新活动记录地址的指针。静态链:指向直接外层最新活动记录地址的指针,用来访问非局部数据。SP012TOP每个过程的活动记录内容(嵌套语言)临时单元内情向量局部变量形式单元静态链动态链返回地址形式单元:存放相应的实参的地址或值。局部数据区:局部变量、内情向量、临时工作单元(如存放对表达式求值的结果)。SP012TOP每个过程的活动记录内容临时单元内情向量局部变量形式单元静态链动态链返回地址临时单元内情向量局部变量形式单元静态链动态链返回地址
SPTOP连接数据(控制信息)SP为当前活动记录的起始位置。TOP为栈顶单元。分别放在两个寄存器中。访问信息1、
callP被翻译成:1[TOP]:=SP(保护现行SP)JSRP(转子指令)参数个数返回地址形式单元内情向量局部变量老SP临时单元活动记录的填写TOP
SP调用过程的活动记录老SP2、转进过程P后,首先应执行下述指令:
SP:=TOP+1
(定义新的SP)1[SP]:=返回地址(保护返回地址)TOP:=TOP+L
(新TOP)
L:过程P的活动记录所需单元数,
在编译时可确定。
参数个数返回地址形式单元内情向量局部变量老SP临时单元TOP调用过程的活动记录返回地址TOPSP3、
过程返回时,应执行下列指令: TOP:=SP-1(恢复调用前TOP) X:=2[TOP](把返回地址取到X中)
SP:=0[SP](恢复调用前SP) UJX(按X返回)参数个数返回地址形式单元内情向量局部变量老SP临时单元调用过程的活动记录TOPSPSPTOP
10.2栈式存储分配的实现一、简单的栈式存储分配的实现程序结构特点:没有分程序结构,过程定义不嵌套,过程可递归调用。简单栈式分配方案:把存储区组织成一个栈,运行时每进入一个过程,就把它的活动记录压入栈,形成过程工作时的临时数据区,该过程结束时取消该数据区。
例:Main(){ Main中的数据说明}procR(){ R中的数据说明}…procQ(){Q中的数据说明}主程序→过程Q
→过程RQ的活动记录TOPR的活动记录SP主程序活动记录全局数据区
R的数组区
R的活动记录
Q的活动记录主程序全局数据区分配了数组区之后的运行栈TOPSP二、嵌套过程语言的栈式分配的实现1、程序结构特点:语言的定义允许嵌套,一个过程可以引用包围它的任一外层过程所定义的标识符(如变量,数组或过程等)(如PASCAL语言)。如何才能引用外层数据?2、关键:设法跟踪每个外层过程的最新活动记录AR的位置。跟踪办法:(1)用静态链。(2)用DISPLAY表。PASCALPASCAL程序本身可以看成是一个操作系统所调用的过程,过程可以嵌套和递归。一个PASCAL过程:过程头;说明段(由一系列的说明语句组成);begin执行体(由一系列的执行语句组成);end作用域:一个名字能被使用的区域范围称作这个名字的作用域。允许同一个标识符在不同的过程中代表不同的名字。名字作用域规则--"最近嵌套原则"一个在子程序B1中说明的名字X只在B1中有效(局部于B1);如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,则原来的名字X在B2中仍然有效。如果B2对X重新作了说明,那么,B2对X的任何引用都是指重新说明过的这个X。programmain
varA,B:real;
…
procedureP1varB:boolean;
…
begin
…end
procedureP2varA:integer;
…begin
…endbegin
…endA(real)B(real)B(bool)A(integr)
非局部名字的访问的实现
主程序的层次为0;在i层中定义的过程,其层次为i+1;过程运行时,必须知道其所有外层过程的当前活动记录的起始地址。(1)用静态链在过程活动记录中增设静态链,指向包含该过程的直接外层过程的最新活动记录的起始位置。见P223-224mainp1
p2
p3
p4main过程定义的嵌套执行顺序→p2→p4→p3→p3main活动记录P3活动记录存取链(静态链)控制链(动态链)P3活动记录存取链(静态链)控制链(动态链)P4活动记录存取链(静态链)控制链(动态链)P2活动记录存取链(静态链)控制链(动态链)2、用Display表Display表---嵌套层次显示表当前激活过程的层次为K,它的Display表含有K+1个单元,依次存放着现行层,直接外层…直至最外层的每一过程的最新活动记录的基地址。说明:1、由于过程的层数可以静态确定,因此每个过程的Display表的体积在编译时即可以确定。
2、某过程p是在层次为i的过程q内定义的,并且q是包围p的直接外层,那么p的过程层数为i+1。programP;
varx,y:integer;...procedureP1;
vari,j:integer;...procedureP11(a,b:integer);...begin...end;begin...callP11(i,j);...end;
procedureP2;
vars,t:integer;...procedureP21;begin...end;begin...callP1...end;begin...callP2;...end.012x3y4RA567s8t9152主程序P
过程
P2
过程
P1
过程
P11DisplayP的活动记录P2的活动记录RA101112i13j142P1的活动记录RA151617a18b19P11的活动记录3例:programmain(i,0);
程序结构图
……
procR(c,d);
……
R
end/*R*/
procP(a);主
……
procQ(b);
……
P
Q
callR
R(x,y);
end/*Q*/callQ
……
Q(z);callP
end/*P*/
……
callR
P(W);
……
R(U,V);
……end/*main*/用Display表的方案(1)主程序--->(2)P--->(3)Q--->(4)R主程序的活动记录
d[0]spdisplaytop(1)
P的活动记录主程序的活动记录
d[1]d[0]displaysptop(2)用Display表的方案(1)主程序--->(2)P--->(3)Q--->(4)RQ的活动记录
P的活动记录主程序的活动记录
displayd[2]d[1]d[0]sptop(3)R的活动记录Q的活动记录
P的活动记录主程序的活动记录
d[1]d[0]
displaytopsp(4)DISPLAY表的维护和建立
为便于组织存储区,将display作为活动记录的一部分,其相对地址在编译时是完全可以确定的。假设过程P1可调用P2,为了能在P2中建立P2的display,在P1调用P2时设法把P1的display地址作为连接数据之一(全局display地址)传送给P2,因此连接数据包括:老SP值(动态链)返回地址全局display地址
……dDISPLAY4形式单元
3参数个数
2全局DISPLAY地址
1返回地址
0老SP当过程的层次为n,它的display为n+1个值。一个过程被调用时,从调用过程的DISPLAY表中自下向上抄录n个SP值,再加上本层的SP值。
10.3堆式存储分配
堆:通常是一片连续的足够大的存储区,当需要时,就从堆中分配一小块存储区;用完就及时退还给堆。注:在高级语言中有些数据存储空间的请求与释放不再遵循后进先出的原则,而且是全局性的。为此,需要让运行程序持有一块专用的全局存储空间来满足这些数据的存储要求。这种存储空间就是堆。
10.4参数传递(1)procedureexchangel(i,j:integer);(2)varx:integer;(3)begin;(4)x:=a[i];a[i]:=a[j];a[j]:=x(5)end;
带有非局部变量和形参的PASCAL过程非局变量a[i]和a[j]的值进行交换,i,j为形参传值的实现1.形式参数当作过程的局部变量处理,即在被调过程的活动记录中开辟了形参的存储空间,这些存储位置即是我们所说的形式单元(用以存放实参)。2.调用过程计算实参的值,并将其放在对应形式单元开辟的空间中。3.被调用过程执行时,就像使用局部变量一样使用这些形式单元。
(1)programreference(input,output);(2)vara,b:integer;(3)procedureswap({var}x,y:integer);(4)vartemp:integer;(5)begin(6)temp:=x;(7)x:=y;(8)y:=temp(9)end;(10)begin(11)a:=1;b:=2;(12)swap(a,b);(13)writeln(‘a=‘,a);writeln(‘b=‘,b)(14)end.
带有过程swap的PASCAL程序传地址的实现
把实在参数的地址传递给相应的形参,即调用过程把一个指向实参的存储地址的指针传递给被调用过程相应的形参:1.实在参数是一个名字,或具有左值的表达式----传递左值2.实在参数是无左值的表达式----计算值,放入一存储单元,传此存储单元地址3.目标代码中,被调用过程对形参的引用变成对传递给被调用过程的指针的间接引用
(1)swap(x,y)(2)int*x,*y;(3){inttemp;(4)temp=*x;*x=*y;*y=temp;(5)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 测距仪市场发展预测和趋势分析
- 2024年度公寓楼打胶服务合同
- 便携探照灯市场发展现状调查及供需格局分析预测报告
- 内置盒式录像机的便携式摄像机市场发展现状调查及供需格局分析预测报告
- 2024年度技术开发与合作定制合同
- 虚拟现实眼镜市场发展预测和趋势分析
- 2024年度别墅购销合同书:别墅质量保证与维修服务合同
- 2024年度ointAPI接口使用合同
- 2024年度消防安全设施维护合同
- 2024年度房地产公司与购房者预售合同
- 大学mooc英语畅谈中国(湖北大学)章节测验答案
- 《爸爸的花儿落了》
- 体育心理学(第三版)第03篇章运动兴趣和动机
- jgj39-2016《托儿所、幼儿园建筑设计规范》(2019年版)
- 入井须知及安全注意事项
- 一户一表改造施工方案
- 《田螺姑娘》儿童故事ppt课件(图文演讲)
- 辽宁省盘锦市第一完全中学2023-2024学年九年级上学期期中历史试题
- 竞争性磋商响应文件(投标文件)封面模板
- 高中劳动教育-主题班会课件
- 乙醚安全周知卡、职业危害告知卡、理化特性表
评论
0/150
提交评论