學Java,觀GP (轉)

gugu99發表於2007-08-15
學Java,觀GP (轉)[@more@]


下筆之時,學Java已經有5天了。用慣了C++,現在看Java,有一種故人之感。Java和
C++有很多相同的地方,也有一些不同的地方。其實,仔細想一下,這些區別並不能夠說明那個更好,主要是兩種語言的設計思路不同,實現的目標不同:C++側重效率,Java注重安全。他們的差異也就由此展開,當然,我寫這篇文章並不是為了說明他們的不同,只不過有感於一件事,記得好像Java聲稱可以支援GP(也許是下一個版本,也許已經實現了,只不過我剛開始學,也沒看到相關的書籍,不太清楚現在的情況),有點疑惑:STL之父曾經為了實現STL,曾經在Java裡面進行了試驗,結果以失敗告終,不知道這次GP引入Java是採用的什麼技術。
用過STL的人都知道,這是C++裡面實現GP的一個典型範例。那麼究竟什麼才是GP呢?GP的實現由那些技術支援呢?
首先我們說Generic 一般這麼定義:Abstract of Genreic Concepts。GP是Generic
Programming的縮寫,意思是:Abstract Of Generic Concepts And The Subsequent Ins
tantiation,也有人說GP就是Programming With Concepts。從這些定義我們可以看出,在GP裡面的Concept居於一個非常重要的地位,那麼什麼是Concept呢?按照《範型程式設計與STL》一書的定義就是:一組“描述某個型別”的條件。你可以把Concept想象成一組型別條件,也可以想象成型別的集合,甚至可以想象成一組合法的程式,無論如何他們在本質上都是相通的。如果我們按照正式規格系統來定義Concept,也許Concept就是:a set of many-sorted algebas,這是嚴格的以數學邏輯來定義的。個人認為GP就是一種思想,思想的核心就是透過靜態的演算法和動態的操作,以緊密的方式,低耦合的特性,來實現程式設計中的型別無關性。
在C++中GP的實現是透過模板+多繼承來實現的,當然更基礎的就是運算子過載。C++中模板透過編譯期間的時間損失來獲取執行效率的提高,同時透過編譯器進行引數傳遞的型別檢測,具有較高的安全性。這也就是為什麼STL之父選擇C++來實現自己的STL的一個很重要的地方,畢竟語言直接支援可以是實現更加方便,也更有效率。
當然,並不是說GP只能在C++裡面實現,GP是一種思想,應該獨立於任何語言的,Java不是也宣稱要加入GP麼?不過C++裡面引入GP的確本身具有很大的優勢,語言本身的特性(模板+多繼承)使得C++具有得天獨厚的優勢:在無損效率的同時具有很高的安全性。
那麼Java透過什麼來支援GP呢?我有點疑惑。Java裡面沒有模板,也沒有多繼承,當然Java裡面的單繼承也許更加有優勢,另外Java裡面有很好的RTTI機制(至少比C++裡面的RTTI功能強多了,也許是C++裡面的實在太弱了)。不過也有一些問題需要考慮,例如Java裡面的基本型別不是物件,單根特性對他們沒有什麼用處,這就比較讓人頭疼。另外單根+RTTI本身不是與法本身實現的,是透過oop的理論+類庫體系來實現的,這看起來也許更加的直觀,但是RTTI執行期的特性毫無疑問會是一個巨大的障礙,如果說Java不在乎效率,更側重安全的話,這一點似乎也無關痛癢,但是RTTI並沒有像C++那樣有編譯器進行型別檢查,相反他繞過了型別檢查機制,欺騙了編譯器,安全性問題浮現出來,這個安全的保證非常不情願的回到了程式設計師的手裡。這是一個讓人非常鬱悶的地方。
也許java有自己的一套方法,那讓我們拭目以待吧。

注:現在據說Java要引入模版,那就和C++差不多了吧:)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-958670/,如需轉載,請註明出處,否則將追究法律責任。

相關文章