在第 3 章介绍中,我们定义了过程的抽象通过程序员可以绑定一个名字与一段复杂的程序片段,然后可以根据其功能来思考而不是实现。有时候要区分控制抽象,主要目的是抽象一些行为;数据抽象,主要是抽象信息的表示。我们在 10 章讨论数据抽象。
subroutine是大多数编程语言控制抽象的主要机制。执行subroutine的是 caller,等待subroutine执行完毕然后再继续。大多数subroutine是有参数的:caller 传递参数来影响subroutine的行为,或者提供数据以供操作。arguments 也被称为 actual parameter。需要与subroutine的 formal parameters 一一对应。返回值的subroutine通常称为 function。不反回值的subroutine称为 procedure。静态类型语言要求声明subroutine,编译器从而可以验证调用subroutine的正确性。
在 3.2.2 中提到,参数和局部变量的空间大多数语言分配在栈上。因此,9.1,回顾栈的布局。然后 9.2 中 call sequences 来维护布局。这个过程中,我们审视静态链访问嵌套 subroutine 的非局部变量,在网站材料中考虑另一个代替机制,被称为 display, 服务于类似目的。还讨论 subroutine 内联和闭包的表征。为了说明一些可能的实现替代方案,在网站材料中还会根据案例学习 LLVM 的 ARM 指令编译器,和 32,64位 x86 指令的 gcc 编译器。我们还会讨论 SPARC 指令集的 register window 机制。
在 9.3 中,我们更深入 subroutine 参数。讨论参数传递模型,确定 subroutine 可以应用于形参的操作以及这些操作对于实参的影响。还讨论命名和默认参数,参数的数量,以及函数返回机制。
9.4 中,我们考虑如何处理异常。一般情况下,当 subroutine 中出现异常,需要一种机制在不返回的情况下,展开所有的嵌套上下文,可以在调用上下文中恢复。9.5 中,我们讨论 coroutines,允许程序维护两个或者多个执行上下文,并在其中来回切换。coroutine 可以用来实现 iterator,而且还有其他用途,尤其是用来模拟和服务端程序中。在 13 章,我们使用 coroutine 作为基本的并发 thread。最后在 9.6 中,我们讨论异步 events,发生于程序之外的事情,但是需要响应。