面向对象之父Alan Kay谈面向对象



【图灵图书推荐】Beginning Java Objects中文版
最深入浅出的面向对象图书!


Programming.Reddit 真是一个好东西,应该进入每个程序员的必读列表。我最喜欢它的一点在于,它不仅有当下的热门话题,还会引导你读到不少历史性的但是更具深意的文字。 Alan Kay谈OO就是这样一篇。这是一段私人邮件通信,时间是2003年7月。


说图灵奖得主(2003年) Alan Kay是面向对象之父大概是有争议的,因为公认的第一个OO语言是Simula,由另外两个图灵奖得主(2001年)Ole-Johan Dahl and Kristen Nygaard发明,所以Wikipedia将三者都称为OO之父。不过考虑到面向对象编程这个名字却是Alan Kay的发明。

时光倒转到1966年,当时Kay还在犹他大学读研究生,师从图灵奖得主(1988年)Ivan Sutherland。受Sketchpad, Simula, ARPAnet 的设计和 Burroughs B5000 (一种有独特设计的大型机,1961年问世,实现了最早的虚拟机)等等的影响,他开始思考程序设计的架构。1967年的某个时候,当被人问及自己在做什么的时候,Kay回答:“It's object-oriented programming”。Kay回忆,OO最初的概念来自四部分:

1. 对象就像是生物学里的细胞,或者网络中的一台计算机,只能够通过消息来通信(因此消息概念出现很早,但是它在程序设计语言中实际可用却花了较长时间。)

2. 我想去掉数据(【刘江按】此处可能指数据的封装,因为B5000的设计特点之一是禁止非授权的数据访问)。B5000通过其令人难以置信的硬件架构实现了这一点。我意识到,细胞/计算机的隐喻有可能实现这一目的, "<-" 符号可以只是表示消息而已。(这一点花了我很长时间,因为我实际上认为所有这些符号都是函数和过程的名字。)

3. 我的数学背景使我意识到,每个对象可以有很多运算,而且可以有很多系列运算,这样会非常有用。术语”多态“是非常晚(应该是由Peter Wegner)提出的,而且不那么合理,因为它实际上来自函数术语体系,而我所考虑的含义不仅仅是函数。我发明了一个术语" genericity"来指代拟代数(quasi-algebraic)形式的泛型行为。

4. 我不喜欢Simula I 或者Simula 67的继承方式(虽然我认为Nygaard和Dahl都是伟大的思想者和设计者)。因此我决定在有了更深刻理解之前,先不考虑将继承作为内置特性。

我对这种架构的最初实验是在van Wijngaarten和Wirth的"Generalization of Algol"和Wirth的Euler基础上的修改,都是类似LISP的,但具有更传统的可读性更好的语法。我那时候还不太理解 LISP古怪的元语言概念,但是从其他来源包括Irons' IMP那里获得了类似的可扩展语言的想法。

第二阶段,我最终理解了LISP,然后以此为基础设计了更小也更强大的迟绑定底层结构。Dave Fisher的论文是以McCarthy风格完成的,他有关可扩展控制结构的想法对我非常有帮助。这时另一个大的影响是Carl Hewitt的PLANNER。

最初的Smalltalk版本就出自以上这些来源。而对于后来的Smalltalk版本,历史对它们的批评是:又倒退回Simula的老路上,没有实现更安全的尽可能随处可用的扩展机制。

在被问及面向对象程序设计的含义时,Alan Kay这样回答:

我并不反对类型,但是我不知道哪个类型系统没有大问题的,因此我仍然喜欢动态类型化。

对我而言,面向对象程序设计只意味着消息发送(messaging),状态处理的局部保存、保护和隐藏(local retention and protection and hiding of state-process),还有一切东西的极端迟绑定(extreme late-binding of all things)。这些在Smalltalk和LISP中都可以实现。可能还有其他系统,但我不知道。

对上面比较令人费解的”状态处理的局部保存“那句,Alan Kay又做了进一步解释,但仍然不好懂。大概意思似乎是说面向对象有两条道路,一种是他所支持的比较小众的无数据(bio/net non-data-procedure route),一种是现在比较主流的ADT。

【延伸阅读】
Smalltalk背后的设计原则(英文)
阅读更多

没有更多推荐了,返回首页