编译期java_java编译期和运行期
舉個(gè)例子,當(dāng)我們作為開發(fā)人員,在電腦上拼死拼活寫了一個(gè)版本的代碼,然后將代碼提交到git上去,當(dāng)我們用jekins或其他工具將代碼從git上clone下來,使用mvn package,或者mvn intall打包的過程就叫編譯期。是指將java代碼編譯為機(jī)器識(shí)別的字節(jié)碼文件的過程。
在編譯期,將java代碼翻譯為字節(jié)碼文件的過程經(jīng)過了四個(gè)步驟,詞法分析,語法分析,語義分析,代碼生成四個(gè)步驟:
詞法分析
詞法分析是編譯的第一階段。詞法分析器的主要任務(wù)是讀入源程序的輸入字符,將它們組成詞素,生成并輸出一個(gè)詞法單元序列,這個(gè)詞法單元序列被輸出到語法分析器進(jìn)行語法分析。
語法分析
語法分析程序從掃描程序中獲取記號(hào)形式的源代碼,并完成定義程序結(jié)構(gòu)的語法分析 (syntax analysis ),這與自然語言中句子的語法分析類似。語法分析定義了程序的結(jié)構(gòu)元素及其關(guān)系。通常將語法分析的結(jié)果表示為語法樹。
語義分析
程序的語義就是它的“意思”,它與語法或結(jié)構(gòu)不同。程序的語義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語言都具有在執(zhí)行之前被確定而不易由語法表示和由分析程序分析的特征。這些特征被稱作靜態(tài)語義(static semantic),而語義分析程序的任務(wù)就是分析這樣的語義,語義具有只有在程序執(zhí)行時(shí)才能確定的特性,由于編譯器不能執(zhí)行程序,所以它不能由編譯器來確定)。一般的程序設(shè)計(jì)語言的典型靜態(tài)語義包括聲明和類型檢查。由語義分析程序計(jì)算的額外信息,它們通常是作為注釋或“裝 飾”增加到樹中(還可將屬性添加到符號(hào)表中)。
代碼生成
代碼生成器得到中間代碼,并生成目標(biāo)代碼
java運(yùn)行期
程序的運(yùn)行過程就是運(yùn)行期。
從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對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)
加載.class文件的方式:
從本地系統(tǒng)上直接加載
通過網(wǎng)絡(luò)下載.class文件
從zip,jar等歸檔文件中加載.class文件
將java源文件動(dòng)態(tài)編譯為.class文件
驗(yàn)證
類文件的結(jié)構(gòu)檢查 確保類文件總符合ava類文件的固定格式
語義檢查 確保類本身符合java語言的語法規(guī)定
字節(jié)碼驗(yàn)證 確保字節(jié)碼流可以被java虛擬機(jī)安全的執(zhí)行。(靜態(tài)方法,實(shí)例對象)
二進(jìn)制兼容性的驗(yàn)證 引用類之間協(xié)調(diào)一致。
準(zhǔn)備
java虛擬機(jī)對類的靜態(tài)變量分配內(nèi)存,并設(shè)置初始值。如static int此時(shí)為0。
解析
java虛擬機(jī)會(huì)把類的二進(jìn)制數(shù)據(jù)中的符號(hào)引用代替為直接引用
初始化
java虛擬機(jī)執(zhí)行類的初始化語句,為類的靜態(tài)變量賦予初始值。
兩種初始化方式:
在靜態(tài)變量的聲明處進(jìn)行初始化
在靜態(tài)代碼塊中進(jìn)行初始化。
使用
程序運(yùn)行過程
卸載
垃圾回收機(jī)制相關(guān)。對無引用的對象進(jìn)行回收
總結(jié)
以上是生活随笔為你收集整理的编译期java_java编译期和运行期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python xml etree wor
- 下一篇: 印象笔记编辑pdf_做笔记就用印象笔记,