Javac編譯器的基本結(jié)構(gòu)
Javac編譯器的作用就是將符合java語言規(guī)范的源代碼轉(zhuǎn)化成符合Java虛擬機規(guī)范的Java字節(jié)碼寓盗。
一個編譯器完成從一個語言規(guī)范到另一個語言規(guī)范的轉(zhuǎn)化所需步驟就是這個編譯器的基本結(jié)構(gòu)】觯基本步驟了解一下:
- 首先,讀取源代碼撩幽,識別定義的語法規(guī)范關(guān)鍵字箩艺,識別哪些是合法的關(guān)鍵字,哪些不是榨惰,這個步驟就是詞法分析過程静汤。
- 詞法分析的結(jié)果就是從源代碼中找出規(guī)范化的Token流。
- 接著虫给,就是對這些Token流進(jìn)行語法分析抹估,就是檢查這些關(guān)鍵字組合在一起是否符合Java語言規(guī)范。
- 語法分析的結(jié)果就是形成一個符合Java語言規(guī)范的抽象語法樹药蜻。抽象語法樹是一個結(jié)構(gòu)化的語法表達(dá)形式,它的作用是把語言的主要詞法用一個結(jié)構(gòu)化的形式組織在一起蒿往。對這棵語法樹我們可以在后面按照新的規(guī)則再重新組織湿弦,這就是編譯器的關(guān)鍵所在。
- 接下來是語義分析蔬充,雖然上一步已經(jīng)完成了語法分析班利,也就是不存在語法問題了,但是語義是不是正確呢庸队?語義分析的主要工作就是把一些難懂的、復(fù)雜的語法轉(zhuǎn)化成更加簡單的語法彻消。
- 語義分析的結(jié)果就是把復(fù)雜的語法轉(zhuǎn)化為更為簡單的語法,例如將foreach轉(zhuǎn)為for丙笋,形成一個注解后的抽象語法樹煌贴,這棵抽象語法數(shù)更接近目標(biāo)語言的語法規(guī)則。
- 最后通過字節(jié)碼生成器生成字節(jié)碼怠肋,根據(jù)抽象語法樹生成字節(jié)碼井濒,也就是將一種數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為另一種數(shù)據(jù)結(jié)構(gòu)。
== 所以主要有四個模塊:詞法分析器酪惭、語法分析器者甲、語義分析器、字節(jié)碼生成器 ==
Javac工作原理分析
詞法分析器:
我們可以用JDK的com.sun.tools.javac.main.Main的compile(String[] args)方法編譯指定的類鲫懒。
String[] args = new String[] {“-d”刽辙, “/homemytestclasses”, “Test.java”};
Int status = javac.compile(args);
javac主要詞法分析器的接口是com.sun.tools.javac.parser.Lexer颂翼。默認(rèn)實現(xiàn)類是com.sun.tools.javac.parser.Scanner,Scanner會逐個讀取java源文件的單個字符慨灭,然后解析出符合Java語言規(guī)范的Token序列。
其中主要涉及到的類:
Scanner 讀取源文件和歸類不同詞法的操作
JavacParser 規(guī)定哪些詞是符合java語言規(guī)范規(guī)定的
Token 規(guī)定所有Java語言的合法關(guān)鍵詞
Names 存儲和表示解析后的詞法