3

「一個字節碼程序通常是通過一次一個地解析指令來執行的,這種字節碼解釋器是非常便攜的,有些系統稱爲動態翻譯器或」即時「(JIT)編譯器,在運行時根據需要將字節碼轉換爲機器語言:這使得虛擬機不可移植。「字節碼解析指令和機器語言之間的區別?

關於這一段的一個問題是:字節碼得到處理後, 什麼是解析指令和機器語言(或機器代碼)有什麼區別?

+0

它確實取決於你的意思是「解析指令」 - 你指的是到抽象語法樹中的表示? – none 2009-05-19 09:13:44

回答

7

JIT與字節碼解釋器不同。

考慮下面的C函數:

int sum() { 
    return 5 + 6; 
} 

這將直接編譯的機器代碼。說x86和ARM處理器的確切說明將有所不同。

如果我們寫了一個基本的字節碼解釋這可能是這個樣子:

for(;;) { 
    switch(*currentInstruction++) { 
    case OP_PUSHINT: 
     *stack++ = nextInt(currentInstruction); 
     break; 
    case OP_ADD: 
     --stack; 
     stack[-1].add(*stack); 
     break; 
    case OP_RETURN: 
     return stack[-1]; 
    } 
} 

這可以再解釋以下一組指令:

OP_PUSHINT (5) 
OP_PUSHINT (6) 
OP_ADD 
OP_RETURN 

如果您編譯的字節碼解釋器無論是x86還是ARM,那麼你都可以運行相同的字節碼,而不需要進一步重寫解釋器。

如果您編寫了JIT編譯器,則需要爲每個受支持的處理器發出特定於處理器的指令(機器代碼),而字節代碼解釋器依賴於C++編譯器發出特定於處理器的指令。

2

沒有區別 - JIT編譯器正是爲此而設計的 - 它產生了在硬件上執行的機器代碼。

1

最終歸結爲機器說明。

  1. 本地應用程序 - 包含直接執行的機器指令。
  2. JIT應用程序 - 字節碼被編譯成機器指令並執行。
  3. 翻譯的應用程序 - 字節碼由本機應用程序的虛擬機翻譯。

正如你所看到的,用#1,你在#3時的開銷最少,你的開銷最大。因此,性能應該在#1上最快,而在初始編譯開銷後,性能應該在#2上快。

2

在字節碼解釋器中,指令格式通常用於使用移位和掩碼操作符進行非常快速的「解析」。解釋器在「解析」(我更喜歡「解碼」)指令後立即更新虛擬機的狀態,然後開始解碼下一條指令。所以在字節碼在解釋器中得到處理之後,沒有剩餘的剩餘。

在JIT編譯器中,字節以大於單個指令的單位進行處理。最小單位是基本塊,但現代JIT會將較大的路徑轉換爲機器碼。這是一個翻譯步驟,並且翻譯步驟的輸出是機器碼。原始字節碼可能會保留在內存中,但不用於實現—,所以沒有實際區別。 (雖然JITted虛擬機的機器代碼與本地代碼編譯器發出的機器代碼不同,但它仍然是典型的。)

相關問題