it-swarm.cn

那么,“艾伦·凯”这个“面向对象”这个词到底是什么意思?

据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他的话说,我们今天所说的OO)不是他的意思。

例如,我刚刚在Google上找到了它:

我用“面向对象”这个词来形容,我可以告诉你我没有C++

-艾伦·凯(Alan Kay),OOPSLA '97

我隐约记得记得听到了一些关于他did的意思的见解。类似于“消息传递”的东西。

你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。

谢谢。

104
Charlie Flowers

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


日期:2003年7月23日,星期三09:33:31 -0800收件人:Stefan Ram [出于保密目的而删除]发件人:Alan Kay [出于隐私目的而删除]主题:Re:澄清“面向对象”

您好Stefan-

抱歉耽搁了,但我正在休假。

在6:27 PM +0200 7/17/03,Stefan Ram写道:

亲爱的凯博士,

我希望在有关该主题的教程页面上有一些关于“面向对象编程”一词的权威词汇。我认为唯一具有“权威性”的两个来源是国际标准组织,该组织在“ ISO/IEC 2382-15”中定义了“面向对象”,而正如您所说的那样,您就是您创造的。

我敢肯定我做到了。

不幸的是,很难找到包含您对该术语的定义或描述的网页或资源。关于您在这方面可能要说的内容,有几份报告(例如“继承,多态性和封装”),但这不是第一手资料。我也知道,以后您将更多的重点放在“消息传递”上,但是我仍然想了解“面向对象”。

记录下来,我的教程页面以及进一步的发行和发布,请您解释一下:

首先在何时何地使用“面向对象”一词?

66年11月之后的某个时候,在犹他州的某个时候,受Sketchpad,Simula,ARPAnet,Burroughs B5000的设计以及我在生物学和数学领域的影响,我想到了一种编程架构。大概是在1967年,有人问我在做什么,我说:“这是面向对象的编程”。

它的原始概念包括以下部分。

  • 我想到的对象就像是生物细胞和/或网络上的单个计算机,只能与消息进行通信(因此消息传递从一开始就出现了,花了一段时间才能看到如何以编程语言足够有效地进行消息传递,有用)。

  • 我想摆脱数据。 B5000几乎通过其令人难以置信的硬件架构来做到这一点。我意识到,单元格/整个计算机的隐喻将摆脱数据,而“ <-”将只是另一个消息标记(我花了相当长的时间才想到这一点,因为我真的把所有这些符号都认为是功能和程序。

  • 我的数学背景使我意识到,每个对象可能具有与其关联的多个代数,并且可能有这些代数,并且它们将非常有用。 “多态性”一词是在很晚以后才提出的(我认为是由Peter Wegner提出的),它并不是很有效,因为它实际上来自功能的术语,我所需要的不只是功能。我用“代数”的形式组成了“泛型”一词来处理泛型行为。

  • 我不喜欢Simula I或Simula 67做继承的方式(尽管我认为Nygaard和Dahl只是伟大的思想家和设计师)。因此,我决定将继承作为内置功能保留下来,直到更好地理解它为止。

我最初使用此架构进行的实验是使用我改编自van Wijngaarten和Wirth的“ ALGOL的通用化”以及Wirth的Euler的模型完成的。两者都非常像LISP,但是具有更常规的可读语法。那时我还不了解那种奇怪的LISP有形元语言的想法,但是我与来自包括Irons的IMP在内的各种来源的可扩展语言的想法有点接近。

第二阶段是最终了解LISP,然后利用这种了解使LISP变得更好,更小,功能更强大,后期绑定更多。 Dave Fisher的论文以“ McCarthy”风格完成,他有关可扩展控制结构的观点非常有帮助。当时,另一个巨大的影响力是卡尔·休伊特(Carl Hewitt)的PLANNER(考虑到能够预见Prolog的程度和时间,它从未得到应有的认可)。

以上是施乐PARC的原始Smalltalk。在“历史记录”一章的末尾,抱怨了后来的Smalltalk:它们向Simula退步,没有用更有用的安全机制代替扩展机制。

“面向对象的[编程]”对您意味着什么? (如果可能的话,对于熟悉它们的读者,不需要其他类似于教程的介绍,只需对其他概念进行简短说明(例如“使用继承,多态性和封装进行编程”)。而且,也不必解释“对象”。 ”,因为我已经有“ Smalltalk的早期历史”中有关“对象”的解释的来源。)

(我不反对类型,但是我不知道任何类型的系统都不是完全可行的,所以我仍然喜欢动态类型。)

对我而言,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端后期绑定。可以在Smalltalk和LISP中完成。可能还有其他系统可以做到这一点,但我不知道它们。

[另外,]我应该提到的一件事是Simula促进了两条主要路径。早期的(偶然地)是我采用的生物/网络非数据过程路线。另一个作为研究对象而出现的稍后是抽象数据类型,这发挥了更大的作用。

如果纵观整个历史,我们会发现原始OOP始于ADT,对我所谓的“对象”有一点分叉(导致Smalltalk等),但是在那之后, CS部门几乎完成了ADT,并希望坚持使用数据过程范式。从历史上看,值得一看的是USAF Burroughs 220文件系统(我在Smalltalk历史中描述过),Doug Ross在MIT(AED和更早版本))的早期工作中,他主张嵌入程序。数据结构中的指针,Sketchpad(具有完全的多态性-例如,其数据结构中的相同偏移量表示“显示”,并且将有一个指向该结构所表示的对象类型的适当例程的指针,等等), Burroughs B5000的程序引用表是真正的“大对象”,并且包含指向“数据”和“过程”的指针,但是如果它试图获取数据并找到过程指针,通常可以做正确的事情。我在犹他州早期的工作中解决的问题是仅使用方法和对象的“数据消失”,在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇相当漂亮的论文,名为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样漂亮的论文anken”(我认为是在1970年)中,他证明了使用lamda表达式的正确方法将允许数据被过程抽象。

喜欢将对象作为非数据对象的人数较少,包括我自己,卡尔·休伊特,戴夫·里德和其他一些人-几乎所有这些人都来自ARPA是通过ARPAnet→Internet的设计以一种或多种方式参与其中的,其中基本的计算单位是一台完整的计算机。但是,只是为了展示一个想法可以多么顽强地坚持到整个七十年代和八十年代,试图通过“远程过程调用”来解决问题,而不是考虑对象和消息。

干杯,

艾伦·凯

90
Manoj

(不是)艾伦·凯(Alan Kay)所说的面向对象的大部分都体现在Smalltalk语言中。

另外,来自 http://zh.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models

艾伦·凯(Alan Kay)认为,消息传递比OOP中的对象更为重要,并且对象本身通常被过分强调。实时分布式对象编程模型基于此观察结果。它使用分布式数据流的概念,使用高级功能样式规范,根据消息模式来表征复杂的分布式系统的行为。
23
Mark Cidade

Smalltalk语言体现了Alan Kay面向对象所指的大多数(如果不是全部)。

“我们甚至没有在PARC上考虑所有想法。最初的Smalltalk激发了卡尔·休伊特(Carl Hewitt)的许多演员想法,其精神是OOP),而不是后来的Smalltalks。重要的部分Erlang的语言更像是一种真正的OOP)语言,是当前Smalltalk的语言,当然还有用“ OOP Paint”绘制的基于C的语言。”

摘自艾伦·凯的评论:

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/

6
Thiago Silva

我从关注Alan Kay和其他人(例如Jim Coplien)的著作中获得的主要观点之一是,真正的“面向对象”编程是关于根据HUMAN/USER心理模型对计算机和软件进行建模,而不是只是PROGRAMMERS的工具。

据我了解,艾伦(Alan)的OOP)愿景是使计算机成为一种工具,该工具可让人类用户进行所需的任何操作:计算机的全部功能通过以下方式直接暴露给最终用户:直观的交互式模型,我应该能够直接查看和雕刻运行时对象和交互,而不仅仅是通过代码。

这是一篇有关我计划在JavaScript中尝试其某些版本的计划以作为概念证明的帖子: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

从软件开发/编程的角度来看,Jim Coplien讨论了代码如何并且应该类似于用户的思维模型。也就是说,该代码的读取方式与描述其行为的人员所听到的方式大致相同。这主要是通过考虑对象而不是类和类型来实现的。行为是根据对象扮演的角色来描述的,而不是作为对象标识定义的一部分。您应该能够根据对象建模交互,这些对象由对象在交互中扮演的角色识别。这就是人类思维模型的工作方式:服务员,客户,收银员,源帐户,目标帐户......这些是角色,而不是类型,并且您希望能够为“任何对象当时正在扮演这个角色”定义方法”,因为该行为是许多更改对象之间系统交互的一部分,而不是某些TYPE定义的一部分。

6
user1270393