對(duì)于熟悉Java編程的開發(fā)人員而言,JVM指令和Java字節(jié)碼往往是比較關(guān)鍵的概念。Java程序可以編譯成Java字節(jié)碼,這是一種中間格式,之后由JVM解釋執(zhí)行,最終實(shí)現(xiàn)程序的運(yùn)行。
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
上述代碼被編譯成了如下的字節(jié)碼:
0: iconst_0 1: istore_1 2: iload_1 3: iiconst_5 4: if_icmpge 27 7: getstatic #2; //Field java/lang/System.out:Ljava.io.PrintStream; 10: ldc #3; //String Hello, World! 12: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 15: iinc 1, 1 18: goto 2 21: astore_2 22: aload_2 23: invokevirtual #5; //Method java/lang/Exception.printStackTrace:()V 26: return 27: return
可以看到,Java字節(jié)碼是一種棧式指令集,也就是說,這些指令基于操作數(shù)棧進(jìn)行操作。例如,在代碼的第7行,我們調(diào)用了靜態(tài)方法System.out,這個(gè)方法會(huì)將PrintStream對(duì)象推入到棧中。接著,在第10行,我們將字符串Hello, World!推入到棧中。最后,在第12行,我們調(diào)用了println方法,這個(gè)方法會(huì)彈出兩個(gè)元素(PrintStream對(duì)象和字符串),之后將字符串輸出到控制臺(tái)。
雖然Java字節(jié)碼通常是由Java源代碼編譯而來,但是我們也可以手動(dòng)編寫Java字節(jié)碼,然后由JVM解釋執(zhí)行。因此,了解Java字節(jié)碼和JVM指令是成為高級(jí)Java開發(fā)人員的關(guān)鍵一步。