編譯其本質是將一種語言規范轉換成另一種語言規范,即將Java語言規范轉換為JVM虛擬機語言規范。結果就是.java文件到.class文件。
對於C/C++編譯直接將高級語言轉換為機器語言,Java語言不是采用這種策略,而是將高級語言編譯成一種中間態的語言--與平台無關,其執行
過程是依靠對應平台的JVM在執行時刻逐條的將字節碼指令轉換為對應的機器語言,為了提高轉換速度存在JIT技術。
二、javac編譯的具體過程
源碼-->Token流-->語法樹-->注釋語法樹-->字節碼文件
詞法分析:掃描源程序的字符流,按照源程序語言的的詞法規則選取各類單詞符號,產生用於語法分析的記號序列。同時創建符號表,將
所有的標識符記錄在符號表中。
語法分析:是編譯過程的核心,依據源程序的語法規則,組織上一步產生的記號序列。形成一個按照特定語法規則組織的結構---通常是語法
樹的形式體現。
語義分析:主要包括兩部分的內容,語義檢查,其就是對上步產生的語法樹進行檢查,包含類型檢查、控制流檢查、唯一性檢查等。另一個
任務就是對符號表的管理。
代碼生成器:將處理過的語法樹組織成Class文件的格式。
符號表的作用:記錄源代碼中使用的標識符,收集每個表示符的各種屬性信息。符號表的維護是貫穿整個編譯過程的。
錯誤處理:編譯過程中的每一步都可能產生錯誤,編譯器要能對這些錯誤給予處理。
三、不同種類Java語言編譯器
根據編譯器的種類不同,編譯器編譯的過程可能存在很大的不同,商用的JVM一般具有前端編譯器和解釋器。
前端編譯器:直接將源文件轉化為字節碼文件
即時編譯器:將源碼轉換為字節碼,在將字節碼轉換為機器碼。
運行前編譯:直接將源碼轉換為指定平台的機器碼