第六章运行时刻环境序61源语言中的一些问题62存储组织内容摘要:

名字的绑定 说明的作用域 活动的生存期 18 提出的问题 编译程序组织存储分配所采用策略和方法主要取决于对源程序中下面的问题的回答。 1.过程可以是递归的吗。 2.当控制从过程的一次活动返回时,局部 名的值将发生什么 变化 ? 3.一个过程可以访问非局部名吗。 4.当调用过程时参数是怎样传递的。 5.过程可以作为参数被传递吗。 6.过程可以作为结果被返回吗。 7. 可以在程序控制下进行动态存储分配吗。 8. 显式的存储重新分配(指撤除分配后的分 配)是必须的吗。 19 例:函数的返回值是函数。 Fun times x y=x*y val times=fn: int  (int  int) twice=times 2 fun pose(f, g)=f(g(x)) pose=fn: (  ) ( ) val fourtimes=pose(twice,twice) 20 存储组织 运行时刻内存的划分 运行时刻的存储空间必须划分以用来存放 : 1. 生成的目标代码。 2. 数据目标。 3. 用于保存过程活动踪迹的一个控制栈。 存储空间划分的各部分: 21 目标代码 静态数据 栈 堆 1. 编译后知道目标代 码的大小。 2. pascal主程序中的 数据 ,c,FORTRAN 3. 栈 :Pascal,c 4. 堆 : Pascal,c 22 活动记录 把过程的一个活动所需要的信息组织成一块连续的存储单元,称为活动记录。 一个活动所需要的信息的每个数据项有相同的生存期,因此,组织成一个活动记录是很自然的。 对于 pascal语言来说,运行过程中,当调用一个过程时,在栈顶构筑它的活动记录;当这个过程的活动执行完后,把它从栈顶弹出。 源语言不同,实现方法不同,组成活动记录的域不同。 实现 pascal语言的活动记录如 图。 23 返回值 实在参数 控制链 访问链 保存机器状态 局部数据 临时变量 控制链 :指向调用过程活动 的活动记录。 访问链:指向本活动要访 问的非局部数据所在的 活动记录。 保存机器状态:调用过程 活动在调用点的机器 状态,包括计数器, 各种寄存器的值。 局部数据:过程中定义的 局部量。 临时变量:编译产生。 24 编译时刻的局部数据的设计 局部数据域是编译时刻在分析过程中的说 明时设计的。 例如: PROCEDURE sub(x,y:real)。 VAR i ,j:integer。 a:ARRAY[1..5] OF real。 e, f : real。 BEGIN  f :=e+i*j。  END。 25 符号表 名字 形 类型 偏移量 活动记录布局 返回值 (topsp,0) x 形 real 1 (topsp,1) y 形 real 2 (topsp,2) (topsp,3) (topsp,20) i int 20 (topsp,21) j int 21 (topsp,22) a array 22 (topsp,27) e real 27 (t。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。