Java字節碼
編輯與Java的關系
編輯一個Java的程序員不需要知道或了解Java字節碼的。但是,正如IBM?developerWorks期刊中所建議的那樣,“理解字節碼以及Java編譯器可能生成的字節碼將以與匯編知識有助于C或C ++程序員相同的方式幫助Java程序員。”
指令集架構
編輯JVM既是堆棧機又是寄存器機。方法調用的每個幀都有一個“操作數堆棧”和一個“局部變量”數組。操作數堆棧用于計算操作數和接收被調用方法的返回值,而局部變量的作用與寄存器相同,還用于傳遞方法參數。由編譯器計算的操作數堆棧和局部變量數組的xxx大小是每種方法的屬性的一部分。每個值的大小可以從0到65535獨立設置,其中每個值都是32位。long
和double
類型(均為64位)占用兩個連續的局部變量(不需要在局部變量數組中進行64位對齊)或操作數堆棧中的一個值(但在操作數堆棧中計為兩個單位)堆棧的深度)。
指令集
每個字節碼由代表操作碼的一個字節以及用于操作數的零個或多個字節組成。
截至2015年,在256種可能的字節長操作碼中,有202種正在使用(?79%),51種保留供將來使用(?20%),3條指令(?1%)xxx保留給JVM實現,以用于采用。其中兩個(impdep1
和impdep2
)分別為實現特定的軟件和硬件提供陷阱。第三個用于調試器實現斷點。
說明分為以下幾大類:
- 加載和存儲(例如
aload_0
,istore
) - 算術和邏輯(例如
ladd
,fcmpl
) - 類型轉換(例如
i2b
,d2i
) - 對象的創建和處理(
new
,putfield
) - 操作數棧管理(例如
swap
,dup2
) - 控制轉移(例如
ifeq
,goto
) - 方法調用和返回(例如
invokespecial
,areturn
)
對于一些更專門的任務,也有一些說明,例如異常拋出、同步等。
一代
編輯通過生成Java字節碼而針對Java虛擬機的最常見語言是Java。最初只有一個編譯器,即Sun Microsystems的javac編譯器,它將Java源代碼編譯為Java字節碼。但是,由于Java字節碼的所有規范現在都可用,因此其他各方已提供了產生Java字節碼的編譯器。其他編譯器的示例包括:
- Jikes,從Java編譯為Java字節碼(由IBM開發,以C ++實現)
- Espresso,從Java編譯為Java字節碼(僅Java 1.0)
- GNU Java編譯器(GCJ),從Java編譯為Java字節碼;它也可以編譯為本地機器代碼,并且一直是GNU Compiler Collection(GCC)的一部分,直到版本6。
一些項目提供了Java匯編器,以允許手動編寫Java字節碼。匯編代碼也可以由機器(例如,針對Java虛擬機的編譯器)生成。著名的Java匯編器包括:
- Jasmin用Java虛擬機指令集以類似于匯編的簡單語法編寫Java類的文本描述,并生成Java類文件
- 牙買加,一個宏?匯編語言的Java虛擬機。Java語法用于類或接口定義。方法主體是使用字節碼指令指定的。
- Krakatau字節碼工具當前包含三個工具:用于Java類文件的反編譯器和反匯編器,以及用于創建類文件的匯編器。
- Lilac、Java虛擬機的匯編程序和反匯編程序。
其他人則針對不同的編程語言開發了針對Java虛擬機的編譯器,例如:
- 冷融合
- JRuby和Jython,兩種基于Ruby和Python的腳本語言
- Apache Groovy,一種基于Java的腳本語言
- Scala是一種類型安全的通用編程語言,支持面向對象和函數式編程
- JGNAT和AppletMagic,從語言Ada編譯為Java字節碼
- C到Java字節碼編譯器
- Clojure是Lisp系列中的一種功能性,不變的通用編程語言,特別強調并發性
- Kawa是Scheme編程語言的一種實現,也是Lisp的一種方言。
- MIDletPascal
- JavaFX腳本代碼被編譯為Java字節碼
- Kotlin,一種具有類型推斷的靜態類型通用編程語言
- 使用Free Pascal?3.0+編譯器將對象Pascal源代碼編譯為Java字節碼。
Java字節碼的執行
編輯如果不希望在Java虛擬機中執行Java字節碼,則開發人員還可以使用諸如Java的GNU編譯器(GCJ)之類的工具將Java源代碼或字節碼直接編譯為本機代碼。一些處理器可以本地執行Java字節碼。這種處理器稱為Java處理器。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/116412/