版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 目的程序运转时的存储组织 概述栈式存储分配的实现简单的栈式存储分配的实现嵌套过程言语的栈式实现分程序构造的存储管理参数传送过程调用、过程进入和过程前往概述义务:编译程序对目的程序运转时的数据空间的组织和管理设计运转环境和分配存储 如 通常栈式存储分配规划可为: 目的代码区 静态数据区 Stack heap运转环境和存储分配设计分析逻辑阶段:在目的代码生成前,作预备本质: 关联Binding将源程序的文本 程序运转动作的实现 源文件中的名字N 运转时的存储S在语义学中,运用术语environment函数表示env: NS (N到S的映射)术语静态:假设一个名字的性质经过阐明语句或隐或显规
2、那么而定义,那么称这种性质是“静态确定的。动态:假设名字的性质只需在程序运转时才干知道,那么称这种性质为“动态确定的。可变 (动态)数组: 假设一个数组所需的存储空间的大小在编译时就知道,那么称它为确定数组,否那么称为可变(动态)数组。例 procedure A(m,n:integer); begin real z; array Bm:n; begin end; end; 简单的栈式分配方案程序构造特点:过程定义不嵌套,过程可递归调用,含可变数组; 例: main 全局变量的阐明proc Rend R;proc Q end Q;主程序执行语句 end main 嵌套过程言语的栈式分配方案主要特
3、点:言语一个过程可以援用包围它的任一外层过程所定义的标识符如变量,数组或过程等。实现一个过程可以援用它的任一外层过程的最新活动记录中的某些数据。 关键技术:处理对非部分量的援用存取。设法跟踪每个外层过程的最新活动记录AR的位置。跟踪方法: 1. 用静态链如PL/0的SL。 2. 用DISPLAY表。用Display表的方案(1)主程序-(2)P-(3)Q-(4)R P 的活动记录主程序的活动记录 d1d0displaysptop主程序的活动记录 d0spdisplaytop12用Display表的方案主程序-P-Q-RR 的活动记录 Q 的活动记录 P 的活动记录主程序的活动记录Q 的活动记录
4、 P 的活动记录主程序的活动记录 displayd2d1d0 d1d0 displaysptoptopsp34DISPLAY表的维护和建立 DISPLAY表d 运转栈 0 主程序活动记录地址 1 R活动记录地址 . 当过程的层次为n,它的 display为n+1个值。 一个过程被调用时,从调用过程的DISPLAY表中自下向上抄录n个SP值,再加上本层的SP值。全局DISPLAY地址 Procedure A(m,n); integer m,n; B1:begin real z; array Bm:n; B2:begin real d, e; L3: 2 end; B4:begin array C
5、1:m; 1 B5:begin real e; L6: 5 4 end; end; L8:end; 分程序构造的存储分配方案 处置分程序构造存储分配方案的一种简一方法是,把分程序看成 “无参过 程,它在哪里定义就在哪里被调用。因此,可以把处置过程的存储方法运用四处置分程序中。但这种做法是极为低效的。 一那么,每逢进入 一个分程序,就照样建立衔接数据和DISPLAY表,这是不用要的。 二那么 ,当从内层分程序向外层转移时,能够同时要终了假设干个分程序。 按照过程处置方法,意味着必需一层一层地经过“前往 来恢复所要到达的那个分程序的数据区,但不能直接到达。例如:假设有一个从第5层分程序转出到达第1
6、层分程序的标号L,虽然在第5层分程序任务时知道L所属的层数,我们极易从DISPLAY中获得第1层分程序的活动记录基址SP,但是怎样知道第1层分程序进入时的TOP呢?独一的方法是从 5,4,3和2各层顺序退出。但这种方法是很浪费时间的。 为理处理上述问题,可采取两种措施。第一,对每个过程或分程序都建立有本人的栈顶指示器TOP,替代原来仅有过程的栈顶指示器, 每个TOP的值保管在各自活动记录中。这样,上述的第二个问题便可处理。第二,不把分程序看作“无参过程,每个分程序享用包围它的那个最近过程的DISPLAY。每个分程序都隶属于某个确定的过程,分程序的层次是相对于它所属的那个过程进展编号的。 每个过
7、程被当作是0层分程序。而过程体分程序假定是一个分程序当作是它所管辖的第1层分程序。这样,每个过程的活动记录所含的内容有:1.过程的TOP值,它指向过程活动记录的栈顶位置。2.衔接数据,共四项: 1)老SP值;2)前往地址; (3)全局DISPAY地址;4)调用时的栈顶单元地址,老TOP。 3. 参数个数和方式单元 4. DISPAY表。5. 过程所辖的各分程序的部分数据单元。 对于每个分程序来说,它们包括:1)分程序的TOP值。当进入分程序时它含现行栈顶地址,以后,用来定义栈的新高度分程序的TOP值;2)分程序的部分变量, 数组内情向量和暂时任务单元。B Z B1T O 数 组B 数 组B e
8、 dB22的T O PB的 内 情 向 量B 的 内 情 向 量 z zB1 的T O PB1的T O PD I S P L A YD I S P L A Y 方式单元 m,n 2 方式单元 m,n 2连 接 数 据衔接 数 据A的T O PA的T O P (c) (d)(c )数组B分配之后; d进入分程序B22; 参数传送(1)procedure exchangel(i,j:integer);(2) var x:integer;(3) begin;(4) x:=ai; ai:=aj; aj:=x(5) end; 带有非部分变量和形参的PASCAL过程非局变量ai和aj的值进展交换,i,j为
9、形参在这里是传值 (1)program reference(input,output);(2)var a,b:integer;(3)procedure swap(var x,y:integer);(4) var temp:integer;(5) begin (6) temp:=x;(7) x:=y;(8) y:=temp(9) end;(10)begin(11) a:=1; b:=2;(12) swap(a,b);(13) writeln(a=,a);writeln(b=,b)(14)end. 带有过程swap的PASCAL程序 传地址变量参数 例如:过程 swap(var x,y:integ
10、er); swap(a,b; a,b为调用时的实参 调用结果a,b的值被改动。传值值调用特点是对方式参数的任何运算不影响实参的值。 例如:过程 swap(x,y:integer); swap(a,b;其结果: a,b调用前的值不改动。传值的实现1.方式参数当作过程的部分变量处置,即在被调过程的活动记录中开辟了形参的存储空间,这些存储位置即是我们所说的方式单元用以存放实参。2.调用过程计算实参的值,并将其放在对应方式单元开辟的空间中。3.被调用过程执行时,就像运用部分变量一样运用这些方式单元。procedure swap( x,y:integer); var temp:integer; begi
11、n temp:=x; x:=y; y:=temp end; 调用swap(a,b) 过程将不会影响a和b的值。 其结果等价于执行以下运算: x :=a; y :=b; temp :=x; x :=y; y :=temp传地址的实现call- by- reference )(call-by-address)(call-by-location) 把真实参数的地址传送给相应的形参,即 调用过程把一个指向实参的存储地址的指针传送给被调用过程相应的形参:1真实参数是一个名字,或具有左值的表达式-传送左值2真实参数是无左值的表达式-计算值,放入一存储单元,传此存储单元地址3目的代码中,被调用过程对形参的援
12、用变成对传送给被调用过程的指针的间接援用procedure swap( x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp end; 调用swap(i,ai) 其结果等价于执行以下运算: 1把 I和ai的地址分别放到x和y相应的单元a1,a2 2( temp :=x;)temp的内容置为a1所指单元中存的内容 3 (x :=y;) a1所指单元的内容置为a2所指单元值4( y :=temp) a2所指单元的内容置为temp的值 (1)swap(x,y)(2)int *x,*y;(3) int temp;(4) temp=*x
13、; *x=*y; *y=temp;(5)(6)main( )(7) int a=1,b=2;(8) swap(&a,&b);(9) printf(“a is now %d,b is now %dn,a,b);(10) 在一个值调用过程中运用指针的C程序在C程序中无传地址所以用指针实现。过程调用的四元式序列 S call id() ,E Epar T1par T2par Tncall id,n 过程作为参数传送三种环境:词法环境 传送环境 活动环境 program param(input,output); procedure b(function h(n:integer):integer);(*
14、) var m:integer; begin m:=3; writeln(h(2) endb; procedure c;(*) var m:integer; function f(n:integer):integr;(&) begin f:=m+n endf; begin m:=0; b(f) end c begin c end. (1)program param(input,output);(2)procedure b(function h(n:integer):integer);(3) begin writeln(h(2) endb;(4)procedure c;(5) var m:int
15、eger;(6) function f(n:integer):integr;(7) begin f:=m+n endf;(8)begin m := 0; b(f) end c;(9)begin(10) c(11)end 图10-27 嵌套过程作为参数传送各种数据对象的存储分配数据对象 name 名字,称号 type 类型 location 内存地址 value 值 component 成分 建立内情向量,问配内存的目的代码n维可变数组, type-每个元素占一个字begin k:=1;n:=1;c:=0; while k=n do begin di:=ui-li+ 1; m:=m*di; c:=c*di+li; 把li,ui和di填进内情向量表区; k:=k+1 end; 恳求m个空间, 令首地址为a;把n,c,type ,a填进内情 向量表区end赋值中数组元素的翻译A V:=EV id | id ,E | EV | id , E | id E构造记录,笼统数据类型对象类实例变量的存储构造(CIR)class parent | class parent public int a,b,c; | public a,b,c; public void draw() .; | public virtual void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宠物店搬迁装修
- 冷链熟食配送服务协议
- 品牌家居馆装修合同模板
- 农产品国际运输合同
- 专卖店装修违约起诉书
- 乡村度假村装修合同
- 产业升级改造居间合同模板
- 办公设备搬迁合同模板
- 个人工作室门面装修协议
- 建筑材料临时调运合同
- (正式版)HGT 20656-2024 化工供暖通风与空气调节详细设计内容和深度规定
- 2024年安徽省C20教育联盟中考二模道德与法治试题
- MOOC 耕作学-沈阳农业大学 中国大学慕课答案
- 2023年上海市普通高中学业水平等级性考试化学真题试卷含答案
- 2023-2024学年广东省深圳市宝安区宝安中学集团八年级(上)期中历史试卷
- JTG F90-2015 公路工程施工安全技术规范
- 德育与班级管理的心得体会
- TCHAS 10-4-10-2022 中国医院质量安全管理 第4-10部分:医疗管理病案管理
- 平面直角坐标系(单元教学设计)大单元教学人教版七年级数学下册
- 江苏省泰州市海陵区2023-2024学年七年级上学期期中语文试卷
- 培养小学生的逻辑思维能力
评论
0/150
提交评论