2015年10月16日 星期五

Java 學習日誌 007:Byte-Code與Java Virtual Machine


上個文章講到JVM,Java Virtual Machine,一種虛擬電腦用來翻譯byte-code成各種特定電腦能讀取的machine language。而JVM翻譯byte-code的方式有兩種,一種是透過interpreter(解釋器,又譯為直譯器),令一種是透過Just-In-Time(JIT)compiler(及時編譯器)。

一個interpreter會同時翻譯byte-code並且執行翻譯後的machine language指令,所以是一段一段的翻譯並且執行,並非翻譯一整個byte-code程式再執行,所以稱為直譯器(直接一段一段的翻譯執行)。

當今JVM的執行,採用的是JIT compiler,JIT compiler是一種直譯器與編輯器的綜合體,它一次會翻譯一大段的byte-code成當地電腦的machine language,這些被翻譯過的machine language還會被記得,以利下次使用,所以所有的byte-code只需要被翻譯一次,翻譯的速度就比interpreter快很多。

當跑一段Java程式的時候,首先,用compiler將其翻譯成byte-code,接著用JVM為你的電腦翻譯byte-code成適用的machine language,然後你的電腦才能執行這段machine language的指令。

這聽起來像byte-code是多出來的一道程序,為何不直接用一個compiler翻譯程式成特定電腦的machine language?這樣的方法是其他大多數程式語言所使用的,然而,Java byte-code讓Java程式非常易於攜帶,當你將Java程式翻譯成byte-code後,你可以在任何電腦上使用這段byte-code,所以就能將byte-code透過網路傳送到另一台電腦並執行,這也就是為什麼Java適用于網路應用程式撰寫的原因之一。而且這個方式讓執行程式更為安全,若一段Java程式執行異常,那它只會在JVM的環境下異常,而不會造成當地機器(native machine)的危害。不過當然,每一台電腦都要有自己的程式去執行Java Virtual Machine。

將這些觀念套用在「Java程式語言的由來與邏輯」圖示上,就會如下圖所示






參考資料:Walter Savitch. Absolute Java. 5th ed.

沒有留言:

張貼留言