首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

0x0b 面向对象诞生的历史

本期节目由我的好友 WillChen 友情剪辑,在此感谢他的付出和对本节目的宝贵建议.

Hello World. 大家好, 我是 pshu. 今天是码农英语课堂的第11期了.

这期和大家聊一下 Object Orientation 发明的历史,因为这段历史有较多的细节,本期就不扯太远了。希望大家喜欢。

双星的陨落

那大家知道面向对象这种编程范式是谁发明的呢?

其实 OO 是两位挪威人联合发明的,他们是Ole-Johan Dahl (简写为 OJD) 和 Kristen Nygaard(简写 KN),这里两位前辈名字的挪威语发音参考了一次 OO 50周年纪念仪式上提到他们时候的读音( https://youtu.be/B1Hvxxv2AEY?t=191 )

2002年,这两位为人相继去世。先是 OJD在 2002年6月29号 去世, KN 还给他写了讣告. 1个多月后, 8月10号 KN 也因为心脏病突发去世. 两个位巨星的陨落是给计算机领域的巨大的损失. 当年很多的计算机期刊杂志都发文来缅怀两位巨星.

为了尽量真实重现当年 OO 发明的历史,本文参考了论文 "the birth of simula" 的第二部分 "a chronological overview" 和 OJD 在去世一年写的论文 "the birth of OO".

这段历史按照时间的顺序,大概可以分成三个阶段:Simula-0,Simlua-1,Somula-67

Simula-0 (1961 - 1962/8月)

KN 在挪威计算级中心(Norwegian Computing Center, NCC)负责一些运筹学方便的研究, 研究的时候会需要通过模拟的方式判断系统的优劣, 但是原先系统模拟的方法 KN 并不满意. KN认为非常需要一种更加高抽象层面的表示方法来描述他研究的系统, KN 在和一位朋友写信谈到这个事情的时候就说, 我的想法是已经有了雏形了,就是想找一个编程高手帮忙实现, 而且人选已经有了.

这里不是"就差一个程序员"的故事, KN 差的是一个比他还厉害的程序员. 因为 KN 在开始这个项目之前已经是挪威计算级中心(NCC) 的研究主任(director of research), 一个计算机中心的主任不会编程, 你能这么想是来搞笑的吧?

Norwegian Defence Research Establishment(NDRE: 挪威国防研究所) 前的胜利纪念碑

这个人选呢就是 KN 前工作单位"挪威国防研究所"(Norwegian Defence Research Establishment, NDRE)的同事, 也就是故事的另外一位主角 OJD. 他们一起在国防研究所工作的时候是完全两个不同的领域, KN 做过核反应堆和作战系统的研究; 而 OJD 主要是从事高级语言的发明. OJD 在2001的论文里面也说了正是以为他们两个人研究领域的不同才能促成 OO 的诞生, 那个时候就有我们现在常说的跨界合作了.

好了两个大牛要一起干事业就想给事业取个好名字, SIMULA (SIMUlation LAnguage). 在这一年多的时间里面两位大牛设计了 Simula 了一些语言的规范(specification), 并且在一次会议上发表了. 大牛做东西就是不一样,东西还没出来就能发论文了什么.

这个阶段也被称为 simula-0; 当时也仅仅是有一个思路,就是做一个 Algol 语言的预处理器. 而为什么要选择 Algol 有三条理由,其中两条是和技术相关, 最后一条原因是 "European patriotism" ['petrɪətɪzəm] - 爱欧洲主义.

这里为什么要说"爱欧洲"呢? 当时计算机领域是美国独大的一个局面. 那个时期四个被公认的对当代计算机语言影响最大的语言: Lisp, Fortran, COBOL, Algol. 只有 Alogl 是欧洲人(主要是德国)发明的, 其他是美帝国主义的. 所以在合理的选择范围内, 选择国(洲)货这个是人之常情哈.

Simula 1 ( 1962 秋 - 1964 三月 - 1965 一月)

KN 忙于非科研工作 (organizational and financial matters), 但是学术牛人不完全是书呆子, 他给 NCC 谈下了打折买了一台大型计算机(UNIVAC 1107) 和项目的资金.

OJD(左一) 和 KN (右一)在UNIVAC 1107计算机前查看 Simula 打印输出

OJD 原先基于预处理的方式来设计一个新语言对他们的项目还是不太现实. 当时他们用一个模拟 station(站点)来处理 customer(客户)的一个例子来 dogfooding 这个新语言的; 也有说法是模拟调度船只在海峡之间调度的例子,其实本质都差不多. 那完全基于 Algol的过程式语言来描述调度系统中的 "station"(主动处理部分) 和 customer(完全被动被处理的数据) 也有非常大的限制.

然而重要的历史时刻就到来了, OJD 突发奇想: 如果把对 station 和 customer 的描述从栈上移出来, 放到一个我们现在称为堆的地方,一切都变得非常的方便. 而且模拟的系统中的实体可以统一成一个概念, 不会像 simula 0中模拟的对象有主动的被动的区分.

就这样语言设计层面引入了一个叫 "process" 的概念, 这个 process 和 pshu 之前的创刊号中的 process 不是一个意思. Simula 的 process 相当于我们现在所说的 object 的概念的雏形.

有了这个想法时候,OJD 就开始紧锣密鼓的实现. 这次实现就是不会实现一个 Algol 语言的预处理器, 而是完全一个新的编译器. 大概用了五个月的时间就实现了历史上第一个有面向对象思想的语言 Simula 1. 之所以能这么快的作出一个全新的编译器, 也得益于 NCC 的其他同事和 UNIAC 1107 这个计算机厂商的 Algol编译器专家的支持.

Simula 67

实现了 Simula 1 之后 KN 和 OJD 就在各种工作中使用, 那使用然后是肯定是爽爽爽啊! 于是他们觉得 Simulua 1 的思想如果应用到日常的编程中也肯定是如虎添翼. 所以他们就开始着手发明一个新的语言能够在通用的场景下使用. 这个想法最终被 Tony Hoare 的论文点燃爆点, 这篇文章题目提出了 class 和 subclass 的概念, 而且还提议了用"点符号"(dot) 来访问对象的成员. 这个就和我现代使用的面向对象的语法非常的类似了. 关于新的面向对象语言的规范的讨论越来越多,于是将新的语言命名为 Simula 67. 因为划时代的年份就是1967年.为了推动 Simula 67发展还是成立了一个叫 SSG 的委员会来讨论语言规范和实现.

至此 Simula 67 基本算是诞生了, 也就是说 object orientation 也正式发明了. 也有一些说法是 1966年就是 OO 诞生的元年. pshu 个人认为的 OO 元年是1964年, 就是 ODJ 那个灵光一现的 aha moment (顿悟时刻), 想到把数据结构挪到堆上的瞬间. 当然咯, 每个人都有各自的看法.

OO 发明的历史就介绍到这,最后祝大家

happy aha!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G0VCT800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券