編譯過程
??一般來說,一個(gè)程序從源代碼到可執(zhí)行文件是通過編譯器完成的。簡(jiǎn)單的說,編譯器就是把高級(jí)語言變成機(jī)器碼,一個(gè)現(xiàn)代編譯器的工作流程是:(源代碼)——預(yù)處理——編譯——匯編——(可執(zhí)行文件)
對(duì)于C#和Java這種運(yùn)行在虛擬機(jī)上的語言,編譯有所不同。對(duì)C,C++的程序,生成的可執(zhí)行文件,可以在兼容的計(jì)算機(jī)上運(yùn)行,但C#、Java這些語言不一樣。他們的編譯過程是相似的,但是最終生成的不是機(jī)器碼,而是中間代碼。對(duì)于Java而言,生成的是字節(jié)碼。
Java編譯原理
??Java虛擬機(jī)(jvm)是可運(yùn)行Java代碼的假想計(jì)算機(jī),只要根據(jù)jvm規(guī)格描述將解釋器移植到計(jì)算機(jī)上,就能保證編譯過后的任何Java代碼能夠在該系統(tǒng)上運(yùn)行。
運(yùn)行jvm字節(jié)碼是由解釋器完成的。解釋的執(zhí)行過程分為三步:代碼的裝入、代碼的校驗(yàn)、代碼的執(zhí)行。裝入代碼的工作由類裝載器(class?loader)完成。隨后,裝入的代碼由字節(jié)碼校檢器校檢,校檢器可發(fā)現(xiàn)操作數(shù)棧溢出、非法數(shù)據(jù)類型轉(zhuǎn)換等異常。通過校檢后,代碼便開始執(zhí)行。
字節(jié)碼執(zhí)行方式:
? 1.即時(shí)編譯方式:解釋器先將字節(jié)碼編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼。
? 2..解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成Java字節(jié)碼程 序的所有操作。
通常采用的是第二種方法。由于JVM規(guī)格描述具有足夠的靈活性,這使得將字節(jié)碼翻譯為機(jī)器代碼的工作。
JVM規(guī)格描述
JVM的設(shè)計(jì)目標(biāo)是提供一個(gè)基于抽象規(guī)格描述的計(jì)算機(jī)模型,為解釋程序開發(fā)人員提很好的靈活性,同時(shí)也確保Java代碼可在符合該規(guī)范的任何系統(tǒng)上運(yùn)行。JVM對(duì)其實(shí)現(xiàn)的某些方面給出了具體的定義,特別是對(duì)Java可執(zhí)行代碼,即字節(jié)碼(Bytecode)的格式給出了明確的規(guī)格。這一規(guī)格包括操作碼和操作數(shù)的語法和數(shù)值、標(biāo)識(shí)符的數(shù)值表示方式、以及Java類文件中的Java對(duì)象、常量緩沖池在JVM的存儲(chǔ) 映象。這些定義為JVM解釋器開發(fā)人員提供了所需的信息和開發(fā)環(huán)境。Java的設(shè)計(jì)者希望給開發(fā)人員以隨心所欲使用Java的自由。
Java技術(shù)體系
??從廣義上講,Clojuro、JRuby、Groovy等運(yùn)行與Java虛擬機(jī)上的語言及其相關(guān)的程序都屬于Java技術(shù)體系中的一員。我們可以把Java程序設(shè)計(jì)語言、Java虛擬機(jī)、Java?API類庫(kù)這三部分統(tǒng)稱為JDK(Java?Development Kit),JDK是用于支持Java程序開發(fā)的最小環(huán)境。