艾伦·凯谈‘面向对象编程’:聚焦消息传递、本地保留与后期绑定 跳转到主要内容[个人笔记](/en/)[目录](/en/docs/dual-world-theory/preface)英文* [简体中文](/docs/appendix/alan-kay-on-oop)* [英文](/en/docs/appendix/alan-kay-on-oop)* [双世界理论](/en/docs/dual-world-theory/preface)* [前言](/en/docs/dual-world-theory/preface)* [简介](/en/docs/dual-world-theory/intro)* [理论](/en/docs/dual-world-theory/theory)* [双世界理论](/en/docs/dual-world-theory/theory)* [因果传播网络](/en/docs/dual-world-theory/causal-layer-mechanism)* [面向因果的建模](/en/docs/dual-world-theory/core-concepts)* [实践](/en/docs/dual-world-theory/practice)* [游戏架构实践](/en/docs/dual-world-theory/practice)* [无 GC 编程空间与时间](/en/docs/dual-world-theory/practice/gc-free-programming-space-and-time)* [关于](/en/docs/about/dual-world-theory)* [关于双世界理论](/en/docs/about/dual-world-theory)* [关于作者](/en/docs/about/about-author)* [附录](/en/docs/appendix/alan-kay-on-oop)* [艾伦·凯博士谈‘面向对象编程’的含义](/en/docs/appendix/alan-kay-on-oop)* [](/en/)附录艾伦·凯博士谈‘面向对象编程’的含义本页内容艾伦·凯博士谈‘面向对象编程’的含义2003 年 7 月艾伦·凯Alan Kay发给斯特凡·拉姆Stefan Ram两封电子邮件阐明了‘面向对象编程’这一术语的创造者最初赋予它的含义。来源邮件 1 — 2003 年 7 月 23 日主题为‘关于“面向对象”的澄清’。艾伦·凯向斯特凡致歉称因度假回复晚了。斯特凡·拉姆在 2003 年 7 月 17 日下午 6 点 27 分0200 时区写道想在其关于‘面向对象编程’的教程页面上引用权威观点认为国际标准化组织International Standards Organization在 “ISO/IEC 2382 - 15” 中对‘面向对象’进行了定义而艾伦·凯是该术语的创造者。但很难找到艾伦·凯对该术语定义或描述的网页或资料虽有关于他可能说过的话的报道但不是第一手资料。斯特凡·拉姆还提到知道艾伦·凯后来更强调‘消息传递’仍想了解‘面向对象’的含义并询问该术语最早使用的时间和地点。艾伦·凯确定是自己创造了该术语。他表示1966 年 11 月之后的某个时间在犹他州受 Sketchpad、Simula、ARPAnet 的设计、宝来 B5000Burroughs B5000计算机以及自己在生物学和数学方面的背景影响构思出一种编程架构。大概在 1967 年有人问他在做什么他回答是‘面向对象编程’。其最初概念包含以下部分* 把对象想象成生物细胞和/或网络上的独立计算机只能通过消息通信消息传递从一开始就存在但过了一段时间才明白如何在编程语言中高效实现使其实用。* 想摆脱数据的概念宝来 B5000 通过其硬件架构几乎做到了这一点意识到细胞/整台计算机的隐喻可摆脱数据且 - 只是另一个消息令牌花了很长时间才想明白因为真的把所有符号都看作函数和过程的名称。* 数学背景让他意识到每个对象可关联多个代数并有这些代数的家族这很有用。‘多态’polymorphism术语后来由彼得·韦格纳Peter Wegner提出并不十分准确因为它来自函数命名法而他想要的不止函数于是创造了‘泛型性’genericity术语用于以准代数形式处理通用行为。* 不喜欢 Simula I 或 Simula 67 实现继承的方式虽认为尼加德Nygaard和达尔Dahl是了不起的思考者和设计师决定先不把继承作为内置特性直到更好地理解它。艾伦·凯最初对这个架构的实验是使用从范·维恩加登van Wijngaarten和沃斯Wirth的‘Algol 泛化’以及沃斯的欧拉Euler语言改编的模型进行的。这两种语言有点像 LISP但语法更传统、易读。当时他还不理解 LISP 有形元语言的强大概念但从包括艾恩斯Irons的 IMP 在内的各种来源中汲取了关于可扩展语言的想法。第二阶段他最终理解了 LISP并利用这种理解构建出更优美、更小、更强大且更具后期绑定特性的底层结构。戴夫·费舍尔Dave Fisher的论文采用‘麦卡锡McCarthy风格’其关于可扩展控制结构的想法很有帮助。当时另一个很大的影响是卡尔·休伊特Carl Hewitt的 PLANNER 语言考虑到它能如此出色且如此早地预见 Prolog它从未得到应有的认可。施乐帕罗奥多研究中心Xerox PARC最初的 Smalltalk 就源于上述这些。后续的 Smalltalk 在《历史》章节末尾受到了批评它们倒退回了 Simula 的模式没有用更安全且同样实用的扩展机制来替代原有的机制。斯特凡·拉姆还询问‘面向对象 [编程]’ 对艾伦·凯来说意味着什么。艾伦·凯表示不反对类型但没见过不令人头疼的类型系统所以喜欢动态类型对他来说面向对象编程仅意味着消息传递、状态 - 过程的本地保留与保护和隐藏以及所有事物的极端后期绑定。这可以在 Smalltalk 和 LISP 中实现可能还有其他系统也能做到但他不太了解。最后艾伦·凯祝斯特凡一切都好。邮件 2 — 2003 年 7 月 26 日主题同样是‘关于“面向对象”的澄清’。艾伦·凯提到Simula 催生了两条主要的发展路径。早期他走的是生物/网络非数据 - 过程路线另一条稍晚出现、作为研究对象的是抽象数据类型abstract data types这条路线得到了更多关注。回顾整个历史早期的面向对象编程相关内容始于抽象数据类型有一个小分支朝着他所说的‘对象’方向发展进而产生了 Smalltalk 等但之后计算机科学领域的主流还是采用了抽象数据类型并坚持数据 - 过程范式。从历史角度看值得研究美国空军宝来 220 文件系统他在 Smalltalk 历史中描述过、道格·罗斯Doug Ross在麻省理工学院MIT的早期工作AED 及更早的项目他主张将过程指针嵌入数据结构中Sketchpad具有完整的多态性例如其数据结构中的相同偏移量表示‘显示’并且会有一个指向该结构所代表对象类型的相应例程的指针还有宝来 B5000其程序引用表是真正的‘大对象’包含指向‘数据’和‘过程’的指针而且当它试图访问数据却发现是过程指针时通常也能正确处理。艾伦·凯早期在犹他州解决的第一批问题就是仅使用方法和对象来‘消除数据’。在 60 年代末他记得鲍勃·巴尔泽Bob Balzer写了一篇相当出色的论文名为《无数据编程》“Dataless Programming”不久之后约翰·雷诺兹John Reynolds在 1970 年他记得也写了一篇同样出色的论文《思考》“Gedanken”他在文中表明正确使用 lambda 表达式可以用过程来抽象数据。喜欢将对象视为非数据的人较少包括艾伦·凯自己、卡尔·休伊特、戴夫·里德Dave Reed等这个群体几乎都来自 ARPA 社区并且以某种方式参与了 ARPAnet - Internet 的设计其中基本的计算单元是一台完整的计算机。但在整个 70 年代和 80 年代有很多人试图依靠‘远程过程调用’Remote Procedure Call而不是考虑对象和消息。最后艾伦·凯祝斯特凡一切都好。之后斯特凡·拉姆在 2003 年 7 月 26 日晚上 10 点 05 分0200 时区回复感谢艾伦·凯的解释认为‘本地保留’在面向对象编程的语境中是个新概念指的是状态 - 过程意味着对象拥有自己的状态 - 过程对象的状态会保存在对象本地而不是其他地方。他已将艾伦·凯的回复发布在网上为保护隐私删除了电子邮件地址和类似的头部信息。要点总结对艾伦·凯来说面向对象编程从来都不是以继承、类或封装本身为主要目的。它关注的是* 独立实体之间的消息传递* 状态 - 过程的本地保留与保护* 所有事物的极端后期绑定这也是面向因果编程Causality - Oriented认为传统的将对象视为数据容器的模型存在局限性的原因之一当对象被简化为带有方法的状态集合时消息传递和自主计算单元的深层概念就丢失了随之丢失的还有一种清晰的随时间建模因果关系的方法。[上一篇 关于作者](/en/docs/about/about-author)* 邮件 1 — 2003 年 7 月 23 日* 邮件 2 — 2003 年 7 月 26 日* 要点总结[](/cdn-cgi/l/email-protection#c0b3b8b8aaa1a3ab80f1f6f3eea3afad)·[](https://x.com/xiang_xi_shi)