2012-08-03 50 views
2

可能重複:
How are gcc/g++ bootstrapped?「C或gcc」就像「雞還是蛋」? :(

我想知道的gcc編譯方式,因爲我們都知道它是用C寫的

他們是否使用了一些其他編譯器拿出gcc?

如果是這樣,我可以使用相同的編譯來編譯我的C程序嗎?

+0

glibc只是一個庫。它是用C編寫的,當然你可以用C編譯它。 – 2012-08-03 15:17:56

+0

我認爲他的意思是gcc,而不是glibc。 – 2012-08-03 15:18:46

+0

我的意思是gcc,對不起,我現在會改變標題。 – Viswesn 2012-08-03 15:20:05

回答

1

他們沒有使用其他編譯器。你可以編寫一個不使用glibc的C程序,只需告訴編譯器不要使用它。所以像這樣:

gcc main.c -nostdlib 
6

這裏沒有雞和雞蛋。 glibc是使用您正在使用的編譯器進行編譯的。

該編譯器首先使用相同編譯器的以前版本編譯。然後它可以自行編譯。

真正的雞與雞蛋問題在20世紀50年代被解決,當時有人不得不編寫世界上第一個編譯器。之後,您可以使用一個編譯器編譯下一個。

+0

我想第一個「編譯器」實際上是一個解釋器呢? – 2012-08-03 15:25:49

+0

@AlexBelanger我真的不認爲這是一位口譯員。也許是一個彙編程序。 – Hassan 2012-08-03 15:27:13

+0

是的,可能。你不必一次實現整個語言,所以也許整數運算,if-else和一些循環。然後,您可以使用該語言的這一部分來稍後執行其他部分。 – 2012-08-03 15:33:00

4

有兩種基本的方法來建立一個新的編譯器:

  1. 如果你正在寫一個新的編譯器爲像C建立語言,使用現有的編譯器從不同的供應商建立自己的新的編譯器。例如,您可以使用隨HP-UX附帶的C編譯器構建gcc

  2. 如果您正在爲新語言編寫編譯器,請先以不同語言實現一個非常簡單的編譯器(第一個C編譯器用PDP-11彙編器編寫)開始。這個初始編譯器只會識別目標語言的一小部分;基本上足以做一些文件I/O和一些簡單的語句。在目標語言子集中編寫一個新的編譯器,並使用第一個編譯器構建它。現在編寫一個功能稍強的編譯器,可以識別目標語言的更大的子集,然後使用第二個編譯器編譯它。重複這個過程直到你有一個編譯器能夠識別完整的目標語言。

1

這是一個有趣的問題。我想你想知道用什麼語言編寫了一種新語言的編譯器,不是嗎?那麼,如果我們只有彙編語言(例如x86),編寫C編譯器的唯一方法就是彙編語言。後來,我們可以使用我們的彙編編譯器編寫一個更好,更強大的用C語言編寫的編譯器,等等...... 問題出現了:早期的程序員如何編寫第一個彙編編譯器?我的父親告訴我:通過手動輸入1和0! :-)