何為運(yùn)行期?何為編譯期?
編譯期是指編譯器將源代碼翻譯為機(jī)器能識(shí)別的代碼聚磺,java為編譯為jvm認(rèn)識(shí)的字節(jié)碼文件。
運(yùn)行期則是指java代碼的運(yùn)行過程炬丸。
編譯期
編譯期
編譯期
舉個(gè)例子瘫寝,當(dāng)我們作為開發(fā)人員,在電腦上拼死拼活寫了一個(gè)版本的代碼稠炬,然后將代碼提交到git上去焕阿,當(dāng)我們用jekins或其他工具將代碼從git上clone下來,使用mvn package首启,或者mvn intall打包的過程就叫編譯期暮屡。是指將java代碼編譯為機(jī)器識(shí)別的字節(jié)碼文件的過程。
編譯期II
在編譯期毅桃,將java代碼翻譯為字節(jié)碼文件的過程經(jīng)過了四個(gè)步驟褒纲,詞法分析,語(yǔ)法分析钥飞,語(yǔ)義分析莺掠,代碼生成四個(gè)步驟。
-
詞法分析
- 詞法分析是編譯的第一階段读宙。詞法分析器的主要任務(wù)是讀入源程序的輸入字符汁蝶,將它們組成詞素,生成并輸出一個(gè)詞法單元序列,這個(gè)詞法單元序列被輸出到語(yǔ)法分析器進(jìn)行語(yǔ)法分析掖棉。
-
語(yǔ)法分析
- 語(yǔ)法分析程序從掃描程序中獲取記號(hào)形式的源代碼墓律,并完成定義程序結(jié)構(gòu)的語(yǔ)法分析 (syntax analysis ),這與自然語(yǔ)言中句子的語(yǔ)法分析類似幔亥。語(yǔ)法分析定義了程序的結(jié)構(gòu)元素及其關(guān)系耻讽。通常將語(yǔ)法分析的結(jié)果表示為語(yǔ)法樹。
-
語(yǔ)義分析
- 程序的語(yǔ)義就是它的“意思”帕棉,它與語(yǔ)法或結(jié)構(gòu)不同针肥。程序的語(yǔ)義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語(yǔ)言都具有在執(zhí)行之前被確定而不易由語(yǔ)法表示和由分析程序分析的特征香伴。這些特征被稱作靜態(tài)語(yǔ)義(static semantic)慰枕,而語(yǔ)義分析程序的任務(wù)就是分析這樣的語(yǔ)義,語(yǔ)義具有只有在程序執(zhí)行時(shí)才能確定的特性即纲,由于編譯器不能執(zhí)行程序具帮,所以它不能由編譯器來確定)。一般的程序設(shè)計(jì)語(yǔ)言的典型靜態(tài)語(yǔ)義包括聲明和類型檢查低斋。由語(yǔ)義分析程序計(jì)算的額外信息蜂厅,它們通常是作為注釋或“裝 飾”增加到樹中(還可將屬性添加到符號(hào)表中)。
-
代碼生成
- 代碼生成器得到中間代碼膊畴,并生成目標(biāo)代碼掘猿。
這就是整個(gè)編譯期要做的事情。
運(yùn)行期
程序的運(yùn)行過程就是運(yùn)行期唇跨。
image.png
從jvm加載字節(jié)碼文件稠通,到使用到最后的卸載過程,都是屬于運(yùn)行期的范疇买猖。
-
加載
- 將類的.class文件中的二進(jìn)制數(shù)據(jù)讀到內(nèi)存中采记,將其放在運(yùn)時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象政勃,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)唧龄。
- 加載.class文件的方式
- 從本地系統(tǒng)上直接加載。
- 通過網(wǎng)絡(luò)下載.class文件奸远。
- 從zip既棺,jar等歸檔文件中加載.class文件。
- 將java源文件動(dòng)態(tài)編譯為.class文件
- 加載.class文件的方式
- 將類的.class文件中的二進(jìn)制數(shù)據(jù)讀到內(nèi)存中采记,將其放在運(yùn)時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象政勃,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)唧龄。
-
驗(yàn)證
- 類文件的結(jié)構(gòu)檢查 確保類文件總符合ava類文件的固定格式
- 語(yǔ)義檢查 確保類本身符合java語(yǔ)言的語(yǔ)法規(guī)定
- 字節(jié)碼驗(yàn)證 確保字節(jié)碼流可以被java虛擬機(jī)安全的執(zhí)行懒叛。(靜態(tài)方法丸冕,實(shí)例對(duì)象)
- 二進(jìn)制兼容性的驗(yàn)證 引用類之間協(xié)調(diào)一致。
-
準(zhǔn)備
- java虛擬機(jī)對(duì)類的靜態(tài)變量分配內(nèi)存薛窥,并設(shè)置初始值胖烛。如static int此時(shí)為0.
-
解析
- java虛擬機(jī)會(huì)把類的二進(jìn)制數(shù)據(jù)中的符號(hào)引用代替為直接引用眼姐。
-
初始化
- java虛擬機(jī)執(zhí)行類的初始化語(yǔ)句,為類的靜態(tài)變量賦予初始值佩番。
- 兩種初始化方式:
- 在靜態(tài)變量的聲明處進(jìn)行初始化众旗。
- 在靜態(tài)代碼塊中進(jìn)行初始化。
-
使用
- 程序運(yùn)行過程趟畏。
-
卸載
- 垃圾回收機(jī)制相關(guān)贡歧。對(duì)無引用的對(duì)象進(jìn)行回收。