北大编译原理讲义chapter61.ppt
《北大编译原理讲义chapter61.ppt》由会员分享,可在线阅读,更多相关《北大编译原理讲义chapter61.ppt(41页珍藏版)》请在三一办公上搜索。
1、1,第六章 运行时刻环境 序6.1 源语言中的一些问题6.2 存储组织6.3 运行时刻存储分配策略6.4 非局部名字的访问6.5 参数传递6.6 符号表,2,序 计算环境 运行时的环境 计算 目标代码 源程序中的名字(常量,变量)目标机存储空间。它受命于源程序的执行语义。源程序由一组过程按某种规则组成。过程的一次执行称作一次活动,在过程的语句序列执行之前,过程中访问的对象构成此过程的运行环境,由运行支持程序组织好。编译程序根据如何组织运行环境而生成目标代码。,映射,源程序,3,6.1有关源程序中的一些问题 目的:构造运行程序的策略和方法 6.1.1 过程 6.1.2 活动树 6.1.3 控制栈
2、 6.1.4 说明的作用域 6.1.5 名字的绑定 6.1.6 构造运行程序和源程序有关的 一些问题,4,6.1.1 过程 源程序由一组过程组成,不同的程序设计语言,由过程构成源程序的方法不同。构成源程序的两个过程行文,要么是嵌套的,要么是不相交的。,5,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;proc
3、edure quicksort(m,n:integer);var i:integer;begin end end;begin end.,6,6.1.2 活动树 程序执行期间的控制流:1程序执行的控制是顺序的;2过程的每一次执行都是从过程体的开头 开始,并最终把控制返回到紧接着该过 程被调用点的后面。过程的一次活动:过程体的每一次执行。一个过程p的一次活动的生存期:在该过程体的执行中的第一步和最后一步之间的一序列步骤的执行时间,其中包括执行过程p所调用的过程的执行时间,以及这些过程所调用的过程的执行时间,如此等等。,7,特点:每当控制流从过程p的活动进入到过程q的活动中后,它将返回到过程p的同一
4、次活动中。如果a和b是两个过程活动,那么它们的生存期要么是不重叠的,要么是嵌套的。这种活动生存期的嵌套性质可以通过在每一个过程中插入两个打印语句来加以说明。,8,执行开始 enter readarray leave readarray 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)执行结束,9,一个过程是递归的,如果同一
5、过程的一次新的活动可以在前面活动结束以前开始。用一颗树来描绘控制进入和离开活动的途径。这祥的树称作活动树。在一棵活动树中:1.每一个结点代表一个过程的活动;2.根结点代表主程序的活动;3.代表a的结点是b结点的父结点当且仅当控 制从活动a进入活动b;4.结点a在结点b的左边当且仅当a的生存期 发生在b的生存期之前。用活动树来讨论正在这个结点上的控制。,10,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),图6.3 一棵活动树,
6、11,结论:一个结点代表一个唯一的活动,且每 一个活动只有一个结点表示,当控制进 入某一个活动时,可以直接说,控制在 这个结点上。6.1.3 控制栈 程序执行的控制流对应于从根开始,按先根次序遍历活动树。因此,用一个栈保存过程活动的生存踪迹。把它称作控制栈。当一个活动开始执行时,把代表这个活动的结点推进栈;当这个活动结束时,把代表这个活动的结点从栈中弹出。,12,例6.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
7、,0),S q(1.9)q(1,3)q(1,0),q(2,3),S q(1.9)q(1,3)q(2,3),图 6.4,13,控制栈中的活动都是活跃的,当前控制进入的活动在栈顶,从栈顶活动到栈底活动的活动序列是从活动树上当前结点通向根的路径上的结点序列:s,q(1,9),q(l,3),q(2,3)从栈底活动到栈顶活动的活动序列表示了活动的生存期的嵌套关系。结论:扩充控制栈可用来实现如Pascal语言的栈式存储分配,进入一个活动,在栈顶建立这个活动所使用的存储空间;这个活动结束,从栈顶弹出其使用的存储空间。,14,6.1.4 说明的作用域 1.说明把名字与名字的属性信息绑定在一起。2.说明的作用域
8、是一个说明起作用的范围(源程序行文)。一个名字在源程序行文中 可能有几处说明,语言的作用域规则规定:在语句序列中引用的一个名字是在何处说 明的名字。3.编译时,处理说明把名字及其属性信息填 写进符号表(add(id.entry,id.vul);处理引用 名字时,查找这个名字的属性信息(lookup(id),符号表管理程序根据语 言的 作用域规则,使 lookup(id)返回id的作用域 中绑定的属性信息。,15,6.1.5名字与存储的绑定 名字与存储单元的绑定是指把源程序中的数据名字映射到目标机存储单元的过程。引进两个函数,environment和state。environment把名字映射到
9、一个存储单元上;state把存储单元映射到那里所存放的值上。可以说,函数environment把一个名字映射为一个l-value(左-值),而函数state把一个l-value(左-值)映射为一个r-value(右-值)。如图6.5所示。,16,名字,存储单元,值,存储分配,程序运行,environment,state,l-value,r-value,图6.5 从名字到值的两个阶段映射,17,静态概念 动态对应过程定义 过程活动名字说明 名字的绑定说明的作用域 活动的生存期,18,6.1.6 提出的问题 编译程序组织存储分配所采用策略和方法主要取决于对源程序中下面的问题的回答。1过程可以是递归
10、的吗?2当控制从过程的一次活动返回时,局部 名的值将发生什么 变化?3一个过程可以访问非局部名吗?4当调用过程时参数是怎样传递的?5过程可以作为参数被传递吗?6过程可以作为结果被返回吗?7.可以在程序控制下进行动态存储分配吗?8.显式的存储重新分配(指撤除分配后的分 配)是必须的吗?,19,例:函数的返回值是函数。Fun times x y=x*y val times=fn:int(int int)twice=times 2fun compose(f,g)=f(g(x)compose=fn:()()val fourtimes=compose(twice,twice),20,6.2 存储组织 6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北大 编译 原理 讲义 chapter61
链接地址:https://www.31ppt.com/p-5913913.html