第一個 C 語言編譯器是用什麼語言編寫的?

是彙編么?


參考 Dennis M. Ritchie 寫的 The Development of the C Language:Chistory,C 語言誕生的基本過程就是 Ken Thomson 不滿意 BCPL,於是設計了 B 語言,並且用 BCPL 為 B 語言寫了一個編譯器,然後從這個編譯器開始自舉寫新的 B 語言編譯器。貝爾實驗室的眾人在 PDP-7 上用 B 語言寫了各種各樣的東西後又不滿意 B 語言了,於是 1971 年 DMR 開始在新買的 PDP-11 上用 B 給 B 寫擴展,稱之為 NB (new B,此處省略吐槽若干),擴展著擴展著離 B 的畫風越來越遠了,就取了一個新名字變成了一門新語言—— C 語言。 1973 年夏天他們用手頭的編譯器和語言給 PDP-11 重寫了一個 Unix Kernel。C 語言大約就是這個時期成型的。

所以,可以說第一個 C 語言的編譯器是用 B 語言,或者說是擴展過的 B 語言(NB)寫的。因為是一邊改進語言一邊用改進了的編譯器這樣滾雪球寫出來的,也可以看成是 C 語言寫的?畢竟 DMR 也說了,很難確定什麼時候 C 自己變成了一門新語言……

Primeval C: two very early compilers
就放出了貝爾實驗室里第一代 C 編譯器的兩個版本(talk is cheap, show me the code?
:D),這個時候(72年左右)後綴已經是 .c 了,還有部分 PDP-11 的彙編。主要分成兩部分,第一步從源代碼生成 AST 寫進一個 intermediate
representation,第二步從上一步生成的 AST 通過查表生成 PDP-11 的彙編,然後還有一些處理 PDP-11
平台細節的彙編代碼。lexer 和 parser(遞歸下降)都是手寫的(http://cm.bell-labs.com/cm/cs/who/dmr/prestruct-c/c00.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語言寫的。

理論上來講,用什麼語言都可以,CC++JAVA
uby等等


機器生彙編,彙編生B,B生C,C生萬物。


其實,最早的fortran的編譯器是直接編寫出來的,但是後面algo,pascal之類的語言以來的編譯器都不是編寫出來的,而是由文法處理器根據語言的文法描述生成的。

當時的文法處理器估計主要採用PDP-11的匯編語言編寫。畢竟到80年代,CMU和MIT allab的人都還熱衷與PDP-10的匯編程序編寫。

但也不排除ATT用它們的Fortran編譯器完成文法處理器。我覺得可以給現在在谷歌任職的Rob Pike寫一封禮貌得體的信詢問他是否還記得ATT當時的文法處理器的使用情況。


又來打Belleve臉了。

How was the first compiler written?

assembly - How was the first C compiler written ?


推薦閱讀:

為什麼編譯器不能「合成「純虛析構函數的函數定義??
編程語言是語法比較重要還是編譯器的具體實現比較重要?
符號表和抽象語法樹是什麼關係?兩者在編譯器設計中是否必需?
程序設計中,堆和棧比較重要。棧存取速度大於堆,而且編譯器可以修改棧大小,這個值可以隨意設置嗎?
GPU編譯器開發怎麼樣,前景如何?

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