引子
面向對象,呃,真是一個很有吸引能力的詞匯。只要文章用這個作為標題,就會有點擊率的保證。面向對象模型呢,其實一個蠻難解釋的概念。而且有人還說有范型解釋和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的內部結構啊之類的。
另外一個就是觀察一段時間,對象的構造過程啊,對于成員的存取調用啊,拷貝啊,析構啊等等。
瞎侃完了,具體的內容對于每一種實現的分析,呵呵,還沒影呢。別急,肯定有高手。不過高手都不屑于這種雕蟲小技的實現手法了,呵呵,有時間繼續吧。
面向對象,呃,真是一個很有吸引能力的詞匯。只要文章用這個作為標題,就會有點擊率的保證。面向對象模型呢,其實一個蠻難解釋的概念。而且有人還說有范型解釋和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的內部結構啊之類的。
另外一個就是觀察一段時間,對象的構造過程啊,對于成員的存取調用啊,拷貝啊,析構啊等等。
瞎侃完了,具體的內容對于每一種實現的分析,呵呵,還沒影呢。別急,肯定有高手。不過高手都不屑于這種雕蟲小技的實現手法了,呵呵,有時間繼續吧。
浙公網安備 33010602011771號