在學編譯原理的時候,就有一個想法,現在的編譯器是如何編寫的。如果說是用純粹的機器代碼編寫,這顯然是不可能的,因為編譯器是個非常復雜且龐大的軟件工程,用純機器代碼編寫所花費的時間這顯然是不能接受的。有人就會說,用高級語言編寫編譯器唄,那么問題就來了,高級語言是不能被計算機直接識別的,所以這種說法也顯然是不正確的。機器語言的開發效率太低,高級語言又無法被計算機直接識別,所以我個人就想,會不會是采用一種折中的辦法,即編譯器最核心的部分用機器語言編寫,剩下其他的部分用高級語言編寫。后來查看一下其他資料,發現果然是這樣。這種情況被稱為自編譯。
大致過程如下:
設有自編譯語言L,可以通過自展的方法為機器A生成該語言的編譯程序L.Ao。首先,將語言L划分為核心部分和擴充部分,其核心部分為L1,其擴充部分分別為L2、L3、…、Ln,即L=L1+L2+L3+…+Ln。
先用A機的機器語言或匯編語言編寫核心語言L1的編譯程序L1.Ao,然后用語言L1編寫語言(L1+L2)的編譯程序(L1+L2).L1。由於(L1+L2)語言僅是在核心語言L1的基礎上稍加擴充,所以,其編譯程序一般能夠用核心語言編寫出來。利用語言的自編譯性,語言(L1+L2)的編譯程序(L1+L2).L1經L1.Ao編譯以后,則可生成(L1+L2).Ao。然后用語言(L1+L2)編寫語言(L1+L2+L3)的編譯程序(L1+L2+L3).(L1+L2),該編譯程序經(L1+L2).Ao編譯以后,生成語言(L1+L2+L3)的編譯程序(L1+L2+L3).Ao,……,如此重復下去,其過程就像滾雪球一樣直到生成整個語言L的編譯程序L.Ao為止。
由於開始通過低級語言建立的編譯程序可做得比較小而簡單,因而可以在較少的人力和時間的情況下建立起來,以后都是用高級語言本身來編寫較大語言的編譯程序。由於有用高級語言進行程序設計的優點,所以這樣做的結果是比用低級語言直接一次生成一個完整的編譯程序要快,而且在程序的可靠性方面也更能得到保證。