Java虛擬機(英語:Java Virtual Machine,縮寫:JVM),一種能夠執行Java位元組碼的虛擬機器,以堆疊結構機器來實作。最早由太陽電腦所研發並實現第一個實現版本,是Java平臺的一部份,能夠執行以Java語言寫作的軟件程式。
Java虛擬機器有自己完善的硬件架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。JVM封鎖了與具體作業系統平台相關的資訊,使得Java程式只需生成在Java虛擬機器上執行的目標碼(位元組碼),就可以在多種平台上不加修改地執行。通過對中央處理器(CPU)所執行的軟件實作,實現能執行編譯過的Java程式碼(Applet與應用程式)。
作為一種程式語言的虛擬機器,實際上不只是專用於Java語言,只要生成的編譯檔案符合JVM對載入編譯檔案格式要求,任何語言都可以由JVM編譯執行。此外,除了甲骨文公司提供的Java虛擬機器,也有其他開源或閉源的實現。
技術規範
據技術規範所述,Java虛擬機器是一部抽象(虛擬)的電腦。但技術規範未定義使用的垃圾回收演算法及最佳化Java虛擬機器指令的內部演算法,這主要是為了不給實現者帶來過多困擾與限制。所有的Java程式僅可在對Java虛擬機器的抽象技術規範的具體實現環境中才可執行。[1]
自Java平台標準版(J2SE)5.0起,Java虛擬機器的技術規範改為由Java社區流程開發制定(JSR 924)。[2]2006年,JSR 924對技術規範進行了變更,支援更改類檔案格式的提議(JSR 202)[3]。Java虛擬機器的技術細節以藍皮書[4]的形式發佈,其前言稱:
我們希望這份文件中的技術規範足以打造出相容的淨室版Java虛擬機器實現。甲骨文公司提供用於驗證Java虛擬機器實現是否正常運作的測試專案。[註 1]
甲骨文公司的一款Java虛擬機器名為HotSpot;另一款自BEA Systems繼承而來的名為JRockit。淨室設計版Java實現有Kaffe、IBM J9及Skelmir's CEE-J 。甲骨文公司擁有Java商標權,且可能將其用於認證其他實現是否能完全匹配甲骨文的技術規範。
Java位元組碼的組織單位之一是類。類別載入器實現必須辨識並載入任何為Java類別格式的檔案。任何實現也可辨識其他二進制檔案,但必須辨識類檔案。
類別載入器以下列嚴格順序執行三個基礎任務:
- 載入:尋找並匯入特定類型的二進制數據;
- 連結:執行驗證、準備及(可選)解析操作;
- 驗證:確保匯入類型的正確性。
- 準備:為類別變數分配主記憶體並初始化主記憶體為預設值。
- 解析:將類型的符號參照轉化為直接參照。
- 初始化:呼叫初始化類別變數至正確起始值的Java代碼。
通常而言,共有兩種類別載入器類型:引導類別載入器(Bootstrap Class Loader)及用戶定義類別載入器(User Defined Class Loader)。
每款Java虛擬機器實現均必須有載入受信類的引導類別載入器。Java虛擬機器技術規範不對類別載入器尋找類的方式作出指定。
Java虛擬機器以原始值(整數及浮點數)及參照的方式執行,其本質上是一個32位元的機器。64位元的long
和double
類型數據被原生支援,但需要在幀的局部變數或運算元棧中佔用兩個儲存單元(單個單元為32位元)。boolean
、byte
、short
及char
均為符號擴充類型(char
使用零擴充),且以32位元整數的形式(與int
類型相同)運作。較小的資料類型僅有少量用於載入、儲存於類型轉換的特定指令。boolean
類型被視為8位元byte
值,0代表false
,1代表true
。(雖然《Java虛擬機器規範第二版》闡明boolean
被認為是一種資料類型,但除類型特徵的名字修飾及boolean陣列類型外boolean
和byte
無太大區別。boolean
類型的方法簽章為Z
而byte
的類型簽章為B
。布林型陣列搭載資料類型boolean[]
,但每個元素使用8個位元組,同時Java虛擬機器不內建將布林封包裝成位陣列的功能,除此之外其與byte
陣列大同小異。在其他用途中,Java虛擬機器實際上不知道boolean
類型,因為用於操作布林型數據的指令與操作byte
的指令完全相同。)
Java虛擬機器擁有用於儲存對象及陣列的垃圾回收堆。代碼、常數及其他類數據均儲存於「方法區」中。方法區邏輯上是堆的一部分,但虛擬機器的實現可能會區分兩者,從而可能不對方法區進行垃圾回收。每個Java虛擬機器線程均有其自己的呼叫棧(Java虛擬機器棧),用於儲存幀。當呼叫方法時,Java虛擬機器將新建一個幀;方法退出時,幀將自動消除。
每幀均提供一個「運算元棧」及一個「局部變數」陣列。運算元棧用於計算運算元和接收被呼叫方法的返回值,而局部變數與暫存器的用途相同,也用於傳遞方法參數。故Java虛擬機器既是堆疊機器,也是暫存器機。
Java虛擬機器擁有進行下列任務的指令集:載入與儲存、算術、類型轉換、建立並控制對象、運算元棧管理(放入及拉出)、控制轉移(分支)、方法呼叫並返回、投擲異常、基於監視器的並行。
指令集存在的目的是為了保證二進制檔案的相容性。每個獨立宿主作業系統需要對Java虛擬機器及執行時環境的不同實現。這些Java虛擬機器以相同方式語意解析位元組碼,但具體實現可能有所不同。比模擬位元組碼更複雜的是在相容且高效的情況下實現必須對映至不同的宿主作業系統的Java核心API。
Java虛擬機器語言是指使用Java虛擬機器寄存的有效類檔案來表示功能的任意程式語言。類檔案中含有Java虛擬機器指令集(Java位元組碼)、符號表及其他輔助資訊。類檔案是用於表達編譯後的類及介面的二進制格式,與硬件及作業系統無關。[5]
市面上有多種Java虛擬機器語言,既有移植至Java虛擬機器的舊語言,也有全新的語言。JRuby及Jython可能為最知名的移植語言之二;除此之外,也有從零編寫的全新語言,如熱門的Clojure、Apache Groovy、Scala及Kotlin。Java虛擬機器語言的一大顯著特徵是都互相容,舉例來說,Scala庫可與Java程式互用,反之亦然。[6]
Java 7虛擬機器在Java平台上實現了《JSR 292:動態型別語言支援》[7]。此特性由達文西機器專案開發完成,旨在延伸Java虛擬機器的功能,進而支援除Java外的其他語言。[8][9]
語言實現
由於JVM並不是專為Java所實現的執行時,實際上只要有其他程式語言的編譯器能生成正確Java bytecode檔案,則這個語言也能實現在JVM上執行。
以下為原生就在JVM上實現執行的語言:
以下為實現了相應的JVM編譯器的語言及其編譯(解釋)器,意味着下列語言可以使用基於Java開發的編譯器進行編譯或解釋:
註釋
參考文獻
外部連結
參見
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.