精華區beta sttmountain 關於我們 聯絡資訊
http://www.udnnews.com/NEWS/INFOTECH/AD/792645.shtml JVM 二三事 意藍科技 前言 提到Java,你會想到的第一件事是什麼? "跨平臺啊!" 沒錯,Java最大的魅力,就在於這個程式語言設計之初,就替設計師把 不同平臺、不同作業系統的問題考慮到了。遙想以前用C/C++寫的程式, 一換平臺就要重新編譯一次,用VB寫的程式更是只能在Windows平臺上跑 ,想拿到Unix/Linux環境下執行,"門都沒有! 重寫吧!" 相較起來,Java 程式設計師就幸福得多了,程式寫完一次,編譯一次,拿到各個平臺上, 可都跑得嚇嚇叫呢! 為什麼Java能享有這種特權呢? 這就完全不能不提到Java的特殊設計--Ja va Virtual Machine(JVM)。我們這一期就跳脫程式設計的理論,來談談JVM。 Java的心臟—JVM 雖然我們通常所說的Java,都是指Java程式語言(Java Language)居多。然 而,事實上一個Java程式能順暢運作的有三大要素是缺一不可的: Java Virtual Machine、Java API以及Java Class Files,其中的Java Virtual Machine更是讓Java能做到跨平臺(Platform Independence)的要 角,因此說它是Java的心臟也不為過。 說了半天,JVM到底是什麼? 一般的程式語言,程式設計師寫出來的稱為原 始碼(Source Code),要編譯(Compile)成機器碼(Machine Code)才能執行。 但Java的情況不同,Source Code編譯過的結果是Byte Code,機器或是OS是 看不懂的,要靠JVM在執行時解譯為Machine Code,才能執行。也就是說, 對一般程式而言,程式本身直接就接觸到OS或硬體資源層級,因此每遇到一 種平臺,設計師就必須針對不同的平臺做出適當的設計,但Java則不然,程 式本身面對的是JVM,只要JVM看得懂你寫的程式,它就能順利執行,至於面 對不同平臺的問題,就交給JVM的開發者去傷腦筋啦! 因為Java的設計就是要求程式只開發一次,因此無論是那一個平臺上的JVM, 在Java程式看起來都應長得完全一樣,就好像是一台虛擬的,只能執行Java 的Byte Code的機器一樣,但這是一個軟體模擬成的機器,這就是Virtual Machine的名稱由來。 談到這兒,其實說Java是各個平臺都能跑是有一點兒膨風的,雖然理論上是 如此沒錯,那也要看那個平臺上有沒有對應的JVM囉! 所幸,在世界級大廠 的強力背書和Java社群的力量下,大到IBM的Mainframe,小到掌上的PalmOS ,幾乎是處處可見對應不同平臺的JVM的蹤影。不過對於大多數用慣Windows 作業平臺的人而言,大概很少去考慮除了微軟之外的情況吧? 天下沒有白吃的午餐 當然Java的設計和架構上,除了跨平臺之外,還有很多一開始就優於其他程 式語言之處,比如較完整的OO架構,對於網路架構比較完善的支援等,不過 那些已超出本文的討論範圍。但是光是能跨平臺這一點,就足以讓巨人微軟 恨得牙癢癢的,除了把對Java的支援從Windows XP中移除外,還大張旗鼓地 高舉.NET的旗幟來和Java打對臺,以免"Windows化"的霸業受阻。 但是為什麼那麼多優點的Java至今還沒有風行草偃,把微軟逼入絕境呢? 很 遺憾的,天下沒有白吃的午餐。Java在JVM中做到了如此多的優勢(Platform Independence, Network-Oriented...),事實上在某種層次上,犧牲了執行 效能,例如和C/C++編譯的程式相比。當然,JVM的技術也不斷在進步,同樣 的程式在Java 1和Java 2的VM上跑出來可能有截然不同的結果。我們可以說 ,JVM的技術目前或許還不能做到讓Java在同時具有那麼多優點下,還能比 C/C++更快,但是它不會永遠慢。目前執行效能的落後,只能說是在眾多優 點的大我中,不得不犧牲的小我吧! 另外一個值得一提的是,Java為了做到跨平臺,在JVM的設計上當然希望做 到讓每一個不同的Java程式在不同平臺上都能呼叫相同的Java API,然而當 遇上平臺相關的問題時,這個想法往往無法盡如人意。比如說,存取系統資 源時,Unix/Linux和Windows對於硬碟路徑規畫就大不相同--Unix/Linux可 沒有C:、D:這一套。更別提Windows的"服務"和Unix/Linux的"背景執行"的 差異性。這也造成真正想要實作跨平臺的程式設計師的困擾,通常只能先 就各平臺通用的部份先寫作(套句數學用語,取最大公因數),再補齊所有 想要支援的平臺的部份(再套句數學用語,取最小公倍數)。陳意甚高的Java ,也有在現實中無法盡善盡美之處。但既使如此,比起針對不同平臺都必須 重新寫作或是根本無法轉換平臺的語言,Java的程式維護者還是輕鬆了許多 。 好的語言,但"還"不是完美的語言 理想和現實總是有差距的,也因為如此,人類才有努力的空間嘛! 前面所說Java在設計上利用JVM這個架構,完成了跨平臺等等優質的設計, 但面對到現實生活中五花八門的環境,仍有它不得不妥協之處。 比如Sun在發表JRE、JDK時,總是最先發表Windows版本,比自家的Solaris 版本還快,沒法子,用的人數實在是差太多了。還有在各家平臺上百家爭 鳴的JVM環境,使得Sun不得不宣布官方版本只維護Windows/Solaris/Linux 三套JVM,至於其他的什麼HP-UX、IBM-AIX、FreeBSD,就交給大家各顯神 通囉。所以現在其實除了Sun免費提供以上三個平臺的JVM外,另外有很多 要錢的、不要錢的,支援不同的平臺上的JVM在流傳和開發著。別的不說, "巷子內"的人都知道,IBM發表的JRE/JDK在Linux上的效能比起Sun官方版 要好上許多;其他也有許多不同的群組正在努力開發Java的原生碼編輯器 以解決效能問題。相信在眾家大廠、小廠的努力之下,"路線正確"的Java 一定能繼續朝向"完美"之路邁進的。 後語 本期"離題"地提到了JVM的一些現況和問題。事實上,除了必須要實做跨各 個平臺的程式的設計師之外,一般寫作者很少必須面對不同的JVM的問題。 如果您因為業務需要或個人興趣想對JVM有更進一步的了解,Kaffe.org是 個不錯的社群,它的網址是http://www.kaffe.org,內部有更多有關JVM的 資料,值得您參考。 <關於意藍科技> <關於爪哇藍報> -- 「我們都很努力地讓我們的動作看起來很優美、更流暢、控制力更強, 在我們心中有一個理想的風格,成為我們追求的目標; 光是登頂是不夠的,要達到這種完美的境界才重要」。 --Francois Legrand ,1995, for mag.R&C -- Origin:《 成大計中 BBS 站 》[bbs.ncku.edu.tw] 來源:[bp120.bp.ntu.edu.tw]