1. 程式人生 > >Java程式設計入門(1.3):Java虛擬機器

Java程式設計入門(1.3):Java虛擬機器

機器語言由非常簡單的指令組成,計算機的CPU可以直接執行這些指令。幾乎所有的程式都是用Java、Fortran或C++這樣的高階語言編寫的。由高階語言編寫的程式不能被任何計算機直接執行。首先,必須將其翻譯成機器語言。這種翻譯由一種稱為編譯器的程式完成,編譯器將高階語言翻譯成可執行的機器語言程式。當翻譯完成後,機器語言的程式就可以執行任意多次。當然,只能在同一種類型的計算機上執行(這是因為每種型別的計算機都有自己獨立的計算機語言)。如果該程式需要在另一種型別的計算機上執行,就必須使用另一種編譯器重新翻譯成對應的機器語言。

還有另一種編譯高階語言的程式的方式。除了使用編譯器一次性編譯程式外,還可以使用直譯器,按需求逐指令翻譯程式。直譯器也是一個程式,其扮演的角色和CPU類似,還有一個獲取並執行(fetch-and-execute)迴圈。為了執行程式,直譯器在一個迴圈中執行,重複從程式中讀取每條指令,根據這條指令來決定要做些什麼,然後執行對應的機器語言指令。

使用直譯器的過程就是在執行高階語言的程式。例如,Lisp語言通常使用直譯器執行,而不是編譯器。然而,直譯器還有其他目的:即可以在不同型別的計算機上使用同一種機器語言程式。例如,原來有一種家用計算機稱為Commodore 64或“C64”。但在實際中並沒有發現C64,不過發現了在其他計算機甚至瀏覽器中執行的程式可以模擬一個C64。這樣的模擬器可以通過扮演C64機器語言的直譯器來執行C64程式。

Java的設計者巨頂將編譯和解釋結合起來。Java編寫的程式編譯成機器語言,但並不存在使用這種機器語言的就是就是。這種“虛擬”的就是就是成為Java虛擬機器(JVM)。JVM的機器語言成為Java位元組碼。Java位元組碼不僅可以用於虛擬的計算機,也可以用於真實的計算機。但實際上,使用虛擬機器成就了Java的一個賣點:即Java位元組碼可以在任何計算機上使用。所有這些計算機只需要一個Java位元組碼的直譯器。這種直譯器模擬模擬JVM,就像C64模擬器模擬Commodore 64計算機那樣。(屬於JVM還可用於表示Java位元組碼直譯器程式完成模擬的過程。所以我們說,若想執行Java程式,必須要有JVM。從技術上來講,說直譯器實現了JVM比直譯器就是JVM要更加正確一些。)

當然,不同型別的計算機需要不同的Java位元組碼直譯器,但每當一種計算機有了Java位元組碼直譯器後,就可以執行任何Java位元組碼程式,這樣的程式也可以執行在任何裝有Java直譯器的計算機上。這正是Java的本質屬性:相同編譯後的程式可以執行在許多不同的計算機上。

但為什麼能在所有地方都使用中間的Java位元組碼?為什麼不直接分發原來的Java程式,讓每個人自行將其編譯成需要執行的計算機上的機器語言。其中的原因有很多。首先,需要有一個理解Java這門高階語言的編譯器。這種編譯器本身就是一個複雜的程式。另一方面,Java位元組碼直譯器,是一個相對來說較小,簡單的程式。因此,很容易為一種新型別的計算機編寫一個位元組碼直譯器。完成這一步後,新計算機就可以執行任何編譯過的Java程式。而為同樣的計算機編寫一個Java編譯器卻困難的多。

除此之外,有些Java程式需要從網路下載。 這會導致顯而易見的安全問題:我們不想執行會損害計算機或檔案的程式。位元組碼直譯器在計算機和下載的程式之間充當一個快取。在實際中,執行的是直譯器,這樣是間接的執行下載下來的程式。直譯器可以阻止下載下來的程式中含有的潛在的危險行為。

在Java剛問世不久時,人們經常批評Java很慢。這是因為Java位元組碼由直譯器執行,看上去Java位元組碼永遠不會像編譯成機器語言的語言那樣快(後者實際上是在執行計算機自身的機器語言)。但是,通過即時(JIT)編譯器執行Java位元組碼可以在很大程度上克服這一缺點。即時編譯器將Java位元組碼翻譯成本地機器語言。其在執行程式時完成這一步驟。對於普通的直譯器,輸入到即時編譯器的是Java位元組碼,其任務是執行這個程式。但在執行時,還會將其中的某些部分翻譯成機器語言。翻譯的部分執行起來比解釋執行要快得多。由於在程式執行時,某些部分可能會多次執行,所以即時編譯器可以有效的減少總體執行時間。

這裡需要提醒一下,Java和Java位元組碼之間沒有必然的聯絡。Java編寫的程式依然可以編譯成真實計算機的機器語言。其他語言編寫的程式可以編譯成Java位元組碼。但Java和Java位元組碼之間的組合是不依賴特定平臺、安全、網路相容的,這樣允許使用者以現代的高階面向物件的語言編寫程式。

在過去幾年,有許多新語言或已存在的語言都編譯成Java位元組碼。編譯後的位元組碼程式可以用標準的JVM執行。專門為JVM開發的新語言包括Groovy、Clojure、Processing。面向JVM的Jython和JRuby分別表示的已有的Python和Ruby。這些語言可以在不使用Java的情況下享受JVM的優勢。實際上,以其他語言使用JVM變得越來越重要,一致JVM中添加了一些新特性,其目的就是為了更好的支援這些語言。JVM的這些改進已經成為了Java 7和Java 8中的一些新特性。

這裡還要提醒一點,在不依賴特定平臺方面,提供“圖形使用者介面GUI”這個特性是非常困難的(GUI是指窗體、按鈕等這類的東西)。不過Java也能全平臺的支援。詳見1.6節。

原文連結: math.hws.edu 翻譯: ImportNew.com - 孫 波翔譯文連結: http://www.importnew.com/16642.html[ 轉載請保留原文出處、譯者和譯文連結。]