代碼生成

計算機科學中,代碼生成代碼編譯過程中的其中一個環節。在這個環節中,代碼生成器會將某中間語言(IR)轉換為機器可以執行的形式如機器碼,或者另一門語言,如C語言代碼[1]

工業級的編譯器一般存在多個編譯環節(Compiler pass)。第一個環節通常會將原始碼轉換成抽象語法樹,而抽象語法樹隨後又會被轉換成某種中間語言(IR)。編譯器的中間環節會對這門中間語言進行各種變換以優化程序的性能。這種具有階段性的編譯方式,其優勢在於允許編譯器開發者復用前段和中端的代碼,同時也降低了編譯器的開發難度,因為一些優化算法的執行條件需要由其他優化算法完成,也因為一些算法需要一次次地重複執行。由於以上原因,復用性以及重複性都相對較低的代碼生成器,一般位於編譯過程中的最後幾個環節。

主要工作

除了將中間語言轉換成線性的機器碼序列這項基本工作,典型的代碼生成器也會試圖優化生成出來的代碼。

工業級編譯器的代碼生成階段一般包括了:

  • 指令選擇:決定了編譯器使用哪些指令來表達中間語言中的某一操作。
  • 指令調度:決定了編譯器以何種順序放置這些選擇好的指令。對於有流水線的目標機器,這個階段有着關鍵影響。
  • 寄存器分配:目的是將每個變量與處理器上的寄存器一一對應。
  • 如果有相關需求,生成調試數據並且將其嵌入二進制文件中,以方便程式設計師調試程序。

運行時代碼生成

即時編譯(JIT)等場景下,會要求程序在運行時生成代碼,而生成代碼的時間和空間效率在這種情況下都極其重要。例如說,當有程序在運行時解釋正則表達式,並根據該正則表達式生成代碼時,通常該程序會先生成非確定有限狀態自動機而不是確定有限狀態自動機,因為通常前者的創建速度以及佔用的內存空間等屬性往往會比後者更為優秀。

參考文獻

  1. ^ Steven Muchnick; Muchnick and Associates. Advanced Compiler Design Implementation. Morgan Kaufmann. 15 August 1997. ISBN 978-1-55860-320-2. code generation.