面向对象的陈年旧事

*作者:JK ZHAN,本文首发于微信公众号“IC Talking”(ID:HelloICTalking),芯片技术文章分享平台。

 

面向对象编程(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.

[4] https://twobithistory.org/2019/01/31/simula.html

[5] https://openclassrooms.com/en/courses/4542221-deepen-your-knowledge-by-learning-object-oriented-programming-oop-with-swift/4661386-know-the-origins-of-oop

[6] https://wiki.c2.com/?AlanKayOnMessaging

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值