【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)

【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)

ID:30788415

大?。?19.00 KB

頁數(shù):6頁

時(shí)間:2019-01-03

【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)_第1頁
【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)_第2頁
【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)_第3頁
【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)_第4頁
【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)_第5頁
資源描述:

《【深入java虛擬機(jī)(7)】:javac編譯與jit編譯-編程開發(fā)技術(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、【深入Java虛擬機(jī)(7)】:Javac編譯與JIT編譯-編程開發(fā)技術(shù)【深入Java虛擬機(jī)(7)】:Javac編譯與JIT編譯原文出處:蘭亭風(fēng)雨編譯過程不論是物理機(jī)還是虛擬機(jī),人部分的程序代碼從開始編譯到最終轉(zhuǎn)化成物理機(jī)的目標(biāo)代碼或虛擬機(jī)能執(zhí)行的指令集之前,都會(huì)按照如下圖所示的各個(gè)步驟進(jìn)行:其中綠色的模塊可以選擇性實(shí)現(xiàn)。很容易看出,上圖中間的那條分支是解釋執(zhí)行的過程(即一條字節(jié)碼一條字節(jié)碼地解釋執(zhí)行,JavaScript),而下面的那條分支就是傳統(tǒng)編譯原理中從源代碼到目標(biāo)機(jī)器代碼的生成過程。如今,基于物理機(jī)、虛擬機(jī)等的語言,人多都遵循這種基于現(xiàn)代經(jīng)典編譯原理的思路,

2、在執(zhí)行前先對(duì)程序源碼進(jìn)行詞法解析和語法解析處理,把源碼轉(zhuǎn)化為抽象語法樹。對(duì)于一門具體語言的實(shí)現(xiàn)來說,詞法和語法分析乃至后而的優(yōu)化器和口標(biāo)代碼生成器都可以選擇獨(dú)立于執(zhí)行引擎,形成一個(gè)完整意義的編譯器去實(shí)現(xiàn),這類代表是C/C++語言。也可以把抽象語法樹或指令流Z前的步驟實(shí)現(xiàn)一個(gè)半獨(dú)立的編譯器,這類代表是Java語言。又或者可以把這些步驟和執(zhí)行引擎全部集中在一起實(shí)現(xiàn),如大多數(shù)的JavaScript執(zhí)彳亍器。Javac編譯在Jqvq中提到“編譯”,□然很容易想到Javac編譯器將*.java文件編譯成為*?class文件的過程,這里的Jewac編譯器稱為前端編譯器,其他的前

3、端編譯器還有諸如Eclipse?JDT中的增量式編譯器ECJ等。相對(duì)應(yīng)的還有后端編譯器,它在程序運(yùn)行期間將字節(jié)碼轉(zhuǎn)變成機(jī)器碼(現(xiàn)在的Java程序在運(yùn)行吋基木都是解釋執(zhí)行加編譯執(zhí)行),如HotSpot虛擬機(jī)自帶的JIT(Just?Tn?Time?Compi1er)編譯器(分Client端和Server端)。另外,有時(shí)候還有可能會(huì)碰到靜態(tài)提而編譯器(A0T,Ahead?0f?Time?Compi1er)直接把*?java文件編譯成本地機(jī)器代碼,如GCJ、Excelsior?JET等,這類編譯器我們應(yīng)該比較少遇到。下面簡(jiǎn)要說下Javac編譯(前端編譯)的過程。詞法、語法分

4、析??詞法分析是將源代碼的字符流轉(zhuǎn)變?yōu)闃?biāo)記(Token)集合。單個(gè)字符是程序編寫過程中的的最小元素,而標(biāo)記則是編譯過程的最小元素,關(guān)鍵字、變量名、字面量、運(yùn)算符等都可以成為標(biāo)記,比如整型標(biāo)志int由三個(gè)字符構(gòu)成,但是它只是一個(gè)標(biāo)記,不可拆分。語法分析是根據(jù)Token序列來構(gòu)造抽象語法樹的過程。抽象語法樹是-?種用來描述程序代碼語法結(jié)構(gòu)的樹形表示方式,語法樹的每一個(gè)節(jié)點(diǎn)都代表著程序代碼屮的一個(gè)語法結(jié)構(gòu),如bao、類型、修飾符、運(yùn)算符等。經(jīng)過這個(gè)步驟后,編譯器就基木不會(huì)再對(duì)源碼文件進(jìn)行操作了,后續(xù)的操作都建立在抽象語法樹之上。填充符號(hào)表完成了語法分析和詞法分析Z后,下一

5、步就是填充符號(hào)表的過程。符號(hào)表是由一組符號(hào)地址和符號(hào)信息構(gòu)成的表格。符號(hào)表中所登記的信息在編譯的不同階段都要用到,在語義分析(后面的步驟)屮,符號(hào)表所登記的內(nèi)容將用于語義檢查和產(chǎn)生中間代碼,在目標(biāo)代碼生成階段,黨對(duì)符號(hào)名進(jìn)行地址分配時(shí),符號(hào)表是地址分配的依據(jù)。語義分析語法樹能表示一個(gè)結(jié)構(gòu)正確的源程序的抽象,但無法保證源程序是符合邏輯的。而語義分析的主要任務(wù)是讀結(jié)構(gòu)上正確的源程序進(jìn)行上下文冇關(guān)性質(zhì)的審查。語義分析過程分為標(biāo)注檢杳和數(shù)據(jù)及控制流分析兩個(gè)步驟:?標(biāo)注檢查步驟檢查的內(nèi)容包括諸如變量使用前是否已被聲明、變量和賦值Z間的數(shù)據(jù)類型是否匹配等。?數(shù)據(jù)及控制流分析是對(duì)

6、程序上下文邏輯更進(jìn)一步的驗(yàn)證,它叮以檢查岀諸如程序局部變量在使用詢是否有賦值、方法的每條路徑是否都有返回值、是否所有的受査界常都被正確處理了等問題。字節(jié)碼牛成字節(jié)碼生成是Javac編譯過程的最后一個(gè)階段。字節(jié)碼生成階段不僅僅是把前面各個(gè)步驟所生成的信息轉(zhuǎn)化成字節(jié)碼寫到磁盤中,編譯器還進(jìn)行了少量的代碼添加和轉(zhuǎn)換工作。?實(shí)例構(gòu)造器()方法和類構(gòu)造器()方法就是在這個(gè)階段添加到語法樹Z小的(這里的實(shí)例構(gòu)造器并不是指默認(rèn)的構(gòu)造函數(shù),而是指我們自C重載的構(gòu)造函數(shù),如果用戶代碼屮沒有提供任何構(gòu)造函數(shù),那編譯器會(huì)口動(dòng)添加一個(gè)沒有參數(shù)、訪問權(quán)限與當(dāng)前類一

7、致的默認(rèn)構(gòu)造函數(shù),這個(gè)工作在填充符號(hào)表階段就已經(jīng)完成了)。JIT編譯Java程序最初是僅僅通過解釋器解釋執(zhí)行的,即對(duì)字節(jié)碼逐條解釋執(zhí)行,這種方式的執(zhí)行速度相對(duì)會(huì)比較慢,尤其當(dāng)某個(gè)方法或代碼塊運(yùn)行的特別頻繁時(shí),這種方式的執(zhí)行效率就顯得很低。于是后來在虛擬機(jī)屮引入了JIT編譯器(即吋編譯器),當(dāng)虛擬機(jī)發(fā)現(xiàn)某個(gè)方法或代碼塊運(yùn)行特別頻繁時(shí),就會(huì)把這些代碼認(rèn)定為“IIot?Spot?Codc”(熱點(diǎn)代碼),為了提高熱點(diǎn)代碼的執(zhí)行效率,在運(yùn)行時(shí),虛擬機(jī)將會(huì)把這些代碼編譯成與本地平臺(tái)相關(guān)的機(jī)器碼,并進(jìn)行各層次的優(yōu)化,完成這項(xiàng)任務(wù)的正是JIT編譯器。現(xiàn)在主流的商用虛擬機(jī)(如Su

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。