有幸在InfoQ的飯局里面認識了王翔,他對.Net和MS技術的確有非常深的造詣。今天看到他的一篇評論:
“C#正變得越來越臃腫”發表了一些感想:
先進與成熟的確是矛盾,但是現在的新技術成熟的都比較快,可能是人接受新事物的速度提高了吧。
Haskell這樣的語言是函數式編程的代表,更多的需要從頭開始。所以國外學計算機理論首選Haskell,很多老外抱怨過上學的時候這個東西學的頭疼,但是后來他們也都表示獲益匪淺。我們的計算機教育是本末倒置,所以我們這些程序員覺得他們晦澀難懂。但是看到Erlang這樣的語言,在未來多核環境下的前途,我們還是會動搖的。
LINQ的確不錯,但是又是M$一言堂。統一數據訪問模型是非常好的想法,MS總能后發制人,但是閉門造車很容易被人家超過?,F在我們看到LINQ很先進,但是等MS的講師把它推到實踐的第一線的時候,別的開發平臺也會有類似的產品出現了。而且,根據標準,查詢XML用JQuery,在各種語言里面查詢關系數據庫也都有眾多ORM實現。所以LINQ的想法雖然很好,但是對于其他語言/平臺來說卻沒有非常迫切的需求去實現類似的技術。
關于修改Java JVM的話題不是最緊才有的,下一步會怎樣很難說。CLS這個技術不足為奇,其實虛擬機本身就是平臺/語言無關的東西,我們已經看到了JRuby、XRuby、Jython和現在的Java Script Engine這樣的東西,Java已經在平臺化了,這個大家都不會放慢腳步。
關于C#和Java的痼疾,我推薦Bruce Tate的《超越Java》,里面的觀點同樣適用于C#。
他的原文引用如下:
C# 2.0發布的時候,我們回頭看Java,總認為這個語言怎么發展得這么慢?但當C#發展到3.0的時候,它也開始顯示出臃腫之態了,這是否會也會帶來什么連鎖效應呢?
6年前,我是個Java的擁護者,當時C#還是1.0版,我經常和師傅爭論Java如何比C#好,于是他給我一個回答:“我們的COM比Java早
了近5年,所以我們更成熟;我們的.NET比Java晚了5年,所以更先進”。雖然這么比較有“偷換概念”的感覺,但現在想想其實有另一層意思——“成熟
與先進”的矛盾。
Lisp、Haskell、Scheme這些語言也都可以被稱之為“偉大”,但為什么很少有人去學呢?因為需要用太多的東西“充斥”我們的大腦后才
可以使用。Java和C#之所以可以快速地被普遍接受,一個很重要的原因就是因為它們的簡單與清爽。但當明年春天C#
3.0發布的時候會怎么樣呢?雖然你可以將WCF、WF、WCS和WPF視為.NET的外掛,不予理會,但LINQ是個不好回避的內容,因為它在處理數據
訪問(關系型的、非關系型的)方面有比較明顯的優勢,所以即便你個人排斥它,其他還是會有很多人用。最后很可能成為這樣一種局面:參與到一個項目組,自己
只能從事一些表層業務開發,因為下層的公共封裝機制都是用LINQ編寫的,況且還有Enterprise Library這個“樣板工程”在后面催著。
可以這么說,C#越來越臃腫是個必然的趨勢,作為.NET語言的“主力”,隨著新的開發架構的出現,C#的復雜性還會增加,同時很可能導致革新特性越出越慢,畢竟牽扯的內容多了,作為“主力”除了要考慮語言特性間的協作外,還要充分考慮處理效率。
不過比起“一條道跑到黑”的Java而言,.NET平臺有個優勢——CLS(Common Language
Specification,公共語言規范)。相信Java的設計者不太愿意,也不敢隨便為了一個“快速走紅”但還沒有2年時間市場考驗的技術趨勢就去修
改Java編譯器;.NET不同,“C#紅旗不倒的同時,.NET平臺可以彩旗飄飄”,比如Spec#就是個例子,為了避免null對于軟件的影響,.
NET家族誕生了Spec#,目的就是通過非null這個前提,提高數據驗證、異常處理、堆棧管理的能力,利于開發者提供更高質量的軟件;F#也是,雖然C#是強類型的,但動態語言式的開發一樣可以基于這個“小兄弟”開發,加上它和其他.NET語言前輩基于同一個CLR環境,所以功能毫不遜色。
綜上所述,C#臃腫是不可避免的,而且很可能會像Visual
C++一樣,因為語言的復雜性,導致C#開發人員技術能力的兩極分化。但同時,借助試驗性.NET語言的支持,即便需要集成新的特性,也不會像某些語言一
樣從頭開始。依靠試驗性語言的積累,相信從MSDN中查看C#這些新語法的時候,可以少見一些標著“[Obsolete]”的內容。