第9章 运行时的存储组织
重点:符号表的内容、组织,过程调用实现,
静态存储分配、动态存储分配的基本方法。
难点:参数传递,过程说明语句代码结构,
过程调用语句的代码结构,
过程调用语句的语法制导定义,
栈式存储分配。
9.1 与存储组织有关的源语言概念与特征
n 静态策略:在编译时即可做出决定的策略
n 动态策略:直到程序执行时才能做出决定的策略
n “名字”、“变量”和“标识符” 的区别与联系
9.1.4 参数传递方式
1.传值:
2.传地址:
3.传值结果:
4.传名:
例子:
主程序
A:=2;B:=3;
P(A+B,A, A);
print A
子程序
P(X,Y,Z);
{Y:=Y+1;
Z:=Z+X}
传值:2
传值结果:7
X=T=5, Y=Z=A=2
Y:=Y+1=3
Z:=Z+X=2+5=7
Y ->A=3
Z ->A=7
传地址:8
X=T=5,Y=Z=A=2
A:=A+1=2+1
A:=A+T=3+5
传名:9
A:=A+1=3
A:=A+A+B=3+3+3
9.2 存储组织
9.3 静态存储分配(FORTRAN)
9.4 栈式存储分配(PASCAL)
9.5 栈中非局部数据的访问
9.6 堆管理
内存管理器的基本任务:
空间分配 + 空间回收
程序中的局部性:
时间局部性 + 空间局部性
设计目标:
空间效率、程序效率、低开销
堆区空间分配策略:
最佳适应、首次适应
9.7 本章小结
n 存储组织与管理是编译系统的重要组成部分,用来实现目标程序的存储组织与分配。根据程序设计语言的要求,有静态管理策略和动态管理策略
n 名字的绑定要体现名字的声明和作用域约定
n 过程调用中参数的传递方式分为传值、传地址、传值结果和传名4种
n 典型的运行时内存空间包括目标代码、静态数据区和动态数据区
n 对编译时就能确定其运行时所需要的存储空间的对象实行静态存储分配,对编译时无法确定过程何时运行、运行时所需要存储空间的对象实行动态存储分配
n 静态存储管理方式支持较高的运行效率,利用适当的策略可以提高内存的利用率,但是无法支持动态数据和“过程”的递归调用
n