哈工大编译原理第7章.ppt
《哈工大编译原理第7章.ppt》由会员分享,可在线阅读,更多相关《哈工大编译原理第7章.ppt(91页珍藏版)》请在三一办公上搜索。
1、1,第七章 运行时刻环境,2,序7.1 源语言中的一些问题7.2 存储组织7.3 运行时刻存储分配策略7.4 非局部名字的访问7.5 符号表,3,序 计算环境 运行时的环境 计算 目标代码,映射,源程序,源程序中的名字(常量,变量)目标机存储空间。它受命于源程序的执行语义。,源程序由一组过程按某种规则组成。,过程的一次执行称作一次活动.,4,在过程的语句序列执行之前,过程中访问的对象构成此过程的运行环境,由运行支持程序组织好。,PROCEDURE sub(x,y:real);VAR i,j:integer;a:ARRAY1.5 OF real;e,f:real;BEGIN f:=e+i*j;E
2、ND;,5,f,符号表,名字 形 类型 偏移量,活动记录布局=,老SP,(sp,0),x 形 real 3,返回地址,(sp,1),y 形 real 4,2,(sp,2),(sp,3),(sp,5),i int 5,i,(sp,9),j int 9,j,(sp,13),a array 13,a,(sp,53),e,e real 53,(sp,61),f real 61,(sp,4),x,y,t1,t2,t3,(sp,62),(sp,63),(sp,64),6,中间代码*i j t1*(sp,20)(sp,21)(sp,29)+e t1 t2+(sp,27)(sp,29)(sp,30)itor
3、t2 t3 itor(sp,30)(sp,31):=t3 f:=(sp,31)(sp,28),确定活动记录中局部数据的地址:假设sp标记一个活动记录的开始的位置,dx表示x的地址相对于sp的偏移量。那么,x在过程的目标代码中的地址可写成 dx(sp),7,7.1 有关源程序中的一些问题 目的:构造运行程序的策略和方法1.1 过程1.2 活动树1.3 控制栈1.4 说明的作用域1.5 名字的绑定1.6 参数传递1.7 构造运行程序和源程序有关的 一些问题,8,1.1 过程,构成源程序的两个过程行文,,源程序由一组过程组成,,不同的程序设计语言,,由过程构成源程序的方法不同。,要么是嵌套的,,要么
4、是平行的。,9,1.2 活动树,程序执行期间的控制流:,1程序执行的控制是顺序的;,2过程的每一次执行都是从过程体的开头开始,并最终把控制返回到紧接着该过程被调用点的后面。,10,一个过程p的一次活动的生存期:,main,P,其中包括执行过程p所调用的过程的执行时间,以及这些过程所调用的过程的执行时间,如此等等。,在该过程体第一步到最后一步之间的语句的执行时间。,p,11,这种活动生存期的嵌套性质可以通过在每一个过程中插入两个打印语句来加以跟踪。,2、如果a和b是两个过程活动,那么它们的生存期要么是并列的,要么是嵌套的。,控制流的特点:1、每当控制流从过程p的活动进入到过程q的活动中后,它将返
5、回到过程p的同一次活动中。,12,program sort(input,output);var a:array0.10 of integer;procedure readarray;var i:integer;begin end;function partition(y,z:integer):integer;var i,j,x,v:integer;begin end;procedure quicksort(m,n:integer);var i:integer;begin end end;begin end.,程序见P254页,13,执行开始 enter readarray leave read
6、array enter quicksort(1,9)enter partition(1,9)leave partition(l,9)enter quicksort(1,3).leave quicksort(1,3)enter quicksort(5,9).leave quicksort(5,9)leave quicksort(1,9)执行结束,这是递归调用,14,递归:一个过程是递归的,如果同一过程的一次新的活动可以在前面活动结束以前开始。,活动树:,在一棵活动树中:,2.根结点代表主程序的活动;,3.代表a的结点是b结点的父结点当且仅当控制从活动a进入活动b;,4.结点a在结点b的左边当且仅
7、当a的生存期发生在b的生存期之前,用一颗树来描绘控制进入和离开活动的途径。这样的树称作活动树。,1.每一个结点代表一个过程的活动;,15,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),p(5,9),q(5,5),q(7,9),p(7,9),q(7,7),一棵活动树,假设I=4,假设I=1,假设I=1,假设I=2,假设I=6,假设I=8,假设I=8,q(9,9),16,结论:,且每一个活动只有一个结点表示;,当控制进入某一个活动时,,可以直接说,控制在这个结点上。,一个结点代表一个唯一的活动,,
8、17,1.3 控制栈,因此,用一个栈保存过程活动的生存踪迹;,程序执行的控制流对应于从根开始,按先根次序遍历活动树.,当一个活动开始执行时,,把代表这个活动的结点推进栈;,当这个活动结束时,,把代表这个活动的结点从栈中弹出。,18,例2 栈和活动树的变化,栈,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),19,结点序列:s,q(1,9)
9、,q(l,3),q(2,3),控制栈中的活动都是活跃的,,从栈底活动到栈顶活动的活动序列表示了活动的生存期的嵌套关系。,从栈顶活动到栈底活动的活动序列是从活动树上当前结点通向根的路径上的节点,当前控制进入的活动在栈顶;,20,结论:扩充控制栈可用来实现如Pascal语言的栈式存储分配,进入一个活动,在栈顶建立这个活动所使用的存储空间;这个活动结束,从栈顶弹出其使用的存储空间。,21,一个名字在源程序行文中可能有几处说明,语言的作用域规则规定了:,1.说明把名字与名字的属性信息绑定在一起。,1.4 说明的作用域,2.说明的作用域是一个说明起作用的范围(源程序行文)。如:局部变量、全局变量,Int
10、 a10;,在语句序列中引用的一个名字是在何处说明的名字。,22,3.编译时,处理说明语句时,把名字及其属性信息填写进符号表(add(id.entry,id.vul);,处理引用 名字时,查找这个名字的属性信息(lookup(id),符号表管理程序根据语 言的 作用域规则,使 lookup(id)返回id的作用域中绑定的属性信息。,23,可以说,函数environment把一个名字映射为一个l-value(左-值),1.5名字与存储的绑定,引进两个函数,environment和state。environment把名字映射到一个存储单元上;,state把存储单元映射到那里所存放的值上。,而函数s
11、tate把一个l-value(左-值)映射为一个r-value(右-值)。,如下图所示。,名字与存储单元的绑定是指把源程序中的数据名字映射到目标机存储单元的过程。,24,名字,存储单元,值,存储分配,程序运行,environment,state,l-value,r-value,图:从名字到值的两个阶段映射,25,静态概念 动态对应过程定义 过程活动名字说明 名字的绑定说明的作用域 活动的生存期,1.6 参数传递,实在参数和形式参数结合的方法:,传值调用(call-by-value),引用调用(call-by-reference),复制恢复(copy-restore),传名调用(call-by-
12、name),27,1.7 提出的问题,编译程序组织存储分配所采用策略和方法主要取决于对源程序中下面的问题的回答。,1过程可以是递归的吗?,2当控制从过程的一次活动返回时,局部名的值将发生什么 变化?,3一个过程可以访问非局部名吗?,4当调用过程时参数是怎样传递的?,28,上面的问题对运行时的存贮分配有很大的影响,,5过程可以作为参数被传递吗?,6过程可以作为结果被返回吗?,7.可以在程序控制下进行动态存储分配吗?,8.显式的存储重新分配(指撤除分配后的分配)是必须的吗?,我们将在后面章节里,对以上问题进行讨论并介绍与之相应的存贮分配策略,29,7.2 存储组织,2.1 运行时刻内存的划分,运行
13、时刻的存储空间必须划分成块,用来存放:,1.生成的目标代码;,2.数据目标;,3.用于保存过程活动踪迹的一个控制栈。,30,目标代码,静态数据,栈,堆,1.编译后知道目标代码的大小。,存储空间划分的各部分:,2.Pascal,c,Fortran,3.栈:Pascal,c,4.堆:Pascal,c,31,2.2 活动记录,对于pascal语言来说,运行过程中,当调用一个过程时,在栈顶构筑它的活动记录;,一个活动所需要的信息的每个数据项有相同的生存期,因此,组织成一个活动记录是很自然的。,当这个过程的活动执行完后,把它从栈顶弹出。,把过程的一个活动所需要的信息组织成一块连续的存储单元,称为活动记录
14、。,32,源语言不同,实现方法不同,组成活动记录的域不同。常见语言的活动记录如后图所示。,33,返回值,实在参数,控制链,访问链,保存机器状态,局部变量,临时变量,临时变量:编译产生。,保存机器状态:调用过程的活动在调用点的机器状态,包括计数器,各种寄存器的值。,局部数据:过程中定义的 局部量。,访问链:指向本活动要访问的非局部数据所在的活动记录.,控制链:指向主调过程的活动记录的首地址。,形式单元,内情向量,连接数据,局部数据,sp,top,34,2.3 编译时刻的局部数据的设计 局部数据域是编译时刻在编译过程中分配的。例如:,PROCEDURE sub(x,y:real);VAR i,j:
15、integer;a:ARRAY1.5 OF real;e,f:real;BEGIN f:=e+i*j;END;,名字所需的存贮空间的数量是由它的类型确定的,多字节对象存放于连续的字节中,,以第一个字节的地址作为该对象的地址,35,f,符号表,名字 形 类型 偏移量,活动记录布局=,老SP,(sp,0),x 形 real 3,返回地址,(sp,1),y 形 real 4,2,(sp,2),(sp,3),(sp,5),i int 5,i,(sp,9),j int 9,j,(sp,13),a array 13,a,(sp,53),e,e real 53,(sp,61),f real 61,(sp,4
16、),x,y,t1,t2,t3,(sp,62),(sp,63),(sp,64),36,中间代码*i j t1*(sp,5)(sp,9)(sp,62)+e t1 t2+(sp,53)(sp,62)(sp,63)itor t2 t3 itor(sp,63)(sp,64):=t3 f:=(sp,64)(sp,61),确定活动记录中局部数据的地址:假设sp标记一个活动记录的开始的位置,dx表示x的地址相对于sp的偏移量。那么,x在过程的目标代码中的地址可写成 dx(sp),37,编译结束,知道每个过程的活动记录的长度,将其填写到相应的过程表中,,运行时,调用哪个过程,就在运行栈顶,推进那个过程的活动记录
17、(栈箭头加上活动记录长度)。,38,7.3 运行时刻存储分配策略,3.1 静态存储分配:FORTRAN3.2 栈式存储分配:C,PASCAL3.3 堆式存储分配:C,PASCAL,采用哪种分配策略是由源语言的语义决定的。,39,3.1 静态存储分配,局部名字的值在过程活动停止后仍保留下来。,且这种绑定在运行时刻不再发生变化。,在编译时刻为每个数据项目确定出在运行时刻的存储空间中的位置,,40,限制:,1.在编译时刻知道数据目标的大小和它们在内存位置上 约束;,2.不能递归调用过程(一个过程的两个活动的生存期不相交,一个过程的所有活动可以使用同一个活动记录);,3.不能动态地建立数据结构。,41
18、,(1)PROGRAM CNSUME(2)CHARACTER*50 BUF(3)INTEGER NEXT(4 CHARACTER C,PRDUCE(5)DATA NEXT1,BUF/(6)CPRDUCE()。(7)BUF(NEXT:NEXT)C(8NEXTNEXT1(9)IF(C.NE.)GOTO 6(10)WRITE(*,(A))BUF(11)END,42,(12)CHARACTER FUNCTION PRDUCE()(13)CHARACTER*80 BUFFER(14)INTEGER NEXT(15)SAVE BUFFER,NEXT(16)DATA NEXT81(17)IF()THEN(1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 编译 原理
链接地址:https://www.31ppt.com/p-6556366.html