运行时的存储组织及管理

上传人:208891****657173 文档编号:244664487 上传时间:2024-10-05 格式:PPT 页数:36 大小:476KB
返回 下载 相关 举报
运行时的存储组织及管理_第1页
第1页 / 共36页
运行时的存储组织及管理_第2页
第2页 / 共36页
运行时的存储组织及管理_第3页
第3页 / 共36页
点击查看更多>>
资源描述
,啊,啊,*,编译技术,*,运行时的存储组织及管理,编译器的应用模型,出,错,处,理,语法分析程序,语义分析程序,目标代码生成程序,词法分析程序,中间代码生成程序,代码优化程序,表,格,管,理,编译的前端,(,Front End,),编译的后端,(,Back End,),10/5/2024,2,编译技术,运行时的存储组织及管理,概述,存储组织,运行时的存储分配策略,静态存储分配,动态存储分配,对非局部名字的访问,参数传递,10/5/2024,3,编译技术,运行时的存储组织及管理,计算环境 运行时的环境,计算 目标代码,当词法分析扫描得到标识符,并将它填入符号表的过程中需要给识别出来的标识符分配内存空间。,源程序由一组,过程,按某种规则组成。,过程的一次执行称作一次,活动,。,在过程的语句序列执行之前,过程中访问的对象构成此过程的运行环境,由运行支持程序组织好。,编译程序根据如何组织运行环境而生成目标代码。,映射,源程序,10/5/2024,4,编译技术,运行时环境的作用,目标程序运行时所需存储空间的组织与管理以及源程序中变量存储空间的分配。,10/5/2024,5,编译技术,有关源程序中的一些问题,问题的提出:如何,构造运行程序的策略和方法,过程,活动树,控制栈,说明的作用域,名字的绑定,构造运行程序和源程序有关的一些问题,10/5/2024,6,编译技术,过程,源程序由一组过程组成,不同的程序设计语言,由过程构成源程序的方法不同。,构成源程序的两个过程行文,要么是嵌套的,要么是不相交的。,10/5/2024,7,编译技术,program,sort,(input,output);,var,a:array0.10 of integer;,procedure,readarry,;,var,i:integer;,begin,for i:=1 to 9 do,read(ai,),end;,function,partition,(y,z:integer):integer,;,var,i,j,x,v,:integer;,begin ,end;,procedure,quicksort,(m,n:integer,),var,i:integer,;,begin,if(n,m)then begin,i:=,partition,(m,n,);,quicksort,(m,i-1);,quicksort,(i+1,n),end,end,begin,a0:=-9999;a10:=9999;,readarray,;,quicksort(1,9),end,10/5/2024,8,编译技术,活动树,程序执行期间的控制流:,程序执行的控制是连续的:在任何一步,控制都处于程序的某一点,过程的每一次执行都是从过程体的开头 开始,并最终把控制返回到紧接着该过程被调用点的后面。,过程的一次活动,:,过程体的每一次执行。,过程,p,的一次活动的,生存期,:,在该过程体的执行中的第一步和最后一步之间的一序列步骤的,执行时间,,其中包括执行过程,p,所调用的过程的执行时间,以及这些过程所调用的过程的,执行时间,,如此等等。,一个过程是递归的,如果同一过程的一次新的活动可以在前面活动结束以前开始。,10/5/2024,9,编译技术,活动树,为什么过程的活动可以用树形结构描述?,过程活动的特点:,每当控制流从过程,p,的活动进入到过程,q,的活动中后,它将返回到过程,p,的同一次活动中。,也就是说,如果,a,和,b,是两个过程活动,那么它们的生存期要么是不重叠的,要么是嵌套的。,在树形结构中,节点间的关系就反映了过程之间的关系:,父子关系:嵌套,兄弟关系:先后,10/5/2024,10,编译技术,活动树,用一颗树来描绘控制进入和离开活动的途径。这祥的树称作活动树。,每个节点代表过程的一个活动,根节点代表主程序的活动,当且仅当控制流从活动,a,进入活动,b,时,节点,a,是,b,的父节点,当且仅当,a,的生存期先于,b,的生存期时,,a,节点处于,b,结点的左边,一个结点代表一个唯一的活动,且每一个活动只有一个结点表示,当控制进入某一个活动时,可以直接说,控制在这个结点上。,10/5/2024,11,编译技术,program,sort,(input,output);,var,a:array0.10 of integer;,procedure,readarry,;,var,i:integer;,begin,for i:=1 to 9 do,read(ai,),end;,function,partition,(y,z:integer):integer,;,var,i,j,x,v,:integer;,begin ,end;,procedure,quicksort,(m,n:integer,),var,i:integer,;,begin,if(n,m)then begin,i:=,partition,(m,n,);,quicksort,(m,i-1);,quicksort,(i+1,n),end,end,begin,a0:=-9999;a10:=9999;,readarray,;,quicksort(1,9),end,s,r,q(1,9),p(1,9),q(1,3),p(1,3),q(1,0),q(2,3),p(2,3),q(2,1),q(3,3),q(5,9),10/5/2024,12,编译技术,控制栈,程序的控制流对应于从活动树根节点开始的深度优先遍历。(从左至右),活动树表示了完整的程序控制的先后顺序。在真正运行过程中,活动树并不是真实存在的数据结构。,在程序运行过程中,我们只需要保存那些,活跃着的过程,。,控制栈,控制栈的基本思想:,当一个活动开始执行时,把代表这个活动的结点推进栈;当这个活动结束时,把代表这个活动的结点从栈中弹出。,控制栈只能表示活动树的一部分,活动树只是逻辑上存在的,类似于语法分析树,10/5/2024,13,编译技术,栈和活动树的变化,s,s,r,S r,q(1,9),S q(1.9),p(1,9),S q(1.9)p(1,9),q(1,3),S q(1.9)q(1,3),p(1,3),S q(1.9)q(1,3)p(1,3),q(1,0),S q(1.9)q(1,3)q(1,0),q(2,3),S q(1.9)q(1,3)q(2,3),10/5/2024,14,编译技术,控制栈,控制栈中的活动都是活跃的,当前控制进入的活动在栈顶,从栈顶活动到栈底活动的活动序列是从活动树上当前结点通向根的路径上的结点序列。,从栈底活动到栈顶活动的活动序列表示了活动的生存期的,嵌套关系。,结论:扩充控制栈可用来实现如,Pascal,语言的栈式存储分配。(控制栈中存储活动记录),10/5/2024,15,编译技术,声明的作用域,声明语句是把名字与名字的属性信息绑定在一起的语法结构。,说明的作用域是一个说明起作用的范围,(,源程序行文,),。,一个名字在源程序行文中可能有几处说明,语言的,作用域规则,规定了在语句序列中引用的一个名字是在何处说明的名字。,编译时,处理说明时,把名字及其属性信息填写进符号表;处理引用时,查找这个名字的属性信息,符号表管理程序根据语言的作用域规则,返回其作用域中绑定的属性信息。,10/5/2024,16,编译技术,名字与存储的绑定,名字与存储单元的绑定是指把源程序中的,数据名字,映射到,目标机存储单元,的过程。,环境,把名字映射到一个存储单元上;,状态,把存储单元映射到那里所存放的值上。,或者说,环境把一个名字映射为一个左值,而状态把一个左值映射为一个右值。,10/5/2024,17,编译技术,名字与存储的绑定,名字,存储单元,值,存储分配,程序运行,环境,状态,l-value,r-value,10/5/2024,18,编译技术,静态概念 动态对应,过程定义 过程活动,名字说明 名字的绑定,说明的作用域 活动的生存期,10/5/2024,19,编译技术,存储组织,运行时刻内存的划分:假定编译器从操作系统得到一块存储区,运行时的存储空间要划分成块,:,生成的目标代码,;,数据对象,;,记录过程活动的控制栈对应的数据结构,10/5/2024,20,编译技术,目标代码,静态数据,栈,堆,1.,编译后知道目标代码的大小。,放入静态确定的区域中,2.,某些数据对象的长度也可以在编译时知道,也可以放在静态区域中。主程序中的数据:,c,FORTRAN,3.,栈,控制栈:,Pascal,c,4.,堆,开销比栈大,(,分配和释放方式,),:,Pascal,c,10/5/2024,21,编译技术,活动记录,把过程的一个活动所需要的信息组织成一块连续的存储单元,称为活动记录。,一个活动所需要的信息的每个数据项有相同的生存期,因此,组织成一个活动记录是很自然的。,对于,pascal,语言来说,运行过程中,当调用一个过程时,在栈顶构筑它的活动记录;当这个过程的活动执行完后,把它从栈顶弹出。,10/5/2024,22,编译技术,活动记录,控制链,:,指向调用过程活动的活动记录。,访问链:指向本活动要访问的非局部数据所在的活动记录。,保存机器状态:调用过程活动在调用点的机器状态,包括计数器,各种寄存器的值。,局部数据:过程中定义的局部量。,临时变量:编译产生。,返回值,实在参数,控制链,访问链,保存机器状态,局部数据,临时变量,10/5/2024,23,编译技术,编译时刻的局部数据的设计,PROCEDURE,sub(x,y:real,);,VAR,i,j:integer,;,a:ARRAY1.5 OF real;,e,f:real;,BEGIN,f:=,e+i,*j;,END;,名字 形 类型 偏移量,x,形,real 1,y,形,real 2,i,int,20,j,int,21,a,array,22,e,real,27,f,real,28,符号表,10/5/2024,24,编译技术,中间代码,编译结束,知道每个过程的活动记录的长度,将其填写到相应的过程表中,运行时,调用哪个过程,就在运行栈顶,推进那个过程的活动记录(栈箭头加上活动记录长度)。,f:=,e+i,*j;,*ijt1,+et1t2,:=t2f,10/5/2024,25,编译技术,运行时刻存储分配策略,分配策略是:,静态分配;,栈式分配,或称栈式动态分配;,堆式分配,或称堆式动态分配。,采用哪种分配策略是由源语言的语义决定的。,10/5/2024,26,编译技术,静态存储分配,静态存储分配:在,编译阶段,由,编译程序,实现对存储空间的管理和为源程序中的变量分配存储的方法。,静态存储分配的条件,如果在编译时能够确定源程序中变量在运行时的数据空间大小,且运行时不改变,那么就可以采用静态存储分配方法。,允许局部名字的值在过程停止活动后仍然保持,也就是当控制再次进入程序时,局部名字的值同控制上次离开时一样。,还能用控制栈进行控制吗?,10/5/2024,27,编译技术,静态存储分配的局限,在编译时刻知道数据目标的大小和它们在内存位置上的约束;,不能递归调用过程(一个过程的两个活动的生存期不相交,一个过程的所有活动可以使用同一个活动记录);,不能动态地建立数据结构。,10/5/2024,28,编译技术,静态存储分配策略,CNSUME,目标代码,PRDUCE,目标代码,Char *50,buf,int,next,char c,Char *80 buffer,int,next,Cnsume,活动记录,prduce,活动记录,目标代码,静态数据,10/5/2024,29,编译技术,静态存储分配策略,由于每个变量所需空间的大小在编译时已知,因此可以用简单的方法给变量分配目标地址。,开辟一数据区。(首地址在加载时定),按编译顺序给每个模块分配存储空间。,在模块内部按顺序给模块的变量分配存储,一般用相对地址,所占数据区的大小由变量类型决定。,目标地址填入变量的符号表中。,10/5/2024,30,编译技术,10/5/2024
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 方案规范


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!