編譯原理(一)編譯器自舉、自展法
阿新 • • 發佈:2018-12-12
前言
新興語言井噴,實際上都是踩在前輩肩膀上進行功能特化的結果,本系列從編譯的角度找到語言的共性和不同語言的聯絡。
編譯器是將源語言(通常指高階語言)轉換成目標語言的程式,這個程式也是由某種語言寫成並執行的。通常我們希望一個語言的編譯器能夠執行在裸機上而不依賴其他編譯器才能執行,即機器語言。但直接用機器語言實現編譯器實在太過麻煩,可以通過自展法一步步簡化編寫。
一個由語言L編寫的,將語言X程式檔案翻譯成語言Y程式檔案的翻譯程式稱為編譯器,記作
自展法
直接用語言A(assembly)完成的全部內容可能比較複雜。現在考慮到一個特點:
一個語言L本身是可分割的,內部可以再抽出多層作為單獨的語言,比如L1,L2,L3……,L1是整個L的核心,可以編寫出等價的L2實現的功能,L1(和L2)可以編寫出L3實現的功能,如此遞迴地包裹多層最後構成整個L。
實現前,可以單獨先實現,然後用L1編寫此步已經比直接用A寫簡單了;將這個編譯器經過編譯得到;如此迭代最終得到
編譯器自舉
編譯器自舉指用本編譯器被編譯的語言來編寫本編譯器。編譯器自舉一般都是編譯器開發的一個里程碑事件。
編譯器自舉意味著被編譯的語言榮升成自編譯語言,而且編譯器擁有自舉能力對實現語言的語法語義本身沒有限制。
以上文例子,將語言L變成自編譯語言需要如下步驟
- 使用其他高階語言或者彙編(統一記作A)實現(可用自展法)
- 實現,用編譯後,若測試兩者編譯效果相同,進行下一步
- 用的可執行程式編譯自己,自舉完成
舉個例子
Pascal編譯器,其第一版編譯器是用Fortran寫的,而這也是常見的編譯器自舉過程的幾乎必走的一條路,即最開始使用X語言(如Fortran)實現Y語言(如Pascal)的編譯器,即解決雞與蛋的問題,所以你的問題二是不正確的,因為我們先要使用其它語言構建出我們的第一版編譯器,之後成熟以後,就可以完全使用已經生成好的編譯器來編譯出我們的新編譯器。
作者:藍色 連結:https://www.zhihu.com/question/28513473/answer/41123883 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。