面向对象之父Alan Kay谈面向对象
2017-01-11 11:11
211 查看
原文链接:http://blog.csdn.net/turingbook/article/details/1873481
Alan Kay原文:http://www.tuicool.com/articles/ZrUVzuV
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最初的概念来自四部分:
对象就像是生物学里的细胞,或者网络中的一台计算机,只能够通过消息来通信(因此消息概念出现很早,但是它在程序设计语言中实际可用却花了较长时间。)
我想去掉数据(【刘江按】此处可能指数据的封装,因为B5000的设计特点之一是禁止非授权的数据访问)。B5000通过其令人难以置信的硬件架构实现了这一点。我意识到,细胞/计算机的隐喻有可能实现这一目的, “<-” 符号可以只是表示消息而已。(这一点花了我很长时间,因为我实际上认为所有这些符号都是函数和过程的名字。)
我的数学背景使我意识到,每个对象可以有很多运算,而且可以有很多系列运算,这样会非常有用。术语”多态“是非常晚(应该是由Peter Wegner)提出的,而且不那么合理,因为它实际上来自函数术语体系,而我所考虑的含义不仅仅是函数。我发明了一个术语” genericity”来指代拟代数(quasi-algebraic)形式的泛型行为。
我不喜欢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。
Alan Kay原文:http://www.tuicool.com/articles/ZrUVzuV
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最初的概念来自四部分:
对象就像是生物学里的细胞,或者网络中的一台计算机,只能够通过消息来通信(因此消息概念出现很早,但是它在程序设计语言中实际可用却花了较长时间。)
我想去掉数据(【刘江按】此处可能指数据的封装,因为B5000的设计特点之一是禁止非授权的数据访问)。B5000通过其令人难以置信的硬件架构实现了这一点。我意识到,细胞/计算机的隐喻有可能实现这一目的, “<-” 符号可以只是表示消息而已。(这一点花了我很长时间,因为我实际上认为所有这些符号都是函数和过程的名字。)
我的数学背景使我意识到,每个对象可以有很多运算,而且可以有很多系列运算,这样会非常有用。术语”多态“是非常晚(应该是由Peter Wegner)提出的,而且不那么合理,因为它实际上来自函数术语体系,而我所考虑的含义不仅仅是函数。我发明了一个术语” genericity”来指代拟代数(quasi-algebraic)形式的泛型行为。
我不喜欢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。
相关文章推荐
- [面向对象起源] 面向对象之父Alan Kay:预测未来,创造未来
- 面向对象之父Alan Kay谈面向对象
- 连载:面向对象葵花宝典:思想、技巧与实践(2) - 面向对象语言发展历史
- Java面向对象(二)面向对象的特征 --- 封装 、 继承、 多态
- 关于初学者如何理解面向对象和面向过程的区别以及java中的类和对象
- 黑马程序员—Java面向对象(单例设计模式、面向对象的继承、final关键字)
- 面向对象葵花宝典:思想、技巧与实践(2) - 面向对象语言发展历史
- matlab面向对象教程【0】初识matlab面向对象
- Java第二课 Java面向对象编程,面向对象编程和面向过程编程的区别,我们如何才能掌握面向对象的编程,类和对象的关系;讲解了Java中的构造、重载、this和super变量、静态变量、Java中的常
- 面向对象之父Alan Kay:预测未来,创造未来
- 尚硅谷第五天课0722班 java-面向对象学习的三条主线-面向对象的思想概述- 类的元素- java类及类的成员-类的成员之方 法
- 什么是对象,为什么要面向对象,怎么才能面向对象?
- 什么是对象,为什么要面向对象,怎么才能面向对象?
- 面向对象第九课,面向对象三大基本特征,继承,Object用法,toString和equals方法
- js面向对象(json对象、继承、面向对象拖拽)
- 程序设计方法概述:从面相对象到面向功能到面向对象
- 面向对象软件构造(第2版)-第2章 面向对象的标准
- C语言中的面向对象-C语言中的面向对象思想
- 面向对象---使用面向对象写函数
- Java基础(五)OOP面向对象之(三) 面向对象思想概述(续)