据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他所说的话,今天我们所说的面向对象不是他的意思。
例如,我刚刚在Google上找到了这个:
我用“面向对象”这个词来形容,我可以告诉你我没有C ++
-艾伦·凯(Alan Kay),OOPSLA '97
我依稀记得听到一些非常有见地的关于他没有意思。类似于“消息传递”的东西。
你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。
谢谢。
据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他所说的话,今天我们所说的面向对象不是他的意思。
例如,我刚刚在Google上找到了这个:
我用“面向对象”这个词来形容,我可以告诉你我没有C ++
-艾伦·凯(Alan Kay),OOPSLA '97
我依稀记得听到一些非常有见地的关于他没有意思。类似于“消息传递”的东西。
你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。
谢谢。
Answers:
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)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。但是如果它试图获取数据并找到过程指针,通常可以做正确的事情。我用犹他州早期的东西解决的第一个问题是仅使用方法和对象的“数据消失”。在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇非常漂亮的论文,称为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。但是如果它试图获取数据并找到过程指针,通常可以做正确的事情。我用犹他州早期的东西解决的第一个问题是仅使用方法和对象的“数据消失”。在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇非常漂亮的论文,称为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。
将对象作为非数据的对象的人数较少,包括我自己,卡尔·休伊特,戴夫·里德和其他一些人-几乎所有这些人都来自ARPA社区,并以一种或另一种方式与ARPAnet→Internet的设计,其中计算的基本单位是一台完整的计算机。但是,只是为了表明一个想法可以顽固地坚持到整个七十年代和八十年代,有很多人试图通过“远程过程调用”来解决问题,而不是考虑对象和消息。Sic运输gloria mundi。
干杯,
艾伦·凯
Smalltalk语言体现了Alan Kay 面向对象所指的大多数(如果不是全部)。
另外,来自http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models:
艾伦·凯(Alan Kay)认为,消息传递比OOP中的对象更为重要,并且对象本身通常被过分强调。实时分布式对象编程模型基于此观察结果。它使用分布式数据流的概念,使用高级的功能样式规范,根据消息模式来表征复杂的分布式系统的行为。
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/
我从关注Alan Kay和其他人(例如Jim Coplien)的著作中获得的主要观点之一是,真正的“面向对象”编程是关于在人类/用户心理模型方面对计算机和软件进行建模,而不是只是PROGRAMMERS的工具。
据我了解,艾伦(Alan)对OOP的愿景是使计算机成为一种工具,使人类用户可以执行他们想要的任何事情:计算机的全部功能通过直观的交互模型直接暴露给最终用户。我应该能够直接查看和雕刻运行时对象和交互,而不仅仅是通过代码。
这是有关我计划尝试使用JavaScript的某些版本作为概念证明的计划的文章:http : //www.cemetech.net/forum/viewtopic.php? p= 234494#234494
从软件开发/编程的角度来看,吉姆·科普林(Jim Coplien)讨论了代码如何并且应该类似于用户的思维模型。也就是说,该代码的读取方式与描述其行为的人员所听到的方式大致相同。这主要是通过考虑对象而不是类和类型来实现的。行为是根据对象扮演的角色来描述的,而不是作为对象标识定义的一部分。您应该能够根据对象建模交互,这些对象由对象在交互中扮演的角色识别。这就是人类思维模型的工作方式:服务员,客户,收银员,源帐户,目标帐户......这些是角色,而不是类型,并且您希望能够为“任何对象当时正在扮演这个角色”定义方法”,