編譯器編寫(1)
Java從源程式編譯為一種位元組碼的形式,意在減少Java應用程式的下載下傳時間。
Java程式是通過在對應的JVM上運作位元組碼來實作的,JVM是一種位元組碼的解釋器,許多JVM都包括了JIT編譯器,運作時執行的編譯器,将位元組碼轉換成本機碼。
虛拟機是處理器的模拟器,是針對本機指令集的解釋器。
編譯器使用的算法知識:
貪心算法(寄存器配置設定)、啟發式搜尋技術(表排程)、圖算法(死代碼消除)、動态規劃(指令選擇)、有限自動機和下推自動機(詞法分析和文法分析)、以及不動點算法(資料流分析)。
編譯器結構:
單盒模型指出,編譯器必須了解輸入的源程式并将其功能映射到目标機,這兩項功能決定了編譯器分為前端和後端兩部分。
前端:将源程式的認識編碼到某種結構(IR)中,以供後端使用(詞法分析、文法分析和加工)
IR: 編譯器使用一些資料結構來表示他處理的代碼,稱為中間表示
後端:将IR程式映射到目标機的指令集和有限的資源上,後端僅處理IR(指令選擇、指令排程、寄存器配置設定)
中間部分:将IR程式作為輸入,産生一個語義上等價的IR程式作為輸出,稱為優化器。
前端
詞法分析:在一趟進行中将單詞歸入相應的類,詞法分析器以字元流作為輸入,并将其轉化為已歸類單詞的流,已歸類單詞是形如(p,s)的對,p是單詞的詞類,s是單詞的拼寫 eg:(noun:“bag”);
文法分析:找出各詞性組成的可能正确的組合,與待驗證句子進行比對,自動查找推導的過程稱為解析(或文法分析,parsing)。
中間表示
優化器
分析和轉換
後端
對于每個IR操作,後端都會選擇相應的目标機操作來實作它
指令選擇:将IR操作重寫為目标機操作