生成編譯器的代碼又由誰負責編譯?
01-01
一個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:編譯器 |