面向对象之父Alan Kay谈面向对象
2007-11-08 13:41
831 查看
【图灵图书推荐】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背后的设计原则(英文)
相关文章推荐
- [面向对象起源] 面向对象之父Alan Kay:预测未来,创造未来
- 面向对象之父Alan Kay谈面向对象
- Delphi面向对象 COM [转载]Delphi面向对象学习随笔七:COM
- php面向对象视频笔记之第一章(面向对象基础)
- 面向对象之编程语言面向对象实现机制
- java面向对象(一) 了解面向对象
- C语言中的面向对象-C语言中的面向对象思想
- 什么是对象,为什么要面向对象,怎么才能面向对象?
- 面向对象之父Alan Kay:预测未来,创造未来
- 连载:面向对象葵花宝典:思想、技巧与实践(4) - 面向对象是瑞士军刀还是一把锤子?
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- js面向对象练习(二):JS面向对象的思路(canvas)写躁动的小球
- 2、面向对象以及winform的简单运用(面向对象的四大基本特性)
- 前端开发:面向对象与javascript中的面向对象实现(一)
- 大三学长带我学习JAVA.作业5.面向对象之封装 面向对象之封装.续 学长带我学java的作业5
- 面向对象及行程一种面向对象的编程思维!
- 面向对象--不能对非静态字段进行静态引用 面向对象-static 类名.对象
- 【JavaSE笔记】面向对象(一)_面向对象入门
- day34 反射、面向对象内置方法:如__str__、面向对象的软件开发
- 16-面向对象(static关键字-什么时候用) 面向对象-Static难点 18-面向对象(构造代码块).(静态代码块)