Smalltalk 的早期历史(1993)
摘要
Alan Kay 于 1993 年在 HOPL-II 会议上发表的论文回顾了 Smalltalk 在 Xerox PARC 的早期历史,追溯其根源:20 世纪 60 年代的人机共生研究、FLEX 机器、SketchPad/Simula,以及走向面向对象设计的 Dynabook 愿景。
暂无内容
查看缓存全文
缓存时间: 2026/10/06 17:52
# Smalltalk 的早期历史
来源:https://worrydream.com/EarlyHistoryOfSmalltalk/
原始 PDF(https://raw.githubusercontent.com/worrydream/EarlyHistoryOfSmalltalk/master/SmalltalkHistoryHOPL-scanned-2015-07-16.pdf)/ 修订(https://github.com/worrydream/EarlyHistoryOfSmalltalk)
*Alan C. Kay*
*Apple Computer*
*[email protected]#*
允许无偿复制本材料的全部或部分内容,条件是:所作副本不得为直接商业利益而制作或分发,且须保留 ACM 版权声明、出版物标题及其日期,并注明复制行为已获美国计算机协会(Association for Computing Machinery)许可。如需以其他方式复制或再版,须付费及/或取得专门许可。
HOPL-II/4/93/MA, USA © 1993 ACM 0-89791-571-2/93/0004/0069…$1.50
## 摘要
大多数想法源自此前的想法。二十世纪六十年代,尤其是在 ARPA 社区,通过交互式分时计算机、图形屏幕和指点设备,催生了大量关于“人机共生”的观念。人们发明了先进的计算机语言,用以模拟炼油厂这类复杂系统,以及半智能行为。随后而至的范式转移——现代个人计算、重叠窗口界面与面向对象设计——源于把六十年代的工作看作不只是“更好的旧东西”。也就是说,不只是更好的方式:来实现大型机计算;让最终用户调用功能;让数据结构更加抽象。相反,计算/价格/体积指数级增长的前景要求我们把六十年代视为“*几乎*是一个新东西”,并找出真正的“新东西”可能是什么。例如,人们会用手持的“Dynabook”进行计算,而这在共享大型机上是不可能的;数以百万计的潜在用户意味着用户界面必须成为一种学习环境,其路数类似于 Montessori 和 Bruner;对更大规模、复杂度的削减以及最终用户素养的需求,则要求抛弃数据与控制结构,转而采用一种更生物学式的方案:受保护的通用单元只通过消息交互,从而能够模仿任何期望的行为。
早期 Smalltalk 是这些新观点的第一个完整实现,其思想谱系来自它在硬件、语言和用户界面设计方面的众多前辈。它成了新计算的典范,部分原因在于我们当时确实在追求信念结构上的质性转变——一种与印刷术发明同属一种精神的新的库恩式范式——因此采取了极其极端的立场,几乎逼迫这些新风格不得不被创造出来。
## 目录
- 引言 2 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p2)
- I. 1960–66——早期面向对象编程及六十年代的其他形成性思想 4 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p4)
- B220 文件系统
- SketchPad 与 Simula
- II 1967–69——FLEX Machine,一台基于面向对象的个人计算机 6 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p6)
- Doug Englebart 与 NLS
- 等离子面板、GRAIL、LOGO、Dynabook
- III. 1970–72——Xerox PARC 12 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p12)
- KiddiKomp
- miniCOM
- Smalltalk-71
- 重叠窗口
- 字体编辑、绘图、动画、音乐
- 字节码
- 图标式编程
- IV. 1972–76——Xerox PARC:第一个真正的 Smalltalk(-72)17 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p17)
- 两个赌注:Smalltalk 的诞生与过渡型 Dynabook
- Smalltalk-72 的原理
- Smalltalk 用户界面
- Smalltalk 应用与系统的开发
- Smalltalk 的演进:ST-74、ooze 存储管理
- Smalltalk 与儿童 (https://worrydream.com/EarlyHistoryOfSmalltalk/#smalltalkAndChildren)
- V. 1976–80——第一个现代 Smalltalk(-76)29 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p29)
- “把我们的磁盘组烧掉吧”
- Notetaker
- Smalltalk-76
- 继承
- 与 Xerox 的更多麻烦
- ThingLab
- Apple 演示
- VI. 1980–83——Smalltalk 的发布版本(-80)38 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p38)
- 转型
- 尾声 (https://worrydream.com/EarlyHistoryOfSmalltalk/#coda)
- 正文中引用的参考文献 41 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p41)
- 附录 I:KiddiKomp 备忘录 45 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p45)
- 附录 II:Smalltalk-72 解释器设计 47 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p47)
- 附录 III:致谢 50 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p50)
- 附录 IV:事件驱动循环示例 53 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p53)
- 附录 V:Smalltalk-76 内部结构 54 (https://worrydream.com/EarlyHistoryOfSmalltalk/#p54)
—致 Dan Ingalls、Adele Goldberg 以及 Xerox PARC LRG 一伙的其他成员
—致 Dave Evens、Bob Barton、Marvin Minsky 与 Seymour Papert
—致 SKETCHPAD、JOSS、LISP 和 SIMULA——六十年代四大编程构想
## 引言
我正在三万五千英尺高空的一架飞机上写这段引言。我的腿上放着一台五磅重的笔记本电脑——1992 年的“过渡型 Dynabook”——到年底它的售价已不到 700 美元。它有一块平整、清晰、高分辨率的位图屏幕,具备重叠窗口、图标、指点设备、可观的存储与计算能力,而且它最优秀的软件是面向对象的。它内置了高级网络功能,而且当时已有无线网络的选项。Smalltalk 就运行在这套系统上,也是我目前与孩子们共事时使用的主要系统之一。
在某些方面,它已超过一台 Dynabook(就数量而言),而在另一些方面则尚未真正达到(就品质而言)。总而言之,大致就是六十年代末人们心中所想的样子。
Smalltalk 是这项更大追求的一部分——先是 ARPA,后来是 Xerox PARC——我称之为*个人计算*。从研究社群来看,每个阶段都有如此多的人参与,以至于要精确分配想法的功绩几乎是不可能的任务。因此,正如 Bob Barton 喜欢引用歌德的话,我们应当“共享发现的兴奋,而不要徒劳地争夺优先权”。我将尝试说明大部分影响来自何处,以及它们如何在由新的个人计算隐喻所形成的磁场中被转化。帮助 Smalltalk 被发明出来的,是先驱们的*态度*,以及那些伟大的思想。当时我最敬佩的人中——例如 Ivan Sutherland、Marvin Minsky、Seymour Papert、Gordon Moore、Bob Barton、Dave Evans、Butler Lampson、Jerome Bruner 等人——似乎都有一种卓越的直觉:他们的创造物虽然按相对标准而言非常出色,却尚未接近必须跨越的绝对门槛。
心胸狭隘的人试图建立宗教,伟大的人只是想要更好的上山之路。牛顿说自己站在巨人的肩膀上看得更远,而计算机科学家们却常常互相踩脚趾。在有巨人肩膀可站的地方,短视仍然是个问题——“外视”(outsight)比“内视”(insight)更好——但可以借助对美学与批评高度敏感的镜片来加以矫正。
编程语言可以按多种方式归类:命令式、应用式、基于逻辑、面向问题等等。但它们似乎要么是“特性的黏合”,要么是“风格的结晶”。COBOL、PL/1、Ada 等属于前者;LISP、APL——以及 Smalltalk——属于后者。黏合型语言似乎总是由委员会发起,而结晶型语言则由单人促成,这大概并非偶然。
Smalltalk 的设计——以及它的存在——源于这样一个洞见:我们所能描述的一切,都可以表示为单一一类行为构件的递归组合,这类构件把自身的状态与过程的组合隐藏在内部,只能通过消息交换来打交道。
从哲学上说,Smalltalk 的对象与 Leibniz 的单子以及二十世纪物理学和生物学的概念有许多共同之处。它构造对象的方式颇具柏拉图色彩,因为其中一些对象充当概念——*理念*(Ideas)——的某种理想化,*表现*(manifestations)可以由它们创造出来。理念本身即是(理念-理念的)表现,而理念-理念是*一种*表现-理念——后者又是它自身的一种——如此,整个系统可以完全自我描述——柏拉图会把这当作一个极其高明的玩笑来欣赏 \[Plato\]。
用计算机的术语来说,Smalltalk 是对“计算机”这一概念本身的递归。它不把“计算机的东西”拆分成一个比整体更弱的部分——比如那些构成编程语言惯常行头的数据结构、过程与函数——而是让每个 Smalltalk 对象都成为对计算机全部可能性的递归。因此它的语义有点像是由极高速网络连接起来的成千上万台计算机。具体表示方式的问题因此可以几乎无限期地搁置,因为我们主要关心的是计算机行为是否恰当,只有当结果不对或返回太慢时,才会对特定策略感兴趣。
尽管 Smalltalk 确实拥有高贵的血统,但它的贡献是一种新的设计范式——我称之为*面向对象*——用以解决专业程序员面对的大型问题,并让初学者也能处理小问题。面向对象设计是一次成功的尝试,旨在质性地提高对由硅技术爆炸所促成的、日益复杂的动态系统与用户关系进行建模的效率。
> “当我们做这些事的时候,我们就会明白他们的想法。”
> ——Richard Hamming
> “记忆与想象不过是同一件事的两种说法。”
> ——Thomas Hobbes
在这部历史中,我将努力忠于 Hamming 的要求,并以 Hobbes 的观察作为调和。以往几次试图撰写 Smalltalk 时我颇感困难,因为我的情感投入一直集中在个人计算作为人类触角的放大器这一点上——而非编程系统设计——而我们还没有走到那里。虽然我是 Smalltalk 的发起者和最初的设计师,但它一直更属于那些让它运转起来并把它推出门的人,尤其是 Dan Ingalls 和 Adele Goldberg。每一位 LRG 成员都以深刻而卓越的方式为这个项目做出贡献,我真希望篇幅足够让我充分地公正对待他们所有人。但我认为我们都会同意,在 Smalltalk 大部分的开发历程中,Dan 是核心人物。
编程本质上是一门实践性的技艺,要造出真实的东西,因此真实现终究必须存在。事实上,今天在使用的语言中,很多(如果不是大多数的话)之所以被使用,并非因为它们有什么真正的优点,而是因为它们存在于一台或多台机器上、能够自举等等。但 Dan 远不只是一个杰出的实现者;随着 Smalltalk 走入实用世界,他也越来越像一位设计师——不只是语言的设计师,也是用户界面的设计师。
在这里,我将尝试把焦点放在导致 Smalltalk-72 的那些事件,以及它向其现代形态 Smalltalk-76 的过渡上。大多数想法都发生在这里,而面向对象编程(OOP)的许多最早阶段,在几乎难以寻觅的文献中记录得很差。
这篇历史写得太长了,但我惊讶地发现,有如此多曾产生影响的人与系统,只是作为影子出现,甚至完全不见踪影。我很抱歉不能多谈 Bob Balzer、Bob Barton、Danny Bobrow、Steve Carr、Wes Clark、Barbara Deutsch、Peter Deutsch、Bill Duvall、Bob Flegal、Laura Gould、Bruce Horn、Butler Lampson、Dave Liddle、William Newman、Bill Paxton、Trygve Reenskaug、Dave Robson、Doug Ross、Paul Rovner、Bob Sproull、Dan Swinehart、Bert Sutherland、Bob Taylor、Warren Teitelman、Bonnie Tennenbaum、Chuck Thacker 和 John Warnock。更糟的是,我漏掉了许多我所厌恶其设计的系统,但它们在反作用中催生了大量有用的想法与态度。换句话说,“历史”不应当被过于认真地对待,而应被视为在演员早已离场之后很久才做出的“笨拙的姿势”。
感谢众多评审者耐心审阅了他们不得不评论的众多草稿。特别感谢 Mike Mahoney,他如此温和地提供帮助,使我听从了他的建议,又如此出色地帮助我,使这篇文章大为改进——还要感谢 Jean Sammet,一位老得不能再老的朋友,她简直可以说是把我吓着了才让我写完的——我可不想知道如果我拖得太久会发生什么。Sherri McLoughlin 和 Kim Rose 在汇集所有材料方面帮了大忙。
## I. 1960–66——早期面向对象编程及六十年代的其他形成性思想
尽管面向对象编程(OOP)出自许多动机,但有两个是核心。大的那个动机是为复杂系统寻找一种更好的模块方案,使细节得以隐藏;小的那个动机是寻找一种更灵活的赋值形式,然后再试着把它整个消除掉。和大多数新想法一样,它最初只是零零碎碎、断断续续地发生。
新想法要经历从内到外的若干接受阶段。从内部来看,其序列是:在多次经历中“勉强看见”一个模式,接着注意到它但并未感知到它的“宇宙般”意义,然后在多个领域中以操作的方式使用它,接着是一次“大旋转”,模式成为一种新思维方式的中心,最终,它变成了它当初所挣脱的那种僵化宗教。从外部来看,正如叔本华所注意到的,新想法首先被斥为疯子的产物,几年后它被认为是显而易见、平平无奇的,最后,最初的斥责者们会声称是他们发明了它。
完全符合这些阶段,我在大约 1961 年、作为美国空军的一名程序员时,“勉强看见”了这个想法好几次。
第一次是在 Burroughs 220 上,以一种将文件从一个空军训练司令部(Air Training Command)设施传输到另一个设施的文件格式(https://worrydream.com/EarlyHistoryOfSmalltalk/Images/b220.png)风格出现。那时还没有标准的操作系统或文件格式,于是某个(至今仍不知姓名)的设计师决定用一个巧妙的办法来绕开这个问题:把每个文件分成三部分。第三部分是全部的实际数据记录,大小和格式任意。第二部分包含 B220 的过程,这些过程知道如何取得记录和字段,以便复制和更新第三部分。第一部分则是一个数组,其中的相对指针指向第二部分中各过程的入口点(最初的指针以标准顺序排列,代表标准的含义)。
不用说,这是一个伟大的想法,并在随后的许多系统中被使用,直到强制使用 COBOL 才使其不复存在。
第二次对这个想法的“勉强看见”稍晚一些出现,当时空军训练司令部决定用 B5000 替换 220。当时我没有足够的视角来真正欣赏它,但我确实注意到了它的分段存储系统、高级语言(HLL)编译与字节码执行的高效性、用于子例程调用和多处理器切换的自动机制、可共享的纯代码、保护机制等等。而且我看到,对它的程序引用表(Program Reference Table)的访问,正好对应于 220 文件系统方案中为模块提供过程接口的做法。然而,此时这台机器给我的最大收获并不是面向对象的想法,而是关于高级语言翻译与求值的一些洞见。
\[Barton, 1961\] \[Burroughs, 1961\]
离开空军之后,我主要通过为国家大气研究中心(National Center for Atmospheric Research)的大规模气象数据集合编写检索(Moore 定律曲线(https://worrydream.com/EarlyHistoryOfSmalltalk/Images/mooreslaw.png))系统来勤工俭学,读完大学余下的课程。
相似文章
一次一台Lisp机器,创造未来
Larry Masinter和Frank Halasz回顾了他们在Xerox PARC的经历,讲述了Interlisp和NoteCards的开发,以及当前Medley/Interlisp的重生计划,反思了研究文化以及早期计算环境的持久价值。
Prolog的诞生(1996)
一篇1996年回顾Prolog编程语言起源与发展的文章。
早期岁月:交互式计算的历史
一部交互式计算的历史概述,追溯了计算机如何从批处理大型机演变为个人实时机器,关键发明包括图灵的理论工作和麻省理工学院的Whirlwind。
探索 PDP-1 Lisp (1960年)
关于运行1960年历史性的PDP-1 Lisp实现的详细介绍,包括启动过程及其作为首个交互式编程环境的重要意义。
PDP 计算机简史
简要回顾 DEC 公司 PDP 系列计算机的发展历程,探讨从 PDP-1 到 VAX 如何塑造了早期黑客文化,并直接影响了 Unix、C、Emacs、Lisp 等基础软件的诞生与发展。