有效的程序综合还需要一些组织原则,它们能够指导我们系统化地完成系统的整体设计。特别的需要一些能够帮助我们构造起模块化的大型系统策略,也就是说,使这些系统能够“自然地”划分为一些具有内聚力的部分,使这些部分可以分别进行开发和维护。
有一种非常强有力的设计策略,特别适合用于构造那类模拟真实物理系统的程序,那就是基于被模拟程序的结构去设计程序的结构。那么有关的物理系统里的每一个对象,我们构造起一个与之对象的计算对象;对该系统里的每种活动,我们在自己的计算系统里顶一种符号操作。采用这一策略时的希望是,在需要针对系统中的新对象或者新活动扩充对应的计算模型时候,我们能够不必对程序的组织方面做得很成功,那么在需要添加新特城或者排除旧东西里的错误时候,就只需要在系统里的一些小局部中工作。
本章研究两种特点鲜明的策略。第一种策略将注意力集中在对象上,将大型系统看成一大批对象,它们的行为可能随着时间的进展而不断的变化。另一种组织策略将注意力集中在流过的系统的信息流上,非常像电子工程师观察一个信号处理系统。
对于对象途径而言,我们必须关注计算对象可以怎样变化而又同时保持其标识。这将迫使我们抛弃老的计算的代换模型,转向更机械式的,理论上也更不同意把握的计算的环境模型。在处理对象、变化和标识时,各种困难的基本根源在于我们需要在这一计算模型中与时间搏斗。如果允许程序并发指向的可能性,事情会变得更困难许多。流方式特别能用于松解在我们模型中对时间的模拟与计算机求值过程中的各种时间发生的顺序。我们将通过一种称为延时求值的技术做到这一点。
赋值和局部状态
一个由许多对象组成的系统里,其中的这些对象极少会是完全独立的。每个对象都可能通过交互作用,影响其他对象的状态,所谓交互就是建立起一个对象的状态变量与其他对象的状态变量之间的联系。确实如果一个系统中的状态变量可以分组,形成一些内部紧密结合的子系统,每个子系统与其他子系统之间只存在松散的练习,此时将这个系统看作是由一些独立对象组成的观点就会特别有用。
对于一个系统的这种观点,有可能成为组织这一系统的计算模型的有力框架。要使这样的一个模型成为模块化的,就要求它能够分解为一批计算对象,使它们能够模拟系统里的实际对象。每个计算对象必须有它自己的一些局部状态变量,用于描述实际对象的状态。对于被模拟系统里的对象的状态是随着时间的变化的,与它们对象的计算对象的状态也必须变化。