跳至內容
主選單
主選單
移至側邊欄
隱藏
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
Taiwan Tongues 台語維基
搜尋
搜尋
外觀
建立帳號
登入
個人工具
建立帳號
登入
檢視 Java位元組碼 的原始碼
頁面
討論
臺灣正體
閱讀
檢視原始碼
檢視歷史
工具
工具
移至側邊欄
隱藏
操作
閱讀
檢視原始碼
檢視歷史
一般
連結至此的頁面
相關變更
特殊頁面
頁面資訊
外觀
移至側邊欄
隱藏
←
Java位元組碼
由於以下原因,您無權編輯此頁面:
您請求的操作只有這些群組的使用者能使用:
使用者
、taigi-reviewer、apibot
您可以檢視並複製此頁面的原始碼。
'''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 操作碼。 ==參考文獻== [[分類: 待校正]]
返回到「
Java位元組碼
」。