跳至內容

Java虛擬機器

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

Java 虛擬機(英語:Java Virtual Machine,縮寫:JVM), 一種會當執行 Java 位元組碼的虛擬機器,以堆疊結構機器來進行實際做。上早由昇陽電腦所研發並實現第一个實現版本,是 Java 平台的一部份,會當執行以 Java 語言寫作的軟體程式。

Java 虛擬機器有家己完善的硬體架構,如處理器、疊、暫存器等,閣有相應的指令系統。JVM 封鎖佮具體作業系統平台相關的資訊,予得 Java 程式干焦需要生成佇 Java 虛擬機器上執行的目的碼(位元組碼), 就會當佇咧濟種平台無加修改地執行。通過對中央處理器(CPU)所執行的軟體實作,實現會當執行編譯過的 Java 程式碼(Applet 佮應用的程式)。

成做一種程式語言的虛擬機器,實際上毋是干焦用著 Java 語言,只要生成的編譯檔案符合 JVM 著載入編譯檔案來要求,啥物語言攏會當由著 JVM 編譯執行。此外,除了甲骨文,閣有其他開源抑是閉源的實現。

技術規範

根據技術規範所述,Java 虛擬機器是一部抽象(虛擬)的電腦。毋過技術規範無定義使用的糞埽回收演算法佮最佳化 Java 虛擬機器指令的內部演算法,這主要是為著莫予實現者帶來過偌困擾佮限制。所有的 Java 程式干焦會當佇咧著 Java 虛擬機器的抽象技術規範的具體實現環境中才會當執行。

自 Java 平台標準版(J 二 SE)五孵空起,Java 虛擬機器的技術規範改做是由 Java 社群流程開發制定(JSR 九百二四)。 二空空六年,JSR 九百二十四對技術規範進行矣變更,支援更改類檔案格式的提議(JSR 兩百空二)。 Java 虛擬機器的技術細節以藍皮書的形式發布,其前言稱:

> 咱希望這份文件中的技術規範會當打造出相容的淨室版 Java 虛擬機器實現。甲骨文公司提供用於驗證 Java 虛擬機器實現是毋是正常運作的測試專案。 > >

甲骨文公司的一款 Java 虛擬機器名做 HotSpot;另外一款自 BEA Systems 繼承落來的名 JRockit。淨室設計版 Java 實現有 Kaffe、IBM J 九及 Skelmir's CEE-J。甲骨文公司有 Java 商標權,而且可能共認證其他的實現敢有法度完全匹配甲骨文的技術規範。

類別載入器

Java 位元組碼的組織單位之一是類。類別載入器實現著愛辨識並載入任何為 Java 類別格式的檔案。任何實現嘛會當辨識其他兩進位檔案,毋過必須愛辨識類檔案。

類別載入器以下列嚴格順序執行三个基礎任務:

一 . 載入:走揣並匯入特定類型的二進位資料; 二 . 連結:執行驗證、準備及(通選)解析操作;

  • 驗證:確保匯入類型的正確性。
  • 準備:為類別變數分配記憶體閣初初的化記憶體為預設值。
  • 解析:將類型的符號參照轉化做直接參照。

三 . 初初化:呼叫初初化類別變數至正確起始值的 Java 代碼。

通常來講,有兩種類別載入去器類型:引導類別載入器(Bootstrap Class Loader)佮使用者定義類莫載入器(User Defined Class Loader)。

逐款 Java 虛擬的機器實現攏愛有載入相信類的引導類別載入去器。Java 虛擬機器的技術規範毋著類別載入去器走揣類的方式來做出指定。

虛擬機器架構

Java 虛擬機器以原始值(整數佮浮點數)佮參照的方式執行,其本質上是一个三十二位元的機器。六十四位箍的 ` long ` 和 ` double ` 類型的資料予原生支援,毋過需要佇影格的局部變數抑是運算元棧中占用兩个儲存單元(單位單元為三十二位元)。 ` boolean `、` byte `、` short ` 佮 ` char ` 攏是符號擴充類型(` char ` 使用零擴充), 而且以三十二位元整數的形式(佮 ` int ` 類型相仝)運作。較細的資料類型干焦有少量用載入、儲存佇咧類型轉換的特定指令。` boolean ` 類型予人看做是八个元 ` byte ` 值,零代表 ` false `,一代表 ` true `。(雖然《Java 虛擬機器規範第二版》闡明 ` boolean ` 予人認為是一種資料的類型,但是除了類型特徵的名字修飾佮 boolean 陣列類型以外 ` boolean ` 和 ` byte ` 無啥大區別。` boolean ` 類型的方法簽章為 ` Z ` 而且 ` byte ` 的類型簽章為 ` B `。布林型陣列搭載資料類型 ` boolean [ ] `,但是每一个元素使用八个位元組,同時 Java 虛擬機器無內建將布林封包裝成位陣列的功能,除了這以外其實佮 ` byte ` 陣列大同小異。佇其他的用途中,Java 虛擬機器實際上毋知 ` boolean ` 類型,因為用於操作布林型資料的指令佮操作 ` byte ` 的指令完全仝款。)

Java 虛擬機器有路用佇咧儲存的物件佮陣列的糞埽回收。代碼、常數佮其他的資料攏做伙儉佇咧「方法區」中。方法區的邏輯是堆的一部份,毋過虛擬機器的實現可能會分做兩者,對而且可能毋對方法區進行糞埽回收。彼每一个 Java 虛擬機器執行緒均有其家己的呼叫棧(Java 虛擬機器棧), 用於儲存影格。彼呼叫方法的時,Java 虛擬機器共新起一个影格;紅毛筆登出的時陣,影格將自動消除。

逐个影格攏提供一个「運算元棧」佮一个「局部變數」陣列。運算元棧用佇計算運算元佮接收被呼叫方法的返回值,局部變數佮暫存的用途仝款,嘛用傳遞方法參數。故 Java 虛擬機器也就是疊機器,嘛是暫存器機。

位元組碼指令

Java 虛擬機器有咧進行下列任務的指令集:載入佮儲存、算術、類型轉換、建立並控制物件、運算元棧管理(囥入佮搝出)、 控制轉移(分支)、 方法呼叫並轉去、擲擲咧誠媠、是基於監視器的並行。

指令集存在的目的是為著保證二進位檔案的相容性。逐个獨立宿主作業系統需要對 Java 虛擬機器佮執行時環境無仝款的實現。這是 Java 虛擬機器用仝款方式語意解析位元組碼,但是具體實現可能有無仝款。比類比位元組碼閣較複雜的是佇相容而且高效的情形下實現必須對映至無仝款的宿主作業系統的 Java 核心 API。

頂述指令集通過操作共同的抽象資料類型執行命令,毋是以使用特定指令集架構的原生資料類型的方式執行。

Java 虛擬機器語言

Java 虛擬機器語言是講使用 Java 虛擬機器代管的有效類檔案來表示功能的任意程式語言。類檔案內底有含 Java 虛擬機器指令集(Java 位元組碼)、 符號表佮其他輔助資訊。伊的檔案是用表達編譯了後的類和介面的二進位格式,閣硬體佮作業系統無關係。

市面上有偌種 Java 虛擬機器語言,既然有徙栽到 Java 虛擬機器的舊語言,也有全新的語言。JRuby 佮 Jython 可能為上出名的移植語言之二;除了這以外,也有對零編寫的全新語言,抑若熱門的 Clojure、Apache Groovy、Scala 佮 Kotlin。Java 虛擬機器語言的一大顯明特徵是攏互相容,比如講伊,Scala 庫通佮 Java 程式互用,反之亦然。

Java 七虛擬機器佇咧 Java 平台上實現《JSR 兩百九十二:動態型別語言支援》。 此特性由達文西機器專案開發完成,旨咧延伸 Java 虛擬機器的功能,進一支援除 Java 外的其他的語言。

語言實現

因為 JVM 並毋是專為 Java 所實現的執行,實際上只要有其他程式語言的編譯器能生成正確 Java bytecode 檔案,則這个語言嘛會當實現在 JVM 上執行。

以下為原生就佇咧 JVM 上實現執行的語言:

  • BBj
  • BeanShell
  • Ceylon
  • Clojure
  • Fantom
  • Groovy
  • Java
  • Kotlin
  • MIDletPascal
  • Scala
  • Xtend

以下為實現著相應的 JVM 編譯器的語言佮其編譯(解說)器,意味下列語言會當使用基於 Java 開發的編譯器進行編譯抑是解說:

  • Erlang:Erjang
  • JavaScript:Rhino
  • Pascal:Free Pascal
  • PHP:Quercus
  • Python:Jython
  • REXX:NetRexx
  • Ruby:JRuby
  • Scheme:Kawa
  • Tcl:Jacl

注釋

參考文獻

外部連結

  • Java 虛擬機器下載

參見

  • 虛擬機器