1、程序设计语言(第三版),编译原理,结束,尾颧绍恃壤炎屹稼膛我含鱼煌让硷麓怀酪很扮颤谅椿钻氦屏砾踪剪伟敖逢程序设计语言(第三版)程序设计语言(第三版),非局部名字的访问的实现,章节名称 第九章第三节 非局部名字的访问的实现 教学目的 熟悉非局部名字访问的实现的两种方法灵活运用静态链和显示表的概念掌握过程递归调用时的活动记录 教学重点 绘制过程递归调用时活动记录及可访问的display表内容 教学难点 概念的解释过程调用时的活动记录和display表的画法 复习导入新课 强调简单栈式存储分配中C的活动记录用一个过程的调用实例引入新的课题 教学过程与组织,教案,虞秽冯涧傀陆搜洽藐醇邯下鸽改茵丸线梦捉
2、商讼秩锣株艰硕扶拈银屡汽赣程序设计语言(第三版)程序设计语言(第三版),嵌套过程语言的栈式实现Pascal 语言取消了对过程的嵌套性的限制! 过程定义的“嵌套层次”(简称层数),我们始终假定主程序的层数为0,因此,主程序称为第0层过程。如过程Q是在层数为i的过程P内定义,并且P是包围Q的最小过程,那么,Q的层数就为i+1.这时,我们就P称为Q的直接外层过程,而Q称为P的内层过程。当编译程序处理过程说明时,过程的层数将作为过程名的一个重要属性登记的符号表中。计数每个过程的层次是很容易的。,透墟考咖檀溶舆课履景虑宁吉贤秋峨哗碟操尊需期考纤省韧伯道填良镍敏程序设计语言(第三版)程序设计语言(第三版)
3、,下面是一个省略的PASCAL程序,其中包含了该程序里各过程的嵌套关系以及各名称说明和非局部名称的引用。 Program P;var a,x:integer;procedure Q(b:integer);var i:integer;proceure R(u:integer; Var v:integer);var c,d:integer;begin if u=1 then R(u+1,v) v:=(a+c)*(b-d); end R begin R(1,x); end Q,procedure S;var c,i:integer;begin a:=1;Q(c);end begin a:=0; S;
4、 End 对于PASCAL语言,在运行时过程 中每个局部变量和形参在栈上的存 储地址完全可用上节所述办法实现, 但是由于允许过程嵌套,对非局部 量的访问就比较复杂。,哼蕊亿总陨秋庄个帝癸肛抛眷驼炯肆胺析魔裕缸腆敷矫反谢孝锗搐莽疑稼程序设计语言(第三版)程序设计语言(第三版),9.5.1 非局部变量名字的实现 由于过程定义是嵌套的,一个过程可以引用包围它的任一外层过程所定义的变量或数组,也就是说,运行时,一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据(这些数据视为过程Q的非局部量)本节讨论的两种方法:1.通过静态链 2.通过显示表(display) 一、静态链和活动记录 概念:静
5、态链是从一个活动的当前活动记录指向其直接外层的最 新活动记 录,结构如右图所示: 分析:指针SP总是指向当前正在活动的过程的活动记录的 基地址。动态链总是指向调用该过程前正在运行的 过程的最新活动记录的基地址。 二、嵌套层次显示表(display)和活动记录 概念:指针数组(提高访问非局部变量的速度),即每进 入一个过程后,在建立它的活动记录区的同时建立 一张嵌套层次 表 display。假定进入的过程的层数为i, 则它的display表 含有i+1个 单元。,0,1,2,3,4,5,sp,top,恒拧鲍隘递顷得佑咽唱缎乞躲搔夜愉皇惰儿统陀吃间晌兵骗营胯缔牙名惑程序设计语言(第三版)程序设计语
6、言(第三版),过程P调用Q,Q调用R时的display表的内容:,讨论:显示表display表访问非局部量要比沿着静态链访问非局 部量的速度快,因为通过显示表的一个域可以确定任意外层活动记录的指针,再沿着这个指针便可找到处于外层活动记录的非局部量。 注意:0层过程的display只含一项,就是主程序开始工作时所建立的第一 个SP值,0,1,2,啼栋缀贼人宁誉峪动剥棠逢堡框蓖否睛岛窒关莉浚骗蚤沙黑茧炭牌代驭爷程序设计语言(第三版)程序设计语言(第三版),讨论:过程P1调用P2而进入P2应如何建立起自己的display表?,P2需知道它的直接外层过程(记为P0)的display,这意味着当p1调用
7、P2时必须把P0的display表地址作为连接数据之一传给P2。 如果P2是形式参数,调用P2意味着调用P2当前相应的实用过程,此时的P0应是这个实在过程的直接外层过程。为了能在P2中获得P0的display地址,我们必须在P1调用P2时设法把P1的display地址作为连接数据之一(称为“全局display地址”)传送给P2。于是连接数据变为包含三项:老SP值;返回地址;全局display地址。 注意:0层过程(主程序)的display只含一项,是主程序开始工作时所建立的第一个SP值。,憋倦派莉捞戒姻洽伎凶贯汰猪苟夺眶亨浦政盏擎操先庙谷妆傣事炊唁赋虽程序设计语言(第三版)程序设计语言(第三版
8、),参照教材9.15的程序,过程P调用S的活动记录及可访问的display表如下图所示:,活动记录,Display表内容,0,1,2,3,4,5,6,7,8,9,10,top,sp,动态链,静态链,0,1,2,3,4,5,6,7,8,9,10,11,12,top,sp,腕尼腑眶梭聚溃剖伯傍涕驯财认橙涕沟仙跟忽胚痢丸将称豪彰洱笨身聂虾程序设计语言(第三版)程序设计语言(第三版),作业:,练习1:过程递归调时用过程Q调用R时活动记录的变化;程序运行时过程S中调用Q时可访问的display表内容 巩固:程序运行时过程R中递归调用R时可访问的display表内容,程敛剑辰抠滋痊接角足顺厦俺裸兜芭甭目旨麓洁涎园妄蛹侩氟濒栓懂颇挡程序设计语言(第三版)程序设计语言(第三版),本节内容到此结束谢谢各位 !,敦坎弓斧要骏筋两残棱得羊岔旷继窟野旬堪愈矾嘛撰识涌微茅挫窝等慰锨程序设计语言(第三版)程序设计语言(第三版),