在艾伦·凯(Alan Kay)发明该术语之前,他们称其为面向对象编程是什么?


22

艾伦·凯(Alan Kay)宣称:“我用术语“面向对象”来形容,我可以告诉你我没有C ++。” 当然,他想到的是Smalltalk。但是他没有组成面向对象的程序本身。他从Simula获得了基本思路。因此,如果尚未发明该术语,他们最初在Simula中将其称为面向对象编程是什么?

Answers:


39

实际上,Alan Kay 提出“面向对象编程”一词时并没有想到Smalltalk

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

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

  • 我想到的对象就像是生物细胞和/或网络上的单个计算机,只能与消息进行通信(因此消息传递从一开始就出现了,花了一段时间才能看到如何以编程语言足够有效地进行消息传递,有用)。
  • 我想摆脱数据。B5000几乎通过其令人难以置信的硬件架构来做到这一点。我意识到,单元格/整个计算机的隐喻将摆脱数据,而“ <-”将只是另一个消息标记(我花了相当长的时间才想到这一点,因为我真的把所有这些符号都认为是功能和程序。
  • 我的数学背景使我意识到,每个对象都可以具有与其关联的多个代数,并且可以包含这些代数,并且它们将非常有用。“多态性”一词是在很晚以后才提出的(我认为是由Peter Wegner提出的),它并不是很有效,因为它实际上来自功能的术语,我所需要的不只是功能。我用“代数”的形式组成了“泛型”一词来处理泛型行为。
  • 我不喜欢Simula I或Simula 67做继承的方式(尽管我认为Nygaard和Dahl只是伟大的思想家和设计师)。因此,我决定将继承作为内置功能保留下来,直到更好地理解它为止。

Smalltalk是此概念的结果,它借鉴并扩展了Simula的“对象”和“类”概念,Simula继而又继承了ALGOL,如Kristen Nygaard和Ole-Johan 在“ Simula语言的发展”中所述。达尔(1978,第253页):

在ALGOL中,块(包括过程)在外部被视为通用操作。通过引入准并行排序机制,基本上相同的结构可以并行地扮演进程的角色,并且通过命名块实例并访问其内容的机制,它们可以充当通用数据对象。在单个结构中组合数据和操作的基本好处已经在探索中。

这项探索的结果是发现“过程属性”可能有用。语言定义文档(Dahl和Nygaard 1965)中引用了以下“抽象”汽车对象类的示例。5.3。

CAR Hoare的记录课(第258页)是我们的进一步灵感,尤其是对于子类而言:

Hoare(68)的子类思想是一个自然的起点,但是有两个困难:

  1. 我们需要具有自己的操作和本地数据栈的流程子类,而不仅仅是纯数据记录。
  2. 我们还需要将常见的过程属性组合在一起,以便以后可以在不一定事先知道的各种不同情况下应用它们。

在1966年秋天,花了很多时间试图使Hoare的唱片级结构适应我们的要求,但没有成功。1966年12月,突然想到了“前缀”的想法。我们想到的是桥上的环礁亭,上面堆满了卡车或公共汽车。(此示例在(Dahl和Nygaard 1968)中再次出现)。

术语“类”和“对象”也出现在Ole-Johan Dahl,Bjorm Myhrhaug和Kristen Nygaard的SIMULA 67通用基础语言中(第4-5页):

块概念对应于“子问题”或“子算法”的直观概念,这是在传统应用程序区域中有用的分解单元。

块是聚合数据结构以及相关算法和操作的形式描述或“模式”。

...

通过“类”声明和关联的交互机制(例如“对象引用”(指针),远程访问”,“准并行”操作和块“串联”)引入了扩展的块概念。

在第1.3.3章(第5页)中详细讨论了类:

Simula 67中的一个中心新概念是“对象”。对象是一个独立的程序(块实例),具有自己的本地数据和由“类声明”定义的动作。类声明定义了程序(数据和操作)模式,并且符合该模式的对象被称为“属于同一类”。

...

因此,尽管还没有发明“面向对象”一词,但在1969年Alan Kay开始开发Smalltalk之前,“类”和“对象”的用法与现代用法相似。

伊万·萨瑟兰(Ivan Sutherland)Sketchpad上将Simula识别为第一种面向对象的编程语言:一种人机图形通信系统(第4页),还认识到CAR Hoare,Douglas T. Ross,ALGOL和Sketchpad的影响:

尽管如此,Sutherland试图消除用户和程序员之间的鸿沟的尝试并不是唯一一种未能做到的系统,它为实现新的编程范例提供了富有想象力的飞跃。Nygaard和Dahl的Simula [7]是第一种结合了面向对象原理的常规编程语言,但是Sketchpad的类和基于实例的继承(尽管未称为对象)的实现要比Simula早几年。

道格拉斯·罗斯(Douglas T. Ross)的工作似乎产生了共同的影响,本论文的致谢中提到了道格拉斯·罗斯(Douglas T. Ross),并以此为基础在麻省理工学院林肯实验室的技术报告中也引用了罗斯。罗斯于1960年代中期坐在CAR Hoare的Algol 68委员会中,他以前在记录类似的数据结构(称为plex)方面的工作影响了Hoare关于抽象数据类型的想法[3],后来被Nygaard和Dahl赞扬作为Simula中类定义机制的起源[7]。

艾伦·凯(Alan Kay)的开创性的Dynabook项目直接导致了Xerox Star以及通过他的语言Smalltalk对面向对象编程的兴趣激增,这直接受到了Sketchpad的影响。凯(Kay)曾写过一个事实,即Smalltalk的起源恰好出现在他桌子上同时出现的Simula发行带和Sutherland的Sketchpad论文的副本[5]。凯认识到,这两个系统是基于相同的基础类型概念(显然是通过Ross plex通过两条不同的路径派生的),并且它们可以构成更广泛使用的编程系统的基础。在比较这两种影响途径时,Simula是一个远远超过Sketchpad的项目,Sketchpad被公认为第一种面向对象的编程语言,

但是,显然,Alan Kay认为Smalltalk是第一种面向对象的语言

尽管它确实具有高贵的祖先,但是Smalltalk的贡献是一种新的设计范式-我称之为面向对象的-用于攻击专业程序员的大问题,并使新手用户可以解决小问题。面向对象的设计是成功地定性提高建模效率的成功尝试,而这种效率越来越高的动态系统和用户关系因硅爆炸而成为可能。

创造了这个词之后,我认为那里没有太多辩论。

最后回答您的问题:面向对象的一些核心概念确实存在于Simula以及Algol和LISP等早期语言中,但是范式本身并不存在,因此实际上并不需要名称。

Smalltalk的设计考虑了面向对象,至少Alan Kay认为是面向对象的

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

该体系结构似乎是早期概念的融合,但是其核心概念由Smalltalk引入,因此标志着该范例的首次实现。


2
+1像往常一样,很好的回答Yannis!我从中学到了很多。
乔纳森·亨森

6
实际上,有很多争论,并且有充分的理由。尽管艾伦·凯(Alan Kay)自夸为“新范式”,但几乎没有办法定义包括Smalltalk但不包括Simula的“面向对象”。在某些实现中,“万物都是对象”的想法(也是Smalltalk中的一个概念-作为一种优化,小的整数对象的表示形式与C或Pascal所使用的表示形式几乎没有区别)。
杰里·科芬

1
@JerryCoffin我不同意大多数概念和原理在那里,在阳光下没有什么新鲜的东西,在Smalltalk Kay的早期历史中,甚至在很多其他影响中,甚至把柏拉图作为面向对象的灵感。就我个人而言,我会继续认为Smalltalk是引入了范式,因为它是在设计时就考虑到范式的第一个实现,而在较早的实现中,相关概念的特征(核心或次要)却并非带来了驱动原理。语言。
扬尼斯,2012年

1
@JerryCoffin(续...)但是那是火焰战争的领域,我真的不认为这很重要。我认为我所引用的萨瑟兰语录充分说明了一个事实,即并非所有人都同意凯“发明”了这种范例,而我对此事的个人见解只不过是一个脚注。
扬尼斯

5
实际上,中心概念不是“每个实体都是对象”,而是“每个动作都是消息发送”。艾伦·凯(Alan Kay)甚至表示,他对将其命名为“面向对象”感到遗憾,而“面向消息”之类的词会更好。
约尔格W¯¯米塔格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.