版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LI Wensheng, SCST, BUPT 第第7章章 运行环境运行环境知识点:活动记录、控制栈知识点:活动记录、控制栈 栈式存储分配栈式存储分配 非局部名字的访问非局部名字的访问 参数传递方式参数传递方式1Wensheng Li BUPT 2008运行环境运行环境n程序运行时刻的环境,即运行中程序的信息是怎样程序运行时刻的环境,即运行中程序的信息是怎样存储和访问的。存储和访问的。n执行过程中,程序中数据的存取是通过对应的存储执行过程中,程序中数据的存取是通过对应的存储单元来进行的。单元来进行的。n存储组织与管理存储组织与管理早期的计算机上,存储管理工作是由程序员自己来完成早期的计算机上,
2、存储管理工作是由程序员自己来完成有了高级语言之后,程序中使用的存储单元都由有了高级语言之后,程序中使用的存储单元都由标识符标识符来来表示,它们对应的内存地址由编译程序在编译时或由其生表示,它们对应的内存地址由编译程序在编译时或由其生成的目标程序在运行时进行分配。成的目标程序在运行时进行分配。n存储的组织及管理是编译程序要完成的一个复杂而存储的组织及管理是编译程序要完成的一个复杂而又十分重要的工作。又十分重要的工作。2Wensheng Li BUPT 2008运行环境运行环境7.1 7.1 程序运行时的存储组织程序运行时的存储组织7.2 7.2 存储分配策略存储分配策略7.3 7.3 访问非局部
3、名字访问非局部名字7.4 7.4 参数传递机制参数传递机制 小小 结结3Wensheng Li BUPT 20087.1 7.1 程序运行时的存储组织程序运行时的存储组织概念:过程与活动概念:过程与活动一、程序运行空间的划分一、程序运行空间的划分二、控制栈与活动记录二、控制栈与活动记录三、作用域及名字绑定三、作用域及名字绑定4Wensheng Li BUPT 2008概念:过程与活动概念:过程与活动n过程的定义过程的定义一个声明语句一个声明语句把一个标识符和一个语句联系起来把一个标识符和一个语句联系起来标识符是过程名,语句是过程体。标识符是过程名,语句是过程体。n过程的分类过程的分类过程:没有
4、返回值的过程过程:没有返回值的过程函数:有返回值的过程函数:有返回值的过程也可以把函数、一个完整的程序看作过程也可以把函数、一个完整的程序看作过程n过程引用:过程名出现在一个可执行语句中过程引用:过程名出现在一个可执行语句中n参数:参数:形参、实参形参、实参5Wensheng Li BUPT 2008活动活动n活动活动一个过程的每次执行称为它的一次活动一个过程的每次执行称为它的一次活动如果一个过程在执行中,则称它的这次活动是如果一个过程在执行中,则称它的这次活动是活着的活着的n过程与活动过程与活动过程是一个静态概念,活动是一个动态概念过程是一个静态概念,活动是一个动态概念过程与活动之间可以是过
5、程与活动之间可以是1:1、1:m的关系的关系递归过程,同一时刻可能有若干个活动是活着的递归过程,同一时刻可能有若干个活动是活着的每个活动都有自己独立的存储空间每个活动都有自己独立的存储空间/ /数据空间数据空间PPPP有有3个活着的活动个活着的活动P有有2个活着的活动个活着的活动P有有1个活着的活动个活着的活动6Wensheng Li BUPT 2008活动的生存期活动的生存期n程序执行时程序执行时, ,过程之间的控制流过程之间的控制流是连续的是连续的过程的每一次执行都是从过程体的起点开始,最后控制返回到直接过程的每一次执行都是从过程体的起点开始,最后控制返回到直接跟随本次调用点的位置。跟随本
6、次调用点的位置。n活动的生存期活动的生存期过程体的执行中,第一步和最后一步之间的一系列步骤的执行时间过程体的执行中,第一步和最后一步之间的一系列步骤的执行时间过程过程P的一次活动的生存期,包括执行过程的一次活动的生存期,包括执行过程P所调用的过程的时间,所调用的过程的时间,以及这些过程所调用的过程的时间以及这些过程所调用的过程的时间如果如果a和和b是过程的活动,那么它们的生存期要么是不重叠,要么是是过程的活动,那么它们的生存期要么是不重叠,要么是嵌套的。嵌套的。n递归过程:递归过程:如果一个过程,它的不同活动的生存期可以嵌套,则这个过程是递如果一个过程,它的不同活动的生存期可以嵌套,则这个过程
7、是递归的归的直接递归、间接递归直接递归、间接递归ababab7Wensheng Li BUPT 2008一、程序运行空间的划分一、程序运行空间的划分n编译程序在编译源程序时,向操作系统申请一块编译程序在编译源程序时,向操作系统申请一块内存区域,以便被编译程序在其中运行内存区域,以便被编译程序在其中运行代码区代码区/ 保存目标代码保存目标代码 静态数据区静态数据区 控制栈控制栈 堆堆 编译时可以确定代码段的长度,编译时可以确定代码段的长度,可以放在一个静态确定的区域内可以放在一个静态确定的区域内编译时可确定大小的数据对象,放在静态确编译时可确定大小的数据对象,放在静态确定的区域内,目标地址可以编
8、入目标代码中定的区域内,目标地址可以编入目标代码中用于管理过程的活动、用于管理过程的活动、保存断点的现场信息,用于返回时的恢复保存断点的现场信息,用于返回时的恢复程序控制下进行的动态存储分配,程序控制下进行的动态存储分配,分配在堆中,如分配在堆中,如Pascal中中new函数函数?8Wensheng Li BUPT 2008二、控制栈与活动记录二、控制栈与活动记录n控制栈:用于保存控制信息的栈。控制栈:用于保存控制信息的栈。程序执行过程中使用控制栈来保存活动的生存踪迹及活动程序执行过程中使用控制栈来保存活动的生存踪迹及活动的运行环境。的运行环境。 n活动记录:一个连续的存储块活动记录:一个连续
9、的存储块记录过程在一次执行中所需要的信息记录过程在一次执行中所需要的信息n通常,活动记录分配在控制栈中(像通常,活动记录分配在控制栈中(像PascalPascal、C C)当一个过程被调用时,被调用过程的一次新的活动被激活,当一个过程被调用时,被调用过程的一次新的活动被激活,在栈顶为该活动创建一个新的活动记录来保存其环境信息;在栈顶为该活动创建一个新的活动记录来保存其环境信息;当活动结束,控制从被调用过程返回时,释放该活动记录,当活动结束,控制从被调用过程返回时,释放该活动记录,使调用过程的活动记录成为栈顶活动记录,即恢复调用过使调用过程的活动记录成为栈顶活动记录,即恢复调用过程的执行环境。程
10、的执行环境。 9Wensheng Li BUPT 2008活动记录的内容活动记录的内容返回值返回值实参区域实参区域控制链控制链访问链访问链机器状态域机器状态域局部数据区局部数据区临时数据区临时数据区存放中间计算结果存放中间计算结果在本次活动中,为过程中定义的局部变量在本次活动中,为过程中定义的局部变量分配的存储空间分配的存储空间保存断点的现场信息,寄存器、保存断点的现场信息,寄存器、PSWPSW等等指向直接外围过程的最近一次活动的活动指向直接外围过程的最近一次活动的活动记录的指针,用于对非局部名字的访问记录的指针,用于对非局部名字的访问指向调用过程的活动记录的指针,指向调用过程的活动记录的指针
11、,用于本活动结束时的恢复用于本活动结束时的恢复调用过程提供给本活动的实参值调用过程提供给本活动的实参值本活动返回给调用过程的值本活动返回给调用过程的值根据确定每个域所需空间大小的时间早晚安排其位置。根据确定每个域所需空间大小的时间早晚安排其位置。(1) 早:中间早:中间 晚:两头晚:两头 (2) 用于通信:前面用于通信:前面 自己用的:后面自己用的:后面10Wensheng Li BUPT 2008活动记录中内容的安排原则活动记录中内容的安排原则n大小能够较早确定的区域放在活动记录的中间,大小能够较早确定的区域放在活动记录的中间,大小较晚才能确定、并且变化较多的区域放在活大小较晚才能确定、并且
12、变化较多的区域放在活动记录的两头。动记录的两头。控制链、访问链、机器状态域,是编译器设计的一部分,控制链、访问链、机器状态域,是编译器设计的一部分,编译器构造时就可以确定它们的大小,所以把这些区域编译器构造时就可以确定它们的大小,所以把这些区域放在活动记录的中间。放在活动记录的中间。参数域放在前面,便于调用过程进行参数传递,同时,参数域放在前面,便于调用过程进行参数传递,同时,被调用过程也可很方便地进行访问。被调用过程也可很方便地进行访问。返回值域放在最前面,便于调用过程可以根据自己的栈返回值域放在最前面,便于调用过程可以根据自己的栈指针访问该区域,取回返回值。指针访问该区域,取回返回值。局部
13、数据局部数据/ /临时数据安排在最后,其大小变化不会影响临时数据安排在最后,其大小变化不会影响到活动记录中其他数据的存取。并且调用过程也无权访到活动记录中其他数据的存取。并且调用过程也无权访问被调用过程中的局部数据。问被调用过程中的局部数据。11Wensheng Li BUPT 2008局部数据的安排局部数据的安排n常识:常识:程序运行时使用连续的存储空间程序运行时使用连续的存储空间内存可编址的最小单位是字节内存可编址的最小单位是字节一个机器字由若干个字节组成一个机器字由若干个字节组成一个名字所需存储空间的大小由其类型决定一个名字所需存储空间的大小由其类型决定需多个字节表示的数据对象,存放在连
14、续字节的存储块中,需多个字节表示的数据对象,存放在连续字节的存储块中,第一个字节的地址作为它的地址第一个字节的地址作为它的地址n局部数据的安排局部数据的安排局部数据区是在编译过程中检查声明语句时安排的局部数据区是在编译过程中检查声明语句时安排的长度可变的数据对象,放在该区域之外长度可变的数据对象,放在该区域之外n数据对象的存储安排受目标机器编址限制的影响数据对象的存储安排受目标机器编址限制的影响12Wensheng Li BUPT 2008编址限制的影响编址限制的影响n整数加法指令可能要求整数整数加法指令可能要求整数的地址能够被的地址能够被4 4整除整除n要求地址对齐要求地址对齐如:如:x:i
15、nteger; y:char; z:integer; n为求分配上的全局统一,而多余出来的无用空间为求分配上的全局统一,而多余出来的无用空间叫做填塞(叫做填塞(padding)如果如果char占一个字节,占一个字节,integer占占2个字节个字节, ,x、y、z共需要共需要5个字节。个字节。如果要求从双字节地址分配,如果要求从双字节地址分配,则需要为这三个变量分配则需要为这三个变量分配6个字节,个字节,13Wensheng Li BUPT 2008三、作用域及名字绑定三、作用域及名字绑定n声明是一个把信息与名字联系起来的语法结构声明是一个把信息与名字联系起来的语法结构显式声明(如显式声明(如
16、PASCAL中的声明:中的声明:var i:integer)隐含声明(如隐含声明(如FORTRAN程序)程序)n在一个程序的不同部分可能有对同一个名字的相互在一个程序的不同部分可能有对同一个名字的相互独立的声明独立的声明n一个声明起作用的程序部分称为该声明的作用域一个声明起作用的程序部分称为该声明的作用域n语言的作用域规则决定了当这样的名字在程序正文语言的作用域规则决定了当这样的名字在程序正文中出现时应该使用哪一个声明中出现时应该使用哪一个声明nPascal中的名字遵循中的名字遵循“最近嵌套原则最近嵌套原则”n编译过程中,名字的作用域信息记录在符号表中编译过程中,名字的作用域信息记录在符号表中
17、14Wensheng Li BUPT 2008名字的绑定名字的绑定n把名字对应到存储单元的过程把名字对应到存储单元的过程n名字与存储单元的对应关系:名字与存储单元的对应关系: 1:1 1:mn当当environment把一个存储单元把一个存储单元S与一个名字与一个名字X联系起来时,称联系起来时,称X受限于受限于S。nS的大小取决于的大小取决于X的类型的类型一个活动中的名字与其存储单元之间一个活动中的名字与其存储单元之间一个递归过程中的名字与其存储单元之间一个递归过程中的名字与其存储单元之间名字名字X 存储单元存储单元S S的内容的内容Venvironmentstate地址为名字的左值地址为名字
18、的左值名字的右值名字的右值15Wensheng Li BUPT 2008与存储组织与管理有关的其他问题与存储组织与管理有关的其他问题n名字的存储空间如何组织、名字绑定的方法等主要名字的存储空间如何组织、名字绑定的方法等主要取决于对以下问题的回答:取决于对以下问题的回答:过程是否可递归?过程是否可递归?当控制从过程的一次活动返回时,对局部名字的值如何当控制从过程的一次活动返回时,对局部名字的值如何处理?处理?过程是否可以引用非局部的名字?过程是否可以引用非局部的名字?过程调用时如何传递参数?过程调用时如何传递参数?过程是否可以作为参数传递?过程是否可以作为参数传递?过程可否作为结果被返回?过程可
19、否作为结果被返回?存储空间能否在程序控制下进行动态分配?存储空间能否在程序控制下进行动态分配?存储空间是否必须显式地归还?存储空间是否必须显式地归还?16Wensheng Li BUPT 20087.2 7.2 存储分配策略存储分配策略n运行时刻存储空间的划分,除目标代码外,其余三运行时刻存储空间的划分,除目标代码外,其余三种数据空间采用的存储分配策略是不同的。种数据空间采用的存储分配策略是不同的。静态存储分配:编译时对所有数据对象分配存储空间静态存储分配:编译时对所有数据对象分配存储空间栈式存储分配:运行时把存储器作为栈进行管理,数据对栈式存储分配:运行时把存储器作为栈进行管理,数据对象分配
20、在栈中象分配在栈中堆式存储分配:运行时把存储器组织成堆结构,对用户提堆式存储分配:运行时把存储器组织成堆结构,对用户提出的存储空间的申请与归还进行存储分配与回收。出的存储空间的申请与归还进行存储分配与回收。一、静态存储分配一、静态存储分配二、栈式存储分配二、栈式存储分配三、堆式存储分配三、堆式存储分配17Wensheng Li BUPT 2008一、静态存储分配一、静态存储分配n条件:条件:源程序中出现的各种数据所需要的存储空间源程序中出现的各种数据所需要的存储空间的大小在的大小在编译时可以确定编译时可以确定n存储分配:编译时存储分配:编译时, ,为他们分配为他们分配固定的固定的存储空间存储空
21、间n运行时:运行时:总是总是使用这些存储空间使用这些存储空间过程每次被激活,同一名字都使用相同的存储空间过程每次被激活,同一名字都使用相同的存储空间允许局部名字的值在活动结束后被保留下来允许局部名字的值在活动结束后被保留下来当控制再次进入时,局部名字的值即上次离开时的值当控制再次进入时,局部名字的值即上次离开时的值n数据对象:数据对象:每个过程的活动记录的位置及大小每个过程的活动记录的位置及大小记录中每一个名字所占用的存储空间的位置及大小记录中每一个名字所占用的存储空间的位置及大小数据在运行时刻的地址可以填入到目标代码中数据在运行时刻的地址可以填入到目标代码中18Wensheng Li BUP
22、T 2008静态存储分配策略对源语言的限制静态存储分配策略对源语言的限制n数据对象的大小和它们在内存中的位置必须在编译数据对象的大小和它们在内存中的位置必须在编译时都能够确定时都能够确定n不允许过程递归调用不允许过程递归调用因为使用静态存储分配,一个过程里声明的局部数据在该因为使用静态存储分配,一个过程里声明的局部数据在该过程的所有活动中都结合到同一个地址。过程的所有活动中都结合到同一个地址。n不能建立动态数据结构不能建立动态数据结构因为没有在运行时进行存储分配的机制。因为没有在运行时进行存储分配的机制。19Wensheng Li BUPT 2008静态存储分配策略的实现静态存储分配策略的实现
23、n编译器处理声明语句时,每遇到一个变量名就创建一个符号编译器处理声明语句时,每遇到一个变量名就创建一个符号表条目,填入相应的属性,包括目标地址。表条目,填入相应的属性,包括目标地址。n每个变量所需空间的大小由其类型确定,并且在编译时刻是每个变量所需空间的大小由其类型确定,并且在编译时刻是已知的。已知的。n根据名字出现的先后顺序,连续分配空间根据名字出现的先后顺序,连续分配空间name type address . lengthN1 0 n1N2 n1 n2N3 n1+n2 n3. . . 代码区代码区 数据区数据区 N1N2程程序序的的逻逻辑辑空空间间0LA.20Wensheng Li BUP
24、T 2008PROGRAM CNSUME CHARACTER *50 BUF INTEGER NEXT CHARACTER C, PRDUCE DATA NEXT /1/, BUF / /6 C=PRDUCE() BUF (NEXT:NEXT)=C NEXT=NEXT+1 IF (C .NE. ) GOTO 6 WRITE (*, (A) ) BUF ENDFortran程序举例程序举例CHARACTER FUNCTION PRDUCE() CHARACTER *80 BUFFER INTEGER NEXT SAVE BUFFER,NEXT DATA NEXT /81/ IF (NEXT .G
25、T. 80) THEN READ (*, (A) ) BUFFER NEXT=1 END IF PRDUCE=BUFFER (NEXT:NEXT) NEXT=NEXT+1 END21Wensheng Li BUPT 2008存储空间分配存储空间分配CNSUME的代码的代码PRDUCE的代码的代码静态数据区静态数据区代码区代码区CNSUME的活动记录的活动记录PRDUCE的活动记录的活动记录CHARACTER *50 BUFINTEGER NEXTCHARACTER CCHARACTER *80 BUFFERINTEGER NEXT22Wensheng Li BUPT 2008二、栈式存储分配二
26、、栈式存储分配n存储空间被组织成栈存储空间被组织成栈n存储管理存储管理活动开始时,与活动相应的活动记录入栈,局部变量的活动开始时,与活动相应的活动记录入栈,局部变量的存储空间分配在该活动记录中。同一过程中声明的名字存储空间分配在该活动记录中。同一过程中声明的名字在不同的活动中被结合到不同的存储空间。在不同的活动中被结合到不同的存储空间。活动结束时,活动记录出栈,分配给局部名字的存储空活动结束时,活动记录出栈,分配给局部名字的存储空间被释放。名字的值将丢失,不可再用。间被释放。名字的值将丢失,不可再用。.top.ntopq的活动开始的活动开始qa.topq的活动结束的活动结束23Wensheng
27、 Li BUPT 2008 program sort(input, output); var a: array0.10 of integer; x: integer; procedure readarray; var i: integer; begin for i:=1 to 9 do read(ai) end; prcedure exchange(i, j: integer); begin x:=ai; ai:=aj; aj:=x end; procedure quicksort(m, n: integer); var k, v: integer; function partition(y,
28、 z: integer): integer; var i, j: integer; begin a ; v ; exchange(i, j); end; begin if (nm) then begin i:=partition(m, n); quicksort(m,i-1); quicksort(i+1, n) end end quicksort; begin a0:=-999; a10=999; readarray; quicksort(1, 9) end sort.对读入的数据进行排序的PASCAL程序24Wensheng Li BUPT 2008控制栈的变化举例控制栈的变化举例Ssa
29、: arrayx : integerr r i : integer q(1,9)p(1,9) =4 q(1,9) k : integer v : integerp(1,9) i : integer j : integere(1,9) q(1,3) q(1,3) k : integer v : integerp(1,3) =1 e(1,9)p(1,3) i : integer j : integere(1,3)e(1,3) q(1,0) q(1,0) k : integer v : integer q(2,3) q(2,3) k : integer v : integerk入栈?入栈?出栈?出栈
30、?25Wensheng Li BUPT 2008调用序列调用序列n除局部数据外,除局部数据外,活动记录中还活动记录中还有实现过程调有实现过程调用和返回的控用和返回的控制信息制信息n活动记录的入活动记录的入栈,实现了控栈,实现了控制从调用过程制从调用过程到被调用过程到被调用过程的转移的转移n控制的转移由控制的转移由一段代码(即一段代码(即调用序列调用序列)来)来实现实现调用过程调用过程 p的活动记录的活动记录被调用过程被调用过程q的活动记录的活动记录返回值域返回值域参数域参数域控制链控制链访问链访问链机器状态域机器状态域局部数据域局部数据域临时数据域临时数据域返回值域返回值域参数域参数域控制链控
31、制链访问链访问链机器状态域机器状态域局部数据域局部数据域临时数据域临时数据域top_eptop_sptop_ep top_sp PSWtop_sp 26Wensheng Li BUPT 2008调用序列的安排调用序列的安排n参数传递:参数传递: p计算实参的值,写入计算实参的值,写入q的活动记录的参数域;的活动记录的参数域;n控制信息设置:控制信息设置: p将返回地址写入将返回地址写入q的活动记录的机器状态域中的活动记录的机器状态域中 p将当前的将当前的top_ep的值写入的值写入q的活动记录的控制链域的活动记录的控制链域 p为为q建立访问链建立访问链 p设置新的设置新的top_ep的值的值(
32、 (指向指向q的活动记录中某个位置的活动记录中某个位置) )n进入进入q的代码的代码( (goto语句语句) )nq保存寄存器的值、以及其他机器状态信息保存寄存器的值、以及其他机器状态信息nq增加增加top_sp的值,初始化局部变量的值,初始化局部变量n开始执行开始执行27Wensheng Li BUPT 2008返回序列返回序列nq把返回值写入自己活动记录的返回值域把返回值写入自己活动记录的返回值域nq恢复断点状态:恢复断点状态:寄存器的值寄存器的值 top_sp和和top_ep的值的值机器状态机器状态n根据返回地址返回到根据返回地址返回到p的代码中(的代码中(goto语句)语句)np把返回
33、值取入自己的活动记录中把返回值取入自己的活动记录中np继续执行继续执行28Wensheng Li BUPT 2008调用序列与活动记录调用序列与活动记录n区别:区别:活动记录是一块连续的存储区域,保存一个活动所需的全活动记录是一块连续的存储区域,保存一个活动所需的全部信息,与活动一一对应。部信息,与活动一一对应。调用序列是一段代码,完成活动记录的入栈,实现控制从调用序列是一段代码,完成活动记录的入栈,实现控制从调用过程到被调用过程的转移。调用过程到被调用过程的转移。调用序列逻辑上是一个整体,物理上被分成两部分,分属调用序列逻辑上是一个整体,物理上被分成两部分,分属于调用过程和被调用过程。于调用
34、过程和被调用过程。n联系:联系:调用序列的实现与活动记录中内容的安排有密切关系调用序列的实现与活动记录中内容的安排有密切关系29Wensheng Li BUPT 2008可变长数据的处理可变长数据的处理n某些语言允许由实参的值决定被调用过程中局部数某些语言允许由实参的值决定被调用过程中局部数组的大小组的大小可变数组可变数组n可变数组的大小只有到执行过程调用时才能确定可变数组的大小只有到执行过程调用时才能确定n编译时可以确定数组的个数编译时可以确定数组的个数n活动记录中只设置相应于可变数组的指针,而不包活动记录中只设置相应于可变数组的指针,而不包括这些数组的数据空间括这些数组的数据空间n可变数组
35、的数据空间放在活动记录之外可变数组的数据空间放在活动记录之外30Wensheng Li BUPT 2008可变数组的空间分配可变数组的空间分配调用过程调用过程 p的活动记录的活动记录被调用过程被调用过程q的活动记录的活动记录返回值域返回值域/ /参数域参数域控制链控制链访问链访问链/ /机器状态域机器状态域局部局部/ /临时数据域临时数据域top_eptop_eptop_sptop_sp返回值域返回值域/ /参数域参数域控制链控制链访问链访问链/ /机器状态域机器状态域局部数据域局部数据域临时数据域临时数据域pointer to array Apointer to array B数组数组A数组
36、数组B31Wensheng Li BUPT 2008三、堆式存储分配三、堆式存储分配n如果如果具体的存储需求在编译时刻可以确定具体的存储需求在编译时刻可以确定采取采取静态存储分配静态存储分配策略策略n如果某些存储需求在编译时不能确定,但在程序执如果某些存储需求在编译时不能确定,但在程序执行期间,在程序的入口点上可以知道行期间,在程序的入口点上可以知道采用采用栈式存储分配栈式存储分配策略策略n栈式存储分配策略不能处理的存储需求:栈式存储分配策略不能处理的存储需求:程序设计语言中的某些数据结构的存储需求程序设计语言中的某些数据结构的存储需求活动停止时局部名字的值必须被保存下来活动停止时局部名字的值
37、必须被保存下来被调用过程的活动生存期超过调用过程的生存期,这种语被调用过程的活动生存期超过调用过程的生存期,这种语言的过程间的控制流不能用活动树正确地描述。言的过程间的控制流不能用活动树正确地描述。共性:共性:活动记录的释放不需要遵循先进后出的原则活动记录的释放不需要遵循先进后出的原则32Wensheng Li BUPT 2008q(1,9) 控制链控制链堆式存储分配与栈式存储分配的比较堆式存储分配与栈式存储分配的比较n相同点:相同点:动态存储分配动态存储分配n不同点:不同点:组织形式:栈、堆组织形式:栈、堆释放顺序:释放顺序:栈:先进后出栈:先进后出堆:任意堆:任意Sr p(1,9) =4
38、q(1,9) q(1,3) s 控制链控制链r 控制链控制链p(1,9) 控制链控制链q(1,3) 控制链控制链33Wensheng Li BUPT 20087.3 7.3 访问非局部名字访问非局部名字一、程序块一、程序块二、非嵌套过程的静态作用域二、非嵌套过程的静态作用域三、嵌套过程的静态作用域三、嵌套过程的静态作用域四、动态作用域四、动态作用域n对非局部名字的引用取决于对非局部名字的引用取决于作用域规则作用域规则静态作用域规则:词法作用域规则、静态作用域规则:词法作用域规则、最近嵌套最近嵌套规则规则动态作用域规则:由运行时最近的活动决定可应用到一动态作用域规则:由运行时最近的活动决定可应用
39、到一个名字上的声明个名字上的声明n对非局部名字的访问通过对非局部名字的访问通过访问链访问链实现实现n关键:访问链如何创建、使用、维护关键:访问链如何创建、使用、维护34Wensheng Li BUPT 2008一、程序块一、程序块n程序块的基本结构程序块的基本结构begin 声明语句声明语句 语句序列语句序列endn块可以嵌套块可以嵌套n块之间的关系块之间的关系n最近嵌套规则最近嵌套规则B1B2B3B4var x, yvar x, avar yvar aref. a, x, y35Wensheng Li BUPT 2008静态作用域举例静态作用域举例main() int a=0; int b=
40、0; int b=1; int a=2; p r i n t f ( “ % d %dn”,a,b); int b=3; p r i n t f ( “ % d %dn”,a,b); printf(“%d %dn”,a,b); printf(“%d %dn”,a,b);B1B2B3B4a=2a=0b=0b=12 , 10 , 30 , 10 , 0b=336Wensheng Li BUPT 2008二、非嵌套过程的静态作用域二、非嵌套过程的静态作用域n过程定义不允许嵌套过程定义不允许嵌套独立的独立的顺序的顺序的n声明语句的位置声明语句的位置过程过程/ /函数内部函数内部所有过程之外所有过程之外
41、n在一个过程中引用的名字在一个过程中引用的名字局部的局部的全局的全局的int a11;readarray() a int partition(int y, int z) a quicksort(int m, int n) int i; i=partition(m,n); quicksort(m,i-1); quicksort(i+1,n); main () readarray; quicksort(0,10); 37Wensheng Li BUPT 2008变量的存储分配变量的存储分配n全局变量全局变量静态地进行分配静态地进行分配分配在静态数据区中分配在静态数据区中编译时知道它们的位置,可编译
42、时知道它们的位置,可以将全局变量对应的存储单以将全局变量对应的存储单元的地址编入目标代码中元的地址编入目标代码中n局部变量局部变量动态地进行分配动态地进行分配分配在活动记录中分配在活动记录中栈式存储分配栈式存储分配通过对栈指针的偏移访问当通过对栈指针的偏移访问当前活动记录中的局部名字前活动记录中的局部名字代码区代码区/ / 保存目标代码保存目标代码 静态数据区静态数据区控制栈控制栈堆堆返回值域返回值域参数域参数域控制链控制链访问链访问链机器状态域机器状态域局部数据域局部数据域临时数据域临时数据域top_sptop_ep38Wensheng Li BUPT 2008过程作为参数传递、作为结果返回
43、过程作为参数传递、作为结果返回n对非局部名字采用静态存储分配对非局部名字采用静态存储分配n前提(源语言)前提(源语言)静态作用域规则静态作用域规则过程定义不允许嵌套过程定义不允许嵌套n效果效果一个过程的非局部名,对其他过程也是非局部的一个过程的非局部名,对其他过程也是非局部的非局部名字的存储空间由编译程序静态地进行分配非局部名字的存储空间由编译程序静态地进行分配它的静态地址在所有的过程中都可以引用它的静态地址在所有的过程中都可以引用过程对非局部名字的引用与过程是如何激活的无关过程对非局部名字的引用与过程是如何激活的无关n结果结果无论过程作为参数传递、还是作为结果返回,其中对非无论过程作为参数传
44、递、还是作为结果返回,其中对非局部名字的引用,都是对静态分配给它的存储单元进行局部名字的引用,都是对静态分配给它的存储单元进行访问。访问。39Wensheng Li BUPT 2008示例示例 int m; int plusv( int n) return m+n; int mulv( int n) return m*n; void cproc( int pform( int n) ) cout pform(2) endl ; void main( ) m=0; cproc(plusv); cproc(mulv); pass访问链访问链mcproc访问链访问链02220cproc访问链访问链m
45、ulvn=2访问链访问链00plusvn=2访问链访问链40Wensheng Li BUPT 2008三、嵌套过程的静态作用域三、嵌套过程的静态作用域n过程定义允许嵌套过程定义允许嵌套n最近嵌套规则最近嵌套规则Program sort(input,output); var a: array0.10 of integer; x: integer; procedure readarray; var i: integer; begin a end; prcedure exchange(i,j:integer); begin x:=ai; ai:=aj; aj:=x end;procedure qui
46、cksort(m,n:integer); var k,v: integer; function partition(y,z:integer):integer; var i,j: integer; begin a ; v ; exchange(i,j); end; begin end quicksort;begin end sort.41Wensheng Li BUPT 2008过程及名字的嵌套关系过程及名字的嵌套关系PROC quicksortparam. m, nvar k, vFUN partitionparam. y, zvar. i, jref. a, vcall exchangePR
47、OC exchangeparam. i, jref. a, xPROC readarrayparam. i, jref. a, xvar a, x主程序主程序 sortn嵌套深度嵌套深度主程序:主程序:1 1每进入一个过每进入一个过程,深度加程,深度加1 112223n名字的嵌套深度名字的嵌套深度声明时所在过声明时所在过程的嵌套深度程的嵌套深度42Wensheng Li BUPT 2008访问链访问链被调用过程活动记录的访被调用过程活动记录的访问链指向其直接外层过程问链指向其直接外层过程的最新活动的活动记录的最新活动的活动记录实现嵌套过程的静态作用域规则实现嵌套过程的静态作用域规则通过访问链可
48、以实现对非局部名字的访问通过访问链可以实现对非局部名字的访问pqpaccessqaccesspqrpaccessraccessqaccessxqprxaccesspaccessraccessqaccess43Wensheng Li BUPT 2008访问链的使用访问链的使用n过程过程p引用非局部名字引用非局部名字a,嵌套深度分别为嵌套深度分别为np,na nanpn当控制处于当控制处于p中时,中时,p的活动记录在栈顶的活动记录在栈顶n访问链的使用访问链的使用从栈顶活动记录出发,沿访问链前进从栈顶活动记录出发,沿访问链前进 np-na 步步到达到达a的声明所在过程的最新活动记录的声明所在过程的最
49、新活动记录在该活动记录中,相对于访问链的某个固定偏移处即在该活动记录中,相对于访问链的某个固定偏移处即a的存储位置的存储位置该值在编译时可以计算出来该值在编译时可以计算出来该值在编译时可以计算出来该值在编译时可以计算出来n符号表符号表中,变量名字的目标地址:中,变量名字的目标地址: np中非局部名字中非局部名字a的地址:的地址: 44Wensheng Li BUPT 2008访问链的建立访问链的建立n在调用序列中由调用过程在调用序列中由调用过程p创建被调用过程创建被调用过程q的访的访问链问链n过程过程p和和q的嵌套深度分别为的嵌套深度分别为np和和nqnq的活动记录中访问链的建立依赖于的活动记
50、录中访问链的建立依赖于q与与p的关系的关系 q嵌套在嵌套在p中中 nqnp q不嵌套在不嵌套在p中中 nq=np nqnpn静态文本中静态文本中q与与p的关系:的关系:pqnq=np+1paccessqaccessnq活动记录中的访问链指向栈中刚好在其前面的活动记录中的访问链指向栈中刚好在其前面的p的活动记录的访问链的活动记录的访问链n调用序列中,调用序列中,p把把base-sp的值写入的值写入q的活动记录的活动记录的访问链的访问链46Wensheng Li BUPT 2008q不嵌套在不嵌套在p中中nq=npn静态文本中静态文本中q与与p的关系:的关系:xqpnq=npp和和q具有共同的直接
51、外层具有共同的直接外层xaccesspaccessqaccessnq活动记录中的访问链与活动记录中的访问链与p的活动记录的访问链指向的活动记录的访问链指向栈中刚好在栈中刚好在p前面的前面的x的活动记录访问链的活动记录访问链n调用序列中,调用序列中,p把自己的访问链的值把自己的访问链的值复制复制到到q的活动的活动记录的访问链记录的访问链47Wensheng Li BUPT 2008q不嵌套在不嵌套在p中中nqy? x : y ; nmax(5, 3+4)max(5, 3+4):将将x x替换为替换为5 5,y y替换为替换为7 7,得到:,得到:57? 5:757? 5:7。n用相应的实参的值替
52、代过程体中出现的所有形参。用相应的实参的值替代过程体中出现的所有形参。n是是C+C+和和PascalPascal语言的内置机制,本质上,也是语言的内置机制,本质上,也是C C语言和语言和JavaJava语言参数传递的唯一机制。语言参数传递的唯一机制。n在这些语言中,参数被看作是过程的局部变量,初值由调用在这些语言中,参数被看作是过程的局部变量,初值由调用时的实参给出。时的实参给出。n在过程中,参数和局部变量一样可以被赋值,但其结果不影在过程中,参数和局部变量一样可以被赋值,但其结果不影响过程体之外的变量的值。响过程体之外的变量的值。 57Wensheng Li BUPT 2008传值调用的实现
53、传值调用的实现n调用过程对实参求值,调用过程对实参求值,并把实参的并把实参的右值右值写入被写入被调用过程活动记录的形调用过程活动记录的形参存储单元中。参存储单元中。n被调用过程在形参上的被调用过程在形参上的操作不影响调用过程活操作不影响调用过程活动记录中的值动记录中的值referenceab12swapxytemp121 2 1n执行结果执行结果 a=1b=258Wensheng Li BUPT 2008参数是指针类型的情况参数是指针类型的情况n传值调用并不意味着参数的使用一定不会影响过程体外变量传值调用并不意味着参数的使用一定不会影响过程体外变量的值。的值。n如果参数的类型为指针或引用,参数
54、的值就是一个地址如果参数的类型为指针或引用,参数的值就是一个地址通过它可以改变过程体外部的内存值。如,有通过它可以改变过程体外部的内存值。如,有C C语言函数语言函数void init_ptr(int* p) *p=3; 对参数对参数p p的直接赋值不会改变过程体外的实参的值。如:的直接赋值不会改变过程体外的实参的值。如:void init_ptr(int* p) p=(int*) malloc(sizeof(int); n在一些语言中,某些值是隐式指针或引用在一些语言中,某些值是隐式指针或引用如如C C语言中的数组是隐式指针(指向数组的第一个位置)语言中的数组是隐式指针(指向数组的第一个位置
55、)可以使用数组参数来改变存储在数组中的值。如:可以使用数组参数来改变存储在数组中的值。如:void init_array_0(int p) p0=0;59Wensheng Li BUPT 2008二、引用调用二、引用调用n原则上要求:实参必须是已经分配了存储空间的变量。原则上要求:实参必须是已经分配了存储空间的变量。n调用过程把一个指向实参存储单元的指针传递给被调用过程调用过程把一个指向实参存储单元的指针传递给被调用过程的相应形参的相应形参n在目标代码中,被调用过程通过传递给形参的指针间接地引在目标代码中,被调用过程通过传递给形参的指针间接地引用实参,因此,可以把形参看成是实参的别名,任何对形
56、参用实参,因此,可以把形参看成是实参的别名,任何对形参的引用就是对相应实参的引用。的引用就是对相应实参的引用。nFortranFortran语言中唯一的参数传递机制。语言中唯一的参数传递机制。n在在PascalPascal语言中,通过在形参前加关键字语言中,通过在形参前加关键字varvar来指定采用引用来指定采用引用调用机制。调用机制。procedure inc_1(var x: integer); begin x:=x+1 end;n在在C+C+中,通过在形参的类型关键字后加符号中,通过在形参的类型关键字后加符号&来指明采来指明采用引用调用机制,如:用引用调用机制,如:void in
57、c_1(int& x) x+ ; 60Wensheng Li BUPT 2008引用调用引用调用nC C语言可以通过传递引用或显式指针来实现引用调用语言可以通过传递引用或显式指针来实现引用调用的效果的效果nC C语言使用语言使用&指示变量的地址,使用操作指示变量的地址,使用操作* *撤撤销引用指针。销引用指针。n如:如:void inc_1(int* x) / C 模拟引用调用模拟引用调用 (*x)+; int a;inc_1(&a); 61Wensheng Li BUPT 2008引用调用的实现引用调用的实现n调用过程对实参求值,调用过程对实参求值,并把实参的并把实参
58、的左值左值写入被写入被调用过程活动记录的形调用过程活动记录的形参存储单元中。参存储单元中。n若实参是表达式,计算若实参是表达式,计算表达式的值,并把它存表达式的值,并把它存入临时存储单元,然后入临时存储单元,然后传递这个单元的地址。传递这个单元的地址。n被调用过程通过形参间被调用过程通过形参间接地引用实参接地引用实参n执行结果执行结果 a=2 b=1referenceab12swapxytemp1 2 162Wensheng Li BUPT 2008三、复制恢复三、复制恢复n传值调用和引用调用的传值调用和引用调用的一种混合形式一种混合形式n调用过程计算实参,实调用过程计算实参,实参的右值被传递到被调参的右值被传递到被调用过程中。要求在调用用过程中。要求在调用之前求出实参的左值。之前求出实参的左值。n从被调用过程返回时,从被调用过程返回时,把形参的现行右值复制把形参的现行右值复制到相应实参的左值中。到相应实参的左值中。只有具有左值的实参被只有具有左值的实参被复制下来复制下来referenceab12swapxytemp121 2 1 2 1n执行结果执行结果 a=2 b=163Wensheng
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GB-T 26790.2-2015工业无线网络WIA规范 第2部分:用于工厂自动化的WIA系统结构与通信规范》专题研究报告
- 《GBT 22104-2008土壤质量 氟化物的测定 离子选择电极法》专题研究报告
- 《GBT 18654.13-2008养殖鱼类种质检验 第13部分:同工酶电泳分析》专题研究报告:前沿技术与深度应用
- 常见急症的识别与早期处理总结2026
- 道路安全培训考卷课件
- 2026年河北省高职单招语文试题含答案
- 2025-2026年苏教版四年级数学上册期末试卷含答案
- 道法教材培训课件模板
- 2026年甘肃省陇南市重点学校高一入学英语分班考试试题及答案
- 2025胸腔镜肺结节日间手术围手术期健康教育专家共识课件
- 全球AI应用平台市场全景图与趋势洞察报告
- 产品防护控制程序培训课件
- ISO-6336-5-2003正齿轮和斜齿轮载荷能力的计算-第五部分(中文)
- 轨道线路养护维修作业-改道作业
- 2023-2024学年上海市闵行区四上数学期末综合测试试题含答案
- 中铝中州矿业有限公司禹州市方山铝土矿矿山地质环境保护和土地复垦方案
- 解除劳动合同证明电子版(6篇)
- 呼吸科规培疑难病例讨论
- 基于PLC控制的小型钻床机械设计
- DB11T 290-2005山区生态公益林抚育技术规程
- 开放大学(原电视大学)行政管理实务期末复习资料所有单
评论
0/150
提交评论