C編譯器用什麼語言寫的?


理論上來講,用什麼語言都可以,CC++JAVA
uby等等,如果你現在有了一個不滿意的C編譯器,可以打開另外一個編譯器重寫一個自己滿意的出來。另外關於最早的C語言編譯器,查了一下資料:

C語言的原型ALGOL 60語言。(也稱為A語言) 1963年,劍橋大學將ALGOL 60語言發展成為CPL(Combined Programming Language)語言。 1967年,劍橋大學的Matin Richards 對CPL語言進行了簡化,於是產生了BCPL語言。 1970年,美國貝爾實驗室的Ken Thompson將BCPL進行了修改,並為它起了一個有趣的名字「B語言」。意思是將CPL語言煮干,提煉出它的精華。並且他用B語言寫了第一個UNIX操作系統。 而在1973年,B語言也給人「煮」了一下,美國貝爾實驗室的D.M.RITCHIE在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。

所以,最早的C語言編譯器使用B語言寫的。


C語言的編譯器是用C寫的。第一個C的編譯器是使用Ken Thompson和Dennis Ritchie更早前發明的B語言寫的。


贊同 @深井裡的冰 的答案

C語言編譯器就是用來編譯C語言的,如果C語言編譯器也是C開發的,那麼是先有C還是先有C編譯器?沒有C哪來的C編譯器?沒有C編譯器又怎麼去編譯C?

先有雞還是先有蛋的問題

」C語言編譯器是用C語言開發「這句話的正確理解應該是這樣的一個過程:

1. 首先使用彙編語言編寫出一個C語言編譯器 ①.exe(也就是早起的C編譯器);

2. 有了 ①.exe 之後,就可以用 ①.exe來編譯C代碼,得到一個程序 ②.exe

3.②.exe的功能就可以是讀取文本(即C語言源代碼),根據文本的生成相應的彙編代碼。

4. 這裡的②.exe 其實就是」用C語言開發的C語言編譯器「


簡單的說,先用彙編語言編寫一個c語言子集的編譯器,這個編譯器只支持非常簡單易實現的特徵,複雜特性比如struct, union之類肯定是不會用彙編實現的,然後通過這個這個"類c語言編譯器"再實現一個較為完整的c編譯器。

如果你提另一個問題,彙編語言編譯器最開始是用什麼寫的,基本上也遵循這個過程,先用機器語言(打孔機等)實現一個簡化了的彙編語言編譯器,然後在這個簡化了的彙編語言編譯器基礎上再實現一個完整的彙編語言編譯器。

補充,再其後的比如C++這樣的語言,因為編譯技術的發展,基本上可以使用想YACC這樣的工具自動生成編譯器了,即編譯器的編譯器。


這個問題有點像哲學上「先有雞還是先有蛋?」的討論

這裡可以這樣理解,

一隻叫B語言的鴨,下了一隻蛋,結果卻孵出了雞(C編譯器)

有了雞,後來也就有了雞蛋(C程序)

所以,這個哲學爭論在C語言中的結論是,先有雞。


業界慣例(儀式)據說是在C編譯器被(上一版的)編譯出來後的第一件事情是把自己(源代碼)編譯一遍.


他們回答了第一個c編譯器的由來,不過後來的c編譯器,都是自編譯的。

有種技術叫編譯器自舉,可以去維基看一下原理,具體我也不是很懂,說白了就是一種編譯器編譯自己的方法。


llvm也算一個c語言編譯器,不過llvm是c++寫的。。


自舉


C不只有編譯器,還有C的解釋器


推薦閱讀:

這個指針C語言如何聲明?
不用QT,你能讓UI同時運行在Mac, IOS, Windows, Android, Linux上嗎?
如何用C/C++動手編程一款windows平台下的屬於自己的音樂播放器軟體?
c++中cin和scanf的區別是什麼?
客戶端產品一般是用什麼編程語言寫的?

TAG:C編程語言 | 編譯器 |