第七章运行环境.ppt
《第七章运行环境.ppt》由会员分享,可在线阅读,更多相关《第七章运行环境.ppt(63页珍藏版)》请在三一办公上搜索。
1、第七章运行环境,源语言问题存储组织存储分配策略访问非局部名字参数传递,静态和动态,静态和动态的联系名字和数据对象数据对象的动态表示名字的作用域数据对象的存储分配过程和活动参数处理运行时支撑程序包,源语言问题(1),过程及其执行过程定义:是一个声明,最简单形式是把一个标识符和一个语句联系起来该标识符称为过程名语句是过程体函数:返回值的过程过程调用过程名出现在可执行语句中时,则称这个过程在这点被调用调用者、被调用者和调用点参数形式参数:与局部变量有不同实在参数:在调用点,将其传递给被调用的过程,源语言问题(2),program sort(input,output);var a:array 0.10
2、 of integer;procedure readarray;var i:integer;begin for i:=1 to 9 read(ai)end;function partition(m,n:integer);var i,j,x,v:integer;begin.end;procedure quicksort(m,n:integer);var i:integer;begin if(n m)then begin i:=partiton(m,n);quicksort(m,i 1);quicksort(i+1,n);end end;begin a 0:=-9999;a 10:=9999;re
3、adarray;quicksort(1,9)end.,源语言问题(3),过程的执行的表示:活动树控制流的假设控制流是连续的过程的每次执行都从过程体的起点开始,最后控制返回到直接跟随本次调用点的位置过程间的控制流可以用树表示(调用树)活动:过程体的一次执行活动的生存期:过程体执行的第一步和最后一步之间的步序列包括直接或间接被这个过程调用的其它过程的时间过程的活动的生存期要么是不重叠的,要么是嵌套的递归:如果一个过程的前一个活动结束前,它的一个新的活动又开始递归的两种缘起,源语言问题(4),活动树描述控制进入和离开活动:每个结点代表过程的一个活动根结点代表主程序的活动结点a是结点b的父结点,当且仅
4、当控制流从a的活动进入ba结点处于b结点的左边,当且仅当a的生存期先于b的生存期结点和活动是一一对应的,源语言问题(5),幻灯片4中程序的活动树,源语言问题(6),控制栈控制栈用于保存活跃着的过程栈的内容表示活动树上到根结点的一条路径,源语言问题(7),名字与数据对象声明的作用域区分同名程序声明:最接近的嵌套规则int a,b;int*p;int foo(int a)int b,c;char*p;p=malloc(sizeof(char);b=foo(1);作用域:一个声明起作用的程序部分称为该声明的作用域局部和非局部:过程中名字的出现,如果是在该过程的一个声明的作用域内,则这个出现称为局部于
5、该过程,源语言问题(8),名字的结合程序中声明的名字和动态数据对象的关系数据对象是保存值的存储单元一个名字可能代表不同的数据对象环境:表示将名字映射到存储单元(即名字的左值)的函数状态:表示将存储单元映射到它所保存的值(即名字的右值)的函数赋值操作只改变状态,但不改变环境结合:如果环境把存储单元s联系到名字x,则称x结合到s,这个联系本身称为x的结合静态概念动态概念 过程的定义过程的活动 名字的声明名字的结合 声明的作用域结合的生存期,源语言问题(9),名字结合要考虑的问题过程是否递归当控制从过程的活动返回时,局部名字的值是否要保留过程能否引用非局部的名字过程调用时参数是如何传递的过程是否可以
6、作为参数被传递过程能否作为结果值返回存储区能否在程序控制下动态地分配存储区是否必须显式地释放,存储组织(1),运行时内存的划分程序运行时如何使用内存:目标代码的存放目标代码可以存放在静态确定的区域,其长度在编译时即可确定数据对象可静态分配的数据对象,其地址可以编译到目标代码中动态分配控制栈:记录过程活动堆:可以存放动态分配的数据等,但开销要比栈大,存储组织(2),活动记录定义:过程的一次执行所需要的信息用一块连续的存储区来管理,这块存储区叫做活动记录或帧一般的活动记录结构如右图,但不是所有的语言或编译器都是如此寄存器的使用活动记录的操作:过程被调用时入栈过程返回时出栈,存储组织(3),活动记录
7、的各个域的作用临时数据域:临时变量的存储等局部数据域:局部于过程执行的数据机器状态:保存过程调用前的机器状态信息返回地址可选的访问链:用于非局部数据的访问可选的控制链:指向调用者的活动记录实在参数域:参数个数较少时,可以考虑用寄存器传递,效率高;参数多时用用这个域传递返回值域:用于存放被调用过程返回给调用过程的值,也可以用寄存器返回(效率高,但形式受限制),存储组织(4),过程调用时,每个域的长度都可以确定,大部分域的长度可以在编译时刻确定运行框架安排的设计这个框架的设计要考虑指令集体系结构(ISA)特性和要编译的程序语言本身的特点有些系统提供商为他们的体系结构提供一种标准的运行框架安排,使得
8、可以实现不同的语言编写的函数间的调用这个运行框架的设计通常在运行时支撑系统要考虑,存储组织(5),编译时的局部数据安排名字所需的存储空间的大小可以由它的类型确定基本数据对象(字符、整数或实数)可以用几个连续的字节保存聚合类型(记录、数组等)一块足够大的空间存放所有成分连续的字节区局部数据域在编译过程中的声明时安排长度可变的数据不保存在这个区域数据对象的相对地址(偏移)是数据对象地址相对于特定点(例如活动记录的开始点)的地址差数据对齐:数据对象的存储安排受目标机器寻址限制的影响如10个字符的数组可以被编译器分配12个字节不用的2个字节称为衬垫空白区,存储组织(6),两个C编译器的数据布局形式:,
9、存储分配策略(1),静态分配名字的结合:编译时实现,不需要运行时支撑程序名字和存储的结合是固定的允许名字的值在过程停止活动后保持根据名字的类型,编译器可以在静态时刻确定该名字所需的存储空间,效率局限:数据对象的长度和它在内存中位置的限制必须在编译时知道不允许递归过程不允许有动态数据结构在FORTRAN77中,静态存储分配策略,每个过程的活动记录可以与它的代码放在一起,存储分配策略(2),PROGRAM CNSUMECHARACTER*50BUFINTEGERNEXTCHARACTERC,PRDUCEDATA NEXT/1/,BUF/6C=PRDUCE()BUF(NEXT,NEXT)=CNEXT
10、=NEXT+1IF(C.NE.)GOTO 6WRITE(*,(A)BUFENDCHARACTER FUNCTION PRDUCE()CHARACTER*80BUFFERINTEGERNEXTSAVE BUFFER,NEXTDATA NEXT/81/IF(NEXT.GT.80)THENREAD(*,(A)BUFFERNEXT=1END IFPRDUCE=BUFFER(NEXT,NEXT)NEXT=NEXT+1END,存储分配策略(3),存储分配策略(4),栈分配递归过程要求栈分配允许动态数据对象的存在满足先入后出的次序控制栈:活动记录和栈的关系局部量的存储空间包含在对应调用的活动记录中局部量的值
11、会随着过程调用结束而丢失控制栈top的变化和活动记录的长度相关通常,局部量相对于活动记录开始点的偏移量可以记录在符号表中,存储分配策略(5),例:活动记录在栈中的分配,存储分配策略(6),例:编译时确定长度的数据对象偏移量在符号表中的存放,存储分配策略(7),过程调用的实现:通过过程调用序列(calling sequences)实现,包括调用序列和返回序列调用序列:分配活动记录,信息的保存和填充参数、返回地址、老的控制栈top、寄存器的保存、局部对象的初始化等返回序列:恢复机器状态,是调用者继续执行返回值、寄存器的恢复、重置控制栈top、跳转到返回地址调用序列和活动记录不是一成不变的,语言、实
12、现等都会导致不同过程调用序列的代码分成两部分,分别由调用过程和被调用过程负责,但划分的界限不是唯一的,存储分配策略(8),图:调用者和被调用者间的任务划分,存储分配策略(9),调用序列(call sequences),过程p调用过程qp计算实参,依次放入q的活动记录中(也可以利用寄存器传递参数),改变top_sp的值p把返回地址和当前的base_sp的值存入q的活动记录中,建立q的访问链,增加base_sp的值q保存寄存器的值(包括top_sp的值)和其它机器状态信息q增加top_sp的值,初始化它的局部数据,并开始执行,存储分配策略(10),返回序列(return sequences),过程
13、p调用过程qq把返回值置入邻近p的活动记录的地方(也可以利用特定的寄存器传递返回值)q恢复寄存器的值(包括top_sp和base_sp)和其它机器状态信息q根据返回地址将控制返回pp根据参数个数调整top_sp的值,把返回值放入自己的活动记录中参数个数不确定?C语言中的printf保存描述参数的信息,如printf首先处理的第一个变元(它的位置是确定的)指出了其它参数的性质,存储分配策略(11),动态数组数组的界在编译时刻无法确定,只能在运行时刻确定procedure(n)integer n,mnend动态数组不能分配在活动记录中在动态数组的大小确定后,在该过程的活动记录紧邻的栈中分配空间动态
14、数组的描述也可以考虑用内情向量的方式,存储分配策略(12),动态数组访问的示意,存储分配策略(13),悬空引用引用某个已释放的存储单元称为悬空引用这是由于存储空间可以释放这是一个逻辑错误:在大多数语言中,释放的存储单元的值是没有定义的main()int*p;p:=dangle();int*dangle()int i=23;return 函数dangle返回后,指针p指向一个已释放的存储单元,存储分配策略(14),堆分配栈分配的局限不能使得活动停止时,局部名字的值保持被调用者的活动不能比调用者的活动活得更长(否则,活动树不能正确描绘过程间的控制流),只能满足先入后出的次序堆分配把连续存储区域分成
15、块需要时分配(活动记录或其它对象)释放次序任意堆可以与栈分配结合起来C+语言中,基本保持栈的形式,堆用于动态对象的分配C、Pascal语言中的指针的动态分配等,存储分配策略(15),堆中,活跃的活动记录不一定相临,可能存在空洞,存储分配策略(16),堆的释放不释放存储空间溢出时停止显式释放Free(C,PL/1),deallocation(Ada)有可能引起悬挂引用隐式释放单引用引用计数垃圾收集(Garbage collection)堆的分配和释放的优化,访问非局部名字(1),如何通过活动记录正确访问名字,满足作用域的要求?两种作用域静态作用域根据程序正文决定用于名字的声明最接近的嵌套规则程序
16、块非局部名字的访问:访问链动态作用域在运行时,根据现行的活动来决定用于名字的声明,如Lisp等,访问非局部名字(2),程序块定义:起源于AlgolC语言中的定义:declarations statements 允许嵌套最接近的嵌套规则:程序块B中声明的作用域包括B如果名字x没有在B中声明,则B中x的出现是在外围程序块B的x声明的作用域中,且满足:B有x的声明B比其它任何含x声明的程序块更接近被嵌套的B,访问非局部名字(3),例:非局部名字的引用,访问非局部名字(4),名字的存储分配:基于栈分配:声明的作用域决不超出它所在的程序块程序块当作无参的过程,所以活动记录可以是程序块的这类“过程”调用不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 运行 环境

链接地址:https://www.31ppt.com/p-6110395.html