以下为译文:
1992年,ACM邀请我为他们举办的第二届“编程语言历史”大会撰写一篇有关我的工作经历的文章。如今,这段历史有多个版本,其中Bret Victor网站上的“Smalltalk的早期历史”(地址:http://worrydream.com/EarlyHistoryOfSmalltalk/)记载了很多细节,有兴趣的人可以去看看。
我需要申明两点:(a)在1966年的工作中,我确实用到了“面向对象的程序设计”这个词;但是,(b)我当时使用这个词的本意是,对我在多个工作经历中的想法的“轮换”和概括,这些工作经历包括:
一开始我是一名生物学家
从1961年开始担任美国空军程序员,当时的工作是编写“语义文件系统”
后来投身B5000计算机的硬件
很长一段时间都在从事“多程序”和“分时”操作系统的工作
最令人惊讶的是从事过Ivan Sutherland的Sketchpad程序
在Simula中度过了一段平淡无奇的时光
最终从事网络计算机(投身研究社区的ARPAnet)
1966年11月某人的一句极其简单的话深深地触动了我:“只要有足够多可以相互通信的计算机,那么就是说任何工作都可以在一台计算机上完成。”这是因为每台计算机都代表了整个网络。
抛开实际的困难不谈(实际上我是一个非常懒惰的数学家,所以我与务实勤奋的程序员八杆子打不着),这个想法非常诱人,因为与传统的过程式和以数据结构为组件的思想相比,面向对象编程的扩展性更好。
而且,这个想法甚至可以从“设计和编程模拟”的角度来思考。有一次在一周内我看到了两个系统:Sketchpad和第一版Simula,这两个系统的目的都是模拟包含许多相互关联的进程的复杂实体,因而产生了这个想法。
认为一切都由“经由消息互相通信的语义软件计算机”构成,这种思想的另一项非常诱人的特性是,“数据”的某些丑陋的属性不仅可以修正,甚至可以完全消除。例如,标准的硬件和紧密映射到硬件上的编程语言可以引出简单数组的概念,但无法产生“数据结构”的概念,因为数据结构更为复杂,如系数矩阵、堆栈、队列等。如果将其视为“进程”,然后内部决定“赋值箭头”的含义,就会更容易一些。
这样就可以引出比“数据”更漂亮的概念,这些概念依然有状态,但没有竞争条件。例如,在对象内部,对象可以在需要时确定历史的版本,可以做“原子事务”,可以在所有关系都是一致的情况下仅允许查看。还有更多特性。这种新的概念远胜于“数据”的概念,它可以让对象随着时间流逝而发展,并“学习”新的东西,但会更安全。
然后还有模拟想法本身,这里“数据”和“状态”的概念开始让位于“有能力的对象”,这些对象可以互相操作,就像生物的细胞或者人类社会那样。
所以,引出这个想法的思维过程基本上就是“系统思维过程”,可以很容易地将定义进程组成的系统,即任何进程构成的任何系统。
这个概念与绝大多数读者熟知的OOP(如C++、Java等语言中的OOP)并不一样。
主要的区别在于视角上。C++和Java语言主要利用对象来定义类似于数据结构的新物体,编程语言本身也是基于数据结构的(如“setter”将任何实体变回一个任何人都可以操作的数据结构)。理论上,这实际上就是“抽象数据结构”,尽管对象的概念也能实现这一点,但这并不是对象的原本目的。
通过我上面的描述,一个优秀的系统设计师就能够设计并实现出优秀的系统,甚至是非常大型的系统也没问题。显然,如果不是经验丰富的设计师,就无法体现出其中的许多好处。
还有一点很重要,这个范式定义的强大和通用性,是与编程风格无关的(这正是“系统的模拟”含义的核心)。
一个对象可以完美地模拟一个函数、过程、数据结构等,所以一切已有的东西都可以完美支持,但对象还可以模拟非常智能的物体,来提供更强大的功能。
然而,问题在于,计算领域内很少有人下功夫理解“进程的广泛使用、可扩展的系统”的含义,大多数人在扩展程序规模时,依然无法摆脱陈旧、腐朽的方式。
在Parc项目中,我们构思了大量的概念,而编写的代码行数非常少,因为我们尽可能使用这种新的方式来组织并实现复杂的系统。(如今,这一思想已有了更深入的理解,但即使是在当年,我们也常常被其强大之处所折服)。
原文:
https://www.quora.com/What-thought-process-would-lead-one-to-invent-object-oriented-programming/answer/Alan-Kay-11
——END——