「一個字節碼程序通常是通過一次一個地解析指令來執行的,這種字節碼解釋器是非常便攜的,有些系統稱爲動態翻譯器或」即時「(JIT)編譯器,在運行時根據需要將字節碼轉換爲機器語言:這使得虛擬機不可移植。「字節碼解析指令和機器語言之間的區別?
關於這一段的一個問題是:字節碼得到處理後, 什麼是解析指令和機器語言(或機器代碼)有什麼區別?
「一個字節碼程序通常是通過一次一個地解析指令來執行的,這種字節碼解釋器是非常便攜的,有些系統稱爲動態翻譯器或」即時「(JIT)編譯器,在運行時根據需要將字節碼轉換爲機器語言:這使得虛擬機不可移植。「字節碼解析指令和機器語言之間的區別?
關於這一段的一個問題是:字節碼得到處理後, 什麼是解析指令和機器語言(或機器代碼)有什麼區別?
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++編譯器發出特定於處理器的指令。
沒有區別 - JIT編譯器正是爲此而設計的 - 它產生了在硬件上執行的機器代碼。
最終歸結爲機器說明。
正如你所看到的,用#1,你在#3時的開銷最少,你的開銷最大。因此,性能應該在#1上最快,而在初始編譯開銷後,性能應該在#2上快。
在字節碼解釋器中,指令格式通常用於使用移位和掩碼操作符進行非常快速的「解析」。解釋器在「解析」(我更喜歡「解碼」)指令後立即更新虛擬機的狀態,然後開始解碼下一條指令。所以在字節碼在解釋器中得到處理之後,沒有剩餘的剩餘。
在JIT編譯器中,字節以大於單個指令的單位進行處理。最小單位是基本塊,但現代JIT會將較大的路徑轉換爲機器碼。這是一個翻譯步驟,並且翻譯步驟的輸出是機器碼。原始字節碼可能會保留在內存中,但不用於實現—,所以沒有實際區別。 (雖然JITted虛擬機的機器代碼與本地代碼編譯器發出的機器代碼不同,但它仍然是典型的。)
它確實取決於你的意思是「解析指令」 - 你指的是到抽象語法樹中的表示? – none 2009-05-19 09:13:44