1. 程式人生 > >Javac編譯過程

Javac編譯過程

實現 java語言 有意 處理 aot 都是 ruby 程序 直接

Java語言的“編譯期”其實是一段“不確定”的操作過程,因為它可能是指一個前端編譯器(其實叫“編譯器的前端”更準確一些)把*.java文件轉變成*.class文件的過程;也可能是指虛擬機的後端運行期編譯器(JIT編譯器,Just In Time Compiler )把字節碼轉變成機器碼的過程 ;還可能是指使用靜態提前編譯器(AOT編譯器,Ahead Of Time Compiler ) 直接把*.java 文件編譯成本地機器代碼的過程。下面列舉了這3類編譯過程中一些比較有代表性的編譯器。

  • 前端編譯器:Sun的Javac、 Eclipse JDT中的增量式編譯器( ECJ ) 。
  • JIT編譯器
    :HotSpotVM的C1、C2編譯器。
  • AOT編譯器: GNU Compiler for the Java ( GCJ ) 、 Excelsior JET。

這3類過程中最符合大家對Java程序編譯認知的應該是第一類,在本章的後續文字裏, 筆者提到的“編譯期”和“編譯器”都僅限於第一類編譯過程,把第二類編譯過程留到下一章中討論。限制了編譯範圍後,我們對於“優化”二字的定義就需要寬松一些,因為Javac這類編譯器對代碼的運行效率幾乎沒有任何優化措施(在JDK 1.3之 後 ,Javac的-O 優化參數就不再有意 義 )。虛擬機設計團隊把對性能的優化集中到了後端的即時編譯器中,這樣可以讓那些不是由Javac產生的Class文件 (如JRuby、Groovy等語言的Class文件 )也同樣能享受到編譯器優化所帶來的好處。但是Javac做了許多針對Java語言編碼過程的優化措施來改善程序員的編碼風格和提高編碼效率。相當多新生的Java語法特性,都是靠編譯器的“語法糖”來實現,而不是依賴虛擬機的底層改進來支持,可以說,Java中即時編譯器在運行期的優化過程對於程序運行來說更重要,而前端編譯器在編譯期的優化過程對於程序編碼來說關系更加密切。

從Sun Javac的代碼來看,編譯過程大致可以分為3個過程,分別是:

  • 解析與填充符號表的過程。
  • 插入式註解處理器的註解處理過程。
  • 分析與字節碼生成過程。

這3個步驟之間的關系與交互順序如圖所示。

技術分享

http://blog.csdn.net/coslay/article/details/49601603

Javac編譯過程