2011年4月28日 星期四

7. Scala 的企圖心,也是它的特性 --純 Object Oriented 與不純 Object Oriented

有很多推動 object-oriented 編程的人,如果語言參雜了不是 object 的東西,就會感到渾身不對勁,有人稱他們為「OO 的基本教義派」。

這些人是有他的道理的,因為若不完全 OO,程式邏輯被強迫分成兩半, 一些程式碼使用 OO的方式思考,一些程式碼需要使用資料的方式來思考。而且有些東西不是 object ,需要付出應付非 object 的心力,造成程式複雜性較高。
對於 OO 基本教義派,以上的情況,會讓他們感到不夠乾淨、不夠完整,好像整個思考架構有了缺陷一般。

這種純淨的堅持,導致一些純淨 OO 語言產生,如 Smalltalk 就是這種純淨的OO語言,所有看到的東西,都是 object,沒有例外。

所有東西都是 object,有邏輯一致性的優點,但卻產生效能 (Performance) 的缺點。

原本電腦對於一般的資料運算,本來就有它的格式,所有的數值運算鎮 正執行時,都是使用電腦本身既有的資料格式。

電腦原來支援的資料格式有整數、浮點數、布林等。對於這些原本的資料格式,若把它包裝成object,在執行這些資料的運算時,勢必增加資料與物件轉換額外,最後的結果就是拖慢整體運算的時間。

為要加快這種常見型態的運算速度,有一些 OO 語言選擇直接支援這些常見的資料型態,因此除支援 object外,還支援數值與布林等資料型態。這種 OO 語言就被稱為混合型的 OO 語言,Java 就是這種混合型的 OO 語言。
在Java中,這種原始電腦格式的型態稱為原生型態(Primitive Type)。

對於混合型的 OO 語言,有許多 OO 基本教義派沒辦法接受,認為這種語言簡直就是破壞 OO 的完美,也因此產生 Pure OO 與 Non-Pure OO 多年的爭論。

你有沒有感覺到一件事,就是純 OO 派的這種論述,與之前純函數式語言的論述有點相同。

函數式語言的基本教義派是什麼東西都要是函數與值,所有的東西都要沒有副作用(確保每次函數執行都會得到同一個值),若是參雜了一些命令式的東西,有人也會渾身不舒服,覺得思考架構產生缺陷。

為甚相同的感覺重複出現呢?難道這就是純潔的追求嗎?還是只是文人相輕呢?

純 Object Oriented 與不純 Object Oriented 是 OO 語言延續多年的一個大論戰,各有支持者。
那 Scala 的設計者怎麼說呢?我想,你應該知道標準答案吧!為了要支援各種應用(還是,更正確的說,要吸引各種應用的使用者),所以 Scala 兩種都支援!

「別傻了,這種問題哪裡可以兩種都支援?!」

嗯,確實是兩種都支援,只是取巧了點,也讓 compiler 辛苦了點。
怎麼說呢,在 Scala 語言中, 支援的是純 OO,所以每個東西都是 object(純 OO 的支持者,到此,可以放心了),但對於有原生型態的資料類別,會採取特別的方式。
在 compile 階段,若看到原生型態的資料類別,會直接生成 primitive 資料,而不是擴展成object,這就是它支援 pure-OO 但有混合型 OO 效能的方式。

你有沒有發覺,Scala的手法很一致,在爭論的兩造,都是以支援嚴格的為主,但容納另一方的優點。
Static typed 與 dynamic typed 是這樣處理,pure-OO 與 Non pure-OO 也是這樣處理。這樣,它可以爭取到兩方的支持者。

沒有留言:

張貼留言