|
最近常有一種說法,就是我們?nèi)缃衩媾R著另外一場編程模型的變革,面向?qū)ο蠹夹g(shù)已經(jīng)處在被淘汰的邊緣,函數(shù)式語言會取代面向?qū)ο蠹夹g(shù)成為主流方式,甚至出現(xiàn)了面向?qū)ο笠阉赖难哉摗W鳛橐粋€硬核函數(shù)語言的狂熱者,我個人當然希望函數(shù)式語言可以一統(tǒng)天下,成為主流之選。但是不是應該把對象技術(shù)和函數(shù)技術(shù)對立起來,說式后者取前者而代之,我個人認為,這和如何看待面向?qū)ο蠹夹g(shù)有關(guān)。
做為工程實踐的對象技術(shù)
在這個年代,大家有一種神圣化面向?qū)ο蠹夹g(shù)的傾向,很多人都把對象技術(shù)奉為高深的思想和理論。但實際上,面向?qū)ο蠹夹g(shù)僅僅一種工程實踐而已,它是依托于其他技術(shù)而存在的一種實踐,本身并不是一種完備的計算模型。
在計算機科學發(fā)展的早期,對于計算機的非數(shù)值計算應用的討論,以及對于可計算性問題的研究和發(fā)展,大抵確立了幾種的計算模型:遞歸函數(shù)類、圖靈機、Lambda演算、Horn子句、Post系統(tǒng)等等。其中遞歸函數(shù)類是可計算性問題的數(shù)學解釋;Horn子句是prolog這類邏輯語言的理論基礎;lambda演算成為了函數(shù)式語言的理論基礎;圖靈機是圖靈解決可計算問題的時候所設計的裝置,其后成為計算機的裝置模型,與圖靈機相關(guān)的自動機以及馮諾依曼結(jié)構(gòu),成為了命令式語言的理論基礎。
因此當我們談及函數(shù)語言和命令式語言優(yōu)劣的時候,我們實際上是在討論其背后的計算模型——也就是lambda演算和馮結(jié)構(gòu)裝置操作——在執(zhí)行效率和抽象層次上的優(yōu)劣。
而面向?qū)ο蠹夹g(shù)則比較尷尬了,其背后沒有一個對應的計算模型(80年代的時候曾有人研究過,Pi演算是個備選,但是這個模型更多的是在并發(fā)對象領域的語義,而不是通常意義上的計算模型)。它有點類似于“最佳實踐”,在不同的計算模型上有著完全不同實現(xiàn)方式和含義。因此對比對象技術(shù)和其他技術(shù)的時候,搞清楚到底是哪一種面向?qū)ο缶妥兊酶裢庵匾饋怼?/p>
兩種不同的面向?qū)ο?/h2>
目前流行的對象技術(shù),實際上有兩個截然不同的源頭。它們分別在兩個完全不同的計算模型上發(fā)展起來,但是都頂著“面向?qū)ο?rdquo;這個帽子。
第一種對象技術(shù)出現(xiàn)的較晚,在1979年以后。它是以抽象數(shù)據(jù)類型(ADT,Abstract Data Type)為源起,發(fā)展出來的面向?qū)ο蠹夹g(shù)。也就是首先被C++所采用的面向?qū)ο蠹夹g(shù)。
C++作為“更好的C”,繼承了C語言對于程序的看法,也就是數(shù)據(jù)抽象(Data Abstraction)和過程。面向?qū)ο蠹夹g(shù)在C++中,是作為一種更好的數(shù)據(jù)抽象的方式而存在的。
數(shù)據(jù)抽象在這類面向?qū)ο笳Z言中是一種關(guān)鍵的抽象方式。所謂數(shù)據(jù)抽象,在計算機發(fā)展的早期是一種非常關(guān)鍵的技術(shù)。眾所周知,計算機在裝置模型上是一個存儲和一組指令集,而二進制的存儲實際上是沒有任何類型表示的。整數(shù),浮點這些操作必須通過相應的約定,再以指令集的形式進行支持。而隨著計算機的發(fā)展,簡單的數(shù)據(jù)類型顯然已經(jīng)不能滿足應用的需要。這時候一種靈活且有效的類型系統(tǒng),就成了一種自然的追求(直到80年代初,類型系統(tǒng)都是計算機科學研究的重要方向之一)。
在C++中(以及后來的Java和C#),對象是一種構(gòu)造數(shù)據(jù)類型的方式,把每個“類”看作一段存儲(狀態(tài))和操作(方法)的集合。“類”作為已經(jīng)存在的類型系統(tǒng)的一種擴展(這一點在C++中體現(xiàn)得尤其強烈)。在這類語言中,“類”(class)實際上代替了“對象”(object)成為了頭等公民。構(gòu)造一個更好的類型系統(tǒng),是這種面向?qū)ο蠹夹g(shù)所要解決的問題。與其說是面向?qū)ο螅蝗缯f是面向類或面向類型的。
從計算語義上說,這類對象技術(shù)仍然是裝置的操作語義,和面向過程的沒有實質(zhì)上的區(qū)別。唯一的不同是,被這種對象語言操作的機器,可以借由對象技術(shù)擴展機器所支持的類型。這種面向?qū)ο蠹夹g(shù)是過程技術(shù)的一種發(fā)展,雖然在抽象層次上沒有什么太大的提高,但在實踐上已經(jīng)是巨大的進步。
另一種對象技術(shù)出現(xiàn)的很早,大概在60年代末就出現(xiàn)了,直到80年代初還有發(fā)展。但是很長一段時間內(nèi)并不是太主流的做法,反而并不太為人所知。
在函數(shù)式語言里,因為高階函數(shù)(High Order Function)的存在,數(shù)據(jù)可由函數(shù)來表達。這就是函數(shù)語言里一個非常重要的觀點:Data as Procedure。在函數(shù)語言中,可以構(gòu)造一種非常類似于對象的高階函數(shù):
(define (make-user name age sex)
(define (dispatch message)
(cond ((eq? message 'getName) name)
((eq? message 'getAge) age)
((eq? message 'getSex) sex))
(else (error 'messageNotUnderstand))))
dispatch)
(define vincent (make-user 'Vincent 30 'Male))
(vincent 'getName)
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。