標籤:

生成編譯器的代碼又由誰負責編譯?

一個c++程序,通過c++編譯器編譯鏈接之後,生成可執行程序。編譯器應該也是一個可執行程序,問題是這個編譯器由誰編譯鏈接生成?


編譯器的上一個release build,因為C++編譯器幾乎也都是C++寫的。


這個問題有多種答案。為一個沒有X語言編譯器的平台P生成X語言編譯器的辦法如下:

1)用已經有編譯器的Y語言編寫X語言編譯器。

2)如果有老版X語言編譯器,可以用老版X語言去編寫新版X語言的編譯器。gcc即要求上一個主要版本必須要有能力編譯下一個主要版本的代碼。

3)交叉編譯。利用交叉編譯技術,在P"平台上編寫P平台上的X語言編譯器。

4)什麼都沒有的盤古時代,至少還有機器語言和彙編語言可以用。


C++編譯器。可以是其他的C++編譯器,也可以是自己,如果是自己,就被稱為編譯器的自舉。

有時候也會用自己去編譯其他的C++編譯器,然後用編譯出來的其他C++編譯器來編譯自己。或者更進一步用編譯出來的其他C++編譯器來編譯自己以後,然後再用編譯出來的自己再來編譯自己。


第一個c++編譯器可能用c寫的,第一個c的編譯器可能用彙編寫的,第一個彙編編譯器可能是機器碼寫的,依次類推。有了第一個c++編譯器後,就可以用c++來寫新的編譯器了


先用彙編/機器語言寫一個高級語言編譯器的閹割版本,可以性能很差,功能僅是此語言的一個(夠用的)子集。然後用這個原始編譯器去編譯此語言寫的完全版編譯器,這樣我們就有一個能用的某高級語言編譯器了


自舉(bootstrap)的問題啦……

先用一個低一級的語言寫編譯器去編譯目標語言,之後語言功能完善了就可以自己編譯自己了……

這讓我想到一個不恰當+跑題的例子:

eclipse用來寫Java程序的,但是eclipse本身是用Java寫出來的。(大概可以用eclipse來寫eclipse吧)

另外希望有生之年能見到kotlin-native自舉


可以自舉也可以用別的語言寫編譯器。

例如Go在1.4之前是C的活,以後就是Go編譯器編譯下一代了。


第一個編譯器可以是其他語言寫的,到後面可以實現編譯器的自舉


題主最後肯定想知道第一個編譯器是如何產生的...

那麼建議Google「編譯器自舉」


一般來說是上一個版本的編譯器,或者是其他語言的編譯器

至於世界上第一個編譯器,應該是機器語言寫的,求科普


雞與蛋的計算機版?


推薦閱讀:

如何看待Twitter將重新實現Scala編譯器?
計算機編程語言必須能夠自舉嗎?
為什麼pat考試可選的語言眾多,但提供的編輯器卻少得可憐,甚至非常老舊?
C++命名空間的問題:這是編譯器Bug嗎?
對於stdio.h 之類的頭文件,在C++中使用時,編譯器是怎樣處理的?

TAG:編譯器 |