局部引用环境例子-seipkueducn-PKUSEI.PPT

  1. 1、本文档共115页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
局部引用环境例子-seipkueducn-PKUSEI

第九章 子程序控制 子程序间的控制方式: 简单的调用-返回方式:特点、及实现 递归调用方式 子程序间的数据共享和传递 数据共享的相关概念 参数传递 公共环境 9.1 子程序顺序控制 简单的子程序“调用—返回” 程序可视为以子程序为单元的层次结构 子程序调用的控制机制可用“拷贝”规则来解释,子程序调用语句的效果可通过下面方式同样得到:执行用子程序体的拷贝来替代调用语句(合适地替换参数和冲突标识符)。 从这个观点看,子程序调用可视为这样一种控制结构,它使得不必要在程序的多个地方拷贝大量相同或几乎相同的语句。 “调用—返回” 控制结构 这个观点中有若干隐含假设: 1、子程序不能是递归的 递归分为直接递归和间接递归。 对非递归子程序调用,在翻译时,原理上我们可以应用拷贝规则。 但如子程序是直接递归的,则拷贝规则在原理上也是不可能使用的,因为替代过程不会终止,替代一个call至少引入一个call。间接递归可允许删去某些子程序,但最终仍将带来其他的直接递归。 2、显式的调用语句是需要的。 因为需要替代,必须有显式的替代点。 而对例外处理这一类子程序,则不存在显式的调用点。 “调用—返回” 控制结构 3、子程序必须在每次调用中被完整地执行。 拷贝规则应用后,则子程序需从头执行到尾。 但对协同例程子程序,可能在其终止点后继续执行。 4、在调用点立即转换控制权。 显式的调用和拷贝规则,使得程序控制权被立即转移。 但对被调度子程序的调用,子程序的执行可能被延迟一定时候。 5、单个执行序列。 在执行中某点,只有一个子程序拥有控制权,执行是单序列的。 如我们停止程序则我们总可以知道是哪个子程序拥有控制权,哪些程序的执行被挂起,哪些还未被调用,哪些已结束执行。 但用作任务的子程序可以并发执行。 Fortran基本上是以拷贝规则来看待子程序调用的。 简单的调用—返回结构: 实现—基本原理 首先需建立完整的程序执行模型。 对表达式或语句序列,被视为运行时的可执行代码块。表达式或语句序列的执行即是代码块的执行,通过硬件解释器进行。 但对子程序而言,我们需要更多: 1、在子程序定义(翻译为模板)和子程序激活(调用时创建)间存在不同。 2、激活实现为两部分:代码段 + 激活记录。 3、代码段在执行过程中不变,子程序的每个激活使用相同代码段。 4、激活在调用时创建,返回时消除,激活中的内容会因赋值而经常变化。 简单的调用—返回结构: 实现—基本原理 为避免混淆,我们不是简单地说子程序中某特定语句的执行,而是说:在子程序的激活R中S的执行。 这样,为了跟踪程序执行点,我们需要两片数据,用于存放两个系统定义的指针变量。 当前指令指针:CIP 指向当前正在被硬件或软件解释器执行的指令。 当前环境指针:CEP 因为同一子程序的所有激活使用同一代码段,只知道当前指令是不够 的,还需要指向激活记录(代表了子程序的引用环境)的指针(因此称为环境指针)。 简单的调用—返回结构: 实现—基本原理 CEP和CIP的配合,控制了程序的执行路线。 为了保证从子程序的正确返回,CIP和CEP需合适地存放。 通常在调用时将CIP和CEP存放在被调用子程序的激活记录中。 在激活记录中包含一个系统定义的数据对象——返回点(存放两个指针值)。 当遇到call调用时,将旧的(ip, ep)存放到激活记录中返回点,将新的(ip, ep)赋给CIP、CEP,从而完成控制的转移。 遇到返回语句时,取旧的(ip, ep),重设置CIP,CEP,返回控制权。 子程序的执行 子程序B开始执行时的执行状态 简单的调用—返回结构: 实现—简化的实现方法 子程序的拷贝规则观点的重要性质是: 在程序执行中任一点,最多只有某子程序的一个激活是被使用的。子程序可以多次调用,但在其下一次激活开始时,每个激活必须完成且终止。 基于这个性质,可导出一个更简单的子程序实现模型,只要我们愿意用存储来增加执行速度: 为每个子程序静态地分配用以存放单个激活记录的空间,作为代码数的扩展,而不是运行时创建。 很多Fortran和COBOL实现采用这种方式。 简单的调用—返回结构: 实现—简化的实现方法 这样执行不需动态分配空间,而是重复地使用同一个激活记录,只是在调用发生时对其进行初始化而已。 这种模型也带来其他简化,CEP不再需要,因为当前激活记录总是CIP指定的代码数的扩展。 对简化的实现,硬件常提供一return-jump指令,允许子程序调用被单条硬件指令所实现。这样CIP直接表示为硬件的地址寄存器。 返回跳指令将地址寄存器中内容存放到内存或寄存器中,并为其赋新值。 子程序调用返回结构 递归子程序 前面讨论的假设是不允许递归,而递归是重要的顺序控制结构之一。 如LISP中,递归是主要的控制机制。 规约 递归子程序在语法上和其

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档