2013-09-25 105 views
4

我做了一些搜索,試圖瞭解java源文件是如何執行的。我無法找到一個清晰的答案,以JRE和JDK行話從頭到尾說明各個步驟。所以我寫了我從不同博客中瞭解的內容,但有些空白確實存在。對我的理解的更正是非常受歡迎的。標記Q1和Q2的兩個問題都低於2點在Java中,源代碼到字節碼的編譯究竟發生在哪裏?

  1. 寫HellowWorld.java文件

  2. 的javac HelloWowrld.java給HelloWorld.class的。這是它給出了一個字節碼的類文件。現在我可以把這個在Mac中生成的字節碼轉到Windows機器上,運行它應該可以正常工作。
    Q1:現在編譯成字節碼,這真的是編譯還是解釋?
    Q2:Javac必須是JDK和NOT JRE的一部分?

  3. JRE包含JVM和其他庫來創建運行時環境。 JVM(它本身是平臺相關的)執行字節碼到機器碼。即時編譯器實際上是JVM的一部分,它將字節碼的真正編譯部分作爲機器代碼,並在必要時加上緩存字節代碼。

  4. 垃圾收集包含在JRE中。
+1

令人驚訝的是,編譯器是將源代碼編譯爲字節碼的編譯器。 – SJuan76

+0

那麼碰巧是JVM的一部分的JIT編譯器是什麼?編譯是否將字節碼轉換爲機器碼正確? – eagertoLearn

+0

這是另一個編譯器,你不會直接使用它,並不總是運行。編譯是從源代碼到字節碼,從字節碼到機器碼。但是你要執行的唯一的「java編譯器」是'javac'。 – SJuan76

回答

4

編譯爲「字節碼」由javac(Java編譯器)完成。 JDK(Java開發工具包)和JRE(Java運行時環境)之間的區別主要在於JDK包含javac,而JRE不包含。

編譯爲字節碼形式是一個真正的編譯 - 字節碼格式根本不像原始源。但是字節碼必須被解釋或進一步編譯才能在大多數硬件系統上運行。 (已經構建了一些可以直接執行字節碼形式的實驗性硬件系統。)

在大多數系統中,字節碼開始被解釋(通過,「Java解釋器」,它是JRE的一部分) 。在代碼執行時,字節碼的「熱」部分由「即時編譯器」(JITC - 也是JRE的一部分)編譯,然後以與C++或其他語言相同的效率執行,直接執行編譯「語言。

應該指出的是,字節碼格式與許多傳統的「兩階段」/「優化」編譯器使用的「中間語言」格式非常相似。在這個意義上javac是傳統編譯器的前半部分。

+0

感謝您的信息。字節碼到機器碼應該發生在CPU執行指令的某個級別上? – eagertoLearn

+0

類別。通常情況下,字節碼被一種假裝爲「Java虛擬機」,「獲取」單個字節碼並通過執行每個暗示的動作「執行」它們的「模擬器」「解釋」。這與將字節碼轉換爲「原生」機器指令序列相反,這是JITC本質上所做的。 –

2

你的類文件是字節碼。這些代碼對於所有Java虛擬機都是相同的。關鍵是,標準庫/運行時環境必須在某種程度上與平臺相關(因爲它彌合了這些差異),所以您不必擔心這一點。 Java編譯器生成字節碼,它不是運行時環境的一部分。出於同樣的原因,你的類和類不是編譯器的一部分,它只是讀取它們。

所以是的.class文件=字節碼形式。

+0

javap做什麼? – eagertoLearn

+0

它可能是java -P我不知道,如果你谷歌「Java拆卸」它會幫助你。請記住,反彙編與反編譯不同。 –