1.1 计算体系结构

建筑学中的一个隐喻可能对我们所考虑的系统有所启发。在了解了所建场地的性质和对所建结构的要求之后,设计流程开始于parti——设计组织原则[3]。parti通常是各部分的几何排列草图,也可以体现出一些抽象的想法,正如Louis Isadore Kahn的作品那样,将其分为“服务空间”和“佣人空间”(见[130])。这种分离的目的是通过将基础设施(如走廊、洗手间、机械室和电梯)与需要支撑的空间(如学术楼的实验室、教室、办公室)分离,将建筑问题划分为几个部分。

parti是一个模型,但它通常不是一个完全可行的结构,必须用功能元素进行装饰。怎样才能把楼梯和电梯装进去?暖通空调管道、管道、电力和通信分配系统在哪里?如何经营一条道路以适应服务车辆的交付模式?这些设计可能会引起对parti的修改,但parti依然作为一个建筑框架,这些装饰都是围绕这个建筑框架进行搭建的。

在编程中,parti是要进行计算的抽象计划。在小规模程序中,parti可能是一个抽象的算法和数据结构描述。在大规模系统中,它是一个抽象的组成阶段和并行计算分支。在更大规模的系统中,它是对逻辑(甚至是物理)区域的能力分配。

传统上,程序员不能像建筑师那样进行设计。在巧妙设计的语言(例如Java)中,parti与详细内容紧密地混合在一起。“服务空间”(即实际描述所需行为的部分)与“佣人空间”(如类型声明、类声明以及库的导入和导出)混为一谈[4]。更多没那么复杂的语言(如Lisp和Python)则规避了parti,几乎没有给服务空间留下任何多余空间,而且试图增加声明,甚至是临时性的声明。

建筑方面的parti应足够完整,以便能够创建可用于分析和推敲的模型。一个程序的大纲图应该足以用于分析和推敲,但它对于实验和调试来说应该是可执行的。就像建筑师必须填充parti以实现所设计的结构一样,程序员必须制定详细计划以实现所需的计算系统。分层(在第6章中介绍)是允许建立这种细化系统的一种方式。