java中反編譯命令:javap前端
彙編語言本質上是一種助記符java
編譯程序和解釋程序兩大不一樣:git
編譯程序分爲五個階段github
——————————————————以此爲界,上面是前端,下面是後端express
目標代碼生成後端
在編譯過程當中,編譯程序不斷地和符號表管理程序和錯誤處理程序打交道函數
遍:編譯程序對源程序或等價程序掃描的遍數優化
在整個編譯過程當中,看似掃描了五遍,其實只有兩遍,分別是對前端和後端進行的掃描指針
即第一遍:詞法分析、語法分析、語義分析。code
第二遍:代碼優化和中間代碼生成
每遍中的各階段的工做是穿插進行的,例以下圖:
其中,語法分析器處於核心地位,每當語法分析器須要一個完整的語法單位時,便向詞法分析器請求一個Token。當接收到所須要的token以後,便調用語義分析器生成中間代碼。
涉及三個語言:源語言、目標語言 和 編譯程序的實現語言
編譯程序的生成方法:
自動生成編譯程序:
輸入:詞法規則、語法規則和語義解釋
對以下C語言程序進行編譯:
int a,b; b = a + 2*5;
詞法分析的結果是以token的形式傳給語法分析
生成結果是一棵語法樹
分支語句由變量和表達式組成:
語義分析須要構建兩個東西——標識符的語義辭典(符號表)&語句的語義樹(中間語言)
符號表分爲:
接下來是語義樹,和語法樹很相似,可是是徹底不一樣的,前者是描述語義信息,然後者描述的確實構成。
固然了,還能夠採用四元式的形式:
爲了提升運算速度,這裏能夠進行的優化是將2*5直接運算出來,不須要特地爲它生成一條中間代碼。
下圖是對b=a+2*5優化以後的結果:
這裏採用彙編指令做爲目標代碼,對步驟四中的中間代碼對應生成三條彙編指令:
LD R,10 ;將10加載到寄存器中 ADD R,a ;將a與寄存器相加 ST R,b ;將寄存器中的值存儲(store)到b中