iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

JAVA系列 第 5

關於JAVA的一些缺點

  • 分享至 

  • xImage
  •  

JAVA看上去雖說功能算完善,但它並不是一個十分完美的語言,而今天我們要談的便是JAVA的一些缺點。

1.整體性問題
比如一個簡單的個人網站或者獨自編程的程式師在撰寫時,他們會發現Java的複雜管理對於自己要做的程式來說過於強大了。
作為一種已經建立的新技術,Java顯然綜合了很多語言的特性,比如C++、C語言、Python等等。一些對於Java的評論認為Java的不變性在動搖。

2.語言問題
有些程式師不喜歡原始類型(primitive type)和類別(class)的分離,尤其是那些曾經使用過Smalltalk和Ruby的程式設計師。Java的程式碼相對於其他的程式碼來說過於冗長,這與它的輕便化聲明相違背。
Java是一種單繼承的語言。這也導致了使用多重繼承時候的不便,而很多語言都可以使用這個特性。但是Java可以使用介面類,把多重繼承可能導致的風險減少到最小。過去Java對於文字的操作和其他語言,比如Perl和PHP相比差的較多,但Java在1.4版本時候引入了正規表示式。

3.類庫問題
使用Swing平臺編寫的帶有GUI(圖形用戶介面)的程式和其他原始程式非常不同。選用AWT工具包編寫程式的程式師看到的都是原始介面,而且也無法獲得先進的GUI編程支援,如果使用的話,就要提供每個平臺上面所需的API,這將是一項龐大的工程。Swing則是完全用Java語言所寫的程式,避免了介面元素重複的問題,只使用所有平臺都支援的最基本的繪圖機制。但是很多用戶不知道如何在Java風格和Windows風格之間進行轉換,結果造成了Java程式的介面在很多程式中非常特殊。

4.效能問題
由於Java編譯器和虛擬機的不同對Java程式碼的效能影響比語言本身的影響大的多,所以統一討論Java的程式的效能經常是有誤導性的。
Java語言的一些特性不可避免的有額外的效能代價,例如陣列範圍檢查、運行時類型檢查等等。Java程式的效能還會因為不同的動態複雜性和垃圾處理機制使用的多少而各有不同。如果JVM的實現比較最佳化的話,那麼這些功能甚至可以增加記憶體分配的效能。

有許多人認為Java的效能低。這部分歸因於Sun公司最初的JVM實現使用未最佳化的解釋機制來執行位元組碼。一些新版本的JVM使用Just-In-Time(JIT)編譯器,在載入位元組碼的時候將其編譯成針對運行環境的本地程式碼來實現一些本地編譯器的最佳化特性。Just-In-Time機制和本地編譯的效能比較仍舊是一個有爭議的話題。JIT編譯需要很多時間,對於運行時間不長或者程式碼很多的大型程式並不適宜。但是不算JIT編譯階段的話,程式的運行效能在很多JVM下可以和本地編譯的程式一爭短長,甚至在一些計算比較密集的數值計算領域也是這樣。目前,Java已經使用更先進的HotSpot技術來代替JIT技術,Java的效能有了更進一步的提升。另外,在使用-server選項運行Java程式時,也可以對Java進行更深入的最佳化,比如在運行時將調用較多的方法內聯(inline)到程式中來提高運行速度,這就是所謂的「動態最佳化」,而本地編譯器是無法做到這一點的。

Java的設計目的主要是安全性和可攜性,所以對於一些特性,比如對硬體架構和記憶體位址存取的直接存取都被去除了。如果需要間接調用這些底層功能的話,就需要使用JNI(Java本地介面)來調用本地程式碼,而間接存取意味著頻繁調用這些特性時效能損失會很大,微軟的.NET平臺也有這樣的問題。所以到目前為止,效能敏感的程式碼,例如驅動程式和3D電子遊戲,還是大多使用本地編譯,甚至直接以不直接支援物件導向的C語言或機器碼編寫。但最近已經有了許多用純Java編寫的3D遊戲,其效果與用C語言編寫的不相上下,主要是因為新版的Java 3D技術已經能像C++一樣使用顯示卡來加速,無論是C++還是Java語言寫的3D遊戲都是使用顯示卡及GPU來處理,從而使得CPU可以專注於其他方面的工作。


上一篇
JAVA開發環境的設定
下一篇
JAVA歷代的版本
系列文
JAVA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言