Java 程序語言的運行機制
Java 是一門高級語言,它既包含解釋型語言的特征, 也具有編譯型語言的特征。因為 Java 應(yīng)用程序是需要先經(jīng)過編譯,再進行解釋兩個步驟。
解釋型和編譯型
計算機按照程序的執(zhí)行方式可以分為解釋型和編譯型。
解釋型語言(Interpreted language)
這種類型的編程語言,會將代碼一句一句直接運行,不需要像編譯語言(Compiled language)一樣,經(jīng)過編譯器先行編譯為機器代碼,之后再運行。這種編程語言需要利用解釋器,在運行期,動態(tài)將代碼逐句解釋(interpret)為機器代碼,或是已經(jīng)預(yù)先編譯為機器代碼的子程序,之后再運行。
理論上,任何編程語言都可以是編譯式,或解釋型的。它們之間的區(qū)別,僅與程序的應(yīng)用有關(guān)。許多編程語言同時采用編譯器與解釋器來實現(xiàn),其中包括 Lisp,Ruby,JavaScript 與 Python。JAVA 及 C# 采用混合方式,先將代碼編譯為字節(jié)碼,在運行時再進行解釋。
編譯型語言(Compiled language)
這類型的編程語言,通過編譯器來實現(xiàn)。它不像解釋型語言一樣,由解釋器將代碼一句一句運行,而是以編譯器,先將代碼編譯為機器代碼,再加以運行。理論上,任何編程語言都可以是編譯式,或直譯式的。它們之間的區(qū)別,僅與程序的應(yīng)用有關(guān)。
兩者的優(yōu)缺點
一般而言,用編譯語言寫成的程序,在運行期的運行速度,通常比用解釋型語言寫的程序快。因為程序在編譯期,已經(jīng)被預(yù)先編譯成機器代碼,可以直接運行,不用像解釋型語言一樣,還要多一道直譯程序。
但是要先進行編譯,之后才能運行程序,這也造成了編譯語言的缺點。一般而言,編譯語言的程序開發(fā)速度,以及調(diào)試時間,都是比較長的。因為它不像解釋型語言可以寫完一行,或一小段程序之后,馬上運行,馬上調(diào)試。解釋型語言通常讓程序開發(fā)的整體時間變少,在開發(fā)過程中,程序開發(fā)人員也可以更彈性、快速的測試自己的想法。
為了改善編譯語言的效率而發(fā)展出的即時編譯技術(shù),已經(jīng)縮小了這兩種語言間的差距。這種技術(shù)混合了編譯語言與解釋型語言的優(yōu)點,它像編譯語言一樣,先把程序源代碼編譯成字節(jié)碼。到運行期時,再將字節(jié)碼直譯,之后運行。Java 與 LLVM 是這種技術(shù)的代表產(chǎn)物。
Java 的運行機制和 JVM
Java 語言相對于獨立的解釋型和編譯型, 又有一些不一樣。區(qū)別在于編程器編譯的不是最終可以運行的機器語言, 而是能夠運行在 Java 虛擬機 ( JVM: Java Virtual Machine)中的字節(jié)碼。Java 虛擬機只要是用來運行 Java字節(jié)碼文件的虛擬機。不同的平臺上編譯器提供了統(tǒng)一的編程接口,而 Java 編譯器只需要面向 Java 虛擬機, 生成虛擬機能夠運行的代碼。 然后由 Java 虛擬機解釋執(zhí)行,并且在虛擬機中把代碼轉(zhuǎn)換成平臺能夠識別的機器碼來運行程序, 從而做到了一次編譯, 多個平臺運行的跨平臺特性。
流程大概如下:
這里 JVM 也就是 Java 虛擬機中介的概念。 原先你要去租房, 你有一個要租房的“需求”(源代碼), 而每個房東都是你的“運行”環(huán)境。 沒看一次房子都需要單獨的找到對應(yīng)房子的房東進行 “租”(編譯) 的過程。 這個時候, 有個房屋托管(虛擬機)說, 你不要找房東了太麻煩, 我這有這個區(qū)的“房源”, 你來找我就好, 這樣你以后租房子就可以只找這個中介就可以看這個區(qū)的房子, 這樣的話, 你不用來回和不同的房東打交道, 你也不需要知道這些房東是男是女, 是好說話還是不好說話。 但是既然是中間打的交道, 就需要有一些性能的損耗(傭金)。并且你能看多少套房子,就取決于中介有多少房源。 也就是 Java 虛擬機能在那運行, 你的程序就可以在那運行。
JVM
JVM 是 Java Virtual Machine 的縮寫。它是一種基于計算設(shè)備的規(guī)范,是一臺虛擬機,即虛構(gòu)的計算機。
JVM屏蔽了具體操作系統(tǒng)平臺的信息(顯然,就像是我們在電腦上開了個虛擬機一樣),當(dāng)然,JVM 執(zhí)行字節(jié)碼時實際上還是要解釋成具體操作平臺的機器指令的。
通過 JVM,Java 實現(xiàn)了平臺無關(guān)性,Java 語言在不同平臺運行時不需要重新編譯,只需要在該平臺上部署 JVM 就可以了。因而能實現(xiàn)一次編譯多處運行。(就像是你的虛擬機也可以在任何安了 VMWare 的系統(tǒng)上運行)。
JVM結(jié)構(gòu)
- 程序計數(shù)器(Program Counter)
- Java堆(Heap)
- Java虛擬機棧(Stack)
- 本地方法棧(Native Stack)
- 方法區(qū)(Method Area)