2017-05-25 132 views
0

我很困惑,因爲在JVM的角色。我的理解是正確的,JVM只將字節碼轉換爲機器碼?所以基本上,OS,JVM和CPU之間存在通信。我的假設是字節碼被轉換爲機器碼,然後由CPU處理。字節碼是否必須轉換爲機器碼?

+0

我建議你閱讀:https://en.wikipedia.org/wiki/Java_virtual_machine – PSo

回答

0

JVM是一個虛擬機。

就像在VMware或VirtualBox上安裝某些操作系統(Linux,Solaris)時那樣,它們就是虛擬機。他們運行在主機操作系統之上。

JVM是不同的,它的機器代碼是bytecode。有些機器具有高級語言作爲他們的機器代碼。如果JVM要在硬件上運行,而不在主機OS上運行,那麼期望硬件能夠使用bytecode指令集。

但是,由於它在主機操作系統上運行,任何字節碼指令在轉換爲機器碼後都會傳送到主機。在VMware/VirtualBox的情況下,這些軟件會照顧它。在JVM的情況下,它由JRE完成。

+0

因此,每個字節碼指令都轉換爲機器碼?然後傳達給OS和OS到CPU? – manojpotla

+0

是的,但JVM不參與,它必須由包裝環境完成,在這種情況下JRE。把它想象成運行批處理文件或shell腳本,批處理文件中的每條指令都是一個與字節碼中的指令相當的指令。但是解釋器必須根據批處理文件中的每條指令找到適當的程序來運行。 – 11thdimension

0

JAVA是一種編譯和解釋語言,不僅僅是解釋型語言。讓我們一步一步執行它的程序。

  1. 假設我們編寫一個Java程序並將其保存爲「hello.java」在硬盤上的某個文件夾中。
  2. java編譯器的名稱是「javac」。爲了編譯它,我們必須在命令行上編寫「javac hello.java」。
  3. 在此階段,高級代碼被轉換爲機器級代碼。 Java將它轉換爲一個.class文件作爲「hello.class」。此代碼也稱爲字節代碼,因爲此文件中的每條指令均爲1個字節。
  4. 此字節碼也可以在任何其他平臺(如 Mac,Linux或Windows)上帶走。對於其執行 ,它只需要相應操作系統的JVM。因此,JAVA被稱爲第一平臺獨立和體系結構中立的語言。
  5. 現在,爲了執行它,使用瞭解釋器。它本身被命名爲「java」。對於它的解釋,應該在命令行中使用「java hello.java」。它在內部調用類加載器,該加載器負責將硬盤中的'hello.class'文件加載到JVM的地址空間。
  6. 這裏有一個'字節代碼驗證器',用於驗證代碼以避免運行時失敗。在成功驗證之後,JVM藉助OS執行逐字節代碼。

因此,整個Java程序由JVM和OS執行。雖然JVM充當Java程序的小型操作系統,但它僅在指令不在其範圍內時才涉及OS。

相關問題