引子

面向对象,呃,真是一个很有吸引能力的词汇。只要文章用这个作为标题,就会有点击率的保证。面向对象模型呢,其实一个蛮难解释的概念。而且有人还说有范型解释和diagram解释,我是不明白。一般说一个语言提供的面向对象模型,无非就是说对于继承啊,封装啊,多态啊这些实现的一些支持程度的描述。而面向对象模型的实现呢则就是对于这些支持是怎么用机器码构造出来的,怎么用一堆看不见的结构和指针造出了一个概念上的实体的假像。而由于《Inside the c++ object model》和候老师的缘故,曾经一度非常风靡。

观点
面向对象模型的底层实现是非常cutting edage的东西,其实完全没有必要去了解,你也能够活得很好(还有可能看过之后,如见死掉的老鼠,搞得胃口不好)。而且这个东西对于你的OOA和OOD水平都没有什么帮助,还可能搞得你分析大问题的时候分神。不过对于OOP做具体实现的时候,还是能够解决一些面对语法觉得茫然的情况。关于探索面向对象模型实现的价值,候老师已经在他的译本中给了非常好的论述了。大家一定要看看,至少是给候老师面子。
另外一点是对于现代的语言的。现代是相对来说,比如.net中的比如java中的,比如python中的。特别是python这样的面向对象的脚本语言,提供了很好的用其他语言来写模块做扩展和把自身嵌入到其他语言中去的extend/embed的技术,如果你对于其对象模型的实现方法不熟悉,就没有办法去做大的扩展了。所以说为了用底层的东西给高层的语言做扩展,也需要了解一些很机巧的实现方法上的东西。
最后一点好玩的地方是你能够有一些什么都知道的成就感。甚至可以自己用某种奇妙的方法自己实现一遍,比如用MASM中的宏改造一下汇编语言的语法,把class之类的东西加进去。然后告诉别人我用OO的方法写汇编的程序,虽然有些傻傻的,但是还是蛮有噱头的。

有哪些面向对象模型的实现
有多少种面向对象的语言,就有多少实现。另外还有很多再非面向对象语言上加上一些改造的实现版本。c++就是这种做法的典型了,c-front当年就是把c++的源代码进行pre-compile变成C的源代码。其实算是改造C的实验语言了。后人所以评价c++的一些缺点,大凡都会说c++的实验性质限制了很多好东西的引入。
从汇编到动态脚本,中间有很多很多,列举一二给大家参考,高人们请多多补充,我只是把我能够了解的列出来了:
汇编(Thmoas Bleeker和Nan做过一个object.inc包含在masm7.0中了。Tom做过一个Tasm的实现版本。我自己写过一个moop,自我感觉用起来最方便,overhead最少。还有很多人都做过)
C(分为静态和动态的。静态的实现是quantum-leaps.com中的c+,用C的宏实现的。动态的是gtk+中的glib的类型系统gobject)
C++(MFC和QT都可以说是利用单根对C++的对象模型进行了一些改造,而MFC用的是C的宏,而QT用了自己的MOC)
Object Pascal(一定要看看Delphi in a nutshell,不然你不会明白vcl的威力从何而来。还有李维的inside vcl,正在期待呢)
Java
Python
另外还有perl何php之类的动态实现,但是好像不是那么重要。

研究的对象
研究的无非是两大东西。生成的每个object在runtime中的内存呈现及其变化。另外一个是object的type(可能是class,还可能有interface)的信息保存。第二部分有的是在编译期处理了,但是在runtime也有一点表现(比如C++),有的则完全置于runtime中参与reference。分清楚研究是object还是object的type是很重要的,分清楚runtime和compile time也是非常重要的。

研究的方法
一般就两种:给运行中的一个程序做一个时间切片,取出一个时刻来进行分析。然后看objct的内部结构啊之类的。
另外一个就是观察一段时间,对象的构造过程啊,对于成员的存取调用啊,拷贝啊,析构啊等等。

瞎侃完了,具体的内容对于每一种实现的分析,呵呵,还没影呢。别急,肯定有高手。不过高手都不屑于这种雕虫小技的实现手法了,呵呵,有时间继续吧。
posted on 2004-05-25 02:27  taowen  阅读(1114)  评论(0编辑  收藏  举报