概述 任务:编译程序对目标程序运行时的组织(设 计运行环境和分配存储) 如通常存储区布局可为: 目标代码区 静态数据区 Stack ↓ heap 第10章运行空间存储
第10章 运行空间存储 1 概述 任务:编译程序对目标程序运行时的组织(设 计运行环境和分配存储) 如通常存储区布局可为: 目标代码区 静态数据区 Stack heap
运行环境和存储分配 设计分析 逻辑阶段:在目标代码生成前,作准备 实质: 关联(Binding) 将源程序的文本〉 程序运行动作的实现 源文件中的名字N> 运行时的存储S 在语义学中,使用术语environment函数表示 env: N→S (N到S的映射) 第10章运行空间存储
第10章 运行空间存储 2 运行环境和存储分配 设计分析 逻辑阶段:在目标代码生成前,作准备 实质: 关联(Binding) 将源程序的文本 程序运行动作的实现 源文件中的名字N 运行时的存储S 在语义学中,使用术语environment函数表示 env: N→S (N到S的映射)
静态文本中 运行时动作及为实现其动作的准备 (与运行时数据对象的表示有关) 过程定义 过程名 执行过程体 过程体 控制数据对象的分配,为执行 过程体使用 源文本中同样的名字 目标程序中不同的数据空间 因为一个过程可以是递归的, 这时同一个名字在不同的时间 可能代表不同的存储单元 第0章运行空间存
第10章 运行空间存储 3 静态文本中 运行时动作及为实现其动作的准备 (与运行时数据对象的表示有关) 过程定义 过程名 执行过程体 过程体 控制数据对象的分配,为执行 过程体使用 源文本中同样的名字 目标程序中不同的数据空间 因为一个过程可以是递归的, 这时同一个名字在不同的时间 可能代表不同的存储单元
决定运行管理复杂程度的因素 源语言本身 1.允许的数据类型的多少 2.语言中允许的数据项是 静态确定 动态确定 3.程序结构决定名字的作用域的规则和结构 A.段结构 B.过程定义不嵌套, 只允许过程递归调用 C. 分程序结构 分程序嵌套 过程定义嵌套 4存储类别的多少 Global Static Local dynamic 运行空间存信
第10章 运行空间存储 4 决定运行管理复杂程度的因素——源语言本身 1. 允许的数据类型的多少 2.语言中允许的数据项是 静态确定 动态确定 3.程序结构 决定名字的作用域的规则和结构 A.段结构 B.过程定义不嵌套,只允许过程递归调用 C.分程序结构 分程序嵌套 过程定义嵌套 4存储类别的多少 Global Static Local dynamic
术语 静态:如果一个名字的性质通过说明语句 或隐或显规则而定义,则称这种性质是 “静态”确定的。 ·动态:如果名字的性质只有在程序运行时 才能知道,则称这种性质为“动态”确定 的。 第0章运行空间存储
第10章 运行空间存储 5 术语 ❖ 静态:如果一个名字的性质通过说明语句 或隐或显规则而定义,则称这种性质是 “静态”确定的。 ❖ 动态:如果名字的性质只有在程序运行时 才能知道,则称这种性质为“动态”确定 的
第十章 运行时空间组织 常见的分配策略: 1,静态分配策略, 适用于编译时能完全确定每个数据项存储 空间的位置情况,如FORTRAN; 2,动态分配策略,编译时不能完全确定数据项的性质,大小 等,如ALGOL,它允许递归过程和可变数组,名字作用域和 生存期满足分程序结构所限定的作用范围,可采用栈式动态 分配策略(内存先申请先释放):当一种语言内存申请和释 放不遵循先请后放时,一般的处理方法是:让运行程序持有 一个大存区(称为维),凡申请者从堆中分给一块,凡释放 者归还给堆,叫做堆式动态分配策略 第0章运行空间存
第10章 运行空间存储 6 第十章 运行时空间组织 常见的分配策略: 1,静态分配策略,适用于编译时能完全确定每个数据项存储 空间的位置情况,如 FORTRAN; 2,动态分配策略,编译时不能完全确定数据项的性质,大小 等,如 ALGOL, 它允许递归过程和可变数组,名字作用域和 生存期满足分程序结构所限定的作用范围,可采用栈式动态 分配策略(内存先申请先释放);当一种语言内存申请和释 放不遵循先请后放时,一般的处理方法是:让运行程序持有 一个大存区(称为堆),凡申请者从堆中分给一块,凡释放 者归还给堆,叫做堆式动态分配策略
10.1静态存储管理-FORTRAN存储分配 FORTRAN的特点: 1,过程不允许递归: 2,每个数据名所需的存储空间是常数(无可变数组) 3,数据名的性质完全确定 FORTRAN的可调数组:不是可变数组,例子: 子程毫:FUNCTION DIA(A,N,L) 主程序:DIMENSION X(50,50), DIMENSION A(L,L) DIMENSION Y(100,100) DA=A(1,1) D06I=2,N P1=DA(X,10,50)+D1A(Y,100,100) 6 DIA DIA +A(I,I) RETURN END 第10章运行空间存储
第10章 运行空间存储 7 10.1 静态存储管理 --- FORTRAN 存储分配 FORTRAN 的特点: 1,过程不允许递归; 2,每个数据名所需的存储空间是常数(无可变数组) 3,数据名的性质完全确定 FORTRAN 的可调数组:不是可变数组,例子: 子程序:FUNCTION DIA ( A, N, L ) DIMENSION A ( L, L ) DIA = A ( 1, 1 ) DO 6 I = 2, N 6 DIA = DIA + A ( I, I ) RETURN END 主程序: DIMENSION X ( 50, 50 ), DIMENSION Y( 100, 100 ) … P1 = DIA ( X, 10, 50 ) + DIA ( Y, 100,100)
10.1.1数据区 目标程序1 一个FORTRAN程序: 常数 局部区 主程序 目标程序2 COMPILER分块编译 常数 LODER分块连接 局部区 子程序 目标程序3 常数 局部区 子程序 有名公用区 无名公用区 第0章运行空间存储
第10章 运行空间存储 8 10.1.1 数据区 一个 FORTRAN 程序: 主程序 子程序 子程序 COMPILER 分块编译 目标程序1 常数 局部区 目标程序2 常数 局部区 目标程序3 常数 局部区 有名公用区 无名公用区 LODER 分块连接
子程序:SUBROTINE SWAP(A,B) T=A A=B B=T RETURN END 名字 性质 地址 符号表: NAME ATTR DA ADDR SWAP 子,二目 A 哑,实变 k a B 哑,实变 k a+2 T 实变 k a+4 第10章运行空间存储
第10章 运行空间存储 9 符号表: 名字 NAME 性质 ATTR 地址 DA ADDR SWAP 子,二目 A 哑,实变 k a B 哑,实变 k a+2 T 实变 k a+4 子程序:SUBROTINE SWAP ( A, B ) T = A A = B B = T RETURN END
分层分配方案 1,将源表示成一个有层次的有向图 2,从有向图的最低层开始,往上逐层对程序块分配存储单元 11 20-30 15-18 4 13-19 3 7 2 9 5 8-12 6-14 5 如果不重叠,需 要55个单元 5 8 8 6 现在只要31个 0-4 0-5 0-7 第0章运行空间存信
第10章 运行空间存储 10 分层分配方案 1,将源表示成一个有层次的有向图 2,从有向图的最低层开始, 往上逐层对程序块分配存储单元 20-30 1 8 3 2 4 6 7 5 11 4 9 5 7 8 5 7 13-19 8-12 0-7 0-5 0-4 6-14 15-18 如果不重叠, 需 要55个单元 现在只要31个