Self-hosting Compiler 基礎了解跟歷史
介紹
Self-hosting Compiler 代表可以用自己編譯器編譯自己,這是高階語言拓寫編譯器的優點。
Building a self-hosting compiler is a bootstrapping problem, i.e. the first such compiler for a language must be either hand written machine code, compiled by a compiler written in another language, or compiled by running the compiler’s source on itself in an interpreter – History of compiler construction Wiki
根據英文維基百科,最早是 Corrado Böhm(1951)用理論證明 self-hosting 是可能的。
之後第一個 NELIAC (1958) 工程上真正完成,他先使用 assembly 寫一個簡化版 compiler(bootstrap),再用 ALGOL(NELIAC)重寫 compiler,用 bootstrap 編譯它,再用新 compiler 編譯自己,最後丟掉 bootstrap。
另外一個例子是 Lisp (1962),它先用 Interpreter 處理 Compiler,在編譯自己。
C Compiler
1969–1970,Dennis Ritchie 和 Ken Thompson 在 Bell Labs 開始開發 Unix,並且 Ritchie 寫了 C 語言。最早的 C compiler 就是那時候出現的,完全用 Assembly 寫,負責編譯 C 成 PDP-11 機器碼。
這邊有最初的 Unix C Compiler 程式碼。之後為了在不同的平台上面移植,Bell Labs 寫出 Portable C Compiler (PCC),最初在 Unix 7.0 出現,隨者 Unix 出現在不同的平台上面,大多數現成的 C 編譯器都基於它。
GCC
在 GCC 之前,大部分都是使用 Unix 系統上面自己的 Unix vendor C compiler(通常是 PCC 衍生)。
但 Unix 實際上不是自由軟體,他是專有軟體,GCC 的 Stallman 原本想拿現成的 Pastel compiler 來用 (VU Compiler Kit),他寫了一個 C front end 接上 Pastel compiler,想用它編 C code,但發現 Pastel compiler 太大。
之後決定自己重寫,它使用 vendor C compiler 編寫第一版 GCC,用第一版 GCC 再編自己,從這刻起 GCC 變成 self-hosting。
如上截圖,編譯 GCC 他說使用系統自己的 Compiler,不管是 PCC 或者其他的編譯器。
1987 年 3 月:Stallman 宣布第一個版本的 GCC 可以下載使用,目標為面向當時逐漸流行的 16/32 位微處理器,並且為自由軟體、可移植、多平台。
shecc
shecc 不僅是一個從無到有開發、可編譯自身 (self-hosting) 的 C 語言編譯器, 更是理解編譯器最佳化策略的教學範例。其最佳化設計已形成層次分明的架構:前端產生 SSA 形式的中間表示,中端透過全域與區域的分析進行轉換,後端再以 peephole 最佳化 和指令序列重寫完成修飾,展現出具體而微的最佳化流程。連同 Arm 和 RISC-V 處理器 後端的程式碼,全部僅 1 萬行出頭的 C 專案,且不依賴任何組譯器或連結器,直接輸出 ELF 執行檔。