JVM、JRE 與 JDK


不要只用程式語言的角度來看Java,這只會看到「冰山一角」,這可以用 Java SE Technologies 中的圖來印證:

Jave SE Platform at a Glance


如果你安裝JDK,就會安裝這全部的東西,而Java Language只是最左上角一小部份。

什麼是JVM?
在上圖中,Platforms表示Solaris、Linux、Windows各種作業系統平台,在這些平台上架構了Java Virtual Machne,也就是JVM,JVM讓Java可以跨平台,但是跨平台是怎麼一回事?在這之前,你得先了解不能跨平台是怎麼一回事。

對於電腦而言,只認識一種語言,也就是0、1序列組成的機器指令。當你使用C/C++等高階語言撰寫程式時,其實這些語言,是比較貼近人類可閱讀的文法,也就是比較接近英語文法的語言。這是為了方便人類閱讀及撰寫,電腦其實看不懂C/C++這類語言,為了將C/C++翻譯為0、1序列組成的機器指令,你必須有個翻譯員,擔任翻譯員工作的就是編譯器(Compiler)。

問題在於,每個平台認識的0、1序列並不一樣。某個指令在Windows上也許是0101,在Linux下也許是1010,因此必須使用不同的編譯器為不同平台編譯出可執行的機器碼,在Windows平台上編譯好的程式,不能直接拿到Linux等其它平台執行,也就是說,你的應用程式無法達到「編譯一次,到處執行」的跨平台目的。

Java 是個高階語言,要讓電腦執行你撰寫的程式,也得透過編譯器的翻譯。不過Java編譯時,並不直接編譯為相依於某平台的0、1序列,而是翻譯為中介格式的位元碼(Byte code)。

Java 原始碼副檔名為*.java,經過編譯器翻譯為副檔名*.class的位元碼。如果想要執行位元碼檔案,目標平台必須安裝JVM(Java Virtual Machine)。JVM會將位元碼翻譯為相依於平台的機器碼。

不同的平台必須安裝專屬該平台的JVM。這就好比你講中文(*.java),Java編譯器幫你翻譯為英語(*.class),之後這份英語文件,到各國家之後,再由當地看得懂英文的人(JVM)翻譯為當地語言(機器碼)。

所以JVM擔任的職責之一就是當地翻譯員,將位元碼檔案翻譯為當時平台看得懂的0、1序列,有了JVM,你的Java程式就可以達到「編譯一次,到處到處執行」的跨平台目的。除了瞭解JVM具有讓Java程式跨平台的重要任務之外,撰寫Java程式時,對JVM的重要認知就是:

對Java程式而言,只認識一種作業系統,這個系統叫JVM,位元碼檔案(副檔名為.class的檔案)就是JVM的可執行檔。

Java程式理想上,並不用理會真正執行於哪個平台,只要知道如何執行於JVM就可以了,至於JVM實際上如何與底層平台作溝通,則是JVM自己的事!由於JVM實際上就相當於Java程式的作業系統,JVM就負責了Java程式的各種資源管理。

JRE

之後會學到的第一個Java程式,其中會有這麼一段程式碼:

System.out.println("Hello World");

先前曾經談過,Java是個標準,System、out、println這些名稱,都是標準中所規範的名稱,實際上必須要有人根據標準撰寫出System.java,編譯為System.class,如此你才能在撰寫第一個Java程式時,使用System類別(Class)上out物件(Object)的println()方法(Method)。

誰來實作System.java?誰來編譯為.class?可能是Oracle、IBM、Apache,無論如何,這些廠商必須根據相關的JSR標準文件,將標準程式庫實作出來,如此你撰寫的第一個Java程式,在Oracle、IBM、Apache等廠商實作的JVM上運行時,引用如System這些標準API,你的第一個Java程式,才可能輕易地運行在不同的平台。

在上圖中右邊可以看到Java SE API,涵蓋了各式常用的程式庫,像是通用的群集(Collection)、輸入輸出、連線資料庫的JDBC、撰寫視窗程式的AWT與Swing等,這些都是在各個JSR標準文件規範之中,

Java Runtime Environment就是Java執行環境,簡稱JRE,包括了Java SE API與JVM。只要你使用Java SE API中的程式庫,在安裝有JRE的電腦上就可以直接運行,無需額外在你的程式中再包裝標準程式庫,而可以由JRE直接提供。

JDK

先前說過,你要在.java中撰寫Java程式語言,使用編譯器編譯為.class檔案,那麼像編譯器這樣的工具程式是由誰提供?答案就是JDK,全名為Java Developer Killer!呃!不對!是Java Development Kit


正如上圖所示,JDK包括了javac、appletviewer、javadoc等工具程式,對於要開發Java程式的人,必須安裝的是JDK,如此才有這些工具程式可以使用,JDK本身包括了JRE,如此你才能執行Java程式,所以總結就是「JDK包括了Java程式語言、工具程式與JRE,JRE則包括了部署技術、Java SE API與JVM」


撰寫Java程式的人才需要JDK,如果你的程式只是想讓朋友執行呢?那他只要裝JRE就可以了,不用安裝JDK,因為他不需要javac這些工具程式,但他需要Java SE API與JVM。


對初學者來說,JDK確實很不友善,這大概是Java陣營的哲學,假設你懂得如何準備相關開發環境,因此裝好JDK之後,該自己設定的變數或選項就要自己設定,JDK不會代勞,過去戲稱JDK全名為Java Developer Killer其實是其來有自。