第七章 子程序控制
第七章 子 程 序 控 制
主要讨论子程序间的交互,特别是如何以结构的、高效的方式 传递数据。 71子程序顺序控制 简单的子程序“调用一返回” 程序可视为以子程序为单元的层次结构 主程序 子程序 子程序 子程序.」程序 子程序..子程序 子程序调用的控制机制可用“拷贝”规则来解释,子程序调 用语句的效果可通过下面方式同样得到:执行用子程序体的 拷贝来替代调用语句(合适地替换参数和冲突标识符)。 从这个观点看,子程序调用可视为这样一种控制结构,它使 得不必要在程序的多个地方拷贝大量相同或几乎相同的语句
主要讨论子程序间的交互,特别是如何以结构的、高效的方式 传递数据。 7.1 子程序顺序控制 简单的子程序“调用—返回” 程序可视为以子程序为单元的层次结构 主程序 子程序 … 子程序 子程序…子程序 子程序…子程序 子程序调用的控制机制可用“拷贝”规则来解释,子程序调 用语句的效果可通过下面方式同样得到:执行用子程序体的 拷贝来替代调用语句(合适地替换参数和冲突标识符)。 从这个观点看,子程序调用可视为这样一种控制结构,它使 得不必要在程序的多个地方拷贝大量相同或几乎相同的语句
这个观点中有若干隐含假设,如果适当放松可得到更一般的 子程序控制结构。 1、子程序不能是递归的 递归分为直接递归和间接递归。 对非递归子程序调用,在翻译时,原理上我们可以应用 拷贝规则 但如子程序是直接递归的,则拷贝规则在原理上也是不 可能使用的,因为替代过程不会终止,替代一个cl1少 引入一个cal间接递归可允许删去某些子程序,但最终 仍将带来其他的直接递归 2、显式的调用语句是需要的。 因为需要替代,必须有显式的替代点。 而对例外处理这一类子程序,则不存在显式的调用点
这个观点中有若干隐含假设,如果适当放松可得到更一般的 子程序控制结构。 1、子程序不能是递归的 递归分为直接递归和间接递归。 对非递归子程序调用,在翻译时,原理上我们可以应用 拷贝规则。 但如子程序是直接递归的,则拷贝规则在原理上也是不 可能使用的,因为替代过程不会终止,替代一个call至少 引入一个call。间接递归可允许删去某些子程序,但最终 仍将带来其他的直接递归。 2、显式的调用语句是需要的。 因为需要替代,必须有显式的替代点。 而对例外处理这一类子程序,则不存在显式的调用点
3、子程序必须在每次调用中被完整地执行。 拷贝规则应用后,则子程序需从头执行到尾 但对协同例程子程序,可能在其终止点后继续执行 4、在调用点立即转换控制权 显式的调用和拷贝规则,使得程序控制权被立即转移 但对被调度子程序的调用,子程序的执行可能被延迟一 定时候。 5、单个执行序列 在执行中某点,只有一个子程序拥有控制权,执行是单 序列的。 如我们停止程序则我们总可以知道是哪个子程序拥有控 制权,哪些程序的执行被挂起,哪些还未被调用,哪些 已结束执行。 但用作任务的子程序可以并发执行。 Fortran基本上是以拷贝规则来看待子程序调用的
3、子程序必须在每次调用中被完整地执行。 拷贝规则应用后,则子程序需从头执行到尾。 但对协同例程子程序,可能在其终止点后继续执行。 4、在调用点立即转换控制权。 显式的调用和拷贝规则,使得程序控制权被立即转移。 但对被调度子程序的调用,子程序的执行可能被延迟一 定时候。 5、单个执行序列。 在执行中某点,只有一个子程序拥有控制权,执行是单 序列的。 如我们停止程序则我们总可以知道是哪个子程序拥有控 制权,哪些程序的执行被挂起,哪些还未被调用,哪些 已结束执行。 但用作任务的子程序可以并发执行。 Fortran基本上是以拷贝规则来看待子程序调用的
简单的调用一返回结构 实现 首先需建立完整的程序执行模型。对表达式或语句序列,被 视为运行时的可执行代码块。表达式或语句序列的执行即是 代码块的执行,通过硬件解释器进行。 但对子程序而言,我们需要更多 1、在子程序定乂(翻译为模板)和子程序激活(调用时 创建)间存在不同。 2、激活实现为两部分,代码段十激活记录 3、代码段在执行过程中不变,子程序的每个激活使用相 同代码段。 4、激活在调用时创建,返回时消除,激活中的内容会因 赋值而经常变化
简单的调用—返回结构 •实现 首先需建立完整的程序执行模型。对表达式或语句序列,被 视为运行时的可执行代码块。表达式或语句序列的执行即是 代码块的执行,通过硬件解释器进行。 但对子程序而言,我们需要更多: 1、在子程序定义(翻译为模板)和子程序激活(调用时 创建)间存在不同。 2、激活实现为两部分,代码段十激活记录。 3、代码段在执行过程中不变,子程序的每个激活使用相 同代码段。 4、激活在调用时创建,返回时消除,激活中的内容会因 赋值而经常变化