一點點歷史
Java是一門通用的,支持并發(fā)且面相對象的編程語言兑宇。它的語法和 C、C++ 有些類似粱坤,但是它舍棄了 C/C++ 中許多復(fù)雜隶糕、難以理解且不安全的特性。最初站玄,Java平臺是為了解決那些面向網(wǎng)絡(luò)用戶的應(yīng)用程序構(gòu)建問題枚驻。它旨在支持多種主機(jī)架構(gòu),并允許軟件組件的安全交付株旷。為了滿足這些需求再登,編譯后的代碼必須能通過網(wǎng)絡(luò)傳輸尔邓,并能保證在任意的客戶機(jī)上安全的運行。
隨著萬維網(wǎng)(World Wide Web)的普及锉矢,Java 的這些屬性變得更加有趣梯嗽。網(wǎng)絡(luò)瀏覽器使成千上萬的人能便捷的訪問各種豐富多彩的媒體內(nèi)容。無論你使用的是什么機(jī)器沽损,什么操作系統(tǒng)灯节,是快速網(wǎng)絡(luò)還是慢速的調(diào)制解調(diào)器(slow modem),WWW能保證每個人獲取到的信息是一樣的绵估。
網(wǎng)絡(luò)愛好者很快發(fā)現(xiàn)HTML的格式支持的內(nèi)容太有限了炎疆。HTML的擴(kuò)展,例如表單壹士,僅僅是強調(diào)了這些限制磷雇,當(dāng)人們發(fā)現(xiàn)所有瀏覽器都無法同時包含用戶想要的所有特性。擴(kuò)展性變成了唯一的出路躏救。
HotJava(一種瀏覽器)因為使用了Java平臺,可以在HTML頁面中嵌入可執(zhí)行程序螟蒸。程序和HTML頁面一起下載到客戶的瀏覽器中盒使,再被瀏覽器解析之前,程序會仔細(xì)地檢查環(huán)境七嫌,確保安全少办。就像 HTML頁面一樣,編譯后的程序是網(wǎng)絡(luò)诵原,宿主機(jī)無關(guān)的英妓。同一個程序,無論它是通過什么途徑下載绍赛,也無論它是在什么樣的機(jī)器上被加載運行蔓纠,它們的行為總是一致的。
一個結(jié)合了Java平臺的Web瀏覽器不再局限于一組功能吗蚌。用戶在瀏覽動態(tài)內(nèi)容的網(wǎng)頁時腿倚,Java平臺可以確保他們的機(jī)器不會被破壞。開發(fā)者只需要把程序編譯一次蚯妇,就能在所有提供了Java運行環(huán)境的機(jī)器上執(zhí)行敷燎。
Java 虛擬機(jī)(JVM)
JVM是Java平臺的基礎(chǔ)。它從技術(shù)角度上使Java程序能夠跨硬件箩言,跨操作系統(tǒng)執(zhí)行硬贯。編譯后的代碼產(chǎn)物會很小,并且它能保證用戶不被惡意程序所影響陨收。
JVM是一個抽象的計算機(jī)器饭豹。就像一個真正的計算機(jī)一樣,它有指令集并且可以在運行時操控不通的內(nèi)存空間。在虛擬機(jī)上來實現(xiàn)一個編程語言是很常見的事墨状;最有名的虛擬機(jī)可能就是 UCSD Pascal 的 P-Code 了卫漫。
JVM的第一款原型是由 Sun公司實現(xiàn),emulated the Java Virtual Machine instruction set in software hosted by a handheld device that resembled a contemporary Personal Digital Assistant (PDA). Oracle當(dāng)前的實現(xiàn)可以在手機(jī)肾砂,桌面電腦與服務(wù)器中模擬JVM列赎,but the Java Virtual Machine does not assume any particular implementation technology, host hardware, or host operating system. It is not inherently interpreted, but can just as well be implemented by compiling its instruction set to that of a silicon CPU. It may also be implemented in microcode or directly in silicon.
JVM不關(guān)心Java語言的細(xì)節(jié),它只關(guān)心一個特定的二進(jìn)制格式镐确,class 文件包吝。一個 class 文件包含了JVM的指令(或者字節(jié)碼),一個符號表和其它的一些輔助信息源葫。
因為安全考慮诗越,JVM對class文件的語法與結(jié)構(gòu)有著嚴(yán)格的約束。但是息堂,只要能被編譯為一個有效的class文件嚷狞,任何編程語言都可以在JVM上運行。由于JVM的通用與跨平臺的特性荣堰,開發(fā)者可以基于JVM來實現(xiàn)自己的編程語言床未。
這里對JVM的所有說明與JAVA(SE8版本)平臺兼容,并支持在Java語言規(guī)范(SE 8版本)中的編程語言振坚。
文檔結(jié)構(gòu)
- 第二章會對JVM架構(gòu)做一個整體介紹
- 第三章會為大家介紹由Java語言編寫的代碼如何匯編成JVM的指令集
- 第四章定義了被編譯后的類與接口 -- 即class 文件的格式--一種硬件與平臺無關(guān)的二進(jìn)制格式
- 第五章定義了JVM如何啟動薇搁,加載,鏈接和如何對類和接口進(jìn)行初始化
- 第六章定義了JVM的指令集渡八,指令會以操作碼助記符的字母順序排序
- 第七章會列出JVM操作碼助記符的表格并以操作碼的值來作為索引
在第二版的JVM規(guī)范第二章中啃洋,概述了Java編程語言,該語言支持JVM規(guī)范屎鳍,但其本身并不是規(guī)范宏娄。在Java(SE8版本)的JVM規(guī)范中,讀者可以參考Java(SE8版本)的語言規(guī)范哥艇,來學(xué)習(xí)如何書寫Java代碼绝编。References of the form: (JLS §x.y) indicate where this is necessary.
在第二版JVM規(guī)范第八章中詳細(xì)說明了JVM線程與共享主內(nèi)存(shared main memory)交互的底層操作。而在JAVA(SE8版本)的JVM規(guī)范中貌踏,讀者可以參考Java(SE8版本)語言規(guī)范的第十七章十饥,了解有關(guān)線程和鎖的信息。第17章會對 JSR133專家組制定的Java內(nèi)存模型和線程規(guī)范進(jìn)行闡述祖乳。
一點點約定
本規(guī)范引用了來自 JavaSE平臺API的類和接口逗堵。在所有使用了(除了在例子中聲明的那些),標(biāo)記 N的地方眷昆,the intended reference is to the class or interface named N in the package java.lang. 除了java.lang
以外蜒秤,從其它包引用的類或者接口汁咏,會使用全限定名。
每當(dāng)我們使用名為java
的子包下的類或者接口的引用時作媚,那么我們會默認(rèn)其是由 bootstrap
類加載器來確定的攘滩。
在本規(guī)范中,某些特殊字體所代表的含義如下(見注1):
- 固定寬度的字體用于JVM數(shù)據(jù)類型纸泡、Exception漂问、errors、類文件結(jié)構(gòu)女揭、Prolog code和Java代碼塊蚤假。
- 斜體代表 JVM 匯編語言中的操作碼和操作數(shù),as well as items in the Java Virtual Machine's run-time data areas.同時也用于介紹新的特性或者表示強調(diào)吧兔。
用來額外闡述本規(guī)范內(nèi)容的非規(guī)范信息磷仰,會以較小的縮進(jìn)文本給出。
如何聯(lián)系我們
讀者如發(fā)現(xiàn)本規(guī)范有技術(shù)上的錯誤或者含糊不清的地方境蔼,非常歡迎指出灶平,郵件地址: jls-jvms-spec-comments@openjdk.java.net
。
如有關(guān)于 javac
(Java語言指定的編譯器) 如何生成和操作 class
文件的疑問箍土,可發(fā)郵件至 compiler-dev@openjdk.java.net
譯者注
- 注1: 因為本文檔是由Markdown編寫的民逼,所以關(guān)于字體格式及其代表的意義可能會有變動,暫時還沒確定涮帘,這里翻譯的是官網(wǎng)的設(shè)置。