第八章-存储空间组织节_第1页
第八章-存储空间组织节_第2页
第八章-存储空间组织节_第3页
第八章-存储空间组织节_第4页
第八章-存储空间组织节_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CH8运行时存储空间组织编译程序总框

符号表词法分析器语法分析器语义分析器代码优化出错处理源程序目标程序单词符号集语法单位集中间代码程序中间代码程序目标代码生成存储空间组织存储空间分配策略1).静态分配存储分配由编译程序在编译时进行;2).动态分配在编译时生成相应(申请空间)的目标程序,在目标程序运行时,执行该代码,进行存储分配。(有:栈式存储分配,堆式存储分配)影响存储分配策略的源语言主要特征1).过程能否递归调用;ProgramPP(input,output);vark:integer;FunctionF(n:integer):integer;beginifn<=0thenF:=1elseF:=n*F(n-1);end;beginK:=F(10);…end.执行顺序:PP→F1→F2→···每一次调用F,需要一套数据区影响存储分配策略的源语言主要特征2).是否有可变数组(可变数组的大小创建时决定);Pascal:thepoint:arrayof

integer;

setlength(thepoint,5);

在C99,实现了变长数组:用(整型)变量或表达式声明的数组。(在C90和C++,方括号内必须是常数值)。例:int

f

(void)

;

int

main(void)

{

int

size

=

4;

int

a[size];

//

ok

in

only

C99

int

b[size*size];

//

ok

in

only

C99

int

c[

f()

];

//

ok

in

only

C99影响存储分配策略的源语言主要特征3).过程能否访问非局部且非全局的变量如:Pascal语言的过程嵌套声明,内层可以访问外层定义的名字ProgramB1(input,output);consta=10;varb,c:integer;procedureB2(x:real);varf,g:real;procedureB3(y:real);constb=5;varj:real;beginj:=f*B3(a)+b;end;{B3}begin……;begin……;end;{B2}begin……;end;{B1,主程序}其中:j,b——B3

f——B2a——B1影响存储分配策略的源语言主要特征4).是否有分程序结构(分程序中可以有变量声明)#include<stdio.h>inttest=5;voidfun1();voidmain(){inttest=10;fun1();printf(“2--%d\n”,test);{inttest=15;printf(“3--%d\n”,test);}}voidfun1(){printf(“1--%d\n”,test);}全局名:5main定义的局部名:10分程序定义的局部名:15影响存储分配策略的源语言主要特征5).名字的作用域如,C语言的static,extern。动态局部变量(离开函数,值就消失)静态局部变量(离开函数,值仍保留)静态全局变量(只限本文件引用)全局变量(允许其它文件引用)

影响存储分配策略的源语言主要特征6).过程调用时如何传递参数;如:传值,传地址,得结果,传名等。7).哪些实体可以作为参数和返回值;如:简单变量,结构变量,标号,过程等,是否可以做为参数被传递和做为结果被返回?7).是否允许动态的为对象分配存储空间;

如:C:malloc、calloc;pascal:New、GetMem8).存储空间是否必须显式地释放如:C:freepascal:Dispose、FreeMem§8.1目标程序运行时的活动§8.1.1过程的活动1).过程的活动:该过程的一次执行(调用)。2).过程活动的生存期:

从执行过程P的过程体的第一步操作到最后一步操作之间的操作序列;包括执行P时调用其他过程(如Q)花费的时间。3).过程递归:

若过程尚未退出当前活动,又开始其新的活动。过程递归可以是间接达到的。如:P→Q→R→Pprogrammain(input,output);

varA,B:integer;

procedureQ(X:integer);

begin

…end;

procedureP(X,Y,Z:integer);

begin

Y:=Y+1;Z:=Z+X;ifZ>0thenQ(Z)elseP(X,Y,Z);end;

beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,A)

end.过程定义过程调用1).过程的活动2).过程活动的生存期3).过程递归参参数数传传递递过程程(函函数数)::结构构化化程程序序设设计计的的主主要要手手段段;;节省程程序代代码和和扩充充语言言能力力的主主要途途径;;只要有有过程程定义义,就就可以以在别别的程程序单单位调调用它它。调调用者者(程程序单单位)与被被调用用者(过程程)之之间间的信信息传传递主主要通通过“全局局量””和“参数数”来完成成。如果把把数据据看成成内容容物的的话,,那么么装载载数据据的容容器就就是变变元。。主程序序/过过程调用者者被调用用者变元过程变元控制数据流流数据流流:⑴.从从调用者者的变元元=>被调用用过程程的变元元;⑵.被调用用过程程对数据据进行行计算算处理理;⑶.过过程结结束返返回时时,把把数据据结果果=>调用者者的变元元;在完成成对过过程中中代码码段的的调用用执行行的同同时,,也完成成了与与过程程的数数据交交换信息传传递中中,涉涉及到到两类类参数数:⑴属于被调用用过程程:用于表表示相相应数数据在在过程程执行行当中中的含含义——形形式式参数数(形形参,,或哑哑元))programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.形式参参数信息传传递中中,涉涉及到到两类类参数数:⑵属属于调用者者:用于装装载调调用者者对被被调过过程的的输入入/输输出数数据;;——实实在在参数数((实参参))programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.实在参参数形参与与实参参之间间按照照从左左到右右的顺顺序一一一对对应。。即:处处于两两个列列表的的相同同位置置的变变元,,意味味着它它们是相互互关联联的。。形-实实对应应的主主要方方式::传值值,传传地址址,得得结果果,传传名programmain(input,output));varA,B::integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.实在参参数形式参参数传值调调用((Callbyvalue))调用者者计算算出实实在参参数的的值,,并将将其传传送给给过程程的形式参参数。。⑴调调用者者计算算实参参的值值,放放在过过程可可以取取到的的地方方;⑵过过程取取出实实参的的值,,放在在过程程内对对应的的形式式单元元中(过程程的活活动记记录中中开辟辟的存存储空空间);⑶过过程执执行时时,像像局部部名一一样使使用这这些形形式单单元。。C参数为普通变量voidsub(intx,inty)pascal值参procedureP(x,y:integer)programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)end.主程序子程序T5X5A2Y23B3Z27此种参数数传递方方法,过程内对参参数的变动动不会影响响到“调用者”输出结果::A=2传地址(引用调调用)(Call-by-address)调用者把一一个指向实实参的存储储地址的指指针,传递递给过程的的形参。⑴实参是是名字:传传递其地址址;实参是表达达式:计算算表达式值值且存放在在某一存储单元,,将该存储储单元地址址传递过去去。⑵过程中中对形参的的引用和赋赋值,都变变成对传递递来的指针的的间接引用用访问。C参数为指针变量voidsub(int*sum)数组作为参数voidFunc(intarr[5])pascal变参procedureP(Varx,y:integer)programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A)end.主程序T5A238B3子程序X↑TY↑AZ↑A输出结果::A=8C语言参数例例#include<stdio.h>voidsub(intx,inty,int*sum){*sum=x+y;}main(){intx=9,y=10,s=1;sub(x,y,&s);printf("%d\n",s);}答案:19其中:x,y—传值值sum——传传地址址其中::x——传传值y—传地址址#include<stdio.h>intx,y,z;voidp(int*x,inty){++*x;y--;z=*x+y;printf("%d,%d,%d\n",*x,y,z);}voidmain(){x=2;y=3;z=4;p(&x,y);printf("%d,%d,%d\n",x,y,z);p(&y,x);printf("%d,%d,%d\n",x,y,z);}3,2,53,3,54,2,63,4,6得结果果(Callbyresult)或或复复制恢恢复(Copy-Restore)⑴被被调用用过程程为每每个形形参设设置两两个形形式单单元;;分别存存地址址、值值。⑵调调用者者把实实在参参数的的地址址和值值同时时传递递到被被调用用过程中中;⑶被被调用用过程程直接接使用用实参参的值值;⑷过过程返返回时时,把把形参参的现现行值值复制制到相相应的的实在在参数的的地址址中,将计计算结结果返返回给给调用用者。。(Ada,pascal)programmain(input,output);varA,,B::integer;;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘‘A=’,,A))end.主程序T5A237B3子程序X↑T5Y↑A23Z↑A27或:主程序T5A27

3B3结果::A=7(左左→右右)或:A=3(右→→左)传名调调用或或:换换名调调用(Call-by-Name)调用者者将实实在参参数的的名字字传给给被调调用过过程中中相应的的形式式参数数;被调用用过程程的过过程体体中,,所有有的形形式参参数都都用相应实实在参数数的名字字进行替替换;ALGOL使使用的一一种参数数传递方方式programmain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginY:=Y+1;;Z:=Z+X;end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)grammain(input,output);varA,B:integer;procedureP(X,Y,Z:integer);beginA:=A+1;;A:=A+(A+B);end;beginA:=2;B:=3;P(A+B,A,A);writeln(‘A=’,,A)end.主程序TAB52393输出结果果:A=9§8.2运运行时存存储器的的划分运运行行时存储储器的划划分一个目标标程序运运行所需需的存储储空间包包括:存放目标标代码的的空间存放数据据项目的的空间存放程序序运行的的控制或或连接数数据所需需单元(控制栈栈)一个程序序在运行行时刻的的内存划划分:代码(Code)静态数据据(StaticData)栈(Stack)堆(Heap)绝大多数数高级语语言,执执行时不不能改变代代码,所所以在编编译时,,所有代码码(包括括每个过过程的入入口点)地地址都是是可计算算的。过程1的代码过程2的代码...过程n的代码过程1入入口→过程2入入口→过程n入入口→代码区内容代码区大小静态确定位置静态确定静态数据据:编译时就就可以确确定存储储位置的的数据。。如:*)FORTRAN77::所有的的数据;;*)Pascal::全全局变量量;*)C::外部变变量,静态变变量;对常量,常数数:编译时已知其其内容,且值值不变。通常常由编译程序序直接插入到到代码中,不不分配数据空空间。内容数据段静态数据区大小静态确定位置静态确定目标代码静态数据栈堆栈区:用于符合后进先出使用用风格的数据据;*)过程运运行的控制及及连接数据;;*)过程的的局部变量、、形式参数等等;目标代码静态数据栈堆堆区:用于不符合后进先出使用用风格的数据据;*)动态申请地址址空间的变量量。其中:“栈区区”和“堆区区”的大小是是随着程序的的运行而改变的,因此此两者采用对对开式使用。。§8.2.2活动记记录过程在一次活活动(执行)中所需要的的信息,存放放在一片连续续的存储区中中,称为一个个活动记录。。过程调用产产生新的活动动记录。活动记录中至至少应该存放放两类信息::1.控制信信息:*)控制活动动的正确调用用与返回;(如:返回地地址)*)控制活动动记录的正确确切换;(如如:动态链)2.访问信信息:用于为当前活活动提供对数数据(本地数数据、非本地地数据)的访问问。(如::SP,局部部数据区)活动记录结构构TOP→临时单元内情向量局部变量形式单元静态链动态链SP→返回地址

指向:调用本本过程前,最最新活动记录地址址指向:静态直直接外层过程程最新活动记录地址址相应实在参数数的地址或值值现行过程活动动记录在栈顶位置指向:现行过过程活动记录录在栈里的起始始位置局部数据区连接数据TOP→临时单元内情向量局部变量形式单元静态链动态链SP→返回地址

局部数据区局部数据区::*)静态可确确定长度数据据如:简单类型型的局部变量量,形式单元临时变量对此种名字的访访问方式:设名字u,引用方式可可表示为变址访问:LDR1,x[SP]x:名字u相对于活动记记录起点的地址,在编编译时可确定定。活动记录的大大小,是静态态确定的。局部数据区::*)动态确定定长度的数据据的访问信息如:可变数组组的内情向量量;动态数据区的的首地址指针针对动态数据的引用需要经过两步步:⑴LDR1,x[SP]找到起始地址址(如内情向向量)⑵LDR2,h[R1]x:名字u的访问信息息地址(如::首地址)h:u与首地地址的偏移量量。(如:A[3]与A[1]之间间相差2)TOP→临时单元内情向量局部变量形式单元静态链动态链SP→返回地址

局部数据区9、静静夜夜四四无无邻邻,,荒荒居居旧旧业业贫贫。。。。1月月-231月月-23Sunday,January1,202310、雨中黄叶叶树,灯下下白头人。。。21:02:1921:02:1921:021/1/20239:02:19PM11、以以我我独独沈沈久久,,愧愧君君相相见见频频。。。。1月月-2321:02:1921:02Jan-2301-Jan-2312、故人江海海别,几度度隔山川。。。21:02:1921:02:1921:02Sunday,January1,202313、乍乍见见翻翻疑疑梦梦,,相相悲悲各各问问年年。。。。1月月-231月月-2321:02:1921:02:19January1,202314、他乡生白白发,旧国国见青山。。。01一月月20239:02:19下下午21:02:191月-2315、比不不了得得就不不比,,得不不到的的就不不要。。。。。一月239:02下下午午1月-2321:02January1,202316、行行动动出出成成果果,,工工作作出出财财富富。。。。2023/1/121:02:1921:02:1901January202317、做做前前,,能能够够环环视视四四周周;;做做时时,,你你只只能能或或者者最最好好沿沿着着以以脚脚为为起起点点的的射射线线向向前前。。。。9:02:19下下午午9:02下下午午21:02:191月月-239、没有失败,,只有暂时停停止成功!。。1月-231月-23Sunday,January1,202310、很多事情努努力了未必有有结果,但是是不努力却什什么改变也没没有。。21:02:1921:02:1921:021/1/20239:02:19PM11、成功就是是日复一日日那一点点点小小努力力的积累。。。1月-2321:02:1921:02Jan-2301-Jan-2312、世间成事,,不求其绝对对圆满,留一一份不足,可可得无限完美美。。21:02:1921:02:1921:02Sunday,January1,202313、不知知香积积寺,,数里里入云云峰。。。1月-231月-2321:02:2021:02:20January1,20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论