為了實現(xiàn)java程序的可移植性,java語言對這種模式進行了改進,在機器和編譯程序之間增加了一層抽象的虛擬機器,稱之為java虛擬機。這樣,java編譯器沒有將程序直接編譯為某一種特定計算機的機器語言,而是編譯成字節(jié)碼。字節(jié)碼是一種針對JVM的機器語言,由于JVM類似于典型的計算機,因此字節(jié)碼可以很容易地被解釋成為特定的計算機機器語言,執(zhí)行這種解釋工作的程序被稱為解釋器。解釋器對字節(jié)碼指令是翻譯一條,執(zhí)行一條,而不是一次性翻譯所有的字節(jié)碼程序。那么,這就意味這,字節(jié)碼程序可以通過internet傳送到另外一臺計算機上方便地運行。這正是網(wǎng)絡(luò)編程的原因之一。
Java程序與編譯運行環(huán)境的相互關(guān)系。
JVM在任何平臺上都提供給編譯程序一個共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉(zhuǎn)化為特定系統(tǒng)的機器碼執(zhí)行。
在java中提供給虛擬機理解的字節(jié)碼不面向任何特定到底處理器,只面向虛擬機。從結(jié)構(gòu)上看JVM與實際的計算機相似,由一組抽象的部件組成,包括指令集、寄存器組、類文件格式規(guī)定、堆棧、內(nèi)存垃圾收集器和存儲區(qū)6個部分。其中,指令集采用與平臺無關(guān)的字節(jié)碼形式,寄存器組中包含程序計數(shù)器、堆棧指針、運行環(huán)境指針和變量指針,類文件也與平臺無關(guān),堆棧指針用來傳遞參數(shù)和返回運行環(huán)境,垃圾收集處理器不再使用內(nèi)存片段,存儲區(qū)則用來存放字節(jié)碼。JVM僅僅規(guī)定了部件的功能和規(guī)格,雖然這些功能也是統(tǒng)一的,但是沒有規(guī)定部件具體的實現(xiàn)技術(shù)。