標籤:
我是一個Java的反對者,至於為什麼,我想最大的一個原因是它不實在,不管是當年sun所說的一些言論,還是如今Java使用者的一些言論,都有蠱惑之嫌,甚至很多太假了,而這些言論層出不窮,其實就語言本身我不想說什麼,任何語言存在都有它的道理,而且都有適合它的應用情境,但是如果總是誇大實在讓人不爽
一、Java是簡單的
Java簡單嗎,反正我不覺得,當然這是Java剛問世時說的,在當時看來還勉強說的過去,不過這句話至今仍在被引用,而且總是在和C++對比,不能說比C++簡單就叫簡單吧,難道會有人認為有比C++還複雜的語言?這樣的對比顯然是有問題的
二、一次編譯到處運行
這句話應該有個前提,就是只要那個平台上有JVM,不過我不想咬文嚼字找漏洞,這樣也沒什麼說服力,我認為這算不上什麼優點,首先對於指令碼語言而言,一次編寫(不需要編譯)就到處運行,豈不是更有優勢,然而沒有哪個指令碼語言拿這個出來說事兒,為什麼Java總是拿這個說事兒,況且一次編譯到處調試這句話也不是空穴來風。還有經常會拿它的位元組碼來說事,彷彿只有java有中間嗎一樣,實際上解釋型語言幾乎都有中間碼,這就是解釋型語言的特點,這個特點在沒有Java之前就有。讓Java說的好像是它創造的一樣,別的語言都是模仿它
三、JIT最佳化技術可以使Java的運行速度接近C/C++,甚至有些情境下會超越
Java的效能一直是Java開發人員心中的痛,無論是當年的sun還是現在的oracle,幾乎每一次的版本更新都會著重說明效能有很大的提升,而且每一次都像一顆定心丸一樣安慰這它的使用者,使大家對Java的效能有信心。不過從Java誕生起,提升了這麼多年,提升了多少呢,不管提升了多少,用戶端(除了andriod)用Java的太少了,就算是不是純java的eclipse的效能也讓人難受,服務端也要分應用,也不是什麼服務端程式都適合用Java,通常都是語言本身的效能不會是最大的瓶頸的情境,因為有些情境最大的瓶頸可能是IO或者資料庫等。為什麼JIT不能讓Java趕上C++呢,理由很簡單,編譯型語言也不是只有C/C++,還沒有哪個語言做的到,JIT就能?顯然不現實,其實這是語言的特性決定的,C的實現是為了效能可以放棄進階特性,C++的效能也是其最重要的目標之一,而其它語言都是為了進階特性可以犧牲效能,從語言定位上來說,再怎麼最佳化也不可能趕上C/C++,因為最佳化是不可能違反語言的定位的,這其實是魚與熊掌不能兼得的問題。只要在效能能滿足應用的情況下就可以用,但不要老誇大,越自卑的人自尊心越強,人總是不喜歡承認弱點,但也沒必要過分強調這不是弱點,越強調反而越讓人懷疑
說到效能問題我覺得.net 相對還是比較實在的,當年我用.net 1.1 的時候,效能是非常差的,一個普通的WinForm視窗,如果在裡面排列多一點的控制項的話,運行時都能看出來你拖放控制項的順序,非常明顯,但現在好多了,基本上眼睛是看不出來的,都是一起出來的,所以現在很多Windows程式用.net 表現也非常好
四、GC是Java效能的罪魁禍首之一
我覺得說反了,應該說是Java敗壞了GC的名聲,因為很多人都是通過Java認識了GC,導致在很多人心中,GC成了慢的代名詞,實際上這是普遍對GC是的誤解的,GC其實只是個概念,GC曾經考慮過由作業系統實現,自從作業系統都沒實現,就由程式設計語言來實現了,也導致實現的五花八門。至於效能要看具體實現和演算法選擇,這是一項動態記憶體管理的技術,與C的malloc/free的作用一樣,只是GC可以更進階,malloc/free 通常要按照一定的約定來使用以避免記憶體流失問題,GC與手動記憶體管理主要區別是GC需要一定的演算法來選擇如何釋放記憶體,手動的不需要。另一個是釋放時機的選擇手動的更自由,通常GC不是很自由,我說的通常是指一些語言不允許GC的可控,事實上GC的實現都是可控的,只是一些語言不允許這麼做,問題就出在這了,GC的演算法需要時間,而GC的演算法並不能保證最優,所以會產生效能問題,實際上一個可控的GC對效能和開發效率才是更好的選擇,根據情況選擇是否要GC自動管理還是手動控制,就像D語言的方案,它使用GC,但效能確很高,而且GC是可控的,你的程式不必完全依賴GC的演算法,我一般把這種方式叫半自動的,這樣更好,如何管理記憶體應該是開發人員的自由,因為全自動管理的GC有的時候會造成應用程式的卡頓,特別是在不適合的時候出發GC的記憶體管理,這讓有些類型的程式很難接受,比如在射擊類的遊戲中,或者視頻解碼程式,哪怕是一點點的卡頓體驗也是非常不好的(一秒內少於24楨),但在web這樣的應用中,服務端程式短時間暫停用戶端幾乎感覺不到,即使時間長點使用者也會認為是網路問題或者瀏覽器問題
更多關於GC的內容請參考 http://www.iecc.com/gclist/GC-faq.html
五、網上有很多文章通過具體代碼測試,Java效能超越了C++
不管代碼是什麼,只要是結果上真的超了,那一定是作弊了,不信你可以親自驗證,前提是你真的懂C/C++,不然可能你會中招,但這些文章很吸引眼球,引來了眾多的不明真想的圍觀群眾。我的觀點是在效能可以接受的情況下,語言的特效能帶來更多的好處,就是好的選擇,這也是PHP為什麼能在web開發方面能流行的原因之一。但是有些Java人老是發這種文章的行為著實讓人鄙視,而且我發現好像只有Java喜歡挑戰效能,在其它語言上確很少見,這點上值得Java人思考
寫在最後:
看到這Java粉們一定會不高興了,Java優點也很明顯,庫多,非常多。還有一個很大的優點是,Java開發人員不需要對底層技術網路技術等有多麼深入的瞭解就能開發出重量級的應用軟體來,從某種意義上講,這把開發人員們從技術細節中解放了出來,更專註於應用邏輯。於是很多重量級的軟體就這樣誕生了,然後就會有一些人質疑,為什麼這樣的軟體要用Java開發,然後就有人出來說Java一點都不慢,然後 ...... 然後不了了之了。其實就語言本向來說,Java曾經還是不錯的。
我們總是謊言聽多了慢慢的也就信了,因為很多時候真相是什麼可能並不是那麼重要
細數那些我們都習慣了的Java謠言