《Java虛擬機規範(Java SE 7版)》是Java領域最重要和最權威的著作之一,由Oracle官方發布,基於Java SE 7,對最新的Java虛擬機規範進行了完整且詳細的講解,是深度了解Java虛擬機實現細節的必讀之作。由國內幾位資深的Java技術專家聯袂翻譯。《Java虛擬機規範(Java SE 7版)》共7章,第1章從巨觀的角度介紹了Java虛擬機與Java的關係與發展歷程。第2章概覽了Java虛擬機整體架構,包括class檔案格式、數據類型、原始類型、引用類型、運行時數據區、棧幀、浮點算法、異常等,這對理解本書後面的內容有重要幫助。第3章詳述如何將Java語言編寫的程式轉換為Java虛擬機指令集,涉及常量、局部變數、控制結構、算術運算、參數接收、方法調用、數組、運算元棧異常處理、同步與註解等。第4章深入分析了用來表示編譯後的類和接口的class檔案格式,主要包括ClassFile結構、描述符與簽名、常量池、欄位、方法、屬性、代碼約束與class檔案校驗等。第5章定義了Java虛擬機啟動以及類和接口的載入、連結和初始化過程。第6章闡釋並列舉了Java虛擬機指令集。第7章提供了一張以操作碼值為索引的Java虛擬機操作碼助記符表。
基本介紹
- 書名:Java虛擬機規範
- 作者:Tim Lindholm Frank Yellin
- 出版社:機械工業出版社
- 頁數:316頁
- 開本:16
- 品牌:機械工業出版社
- 外文名:The Java Virtual Machine Specification, Java SE 7 Edition
- 類型:計算機與網際網路
- 出版日期:2013年12月15日
- 語種:簡體中文
- ISBN:9787111445159
基本介紹
內容簡介
作者簡介
Frank Yellin?Sun公司高級工程師,Java項目元老級成員。最近十餘年中,他都從事解釋型及編譯型語言的運行時系統方面的工作。在到Sun公司工作之前,他在Lucid公司從事Common Lisp編譯器相關的工作。
Gilad Bracha?Newspeak程式語言的創建者,Sun公司傑出工程師。在到Sun公司工作之前,他在Animorphic Smalltalk System公司從事Strongtalk語言相關的工作。
Alex Buckley?Oracle公司Java程式語言和Java虛擬機規範負責人。
圖書目錄
譯者序
前言
第2版前言
第1版前言
第1章 引言1
1.1 簡史1
1.2 Java虛擬機2
1.3 各章節摘要2
1.4 說明3
第2章 Java虛擬機結構4
2.1 class檔案格式4
2.2 數據類型5
2.3 原始類型與值5
2.3.1 整數類型與整型值6
2.3.2 浮點類型、取值集合及浮點值6
2.3.3 returnAddress類型和值8
2.3.4 boolean類型8
2.4 引用類型與值9
2.5 運行時數據區9
2.5.1 pc暫存器9
2.5.2 Java虛擬機棧9
2.5.3 Java堆10
2.5.4 方法區11
2.5.5 運行時常量池11
2.5.6 本地方法棧11
2.6 棧幀12
2.6.1 局部變數表13
2.6.2 運算元棧13
2.6.3 動態連結14
2.6.4 方法正常調用完成14
2.6.5 方法異常調用完成15
2.7 對象的表示15
2.8 浮點算法15
2.8.1 Java虛擬機和IEEE 754中的浮點算法15
2.8.2 浮點模式16
2.8.3 數值集合轉換16
2.9 特殊方法17
2.10 異常18
2.11 位元組碼指令集簡介20
2.11.1 數據類型與Java虛擬機21
2.11.2 載入和存儲指令23
2.11.3 算術指令23
2.11.4 類型轉換指令24
2.11.5 對象創建與操作26
2.11.6 運算元棧管理指令26
2.11.7 控制轉移指令27
2.11.8 方法調用和返回指令27
2.11.9 拋出異常28
2.11.10 同步28
2.12 類庫28
2.13 公有設計,私有實現29
第3章 Java虛擬機編譯器30
3.1 示例的格式說明30
3.2 常量、局部變數和控制結構的使用31
3.3 算術運算35
3.4 訪問運行時常量池35
3.5 更多控制結構示例36
3.6 接收參數39
3.7 方法調用39
3.8 使用類實例42
3.9 數組43
3.10 編譯switch語句45
3.11 使用運算元棧46
3.12 拋出異常和處理異常47
3.13 編譯finally語句塊50
3.14 同步53
3.15 註解54
第4章 class檔案格式55
4.1 ClassFile結構56
4.2 各種內部表示名稱60
4.2.1 類和接口的二進制名稱60
4.2.2 非全限定名60
4.3 描述符和簽名61
4.3.1 語法符號61
4.3.2 欄位描述符61
4.3.3 方法描述符63
4.3.4 簽名63
4.4 常量池66
4.4.1 CONSTANT_Class_info結構67
4.4.2 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_Interface Methodref_info結構67
4.4.3 CONSTANT_String_info結構69
4.4.4 CONSTANT_Integer_info和CONSTANT_Float_info結構69
4.4.5 CONSTANT_Long_info和CONSTANT_Double_info結構70
4.4.6 CONSTANT_NameAndType_info結構71
4.4.7 CONSTANT_Utf8_info結構72
4.4.8 CONSTANT_MethodHandle_info結構74
4.4.9 CONSTANT_MethodType_info結構74
4.4.10 CONSTANT_InvokeDynamic_info結構75
4.5 欄位75
4.6 方法77
4.7 屬性80
4.7.1 自定義和命名新的屬性81
4.7.2 ConstantValue屬性81
4.7.3 Code屬性82
4.7.4 StackMapTable屬性85
4.7.5 Exceptions屬性91
4.7.6 InnerClasses屬性92
4.7.7 EnclosingMethod屬性94
4.7.8 Synthetic屬性94
4.7.9 Signature屬性95
4.7.10 SourceFile屬性96
4.7.11 SourceDebugExtension屬性96
4.7.12 LineNumberTable屬性97
4.7.13 LocalVariableTable屬性98
4.7.14 LocalVariableTypeTable屬性99
4.7.15 Deprecated屬性101
4.7.16 RuntimeVisibleAnnotations屬性101
4.7.17 RuntimeInvisible Annotations屬性105
4.7.18 RuntimeVisibleParameter Annotations屬性106
4.7.19 RuntimeInvisibleParameter Annotations屬性107
4.7.20 AnnotationDefault屬性108
4.7.21 BootstrapMethods屬性108
4.8 格式檢查110
4.9 Java虛擬機代碼約束110
4.9.1 靜態約束110
4.9.2 結構化約束113
4.10 class檔案校驗115
4.10.1 類型檢查驗證116
4.10.2 類型推導驗證178
4.11 Java虛擬機限制184
第5章 載入、連結與初始化186
5.1 運行時常量池186
5.2 虛擬機啟動188
5.3 創建和載入188
5.3.1 使用引導類載入器來載入類型190
5.3.2 使用用戶自定義類載入器來載入類型190
5.3.3 創建數組類191
5.3.4 載入限制191
5.3.5 從class檔案表示得到類192
5.4 連結193
5.4.1 驗證194
5.4.2 準備194
5.4.3 解析195
5.4.4 訪問控制201
5.4.5 方法覆蓋201
5.5 初始化202
5.6 綁定本地方法實現203
5.7 Java虛擬機退出203
第6章 Java虛擬機指令集204
6.1 設定:“必須”的含義204
6.2 保留操作碼204
6.3 虛擬機錯誤205
6.4 指令描述格式205
6.5 指令集描述207
第7章 操作碼助記符293
附錄A Limited License Grant300
文摘
引 言
1.1 簡史
Java語言是一門通用的、面向對象的、支持並發的程式語言。它的語法與C和C++語言非常相似,但隱藏了C和C++中許多複雜、深奧及不安全的語言特性。Java平台最初用於解決基於網路的消費類設備上的軟體開發問題,它在設計上就考慮到要支持部署在不同架構的主機上,並且不同組件之間可以安全地互動。面對這些需求,編譯出來的本地代碼必須解決不同網路間的傳輸問題,可以操作各式各樣的客戶端,並且還要在這些客戶端上能安全正確地運行。
伴隨著全球資訊網的盛行發生了一些十分有趣的事情:Web瀏覽器允許數以百萬計的用戶共同在網上衝浪,以及通過很簡單的方式訪問豐富多樣的內容。用戶衝浪所使用的設備並不是其中的關鍵,它們僅僅是一種媒介,無論機器的性能如何,無論使用高速網路還是慢速的modem,這些外界因素本質上與你所看到的、聽到的內容沒有任何關係。
Web狂熱者很快就發現網路信息的載體——HTML文檔格式對信息的表達有很多限制,HTML的一些擴展套用,譬如網頁表單,讓這些限制顯得更加明顯。顯而易見,沒有任何瀏覽器能夠承諾它可以提供給用戶所需要的全部特性,擴展能力將是解決這個問題的唯一答案。
Sun公司的HotJava瀏覽器是世界上第一款展現出Java語言某些有趣特性的瀏覽器,它允許把Java代碼內嵌入HTML頁面。在HTML頁面呈現的時候,這些Java代碼顯式地下載至瀏覽器中。而在瀏覽器獲取這些代碼之前,它們已經過嚴謹地檢查以保證它們是安全的。與HTML語言一樣,這些Java代碼與網路和主機是完全無關的,無論代碼來自哪裡,在哪台機器上執行,它們執行時都能表現出一致的行為。
帶有Java技術支持的網頁瀏覽器將不再受限於它本身所提供的功能。瀏覽網頁的用戶可以放心地假定在他們機器上運行的動態內容不會損害其機器。軟體開發人員編寫一次代碼,程式就可以運行在所有支持Java運行時環境的機器之上。
序言
本書整合了自1999年《Java虛擬機規範(第2版)》發布以來Java世界所出現的技術變化。另外,還修正了第2版中的許多錯誤,以及對目前主流Java虛擬機實現來說已經過時的內容。最後還處理了一些Java虛擬機和Java語言概念的模糊之處。
針對本書,讀者有任何勘誤或模糊之處,均可發郵件到[email protected]。
2004年發布的Java SE 5.0版為Java語言帶來了翻天覆地的變化,但是對Java虛擬機設計的影響則相對較小。在Java SE 7這個版本中,我們擴充了class檔案格式以便支持新的Java語言特性,譬如泛型和變長參數方法等。
2006年發布的Java SE 6.0版看起來並沒有為Java語言帶來什麼新的變化,但是對Java虛擬機的影響就比較大。如新的位元組碼驗證方式,它源於Eva Rose的一篇碩士論文,文中以Java Card平台為背景,展示了Java虛擬機位元組碼驗證的另一種全新的實現思路。這促進了Java ME CLDC第1版實現的誕生,並最終成為Java SE平台class驗證過程的理論基礎。關於這部分內容將會在第4章中介紹。
Sheng Liang實現了Java ME CLDC的驗證器。Gilad Bracha負責對該驗證器做出詳細說明,Antero Taivalsaari則是整個Java ME CLDC規範的負責人。Alessandro Coglio在位元組碼驗證的分析方面的工作對本規範做出了很大的貢獻。Wei Tao、Frank Yellin、TimLindholm與Gilad Bracha一起實現的Prolog驗證器是Java ME和Java SE平台規範的共同基礎。Wei Tao後續繼續實現了實際運用於Hot Spot Java虛擬機的驗證器。之後Mingyao Yang改進了規範和設計,形成了Java SE 6中的最終實現版本。該規範成文得益於以下JSR 202專家組成員:Peter Burka、Alessandro Coglio、Sanghoon Jin、Christian Kemper、Larry Rau、EvaRose以及 Mark Stolz。
在2011年發布的Java SE 7平台終於兌現了在1997年《Java虛擬機規範》第1版中就已做出的承諾:“在未來,我們會對Java虛擬機進行適當擴展,以便更好地支持其他語言運行於JVM之上。”Gilad Bracha的工作是開發Java虛擬機中的熱替換(hotswapping)功能,以及在Java虛擬機靜態類型系統上支持動態類型語言實現。invokedynamic指令以及支持這個指令的基礎架構由John Rose以及JSR 292專家組成員:Ola Bini、 Rémi Forax、Dan Heidinga、Fredrik ?hrstr?m、JochenTheodorou進行開發。還有Charlie Nutter和Christian Thalinger做出了特別貢獻。
還有許多人的名字應當出現在這裡,他們在不同時間段對Java虛擬機的設計和實現做出過貢獻。我們今天所見的Java虛擬機擁有卓越的執行性能,這離不開DavidUngar和他的同事們在Sun實驗室Self項目中所積累的技術基礎。這些技術最初用於Self語言,後來形成了Animorphic Smalltalk虛擬機,經過長期而曲折的發展,最終成為今天Oracle HotSpot JVM的技術基礎。Lars Bak和Urs H?lzle經歷了所有上述的技術發展階段,對於今天的Java虛擬機能夠擁有大家認為理所當然的高效執行性能,他們實在是居功至偉。
本規範中很多意義深遠的改進來自於Martin Buchholz、Brian Goetz、Paul Hohensee、David Holmes、Karen Kinnear、Keith McGuigan、Jeff Nisewanger、 Mark Reinhold、Naoto Sato、BillPugh、Uday Dhanikonda、Janet Koenig、AdamMessinger、John Pampuch、Georges Saab和Bernard Traversat所作出的貢獻。Jon Courtney和Roger Riggs幫助我們保證此規範的內容可同時適用於Java ME和Java SE平台。Leonid Arbouzov、Stanislav Avzan、Yuri Gaevsky、Ilya Mukhin、Sergey Reznick和Kirill Shirokov在Java技術兼容包(JavaCompatibility Kit,JCK)上作出了卓越貢獻,以保證本規範中描述的內容是可測試並且已測試的。
Gilad Bracha
Los Altos,California
Alex Buckley
Santa Clara,California