第13章运行时存储空间的组织.pptx

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第13章 运行时存储空间的组织;第一节 程序的存储空间;1.2 代码空间(C) 内容:线性存放着目标指令序列。当前执行的指令位置由指令指针ip指示。 1.3 数据空间(D) 内容:变量、常数、控制信息、描述符等。 静态分配:在运行前就可确定数据空间的大小, 在编译时刻就能进行的存储分配。 动态分配:运行时才能进行的存储分配。;2. 活动记录;2.1 活动记录的内容;2.2 活动记录的特点;2.3 变量的类型;3) 半动态变量 编译时不能确定变量 i 的相对位置offset(i),但能确定 i 的存储格式。 可在活动记录中为 i 建立一个描述符,用于记录 i 在内存中的存储格式,并在描述符中建立一个指针域,用于记录 i 在运行时的具体存储地址。 例:动态数组 int a[1..m]; int b[1..m][1..n]; ;4) 动态变量 编译时不能确定变量 i 的相对位置offset(i),也不能确定 i 的存储格式。 即描述符需要到运行时才能确定,因此可在活动记录中为 i 设置两个指针,一个记录运行时描述符的地址,另一个记录运行时 i 的地址。 例: 某些语言中类型可变的变量; 某些语言中维数可变的数组。 ;4. 存储分配模式;4.2 栈式分配 用栈分配活动记录; 各程序单元之间的调用遵循“后进先出”模式; 活动记录的建立和撤消也满足“后进先出”模式; 分配方法:当一个程序单元被激活时, 在栈顶分配其活动记录;当程序单元退出时,在栈顶将其活动记录撤销。;例子:某程序中各程序单元的调用顺序为: …… P运行 P调用Q Q调用R …… R退出 Q退出 P退出 ……;4.3 堆分配;4.4 存储空间的组织;第二节 栈式分配;1.2 处理方法;1.3 动态连接和动态链;;1.4 CALL P的翻译;例子:过程A调用过程P;1.5 RETURN语句的翻译;;2. 半动态变量的栈式分配;(1) 编译时创建描述符,并产生在运行时动态修改描述符和创建变量存储空间的指令。 (2) 一个单元激活后(进入该单元),遇到变量 i 的说明时,调用上述指令(填描述符,分配存储空间),并调整free := free + L。;3. 动态变量的存储分配; 程序单元间通信方式是通过非局部环境和参数传递来实现的。 对非局部环境的引用必须考虑变量的作用域,变量的作用域是指可访问该变量的程序范围。;1. 动态作用域规则 这是一种最近活动规则,对非局部变量,引用的应是最近的“调用外层”中说明的变量。 例:A-C-F的调用序列,F的直接调用外层为C、C的直接调用外层为A。 2. 引用方法 通过“动态链”找到最近的“调用外层”中说明的变量。;1. 静态作用域规则 这是一种最近嵌套规则,对非局部变量,引用的应是最近的“嵌套外层”中说明的变量。 例:嵌套的层次 若A是B的直接外层,则B的层次=A的层次+1。 A(0)、B(1)、C(2)、D(3)、E(1)、F(2)、G(2) ;unit A;;;2. 引用方法;;假设当前处在栈顶的是单元B的活动记录,单元B中引用了单元A中的变量x。单元A的层次为nA、单元B的层次为nB。要找到变量x的存放地址,即: DA + offset(x) 关键是要找到单元A的活动记录DA。;nB - nA = 0:A和B是同一层(A就是B) DA = current nB - nA = 1:A是B的直接外层(第1个外层) DA = D[current + 2] nB - nA = 2:A是B的第2个外层 DA = D[D[current + 2] + 2] nB - nA = 3:A是B的第3个外层 DA = D[D[D[current + 2] + 2] + 2];令nB - nA = d,定义函数f(d),表示从B的活动记录出发,沿静态链搜索d步,可以到达A的活动记录。 f(d) { if(d=0) then return current ; else return D[ f(d-1) + 2 ] ; };(3) 静态连接的建立(单元X调用单元B时) 当前栈顶为X的活动记录,需要建立B的活动记录。;(1) nX-nB = -1, B的静态连接=f(0) (2) nX-nB = 0, B的静态连接=f(1) (3) nX-nB = 1, B的静态连接=f(2) (4) nX-nB = d, B的静态连接=f(d+1) 因此,静态连接算法为:D[free+2] = f(d+1);(1) D[ free ] := ip + 6(保存返回地址) (2) D[free + 1] := current (设置动态链接 ) (3) D[free + 2] := f(d+1) (设置静态链接

文档评论(0)

191****0059 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5342242001000034
认证主体四川龙斌文化科技有限公司
IP属地四川
统一社会信用代码/组织机构代码
91510100MA6ADW1H0N

1亿VIP精品文档

相关文档