2013-07-07 71 views
0

字節碼是彙編代碼和機器代碼之間的中間形式的代碼嗎?字節碼與目標碼相同嗎?字節碼究竟是什麼?

這就是我的想法 - 高水平的語言 - >大會語言 - >機器代碼/對象代碼(0和1爲不同的CPU不同。)

是不是這樣? 高級語言 - >彙編語言 - >字節碼(將由虛擬機處理,將其轉換爲機器碼) - >機器代碼

我讀過這個 - SO- bytecode vs assembly language code,但需要了解更好

+0

一般來說(術語的含義通常取決於您正在討論的特定開發/執行環境)「對象代碼」是指已編譯並駐留在「對象模塊」中的代碼 - 包含兩者的文件機器指令和其他「支持」數據,例如重定位信息和調試信息。 「機器代碼」OTOH指的是已經「加載」(可能來自「目標模塊」)到執行它們的合適位置的機器指令。 –

+0

[彙編代碼和字節碼有什麼區別?](https://stackoverflow.com/questions/1782415/what-is-the-difference-between-assembly-code-and-bytecode)可能的重複 – roottraveller

回答

4

字節碼只不過是虛擬機的指令集。這個實現可能涉及或不涉及機器碼的JIT。通常情況下,它不會。例如,官方的Lua實現解釋字節碼,而不是將其轉換爲機器碼。 .NET和Java實現幾乎總是將「熱路徑」編譯成機器代碼,以實現更高效的執行。最終,這是一個虛擬機實現細節,與字節碼本身無關,這只是虛擬機的指令。

對象代碼AFAIK始終是機器代碼。

-1

是,Bytecode是機器預代碼;然後由虛擬運行時保持謹慎,並轉換爲機器代碼(轉換爲0/1)。在Java的情況下,它是bytecode和.NET的情況下,它是IL/CIL

Here

字節碼兩者,也稱爲p代碼(可移植代碼),是由軟件 解釋器設計用於高效執行 指令集的形式。不同於人可讀的源代碼,字節代碼是編碼的解析和事物 像類型,範圍和程序對象的嵌套深度語義分析的結果緊湊 數字代碼,常數,和參考文獻(通常數字地址) 。因此,它們比直接解釋 源代碼具有更好的性能。

+0

Qbasic有相同的東西嗎?因爲是翻譯? –

+0

downvoted它的人 - 關心解釋爲什麼? –

+0

是不是我(雖然我知道downvote因爲有人問爲什麼downvote)。然而,字節碼轉換爲機器碼並不普遍。 –

1

Java平臺: 高級語言 - >字節碼 字節碼是由VM如JVM

執行

.Net平臺: 高級語言 - > CIL(通用中間語言)---就在編譯(JIT)--->本機代碼

本地編譯時間: 高級語言 - >目標代碼(本機代碼)---連接 - >可執行文件(本機代碼) 鏈接負責修復變量之間的地址引用r事情。

1

據官方稱,由於(至少不是在Java中)「字節碼」沒有這樣的事 - 這是簡單的「代碼」。 (您不會在Java虛擬機規範中的任何位置找到「字節碼」。)

但非正式地,它是應用於Java內Java方法定義的「代碼」屬性中的虛擬機「指令」的術語。類文件。此術語也適用於其他幾種語言(如C++)的虛擬機指令(可能沒有更多「嚴格」)。

虛擬機指令的概念一般同意源於UCSD Pascal的「p代碼」以及一些相關的早期Pascal語言實現。基本上,這些是編譯器「intermediate language」的一種形式,可以直接由「virtual machine」解釋,與需要額外編譯步驟以轉換爲本機機器碼相對。通常,虛擬機指令集被設計爲(儘可能地)是「機器獨立的」,並且不特定於任何特定的操作系統或硬件指令集。

字節碼指令通常是對「stack architecture」的簡單操作。堆棧體系結構非常方便,因爲它易於編譯,允許「指令」非常簡單,易於解釋,並且是常規編譯器場景中後續優化和代碼生成步驟的方便「源」。 (一個明顯的例外是虛擬機,其指令集不是堆棧架構,而是基於寄存器的架構。)

在Java中,Java程序最常見的情況是最初是「解釋「,其中字節代碼由JVM解釋器」執行「。然後,如果單獨的方法被確定爲「熱」(高度使用),則使用「即時編譯器」(JITC)將各個方法編譯到「目標」硬件的指令集中。其他語言實現可以保持完全解釋或可以立即翻譯成機器指令。