從曆史角度來說,java的思想,非常的具有開創性。因為是java第一次提出來了“一次編譯,處處運行”並且真正的付諸於行動。為此,sun公司付出了巨大的代價--與各大IT公司簽訂協議,免費開放java,只需要一點,其必須遵守sun公司的標準。當初,微軟也簽訂了這份協議。微軟是一家非常具有危機感的公司,他從java的身上,看到了危機,所以,才會有vj++的嘗試以及與sun公司後來的官司。sun發現微軟違背了當初簽訂的協議,為java做了許多擴充,這樣的風險是,微軟有可能藉助其平台的優勢,越過sun的java標準而成為實際業界的java開發標準。所以,sun提起了訴訟。微軟並沒有做過多的堅持,因為sun的背後,是一個聯盟,java聯盟,而且這個聯盟,普遍對微軟懷有敵意。因此,微軟拋開java,另起爐灶,主推c#。所以,從一開始,java與C#,本身就是一對冤家和對手。
微軟的技術實力,毋庸置疑,不管是多少所謂的技術專家嘲笑windows系統架構的是一年級層級還是其他,但是不能否認,widows作業系統,是迄今為止,在個人電腦上運行最為成功的一個作業系統甚至沒有之一。藉助作業系統優勢與業界聲譽,C#從一開始的模仿,到後邊不停的發展擴充,變化速度越來越快,也開始越來越偏離Java。
java與C#的比較:
1、跨平台 java從一開始,就以開放的方式,邀請了足夠多的力量,對其平台進行擴充支援,所以,雖然跨平台上,仍然存在一些小小的瑕疵--某些程式在更換系統後,還是要做很小的微調的,但是已經能夠在大部分的平台上實現了該目的。所以java成功於--開放。開放成就了java,但是java的創始人sun並沒有獲得足夠的利益,導致java的利益,主要流失到了IBM等java聯盟內。C#屬於微軟一家專屬,索然一開始,微軟主推.Net平台時,曾經提過“一次編譯,到處運行”但是後邊也知道,該目的只能是鏡花水月,所以,微軟的主要精力,還是聚集在將Windows平台上的開發工具高度整合的目的之上即.Net平台。有一個開源項目,計劃構建Linux上的.Net CLR,但是並沒有多少人買賬。如果將來有一天,C#和.Net也提供跨平台,那麼,要麼是微軟有足夠的力量,提供了多系統的.net支援,要麼就是有超級牛人愛好者,免費作出,要麼就是微軟開放了.Net平台,其他廠商開始支援,當然,這點可能性最小,至少很長時間段內,可能性很低。
2、編譯效率與特性 C#方面,由.Net2.0發展往上,一直到LinQ,WPF等,支援的運算式和關鍵字都有了很大的擴充,這也導致編譯器編譯負擔越來越大,因此,編譯速度越來越慢。而java,在此方面的發展則較少,這是存在客觀原因的,畢竟每一次更改,都必須所有相關公司去支援而不僅僅是一家。但是開源社區以另外一種方式,在不斷的擴充著java的發展,即架構。
3、運行效率 java和C#,在這一方面,我沒有實際資料比較。僅從邏輯上分析。java和C#,都是運行在一層託管之上,java是jvm,c#是CLR,兩者實際上都是解釋執行。從常規邏輯來說,調用的層次越多,調用花費的時間越長,所以,java和C#的運行效率,都比直接運行在作業系統之上的軟體,要低,具體低的程度,取決於這層解譯器的載入中間代碼的方式和執行效率。
4、 大型服務與網路 在這一方面上,C#是完全佔劣勢的。因為在伺服器作業系統市場,微軟的市場份額,很低。有興趣的使用者可以尋找一下伺服器市場上各種作業系統佔據的市場比。服務方面,主要是java與C/C++爭奪市場,或者更確切的說,是java在不斷吞食C++的市場。在網路方面,則是java與C#展開了正面較量,嗯,從網站數量上來講,C#佔據劣勢,但是這種劣勢,更主要是由於微軟在伺服器市場上的劣勢與樹敵引起的。
5、PC應用領域 這一方面,C#比java的優勢太大了。在個人桌面系統中,你可以找到C#寫成的託管應用程式,但是你不一定能找到java寫就的應用程式,而java的曆史,也證明了,使用java寫就傳統型應用程式,是一種錯誤,也許有一天,當jvm能夠發展採用新的技術或者當PC效能,能夠以人能夠接受的速度,運行java傳統型程式的時候,java傳統型程式,也許才會多起來。當然,這裡邊還存在一個問題在下邊說。
6、底層執行與跨語言 C#支援直接不安全的程式碼的執行。這個特性顯得有點兒多餘,既然需要支援不安全的程式碼,那為什麼不使用對指標等支援更好的C/C++語言呢?不過,如果是用來做與C/C++ dll等或者Windows下的系統調用,這一部分還是有用的。java也支援調用C/C++,但是,他不支援對底層的直接調用,這裡的底層,是指如同C#使用不安全的程式碼一樣直接使用指標。相對而言,調用系統API,C#調用Windows更方面和快捷,方式也簡單的多,畢竟是同一家的東西。但是,從設計目的來說,java本身是純粹面嚮應用的語言,設計就與系統打交道較少,在這方面比,根本沒有可比性。
7、未來的發展方向 VS和.Net越來越臃腫,是的,確實,越來越臃腫,但是其功能也越來越強大,寫代碼,也越來越簡單。如果說,泛型是對java的抄襲,那麼,LinQ和Lamada運算式則是C#對自身編譯器的擴充,一直到後期的WPF。是的,微軟是一家危機性很強的公司,當google開發出瀏覽器並放出風聲,說開發以瀏覽器為中心的作業系統的時候,微軟已經開發了以WPF為基礎的文本解釋型表單程式。瀏覽器是什嗎?從本質上來講,瀏覽器也是一層中間服務,其為html和前台指令碼標籤提供瞭解釋執行,功能實際上與jvm和CLR類似,只不過,其解釋的東西更泛化,而HTML標籤,就是瀏覽器的中繼語言。在VS2010中,VS不僅僅是增加了許多語言的特性,還增強了管理和開發Case方面的支援,實際上從VS.Net的發展方向來看,微軟更看好的應用開發管理與控制,而不再是追求與java的亦步亦趨。java為了跨平台,其標準要求更嚴格,不可能像C#一樣,對文法進行簡單的擴充,所以,其發展方向,一直是外部架構或者說,是Case工具的擴充。如果將這一部分加起來,java的開發環境,也並不簡潔。
不管是java還是C#或者是C/C++,一個個語言比較其實意義不大。因為要麼他們處於的層次不一樣比如比較c/c++和java,要麼應用的方向和情境有差別比如比較java與C#的用戶端程式.只有應用情境和所處的層次大致時,才能夠比較.比如C#的web服務和java的web服務.
歸根結底,各種語言的發展都是越來越智能化,提供的可用的支援都是越來越多。最終發展的目的,就是,程式員們,老老實實的當工人吧,按照使用者的需求,採用他們的架構,將一塊塊磚石壘起來。如果你不想當磚瓦工,那就跳出語言的束縛吧,站起來,學學工程理念,而不是討論哪種語言優劣.
有一個觀念是,決定一件事物發展的,往往不在於該事物的本身,而在於其外部.電腦語言發展到進階語言這一步,已經無所謂優劣了,而已經演變成了各大IT廠商的角力場,哪一方面的語言支援的工具多,開發模式更多,哪一個廠商的實力更佔優,哪一門語言,才更有發展力.而在這一方面,我們國內,根本沒有任何可參與的地方,只能隨著IBM,微軟,Orocal,Google等各大IT公司的角鬥而隨波逐流,既然如此,那我們如此的賣力爭吵,根本沒有任何意義.
一點兒題外話:
說實話我挺佩服微軟,因為,微軟首先作為挑戰者,以後來者身份從IBM等大公司中殺了出來,等他殺出來以後,他又開始面對Google等新型公司的挑戰,同時由於其壟斷地位,導致其他廠商誰看他都不怎麼順眼,所以,才會有越來越多批評微軟的聲音.
開源是一種偉大的創新,但是國內對開源有誤解,認為開源就是免費,或者說,開源了拿著別人的成果改改改頭換面,就以自己的名義發布.所以,國內有許多開源的偽擁泵者,因此,國內對開源的貢獻一直有限,首先,就表現在,基本沒有公司提出或者維護開源的項目,而開發人員們,也整天是研究發行的開源項目,是研究使用,而不是仔細學習研究開源的本質進而提出新的擴充.
看見幾個問題,咱也湊幾句:
1 c/c++ 能不能寫web服務 c/c++ 其實是完全可以寫web服務的.什麼是web服務?web服務本質就是一個C/S結構的服務模型,瀏覽器充當C端,接收到伺服器發的資料後,對html等標記語言進行解析展現,服務端監聽某個連接埠,接收到請求後,進行一系列操作,然後將結果返回.
比如一個很簡單的web服務,監聽80連接埠後,不管任何請求,都可以給回某個字串,完全支援http協議後,一個Web服務就完成了.當然這裡邊還有好多的機制比如Session等.
2 c#/java能不能寫作業系統. 不能,至少現階段不能,除非能夠制出支援.Net framework或者jvm的韌體,否則如果使用軟體已經能夠支援.Net framework或者jvm,那就沒必要再在上實現作業系統了,因為,此時的軟體已經實現了進程,線程,記憶體,檔案等作業系統的基本要素,沒必要再騎馬找馬了.
3 我應該學習java還是C#? 其實這個本來不應該成為問題,但是初學者又都容易迷惑. 語言是工具,如果不是培訓,而是學校裡學習,我的建議是,學習C語言,不要以C++為主,然後學習其他的物件導向語言比如C#或者java,而學習這兩門語言.而在學習語言的過程中,重點學習練習思維方式,一旦對語言熟悉以後,其他語言就簡單得多了,看看文法,看看庫,拿著sdk協助,絕對就可以使用了.為什麼不建議使用C++作為基礎學習語言?因為C++更主要還是一種過渡語言,既包含物件導向又包括面向過程,導致都不純粹,而且其設計極其複雜.另外,c++並沒有一個完整統一的標準,雖然現在有一個標準,但是完全支援的編譯器,太少. 這也是新的物件導向語言代替它的原因. 如果是培訓的,那就沒啥說的了,既然選擇了培訓的項目語言,那就說明看好那方面的發展,好好學習就是了. 不過記住,一種語言打天下的時代,早就沒了,要不然也不會宣揚思維至上,實際上,宣揚的是一種學習方式,因為IT業的知識更新速度太快了,也因此,代碼工人,是最累的一個工人群體.
4 設計對象的一個基本原則是:提供充足的方法和屬性,但是不要提供任何調用.對象的調用,請調用類去控制實現.
5 看某一種語言,最主要從其產生背景,應用領域和操作方便性去看,去瞭解本質,而不是盲目根其他語言比較.
6 開發的越多,越覺得自己不知道的還很多,所以我一直誠惶誠恐.我也不是專家,僅僅是一個行業相關者.因此,有問題歡迎提,有看法歡迎發表,但是語言主義者就不要留言了,因為討論這個話題很沒意思.