Java位元組碼
Java 位元組碼(英語:Java bytecode)是 Java 虛擬機器執行的一款指令格式。大多數操作碼攏是一个位元組長,有一寡操作需要參數,致使著有一寡多位元組的操作碼。而且並毋是所有可能的兩百五十六葩操作碼攏予人咧用;其中五十一个操作碼予人保留做將來使用。除了這以外,原始 Java 平台開發商,昇陽微系統,額外保留三个代碼永久無使用。
佮 Java 的關係
一个 Java 程式設計師並無需要理解所有的 Java 位元組碼。猶毋過,就親像 IBM developerWorks 周刊建議的按呢:「 理解位元組碼以及理解 Java 編譯器如何生成 Java 位元組碼佮學習組譯智識對 C / C + + 程式設計師有仝款的意義。」
指令
每一个位元組,有兩百五十六个可能的代碼值(二十八=兩百五十六), 所以一个位元組的操作碼上濟可能有二百五十六種無仝款的操作。其中,零 x 零、零 xFE、零 xCA、零 xFF 予人指定保留。譬如講零 xCA 做為一个 Java 除錯器的斷指令若無被語言使用。相𫝛的地,零 xFE 佮零 xFF 嘛無予語言使用。
指令會當基本分為以下幾類:
- 儲存指令(比如講:aload \ _ 零 , istore)
- 算術佮邏輯指令(比如講 : ladd , fcmpl)
- 類型轉換指令(比如講:i 二 b , d 二 i)
- 物件建立佮操作指令(比如講:new , putfield)
- 疊操作指令(比如講:swap , dup 二)
- 控制轉移指令(比如講:ifeq , goto)
- 方法呼叫佮返回指令(比如講:invokespecial , areturn )
除了這以外,閣有一寡閣較特殊的指令,當做異常跋無仝步等作用。
大多數的指令有字條佮(抑是)字尾來表明其運算元的類型。如下表比如講," iadd " 指令將兩个整數相加;而且 " dadd " 指令共兩个 double 浮點數相加。此外," const "、" load "、" store " 等命令閣會使用 " \ _ n " 字尾,其中 " load " 和 " store " 命令著的 _ n _ 會當為零到三之間的整數;而且 " const " 命令著的 n 由類型指定。 " const " 指令共一个指定類型的值囥入去疊。比如講 " iconst \ _ 五 " 指令共一个整數五囥落來疊起來;而且 " dconst \ _ 一 " 共一个雙精度浮點數一囥入去疊。 此外閣有 " aconst \ _ null " 指令,放入一个 null 進堆疊。而對 " load " " store " 指令著的 n,指定了變數表內底的儲存位置。" aload \ _ 零 " 指令共佇變數零中的物件(通常是 " this " 東西)囥入去疊," istore \ _ 一 " 指令共棧頂的一个整數囥入變數一 . 對閣較懸的變數,這字尾將去除,這條指令將需要運算元。
計算模型
Java 位元組碼的計算模型是疊導向結構電腦的。比如講,一个 x 八十六處理器的組譯代碼如下這段代碼將兩數值相加,並存入另外一个位址。相𫝛的反組譯位元組碼如下佇遮,需要相加的兩個運算元予人囥入去疊,相加操作就佇咧棧中進行,其實嘛予人囥入去疊。儲存指令了後共棧頂的資料囥入一个變數位址。佇逐條指令頭前的數字干焦是表示這條指令方法開始處的偏移值。這種堆疊結構嘛會當推廣到物件導向模型上。比如講,有一个 " getName " 方法假下
例
考慮如下 Java 代碼假設上術代碼位佇一个函式當中,Java 編譯器可能共代碼翻做下述的 Java 位元組碼。
是因為 Java 位元組碼的語言
上捷用的彼个基於 Java 位元組碼的語言就是開發出 Java 位元組碼的 Java 語言。伊起先,干焦存在一个由昇陽微系統開發的一个編譯器 javac。這馬 Java 位元組碼規範已經會用得著,所以,第三方公司亦開發出支援 Java 位元組碼的編譯器。比如講:
- Jikes,編譯 Java 原始碼到 Java 位元組碼(由 IBM 開發,用 C + + 實現)
- Espresso,編譯 Java 原始碼到 Java 位元組碼(干焦支援 Java 一垺零)
- GCJ,GNU Compiler for Java,編譯 Java 代碼到 Java 位元組碼;抑是會當編譯著機械碼。做為 GNU Compiler Collection ( GCC ) 的一部份提供。
有一寡案提供 Java 組譯器就較好直接用 Java 位元組碼進行開發。主要的 Java 組譯器如下:
- Jasmin,讀取 Java 類別的文字描寫;用一種簡單的使用 Java 虛擬機器指令的類組譯語法,輸出 Java 類別檔案
- Jamaica,一種為 Java 虛擬機器編寫的宏組合語言。其中,會當介面由 Java 語法定義,抑若其中的方法煞由 Java 位元組碼定義。
閣有其他的一寡編譯器,對其他的語言生成 Java 位元組碼,使其實會當執行佇 Java 虛擬機器之上。
- ColdFusion
- JRuby 和 Jython,兩種因為 Ruby 和 Python 的手稿語言
- Groovy , 一種因為 Java 的手稿語言
- Scala , 一種類型安全的通用程式語言,支援物件導向程式設計佮函式語言程式設計
- JGNAT 和 AppleMagic , 編譯 Ada 語言到 Java 位元組碼
- Clojure , 一種函數式的通用程式語言,提供優秀的並行性。是一種 LISP 方言
- MIDletPascal
- JavaFX Script 由昇陽微系統公司開發的一種手稿語言,執行 Java 虛擬機器之上
執行
當前已經有足濟種 Java 虛擬機器產品,包括著自由軟體佮商業軟體。 若佇咧 Java 虛擬機器之中執行 Java 位元組碼並無理想,會當使用一寡工具譬如講 GNU Compiler for Java 將 Java 代碼抑是講 Java 位元組碼編譯做機器碼並由硬體直接執行。 閣有一寡處理器會當直接執行 Java 位元組碼,這種處理器名做 Java 處理器。
對動態語言的支援
Java 虛擬機器對動態型別語言提供了一定的支援。但是真多數 Java 虛擬機器指令集是因為靜態型別語言的。佇靜態型別機制下,方法呼叫中的類型分析攏是咧編譯的時執行的,而且欠缺一種機制佇執行的時陣確定一个類型已經確定相應的方法。
JSR 兩百九十二中,佇咧 Java 虛擬機器層次增加一種支援動態型別的指令 ` invokedynamic `,以支援佇動態型別檢測中的方法呼叫。達文西機器是一種支援這種動態型莫呼叫的虛擬機器。所有支援 JSE 七的 Java 虛擬機器攏應支援 invokedynamic 操作碼。