Smalltalk背后的设计原则

2020-06-13 19:05:28

丹尼尔·H·英格斯学习研究组施乐·帕洛阿尔托研究中心字节杂志,1981年8月。(C)由纽约麦格劳-希尔公司(McGraw-Hill Companies,Inc.)提供。从http://users.ipa.net/~dwighth/smalltalk/byte_aug81/design_principles_behind_smalltalk.html复制,由德怀特休斯扫描并转换成超文本标记语言(带有重建的图形)。Smalltalk项目的目的是为每个人的创新精神提供计算机支持。我们的工作来自于一个愿景,包括一个有创造力的人和最好的可用的计算硬件。我们选择专注于两个主要的研究领域:一种是描述语言(编程语言),它充当人类头脑中的模型和计算硬件中的模型之间的接口;另一种是交互语言(用户界面),它将人类通信系统与计算机的交互系统相匹配。我们的工作遵循了一个两到四年的周期,可以看出这与科学方法是平行的:在当前系统内构建一个应用程序(进行观察),基于该经验重新设计语言(制定理论),基于新设计构建一个新系统(做出一个可以测试的预测)。

Smalltalk-80系统标志着我们在这个周期中的第五次。在这篇文章中,我介绍了我们在工作过程中遵守的一些一般原则。虽然演示文稿经常涉及到Smalltalk&34;为人母,但这些原则本身更具一般性,在评估其他系统和指导未来的工作中应该会被证明是有用的。只是为了热身,我将从一个更具社会性而不是技术性的原则开始,这个原则在很大程度上要对Smalltalk项目的特殊偏见负责:个人掌握:如果一个系统要服务于创造精神,它必须是单个人完全可以理解的。

这里的重点是,人的潜能在个人身上表现出来。为了实现这一潜力,我们必须提供一种个人可以掌握的媒介。用户和系统的某些部分之间存在的任何障碍最终都会成为创造性表达的障碍。系统中任何不能改变的部分或不够通用的部分都可能成为障碍的来源。如果系统的一个部分与所有其他部分的工作方式不同,则需要额外的努力来控制该部分。这种增加的负担可能会削弱最终结果,并将阻碍未来在这一领域的努力。因此,我们可以推断出一个一般的设计原则:良好的设计:一个系统应该用最少的一组不可更改的部分来构建;这些部分应该尽可能地通用;并且系统的所有部分都应该保持在一个统一的框架中。

语言:在设计计算机使用的语言时,我们不需要花很长时间就能找到有用的提示。我们所知道的关于人们如何思考和沟通的一切都是适用的。人类思维和交流的机制已经被设计了数百万年,我们应该尊重它们,认为它们是合理的设计。此外,由于我们必须在接下来的一百万年里使用这种设计,如果我们使我们的计算机模型与大脑兼容,而不是反过来,将节省时间。图1说明了我们讨论中的主要组成部分。一个人被描述为拥有身体和心灵。身体是初级经验的场所,在这个讨论的背景下,它是感知宇宙和实现意图的物理通道。经验在头脑中被记录和处理。创造性思维(不深入其机制)可以被视为信息在头脑中的自发出现。语言是该信息的关键:两个人之间的交互在图1中表示为两条弧线。实线弧线表示明确的交流:所说和所感知的实际言语和动作。虚线表示隐含的交流:共同的文化和经验构成了显性交流的背景。在人类互动中,许多实际的交流都是通过参考共享的语境来实现的,而人类语言就是围绕着这样的典故而建立起来的。计算机也是如此。然而,计算机可以被视为图1中的参与者并不是巧合。在这种情况下,主体提供了信息的可视显示和感测来自人类用户的输入的功能。在这种情况下,计算机可以被视为图1中的参与者之一。在这种情况下,主体提供了信息的可视显示和感测来自人类用户的输入。计算机的头脑包括内部存储器和处理元件及其内容。图1显示了计算机语言设计中涉及的几个不同问题:范围:使用计算机的语言设计必须处理内部模型、外部介质,以及人和计算机两者之间的交互。

这一事实导致了向查看co的人解释Smalltalk的困难。

然而,就像如果显式处理对象存储会使程序变得混乱一样,如果从外部执行处理,系统中的控制就会变得复杂。让我们考虑一下数字加5的过程。在大多数计算机系统中,编译器会计算出它是什么类型的数字,并生成代码将其加5。这对于面向对象系统来说还不够好,因为编译器无法确定确切的数字类型(稍后将对此进行详细介绍)。一种可能的解决方案是调用一个通用加法例程,该例程检查参数的类型以确定近似操作。这不是一个好方法,因为这意味着这个关键例程必须由新手编辑,他们只想尝试自己的数字类别。这也是一个糟糕的设计,因为关于对象内部的深入知识散布在整个系统中。*Smalltalk提供了一个更干净的解决方案:它将所需操作的名称与任何参数一起作为消息发送给数字,并理解接收者最知道如何执行所需操作。我们有了一个行为良好的对象的宇宙,它们礼貌地要求彼此实现它们的各种愿望,而不是一个磨碎比特的处理器强奸和掠夺数据结构。消息的传输是在对象之外进行的唯一过程,这是理所应当的,因为消息在对象之间传输。语言可以重申良好设计的原则:统一隐喻:一种语言应该围绕一个可以统一应用于所有领域的强大隐喻来设计。

这方面最成功的例子包括基于链接结构模型构建的LISP;基于数组模型构建的APL;以及基于通信对象模型构建的Smalltalk。在每种情况下,大型应用程序的查看方式都与构建系统的基本单元相同。特别是在Smalltalk中,最原始对象之间的交互被视为计算机与其用户之间的最高级别交互。Smalltalk中的每个对象(即使是最小的整数)都有一组消息和协议,用于定义该对象可以响应的显式通信。在内部,对象可以具有本地存储和对构成所有通信的隐式上下文的其他共享信息的访问。例如,消息+5(加5)带有一个隐含的假设,即该加数是接收该消息的号码的现值。组织机构:统一的比喻提供了一个框架,可以在其中构建复杂的系统。几个相关的组织原则有助于成功地管理复杂性。首先:

模块性:复杂系统中的任何组件都不应该依赖于任何其他组件的内部细节。图2:系统复杂性。随着系统中组件数量的增加,不需要的交互机会迅速增加。正因为如此,一种计算机语言应该被设计成将这种相互依赖的可能性降到最低。

这一原则如图2所示。如果系统中有N个组件,则它们之间存在大约N平方的潜在依赖关系。如果计算机系统要在复杂的人工任务中提供帮助,它们的设计必须将这种相互依赖降到最低。消息发送隐喻通过将消息的意图(体现在其名称中)与接收者用于实现意图的方法分离来提供模块性。结构信息也同样受到保护,因为对对象内部状态的所有访问都是通过这个相同的消息接口进行的。但是,系统的复杂性通常可以通过对相似组件进行分组来降低。这种分组是通过传统编程语言中的数据类型和Smalltalk中的类来实现的。类描述其他对象--它们的内部状态、它们识别的消息协议以及响应这些消息的内部方法。这样描述的对象称为该类的实例。甚至类本身也适合这个框架;它们只是类Class的实例,它描述了对象描述的适当协议和实现。分类:语言必须提供一种方法来对类似的对象进行分类,并在与系统的核心类平等的基础上添加新的对象类。

分类是对无的对象化。换句话说,当一个人看到一把椅子时,这种体验既是从字面上理解的,也是抽象地理解为椅子一样的东西。这种抽象源于头脑融合相似经验的非凡能力,而这种抽象在头脑中表现为另一个对象,即柏拉图式的椅子或椅子。课程是课外活动的主要机制

..