2001年,美国计算机学会(ACM)将代表计算机界最高奖的图灵奖颁发给了两位挪威计算机科学家,一位是Ole-Johan Dahl,另一位是Kristen Nygaard,以表彰他们“通过设计编程语言Simula 1和Simula 67,创造了面向对象编程的基本概念”这一伟大成就。
上世纪60年代,Simula语言从诞生之初,就具备了现在大部分面向对象语言所具备的功能,包括但不限于类、继承、动态绑定、垃圾回收等功能。虽然那个时候还没有“面向对象”这个名称,但是在这个名称出现之前,面向对象的概念已经存在了。
让我们看看当年面向对象语言是如何发展而来的吧。
面向对象发明人
1952年,二战结束不久,挪威政府决定成立一个叫NCC(Norwegian Computing Centre)的组织,把全国零散的计算机资源整合起来。说起来容易,做起来难,因为这些计算机资源都分散在全国各个部门,比如有的在NDRE(Norwegian Defence Research Establishment)这样的军方部门,有的在奥斯陆这样的大学,还有的在工业界。之前的挪威,还没有一个组织可以协调所有的部门,NCC为此而成立。
二战期间,大部分国家都知道了计算机的威力,挪威也不例外。毕竟挪威是在二战中与纳粹德国抗争时间坚持第二长的欧洲国家,仅次于苏联。战后,1954年,他们研发了第一台计算机,名字叫NUSSE(Numerical Universal Automatic Sequential Electronic Computer),这是一台真空管计算机。该真空管计算机制作完成以后,就被运到了上面所说的新成立的NCC里。
NCC刚成立的几年,除了这台NUSSE真空管计算机,没有其它的计算机。拥有最多计算机资源的是挪威军方NDRE,当时硝烟未散,军方优先拥有最多的计算机资源。而且挪威军方想要制造自己的核反应堆,也没有多余的计算机给别的部门。
军方要增加自己的计算机资源,就从英国的Ferranti公司买一台名为 Mercury的电脑。该项目的负责人叫Jan Garwick,之前在奥斯陆大学当教授,他招了两个人来当助手。
其中一个助手是1952年加入的新兵,他就是Ole-Johan Dahl,他的任务是给Mercury电脑写一个编译器,这个编译器叫MAC(Mercury Automatic Coding)。
另一个助手也是个士兵,是1948年入伍的Kristen Nygaard,他被安排了另外一个项目,该项目是研究一个开放性的问题:如果有一天挪威要制造核武器了,应该如何提前模拟核武器的爆炸威力?
Kristen Nygaard以模拟核武器为题写了一篇名为《Theoretical Aspects of Monte Carlo Methods》的论文,随后在军方成了专职的核武器研究员。虽然他的专职工作是研究核武器,但是他兴趣广泛,他的研究范围从单纯的核武器扩大到世间万物,尤其是人力资源方面,他想知道人能不能也用计算机来建模呢?
他希望他的方法可以管理社会的组成单位:人。他想通过计算机模拟,使用统计学的方法来解决工作效率不高的问题。通过计算机来模拟现实世界,这样想法听起来非常的诱人,尤其引起了苏联的注意,当时苏联是计划体制,如果人也可以被计算被管理,那就再好不过了。
这是一种将社会工程学和管理学相结合的产物,Kristen Nygaard研究人的行为并加以预测和控制。苏联十分热衷,一直跟进他的研究,一旦有成果,苏联就把成果在自己的乌拉尔大型机上实现出来。
后来Kristen Nygaard与军方发生了一些摩擦,他于1960年离开军方并加入前文提到的NCC。相比于军方,NCC更多倾向于民用研究,在这里,他有更大的空间可以自由的发挥。在此,他的兴趣有所转变,他思考能不能将他在军用领域所做的工作转化为民用领域?
一封当时保留下来的信如实记录了当时的情况,1962年,Kristen Nygaard给法国计算机科学家Charles Salzmann写了一封信,在信中他透露说他已经有了完整的模拟现实世界的概念,还没动手写语言的编译器,他想等语言先设计好了再动手做这个工作。在信中,他还透露,他认识一位写程序的天才,两人都对这个想法很乐观。在这封信里他提到的那位天才就是他未来的合作伙伴Ole-Johan Dahl。
这两个年轻人在1962年终于开始共同工作了。
Simula的研究成果
1963年,两人开始研究并实现这个创意,两年后,于1965年完成第一阶段工作。这个阶段的成果在当时被称为Simula,为了区分,后被约定俗成称之为Simula I。
随后的两年,两人继续研究,于1967年发表了第二版本的语言,也就是后来的Simula 67,Simula 67已经有了面向对象的雏形,几个与面向对象相关的概念已经被提出。我们看看这几个重要的概念吧。
错误检查
由于Simula语言最初研究的是核爆炸,安全性显得特别重要,与其它同期的语言不同,Simula格外重视安全,毕竟核爆炸可不是只让电脑死机那么简单了。Simula在设计之初对错误十分重视,Simula设计了两种错误检查,一种是编译时检查,一种是运行时检查。
现在我们把这种机制叫做类型安全(type safety)。
类型安全确保代码不会对底层对象执行任何无效操作,它确保任何变量访问只能以明确定义和允许的方式访问其授权的内存位置。由于不同的编程语言对程序员思维的影响,在讲到类型安全的时候,不同程序员对这个概念的理解有些出入,因此讲出来的意义也就十分的宽泛。
在Java中,类型安全不仅是对一个A类型的变量赋值了一个B类型的值,更多的是考虑到类的层面,比如每个对象创建后都要初始化,外部对类的访问要受相关的限制,对象抛出异常之前要先将自身重置到合法状态等等。类型安全的思想贯穿于整个编程中,而不仅仅在变量赋值这种技术细节。
不止Java借鉴了Simula的错误检查,目前像Haskell语言中的inspect方法或多或少都是从这里学来的。
继承
Ole-Johan Dahl曾经这样写过:“增量的抽象,对已经抽象过可以加上一个前缀C,只要有这个前缀C,就可以使用其所有的属性。这就是继承的雏形,虽然还没有正式叫继承。”
其实对任何语言来说,都可以复用代码,至少可以通过简单的“复制粘贴”来完成代码的重复使用,但是这样复用的代码并不优美,而且还很难维护。
如果能够直接使用别人已经完成的代码,或者自己先前抽象好的代码,而不是自己再重新开始,那么将会有效的降低工作量。Simula语言在这个方面进行了探索。
Java也借鉴了这个思路,Java围绕类的概念做了很多工作,其中最重要的概念之一就是:“继承”。望文生义,继承的表面意思就是从“长辈”那里得来一些东西,在Java中,基本也是这样的,采用已有的类,无需改动这些类,就能获得相应的功能,这种方式在Java中也叫“继承”。
内存回收机制
Ole-Johan Dahl和C.A.R. Hoare合作写过一篇论文《Hierarchical Program Structures》,在这篇论文中,他们介绍了当时的想法:“在实现Simula的时候,借鉴了Algol 60这个编程语言的实现方法,并且对Algol 60的block进行了必要的改进,将block视为数据,其它的程序可以使用这些block,这后来演化成了类的使用方法。”
Simula语言的两位作者写的《The Development of the Simula Language》里,也提到了这一点:“改进了存储机制,引入了内存垃圾回收机制。也许很多语言都意识到了Algol block的威力,但是第一个意识到并且做出垃圾回收的语言是Simula,这在当时是一件了不起的创举。虽然内存垃圾回收很难,还有可能对语言的运行速度产生影响,但是为了以后程序员的方便,这点性能缺失不算什么。Simula还独创了一种名为二维空闲列表的方式来负责内存垃圾回收。”
在计算机科学中,内存泄漏(Memory leak)是一种常见的bug,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被泄露掉从而导致全部或部分设备停止正常工作,最终导致应用程序崩溃。
现在主流的编程语言如Java就提供了内存回收机制,这对保证软件的可靠性和安全性非常有好处。如果大家有C/C++编程经验的话,很可能为了一个内存泄露花费数小时甚至数周来查找。有了内存回收机制以后,将节省大量的编程与调试时间。
动态绑定
Simula开创性的使用了动态绑定技术,虽然当时的名字不叫dynamic binding,而是叫virtual。
刚开始的时候,Simula所有的属性都是静态的。Ole-Johan Dahl是在最后一分钟才决定做成动态的,如果对属性定义为virtual,那么就可以动态绑定了。后来的语言如Smalltalk更纯粹,直接把所有的属性和方法都定义为virtual,在C++中也用相同的关键字virtual。
Java语言同样借鉴了Simula语言,在默认情况下是可以动态绑定的,如果使用了final这个关键字,就是静态绑定从而阻止被覆盖。
小结
如果用Peter Wegner在1987年对对面向对象下的定义:object-oriented = objects + classes + inheritance来衡量的话,至此,面向对象最重要的几个要素在Simula语言中都已经有了雏形。
Peter WegnerPeter Wegner是一位出生于1932年的英国科学家,对面向对象编程有很大的贡献。在1999年,他被奥地利授予奥地利科学与艺术荣誉奖,在去伦敦领奖的路上,出了车祸,昏迷了好久之后才苏醒,但是有了严重的后遗症。 |
如果只有技术,没有推广,Simula可能仍然会像世界上绝大部分的编程语言一样无闻。著名的科技史作家、宾夕法尼亚大学历史学教授Thomas Parker Hughes在爱迪生的传记《Networks of Power: Electrification in Western Society》里这样评价:“像爱迪生这样伟大的发明家有这样的特征,为了达成目标,他们不仅有超越普通人和科学家的认知,还能够综合利用自己的社会关系,政治资源,商业手段。”
强有力的推广自己的产品或理念是一种优秀的品质,这种品质在Simula两位创始人身上体现的也很明显,两位创始人不仅可以埋头搞科研,还和爱迪生一样,是政治和商业上的天才。他们不仅有雄心壮志,同样也有政治动员能力、商业运作水平,这两位创始人靠着自己无与伦比的谈判技巧和推广能力,把Simula语言从挪威推广到了整个英国、法国、美国、苏联,最后影响了全世界。
我还是希望大家能学到比编程更多的东西。要记住,酒香也怕巷子深。能够把一门编程语言推广起来,可不是一件容易的事情。当你写出一款优秀的软件,或者创造了一个编程语言,只是成功走完了第一步。如何推广软件或者语言,让别人用你的软件或者语言,是更重要也是更困难的一步。接下来学习一下Kristen Nygaard和Ole-Johan Dahl是如何推广Simula的吧。
推广Simula
挪威不是计算机强国,如果要推广自己的Simula语言,就要先在计算机上运行。在当时,计算机是非常昂贵的,NCC有意从英国购买KDF-9这台大型计算机,但是这台计算机的价格实在太贵了,远远超出了NCC的预算。当时美国已经制造出了UNIVAC这样一台机器,NCC想购买这台电脑。
Kristen Nygaard表现出了天才般的谈判技巧,他找到了UNIVAC在欧洲的负责人James W. Nickitas,经过了一次谈判,他说服了对方,对方同意把UNIVAC打5折。还敲定了下一次会谈,要和UNIVAC软件的灵魂人物Robert Bemer——前IBM计算机的核心之一——坐下来谈谈软件和编程语言的事情。
UNIVAC的软件核心Robert Bemer在和Kristen Nygaard谈过以后,UNIVAC不仅可以以半价卖给NCC,而且还给Simula项目带来了一笔赞助,还有,Kristen Nygaard成了北欧UNIVAC的销售代理。这样的谈判水平,已经可以说是高手中的高手了。
这种谈判并不是只发生了一次,在Kristen Nygaard推广Simula的时候,这种事情屡次上演,他总是能把最难谈的谈判像谈天一样搞定,很快Simula就可以在UNIVAC,IBM360/370, CDC 6000, DEC System-10等一系列当时主流的机器上运行了。
Kristen Nygaard不仅对编程和计算机有兴趣,他一生还投入了大量精力去做政治运动,始终站在劳动者一边,争取劳动者的权力。
Simula影响了工业界和学术界,也培养出了一大批Simula的拥趸,比如Smalltalk的作者Alan Kay,C++的作者Bjarne Stroustrup都曾声称自己的语言深受Simula的影响。
“Kristen Nygaard不仅对编程和计算机有兴趣,他一生还投入了大量精力去做政治运动,始终站在劳动者一边,争取劳动者的权力。”
学习!
编译检查,运行时异常
太有Java味道了