C#誕生之日起關於C#與Java之間的論戰便此起彼伏至今不辍拋卻Microsoft與Sun之間的恩怨與口角客觀地從技術上講C#與Java都是對傳統面向對象程序設計在組件化軟件時代的革新之果可謂殊途同歸雖說兩個語言有著%的重疊但那另外%的較量也往往能夠左右一個天平的方向本文將攜%之共論%之異對兩個語言做純技術品評文章不涉及兩個語言的公司市場等台面後的事情雖然這往往也會影響人們對編程語言的選擇也不預備得出誰是誰的Killer讀者應該選擇誰的問題語言選擇乃藝術而非技術問題業界早有定論無需多言
C#和Java都提出了對傳統C++艱深晦澀的語法語義的現代改良在語法方面兩者都擯棄了C++中函數及其參數的const修飾宏代換全局變量和全局函數等許多華而不實的地方在繼承方面兩者都采用了更易於理解和建構的單根繼承和多接口實現的方案在源代碼組織方面都提出了聲明與實現於一體的更好的邏輯封裝在類型系統方面兩個語言都在中間語言IL或字節代碼的基礎上提出了映射(Reflection)這樣的概念徹底革新了傳統C++運行時類型鑒別的問題但在大刀闊斧地對C++進行改革的同時C#顯得更為保守它對很多原來C++中很好的性質予以了保留如基於棧分配的輕量級的結構類型枚舉類型引用(ref)輸出(out)數組(params)修飾的參數傳遞方式等這些在Java中都被很可惜地丟掉了在基本類型和單根繼承的對象之間的類型統一方面C#提出的box/unbox要比Java的包裝類顯得高明效率也要好
對C++不安全的指針及內存分配方式C#和Java都提出了托管執行環境效率問題是托管執行環境一直以來令人诟病的地方Java虛擬機(JVM)的解釋執行方式曾經讓很多開發者慢的不可忍受C#的JIT編譯方式為C#在這塊戰場上贏得贊聲一片某些C#托管代碼甚至比傳統C++代碼都快雖然現在各廠商實現的Java平台也都一致地采取了JIT編譯方式但C#在這方面的比較優勢非常明顯C#的目標編譯語言IL從設計初始就把效率擺在了重要的地位而Java的字節代碼的設計卻有些魯莽托管執行環境經過幾年的實踐在現代軟件界已經達成了共識效率的犧牲換來的是高度安全的代碼當然前提是犧牲的效率必須足夠的小至少可以忍受值得指出的是在這裡C#同樣念念不忘老一輩C++程序員C#允許我們在unsafe上下文中進行指針操作數組的索引越界檢查類型安全在C#和Java中都被提到了相當的高度在異常處理方面不管從內置支持還是從執行效率來講C#都較Java略勝一籌
一次編程多處執行是程序設計一直以來的一個訴求尤其是在現代互聯網絡時代在跨平台方面Java的支持和實現都是為人稱道的雖然JVM的速度仍然讓人備感頭疼而C#雖然在底層構造方面對移植性進行了充分的考慮但至少目前還沒有成熟的經過檢驗的產品C#在跨平台方面似乎更熱衷於XML Web Services互操作而不是跨平台編程但C#通過其基礎語言構造(CLI)對二十多種主流語言的對象級的互操作支持又極大地提升了C#的技術地位和COM組件廉價地互操作也為C#掙到不少分數保持一個兼容的體系對現代軟件工業非常重要也是對廣大開發人員負責任的表現
面向組件無疑是當代軟件開發的主流C#對組件編程甚至到了迷戀的地步這與年前就出道的Java不可同日而語當然這是時代問題C#通過屬性索引器委派事件操作符重載特征版本等實現了其對組件編程的第一手的支持雖然這些在Java中都可以通過方法接口或者適配器來間接地實現但軟件業的歷史告訴我們這無論對編程效率或者邏輯設計都是一種極大的損傷高級語言首先面對的是人而不是機器除去這些語言層面的組件支持機制NET平台也為組件的配置運行管理等提供了一攬子解決方案而為組件開發量身定做的Visual StudioNET更是令人興奮這都為C#的組件編程開辟了廣闊的天地在其他技術方面Java的微弱劣勢尚且可以忽略不計但在組件編程方面Java相較於C#卻有著不可治愈的硬傷尤其對於從C++和Visual Basic背景過來的開發人員C#在這方面有著不可抵擋的魅力和誘惑
鑒於XML Web Services在下一代企業分布式計算中的地位我們有必要在這方面對兩個語言有一個簡單的交代在XML Web Services的操作方面NET平台直接在IL中間語言中的內置XML支持使得C#與生俱來地成為下一代Web服務的首選這是通過API集來支持Web服務的Java所不能比的在C#中XMLSOAPUDDIWSDL等底層協議被構建成了面向開發人員的組件而Java中這些仍然是JAX(Java XML API)等底層協議的操作函數當然這種局面可能僅僅是時間問題一個強大的高效的Web Services組件模型對Java來說並不是不可逾越的鴻溝
在語言標准化方面微軟也史無前例地做出了令人贊賞的動作目前C#及NET平台基礎構造已遞交歐洲計算機制造商協會ECMA經過標准化後的C#將可由任何廠商在任何平台上實現其開發工具及其支持軟件這為C#的發展提供了強大的驅動力而Java在這方面雖有動作JCP(Java Community Process)但無疑只能是准標准化在組件化軟件時代擁有一門像C++一樣的標准化語言對軟件界尤其是廣大開發人員非常重要
當然兩個語言的全面的技術品評絕非僅僅上述幾點簡單的羅列比較其後端平台(C# for NET Java for JEE)及其編程框架的支持各語言相關工具的實現現有的系統基礎等等都對程序設計語言的發展產生相當的影響從純技術角度來講C#無疑較Java更具競爭力爭吵誰抄襲誰也沒有意義技術的發展本來就是一個相互借鑒的過程純技術較量也並不能決定這場論戰的勝負如果非要一決雌雄的話軟件界倒樂見競爭經過市場錘煉的技術才能更好地為我們服務讓我們拭目以待!
From:http://tw.wingwit.com/Article/program/net/201311/15587.html