最新第七章 运行时刻环境.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最新第七章 运行时刻环境.ppt

调用代码序列 调用代码序列(calling sequence)为活动记录分配空间,填写记录中的信息; 返回代码序列(return sequence)恢复机器状态,使调用者继续运行。 调用代码序列会分割到调用者和被调用者中。 根据源语言、目标机器、操作系统的限制,可以有不同的分割方案 把代码尽可能放在被调用者中。 * chfght 调用/返回代码序列的要求 数据方面 能够把参数正确地传递给被调用者 能够把返回值传递给调用者 控制方面 能够正确转到被调用过程的代码开始位置 能够正确转回调用者的调用位置(的下一条指令) 调用代码序列和活动记录的布局相关 * chfght 活动记录的布局原则 调用者和被调用者之间传递的值放在被调用者活动记录的开始位置 固定长度的项放在中间位置 控制链、访问链、机器状态字段 早期不知道大小的项在活动记录尾部 栈顶指针(top_sp)通常指向固定长度字段的末端 * chfght 调用代码序列的例子 Calling sequence 调用者计算实在参数的值 将返回地址和原top_sp存放到被调用者的活动记录中。调用者增加top_sp的值(越过了局部数据、临时变量、被调用者的参数、机器状态字段) 被调用者保存寄存器值和其他状态字段 被调用者初始化局部数据、开始运行。 Return sequence 被调用者将返回值放到和参数相邻的位置 恢复top_sp和寄存器,跳转到返回地址。 * chfght 调用者/被调用者的活动记录 * chfght 栈中的变长数据 如果数据对象的生命期局限于过程活动的生命期,就可以分配在运行时刻栈中。 变长数组也可以放在栈中 top指向实际的栈顶 top_sp用于寻找顶层记录的定长字段 * chfght 非局部数据的访问(无嵌套过程) 没有嵌套过程时的数据访问 C语言中,每个函数能够访问的变量 函数的局部变量:相对地址已知,且存放在当前活动记录内,top_sp指针加上相对地址即可访问 全局变量:在静态区,地址在编译时刻可知 很容易将C语言的函数作为参数进行传递 参数中只需包括函数代码的开始地址。 在函数中访问非局部变量的模式很简单,不需要考虑过程是如何激活的。 * chfght 非局部数据的访问(嵌套声明过程) PASCAL中,如果过程A的声明中包含了过程B的声明,那么B可以使用在A中声明的变量。 当B的代码运行时,如果它使用的是A中的变量。那么这个变量指向运行栈中最上层的同名变量。 但是,我们不能通过嵌套层次直接得到A的活动记录的相对位置。必须通过访问链访问 void A() { int x,y; void B() { int b; x = b+y; } void C(){B();} C(); B(); } A的活动记录 C的活动记录 B的活动记录 当A调用C,C又调用B时: 当A直接调用B时: A的活动记录 B的活动记录 * chfght 嵌套深度 嵌套深度是正文概念,可以根据源程序静态地确定 不内嵌于任何其他过程中的过程,嵌套深度为1 嵌套在深度为i的过程中的过程,深度为i+1. 深度为1 sort 深度为2 readArray,exchange, quicksort 深度为3 partition * chfght 访问链 访问链被用于访问非局部的数据 如果过程p在声明时嵌套在过程q的声明中,那么p的活动记录中的访问链指向最上层的q的活动记录。 从栈顶活动记录开始,访问链形成了一个链路,嵌套深度沿着链路逐一递减。 设深度为np的过程p访问变量x,而变量x在深度为nq的过程中声明,那么 np-nq在编译时刻已知; 从当前活动记录出发,沿访问链前进np-nq次找到的活动记录中的x就是要找的变量位置 x相对于这个活动记录的偏移量在编译时刻已知 * chfght 访问链的维护(直接调用过程) 当过程q调用过程p时,访问链的变化 p的深度大于q:根据作用域规则,p必然在q中直接定义;那么p的访问链指向当前活动记录 s调用q(1,9) 递归调用:p=q。新活动记录的访问链等于当前记录的访问链 q(1,9)调用q(1,3)) p的深度小于等于q的深度:此时必然有过程r,p直接在r中定义,而q嵌套在r中;p的访问链指向栈最高的r的活动记录。 p调用exchange * chfght 访问链的例子 * chfght 访问链的维护(过程指针型参数) 在传递过程指针参数时,过程型参数中不仅包含过程的代码指针,还包括正确的访问链。 * chfght 显示表 用访问链访问数据时,访问开销和嵌套深度差有关 使用显示表可以提高效率,访问开销为常量 显示表:数组d为每个嵌套深度保留一个指针 指针d[i]指向栈中最高的、嵌套深度为i的活动记录。 如果程序p中访问嵌套

文档评论(0)

liuxiaoyu98 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档