Java是現(xiàn)代編程語言的一種,其跨平臺(tái)特性和安全性被廣泛使用。Java代碼先經(jīng)過編譯器編譯成字節(jié)碼文件,再由虛擬機(jī)進(jìn)行解釋執(zhí)行。字節(jié)碼文件是在Java虛擬機(jī)中運(yùn)行的文件。
Java字節(jié)碼和機(jī)器碼的關(guān)系:Java字節(jié)碼是與平臺(tái)無關(guān)的中間層代碼,需要被虛擬機(jī)轉(zhuǎn)換為機(jī)器碼或是JIT編譯器編譯成本地代碼才能被處理器執(zhí)行。由于Java跨平臺(tái)的特性,其字節(jié)碼可在不同平臺(tái)上通過虛擬機(jī)得到解釋執(zhí)行,所以java字節(jié)碼的執(zhí)行需要較多的時(shí)間。
//Java代碼示例 public class HelloWorld{ public static void main(String[] args) { System.out.println("Hello World!"); } }
上述Java代碼經(jīng)過編譯器編譯成字節(jié)碼文件如下所示:
//字節(jié)碼文件示例 //Classfile /xxx/HelloWorld.class // Last modified Jan 25, 2022; size 293 bytes // MD5 checksum 516aa1e04dabfd4bf165756ced82f460 // Compiled from "HelloWorld.java" public class HelloWorld { public HelloWorld(); public static void main(java.lang.String[]); }
字節(jié)碼文件中的指令都是以16進(jìn)制數(shù)表示的,例如指令 0x35 表示 ICONST_3,它是將整數(shù)值 3 壓入棧中。
機(jī)器指令是一種CPU能夠識(shí)別并執(zhí)行的指令碼。Java程序在執(zhí)行時(shí),Java虛擬機(jī)將字節(jié)碼轉(zhuǎn)換為機(jī)器指令集來執(zhí)行程序。
與匯編語言相比,機(jī)器指令更為簡單,常見的機(jī)器指令包括 MOV、ADD、SUB、JMP等等。在匯編語言中,每個(gè)指令都對(duì)應(yīng)多個(gè)機(jī)器指令,經(jīng)過匯編器匯編之后,能夠生成機(jī)器指令。
Java程序執(zhí)行的過程:Java程序以字節(jié)碼的形式在虛擬機(jī)中運(yùn)行,虛擬機(jī)將字節(jié)碼轉(zhuǎn)換為機(jī)器指令并交給CPU執(zhí)行,最終產(chǎn)生輸出。
總之,Java字節(jié)碼是Java程序的中間層,在JAVA虛擬機(jī)中運(yùn)行。Java虛擬機(jī)將字節(jié)碼轉(zhuǎn)換為機(jī)器碼來執(zhí)行程序。