凡是接觸過(guò)
Java
的人都知道
JRE
的概念,即
Java
運(yùn)行時(shí)環(huán)境(
Java Runtime Environment
),因?yàn)樗沁\(yùn)行
Java
程序必不可少的(除非程序用
GCJ
等編譯,但我懷疑這樣處理后還能不能稱之為“
Java
程序”了)。
Java
喊出的帶有標(biāo)志性的口號(hào)“
Write Once
,
Run Anywhere
(一次編寫,到處運(yùn)行)”(記得某老師給俺們上課講到這里時(shí)還不忘幽一默:到處運(yùn)行?沒有計(jì)算機(jī)就運(yùn)行不了……),正是建立在
JRE
的基礎(chǔ)之上。何以實(shí)現(xiàn)?就是在
Java
應(yīng)用程序和操作系統(tǒng)之間增加了一虛擬層——
JRE
。程序源代碼不是直接編譯、鏈接成機(jī)器代碼,而是先轉(zhuǎn)化到字節(jié)碼(
bytecode
)這種特殊的中間形式,字節(jié)碼再轉(zhuǎn)換成機(jī)器碼或系統(tǒng)調(diào)用。前者是傳統(tǒng)的編譯方法,生成的機(jī)器代碼就不可避免地跟特殊的操作系統(tǒng)和特殊的機(jī)器結(jié)構(gòu)相關(guān),很多裝雙系統(tǒng)的用戶無(wú)法在
Linux
運(yùn)行
Windows
下的大型游戲,心里那個(gè)郁悶(于是很多虛擬軟件和模擬程序應(yīng)運(yùn)而生)。而
Java
程序的字節(jié)碼文件可以放到任意裝有
JRE
的計(jì)算機(jī)運(yùn)行,再由不同
JRE
的將它們轉(zhuǎn)化成相應(yīng)的機(jī)器代碼,這就實(shí)現(xiàn)了
Java
程序的可移植性。這樣程序員也不用去關(guān)心程序運(yùn)行的具體環(huán)境,而可以專心編寫軟件。這種分層抽象、隱藏細(xì)節(jié)的思想在計(jì)算機(jī)科學(xué)中處處可見,比如機(jī)器組織結(jié)構(gòu)的設(shè)計(jì)、網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)等。
Pascal
語(yǔ)言的發(fā)明者
Niklaus Wirth
,就富有預(yù)見性地指出應(yīng)該有這樣一種可移植的語(yǔ)言,其生成的中間代碼可以在一臺(tái)假想的機(jī)器(
a hypothetical machine
)上運(yùn)行。而
Java
虛擬機(jī)(
Java virtual machine
或
JVM
)就是這樣的一臺(tái)機(jī)器,它模擬實(shí)際處理器的結(jié)構(gòu),解釋字節(jié)碼。怎么一會(huì)說(shuō)是
JRE
,一會(huì)兒又成了
JVM
,兩者是否同物不同名?
回答是否定的。
JVM
是
Java
平臺(tái)的基礎(chǔ),和實(shí)際的機(jī)器一樣,它也有自己的指令集,并且在運(yùn)行時(shí)操作不同的內(nèi)存區(qū)域。
JVM
通過(guò)抽象操作系統(tǒng)和
CPU
結(jié)構(gòu),提供了一種與平臺(tái)無(wú)關(guān)的代碼執(zhí)行方法,即與特殊的實(shí)現(xiàn)方法、主機(jī)硬件、主機(jī)操作系統(tǒng)無(wú)關(guān)。但是在一些小的方面,
JVM
的實(shí)現(xiàn)也是互不相同的,比如垃圾回收算法,線程調(diào)度算法(可能不同
OS
有不同的實(shí)現(xiàn))。
JVM
的主要工作是解釋自己的指令集(即字節(jié)碼)到
CPU
的指令集或
OS
的系統(tǒng)調(diào)用,保護(hù)用戶免被惡意程序騷擾。
JVM
對(duì)上層的
Java
源文件是不關(guān)心的,它關(guān)注的只是由源文件生成的類文件(
class file
)。類文件的組成包括
JVM
指令集,符號(hào)表以及一些補(bǔ)助信息。
而
JRE
是
Sun
公司發(fā)布的一個(gè)更大的系統(tǒng),它里面就有一個(gè)
JVM
。
JRE
就與具體的
CPU
結(jié)構(gòu)和操作系統(tǒng)有關(guān),我們從
Sun
下載
JRE
的時(shí)候就看到了不同的各種版本。同
JVM
一起組成
JRE
的還有一些
API
(如
awt
,
swing
等)。
JRE
是運(yùn)行
Java
程序必不可少的。
Over
posted on 2006-05-22 22:30
崛起的程序員 閱讀(713)
評(píng)論(1) 編輯 收藏 所屬分類:
載選文章