Can you summarize the following document?
        
  一個Java程式設計師並不需要理解所有的Java位元組碼。但是,就像IBM developerWorks週刊建議的那樣:“理解位元組碼以及理解Java編譯器如何生成Java位元組碼與學習彙編知識對於C/C++程式設計師有一樣的意義。”

  每一個位元組,有256個可能的程式碼值(2=256),因此一個位元組的操作碼最多可能有256種不同的操作。其中,0x00、0xFE、0xCA、0xFF被指定保留。例如0xCA作為一個Java偵錯程式的中斷指令而從未被語言使用。相似地,0xFE和0xFF也未被語言使用。  指令可以基本分為以下幾類:  除此之外,還有一些更特殊的指令,作為異常丟擲或同步等作用。  大多數的指令有字首和(或)字尾來表明其運算元的型別。如下表  例如,"iadd"指令將兩個整數相加;而"dadd"指令將兩個double浮點數相加。 此外,"const"、 "load"、 "store"等命令還會使用"_n"字尾,其中 "load"和"store"命令中的"n"可以為0到3之間的整數;而"const"命令中的n由型別指定。 "const"指令把一個指定型別的值放入堆疊。例如"iconst_5"指令將一個整數5放入堆疊;而"dconst_1"將一個雙精度浮點數1放入堆疊。 此外還有"aconst_null"指令,放入一個null進堆疊。而對於"load" "store"指令中的n,指定了變數表中的儲存位置。"aload_0"指令把在變數0中的物件(通常是"this"物件)放入堆疊,"istore_1"指令把棧頂的一個整數放入變數1.對於更高的變數,字尾將被去除,而這條指令將需要運算元。

  Java位元組碼的計算模型是面向堆疊結構計算機的。例如,一個x86處理器的彙編程式碼如下 這段程式碼將兩個數值相加,並存入另一個地址。相似的反彙編位元組碼如下 在這裡,需要相加的兩個運算元被放入堆疊,而相加操作就在棧中進行,其結果也被放入堆疊。儲存指令之後把棧頂的資料放入一個變數地址。在每條指令前面的數字僅僅是表示這條指令到方法開始處的偏移值。這種堆疊結構也可以推廣到物件導向模型上。例如,有一個"getName"方法如下

  考慮如下Java程式碼  假設上述程式碼位於一個函式中,Java編譯器可能將程式碼翻譯成下述的Java位元組碼。

  最常用的基於Java位元組碼的語言就是開發出Java位元組碼的Java語言。剛開始,只存在一個由昇陽微系統開發的一個編譯器javac。而現在Java位元組碼規範已經可以得到,因此,第三方公司亦開發出支援Java位元組碼的編譯器。例如: 有一些專案提供Java彙編器以便於直接用Java位元組碼進行開發。主要的Java彙編器如下:  還有其他的一些編譯器,對於其他語言生成Java位元組碼,使其可以執行在Java虛擬機器之上。

  當前已經有很多種Java虛擬機器產品,包括了自由軟體和商業軟體。 如果在Java虛擬機器之中執行Java位元組碼並不理想,則可以使用一些工具例如GNU Compiler for Java將Java程式碼或Java位元組碼編譯成機器碼並由硬體直接執行。 而有一些處理器可以直接執行Java位元組碼,這種處理器名為Java處理器。

  Java虛擬機器對動態型別語言提供了一定的支援。但絕大多數的Java虛擬機器指令集是基於靜態型別語言的。在靜態型別機制下,方法呼叫中的型別分析都是在編譯時執行的,而且缺乏一種機制在執行時確定一個型別已經確定相應的方法。 JSR292中,在Java虛擬機器層次增加了一種支援動態型別的指令codice_1,以支援在動態型別檢測中的方法呼叫。 Da Vinci Machine 則是一種支援這種動態型別呼叫的虛擬機器。 而所有支援JSE 7的Java虛擬機器都應支援invokedynamic操作碼。
Java 位元組碼(英語:Java bytecode)是Java虛擬機器執行的一種指令格式。大多數都是一個位元組長,而有些操作需要引數,導致了有一些多位元組的操作碼。而且並不是所有可能的256個操作碼都被使用;其中有51個操作碼被保留做將來使用。除此之外,原始Java平臺開發商,昇陽微系統,額外保留了3個程式碼永久不使用。