ilocker:關注 Android 安全(新手) QQ: 2597294287html
傳統的靜態編譯器 (如大多數的 C 語言編譯器) 一般將編譯工做分爲三個階段,分別由三個組件來完成:前端、優化器和後端。前端
前端負責解析源代碼、檢查錯誤,最後創建一個特定語言的抽象語法樹 (AST) 來表示輸入的代碼。一般 AST 要轉換爲一種中間代碼,優化器針對中間代碼進行一系列優化,後端再根據中間代碼生成最後的目標指令。後端
關於 AST,能夠參考:Kaleidoscope: Implementing a Parser and AST安全
優化器負責作各類各樣的變換來努力改善代碼的運行時間,好比消除冗餘計算。後端 (也叫代碼生成器) 負責生成最終的目標指令。對於後端來講,除了要保證生成正確的代碼以外,還要負責根據不一樣目標平臺的特色生成性能儘量好的代碼。後端一般由指令選擇 (instruction selection)、寄存器分配 (register allocation) 和指令調度 (instruction scheduling) 等幾個部分組成。性能
上述編譯器模式一樣適用於解釋器和 JIT 編譯器。JAVA 虛擬機 (JVM) 也是這種模式的實現,它是利用 Java 字節碼做爲前端和優化器之間的接口。優化