面向对象的陈年旧事

本文首发于微信公众号“芯片学堂”,作者JKZHAN

面向对象编程(Object-oriented programming, OOP)是一种成熟的计算机编程模型。在这种模型下,软件设计是围绕数据或者对象而不是功能逻辑来组织的。面向对象编程模型在现代软件开发中发挥着巨大的作用,比如代码可重用性、可伸缩性和开发效率等等。相信很多读者对面向对象早有耳闻,且在学习和了解面向对象的过程中,可能听过那些猫猫狗狗,或者拿着蓝图修房子,或者拿着图纸造汽车的故事。这些故事的目的是为了帮助大家理解抽象,然后建立对面向对象的感性认识。也有很多书籍和文章会总结和介绍面向对象抽象、封装、继承和多态这四种特性。

而本文要讲的面向对象的陈年旧事,不是再造这些用于学习的轮子,而是分享面向对象的真实往事,尝试理解面向对象的真谛~

01 旧事

面向对象的编程思想,跟Ole-Johan Dahl和Kristen Nygaard两位科学家在Simula语言设计上的开拓性工作是密不可分的。Simula语言的发明需要追溯到上个世纪中期。1948年,年轻的Nygaard应征加入挪威国防研究机构(Norwegian Defence Research Establishment),开始挪威第一座核反应堆计算相关的研究工作。Nygaard先后投身传统数值方法、蒙特卡洛模拟方法以及运筹学的研究。1960年,Nygaard才加入挪威计算中心,这是一家于1958年成立的半政府研究机构。在此期间,Nygaard意识到在面对工程问题时仿真的必要性,同时需要能用于描述系统的概念和语言,以及可以生成仿真程序的工具。于是,在1961年,他为了解决这些问题开始着手设计一种仿真语言(simulation language),主要用于离散事件的仿真(discrete event simulation)。差不多在同个年代,在1961年至1962年间,美国计算机科学家Ivan Edward Sutherland实现了允许绘图的应用程序,即SketchPad。该开创性的应用可以说是现代CAD(计算机辅助设计)工具的鼻祖,设计人员可以使用手写笔通过计算机绘制简单的几何图形。同时,它也可以说是面向对象编程的奠基典范。图像界面的开发天然地应用到了“属性-操作”这一关系来描述几何图形,这种关系对于设计人员来说也是很好理解的。Sutherland的这些项目算是OOP思想的早期灵感,它们影响到了下面会将介绍的Simula 67编程语言的发展。

1965年,Nygaard和另一位挪威科学家Dahl共同设计了Simula语言和编译器。Simula是基于ALGOL的过程描述和仿真语言。至于为什么要选择ALGOL,Dahl在其后来发表的文献中有提到,主要考虑到ALGOL具备了块结构、编程安全和欧洲爱国主义。这个时候的Simula还没有类和继承这些现在我们熟悉的面向对象概念。Nygaard和Dahl在其发表于第一届编程语言历史会议(History of Programming Languages Conference)的文章中正式将该语言命名为Simula I。该语言尝试了有关如何将数据和过程捆绑在一起的想法。

同在1965年,英国科学家C.A.R. Hoare在其发表的文章《RECORD HANDLING》中提出了record class等概念。record class跟现在C语言中的结构体很像,它将有关联的成员变量封装在同一个record class里面。可以看得出来,这样一个看起来简单的概念已经包含了将具象对象抽象化成类来进行描述的思想。后来在Vilard-de-Lans暑期学校交流期间,Hoare将他的record class概念介绍给了Nygaard和Dahl,包括子类的概念。

此后,Nygaard和Dahl带着他们的新思想,选用"class"、"object"和例化的概念,融入到了新的Simula语言中,将Simula完善成通用的程序语言,并于1967年发表出来,即Simula 67。Simula 67带来了类、类层次结构和虚拟方法等技术。Simula 67后来也被广泛认为是第一个包含有面向对象思想的编程语言。不过我们不可否认,Hoare和Sutherland都是面向对象起源的关键人物。在这之后,有不少供应商开发了Simula 67的编译器,并且成立了Simula用户协会(Association of Simula Users)负责每年的修订会议。Simula 67也在全球范围内流传开来。

02 发展

1967年,Xerox's Palo Alto研究中心的Alan Kay正式提出了“面向对象程序设计”一词。并于1969年,Alan Kay与其学习研究小组的其他成员共同开发了Smalltalk语言,该语言的灵感或来自Simula。但Smalltalk可以说是比Simula更加的面向对象,“万物皆对象(everything is an object)”这句话一开始就是用来形容Smalltalk语言的。1979年,Bjarne Stroustrup开始从事带有类的C语言的工作,这可以说是C++的前身。1988年,商业C++编译器问世。1989年,第二版C++的发布使得该编程语言成为软件开发的主流。1991年,James Gosling等人启动了Java语言项目。Java是一种基于类和面向对象的通用计算机编程语言。尽管到现在,ALGOL和Smalltalk这些语言逐渐消失在编程历史舞台,但OOP的思想和技术,仍在C++/Java等现代编程语言开发中大放异彩。直到现在,OOP相关的编程技术越来越多,虚拟方法/类、多重继承、设计模式等等。

除了面向对象编程,函数式编程也是一种应用广泛和高效的编程模型。其区别在于,面向对象中数据是存放在对象的成员或者静态成员中;而函数式编程的数据是存在闭包中的。面向对象编程中对数据和方法的访问是通过对象作为句柄来引用,而函数式编程中对数据的访问是直接访问(包括作用域链)。比如使用Chisel来做硬件开发,使用灵活的函数式编程技巧,可以像写英文句子一样来描述功能。但函数式编程不是SV所擅长的,本文就不再多说了。

03 后记

在我收集关于面向对象的资料的过程中,看到了很多探讨面向对象本质的文章,包括以上提到的科学家们自己在当初开发编程语言时候的一些想法,甚至有探讨哲学问题的文章。不禁让从事芯片开发的我惊叹软件开发的思想和乐趣。Alan Kay在1998年的一封邮件里说:

I'm sorry that I long ago coined the term "objects" for this topic because it gets many people to focus on the lesser idea. The big idea is "messaging" - that is what the kernal of Smalltalk/Squeak is all about.

放到芯片验证的框架里,组件间和线程间的通信、交互和同步,也真是一个big idea呀。

参考文献

[1] Dahl, Ole-Johan. "The birth of object orientation: the simula languages." From object-orientation to formal methods. Springer, Berlin, Heidelberg, 2004. 15-25.
[2 ]Hoare, C. "Record handling." Algol Bulletin 21 (1965): 39-69.
[3] Dahl, Ole-Johan, and Kristen Nygaard. "SIMULA: an ALGOL-based simulation language." Communications of the ACM 9.9 (1966): 671-678
[4] Black, Andrew P. "Object-oriented programming: Some history, and challenges for the next fifty years." Information and Computation 231 (2013): 3-20.
[5] https://twobithistory.org/2019/01/31/simula.html
[6] https://openclassrooms.com/en/courses/4542221-deepen-your-knowledge-by-learning-object-oriented-programming-oop-with-swift/4661386-know-the-origins-of-oop
[7] https://wiki.c2.com/?AlanKayOnMessaging

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容