Java源程序如何變成Java字節(jié)碼?
網(wǎng)友解答: java源程序是開發(fā)人員編寫的后綴名為.java的文件,而java字節(jié)碼文件是經(jīng)過javac編譯器編譯之后計算機(jī)能認(rèn)識的后綴名為.class的文件。javac做了些什么?主要
java源程序是開發(fā)人員編寫的后綴名為.java的文件,而java字節(jié)碼文件是經(jīng)過javac編譯器編譯之后計算機(jī)能認(rèn)識的后綴名為.class的文件。
javac做了些什么?
主要由4個模塊組成
詞法剖析器:識別java中的if,else,for,while等關(guān)鍵字及其語句的合法性,構(gòu)成符合標(biāo)準(zhǔn)的Token流。
語法剖析器:對構(gòu)成的Token流進(jìn)行語法剖析,檢查它們構(gòu)成的組合是否符合java語法標(biāo)準(zhǔn),構(gòu)成抽象的語法樹。
語義剖析器:將foreach,注解等雜亂的語法轉(zhuǎn)換成最簡單的語法,構(gòu)成注解往后的語法樹。
字節(jié)碼生成器:將注解往后的語法樹翻譯成字節(jié)碼。
網(wǎng)友解答: Java源程序和Java字節(jié)碼的定義java源程序是指由java語言編寫成的以.java結(jié)尾的文件,也可以叫做'Java源碼'。
java字節(jié)碼是指由java源碼編譯之后的以.class結(jié)尾的文件,它是一個二進(jìn)制文件。
Java源程序(源碼)如何被編譯成Java字節(jié)碼?1.javac編譯器,這里的Javac編譯器稱為前端編譯器,其他的前端編譯器還有諸如Eclipse、JDT中的增量式編譯器ECJ等。
2.相對應(yīng)的還有后端編譯器,它主要是在程序運行期間將字節(jié)碼轉(zhuǎn)變成機(jī)器碼。
下面我來重點說一下前端編譯器javac
Javac編譯(前端編譯)的過程1.語法、語詞分析
語法語詞分析是將源碼中的字符流轉(zhuǎn)變?yōu)闃?biāo)記(Token)集合,經(jīng)過這個步驟后,編譯器就基本不會再對源碼文件進(jìn)行操作了,后續(xù)的操作都建立在抽象語法樹之上。
2.填充符號表
符號表是由一組符號地址和符號信息構(gòu)成的表格。
3.語義分析
語法樹能表示一個結(jié)構(gòu)正確的源程序的抽象,但無法保證源程序是符合邏輯的,而語義分析的主要任務(wù)是對結(jié)構(gòu)上正確的源程序進(jìn)行上下文有關(guān)性的審查。
4.字節(jié)碼生成
字節(jié)碼生成是Javac編譯過程的最后一個階段。
字節(jié)碼生成階段不僅僅是把前面各個步驟所生成的信息轉(zhuǎn)化成字節(jié)碼寫到磁盤中,編譯器還進(jìn)行了少量的代碼添加和轉(zhuǎn)換工作。
如你寫的源碼中沒有提供任何構(gòu)造函數(shù),那編譯器會自動添加一個沒有參數(shù)、訪問權(quán)限與當(dāng)前類一致的默認(rèn)構(gòu)造函數(shù),這個工作其實在填充符號表階段就已經(jīng)完成了。
下面附上一張我摘自網(wǎng)絡(luò)的整個編譯過程中的細(xì)節(jié)圖,我只是略知其中一二,具體的細(xì)節(jié)還待研究,業(yè)內(nèi)高手可以發(fā)表評論到下面,我們共同學(xué)習(xí),共同進(jìn)步!