虛擬機執行子系統
類文件格式
大量建立在虛擬機之上的程序語言將編寫的程序編譯成二進制本地機器碼(Native Code)已不再是唯一的選擇,越來越多的程序語言選擇了與操作系統和機器指令集無關的,平臺中立的格式作為程序編譯後的存儲格式。
各種不同平臺的虛擬機與所有平臺都統一使用的程序存儲格式--字節碼(ByteCode)是構成平臺無關性的基石。
實現語言無關性的基礎仍然是虛擬機和字節碼存儲格式。Java虛擬機不和包括Java在內的任何語言綁定,它只與“Class文件”這種特定的二進制文件格式所關聯,Class文件中包含了Java虛擬機指令集合符號表以及若幹其他輔助信息。利用各種不同語言的編譯器吧程序代碼編譯成Class文件,虛擬機並不關心Class的來源是何種語言。
Java語言中的各種變量,關鍵字和運算符的語義最終都是由多條字節碼命令組合而成的,因此字節碼命令所能提供的語義描述能力肯定會比Java語言本身更加強大。因此,有一些Java語言本身無法有效支持的語言特性不代表字節碼本身無法有效支持,這也為其他語言實現一些有別於Java的語言特性提供了基礎。
class類文件的結構
任何一個Class文件都對應著唯一一個類或接口的定義信息,但反過來說,類或接口並不一定都得定義在文件中(類或接口也可以通過類加載器直接生成)
Class文件是一組以8位字節為基礎單位的二進制流,各個數據項目嚴格按照順序緊湊排列在Class文件之中,中間沒有添加任何分隔符,這使得整個Class文件中存儲的內容幾乎全部是程序運行的必要數據,沒有空隙存在。當遇到需要占用8位字節以上空間的數據項時,則會按照高位在前的方式分割成若幹個8位字節進行存儲。
根據Java虛擬機規範中的規定,Class文件格式采用一種類似於C語言結構體的偽結構來存儲數據,這種偽結構中只有兩種數據類型:無符號數和表。
- 無符號數屬於基本的數據類型,以u1,u2,u4,u8來分別代表1字節,2字節,4字節,8字節的無符號數。可以用來描述數字,索引引用,數量值或安裝UTF-8編碼構成字符串值。
- 表是由多個無符號數或其他表作為數據項構成的復合數據類型,所有表都習慣性地以“_info”結尾。表用於描述有層次關系的符合結構的數據,整個Class文件本質上就是一張表。
字節碼指令
虛擬機類加載機制
虛擬機字節碼執行引擎
參考資料
虛擬機執行子系統