震驚!你知道編程語(yǔ)言之祖 C 語(yǔ) 言,自身是用什么語(yǔ)言寫的嗎?

C語(yǔ)言在運(yùn)行之前得編譯才行,C語(yǔ)言額編譯器從哪里來(lái)?
機(jī)器語(yǔ)言可以直接被CPU執(zhí)行,不需要編譯器。
匯編語(yǔ)言只是機(jī)器語(yǔ)言的助記符,但它依舊需要編譯成機(jī)器語(yǔ)言才能執(zhí)行。
所以只能用機(jī)器語(yǔ)言來(lái)寫第一個(gè)編譯器,以后就不用了。
用匯編語(yǔ)言去寫C語(yǔ)言的編譯器,然后可以編譯任意的C語(yǔ)言程序了。然后用C語(yǔ)言本身寫一個(gè)編譯器,接下來(lái)就可以把用匯編寫的C語(yǔ)言編譯器拋棄了。
如果C語(yǔ)言之前已經(jīng)出些了別的高級(jí)語(yǔ)言,比如pascal,然后就可以用pascal來(lái)寫一個(gè)C語(yǔ)言額編譯器了。
第一個(gè)Pascal的編譯器據(jù)說(shuō)使用fortan寫的。第一個(gè)高級(jí)語(yǔ)言的Fortan的編譯器應(yīng)該是匯編語(yǔ)言寫的。
在開發(fā)第一代unix的時(shí)候,連C語(yǔ)言都沒有KenThompson和DennisRitchie可是用匯編一行行把Unix敲出來(lái)的。
WPS第一版是求伯君用匯編寫出來(lái)的。
Turbo Pascal的編譯器也是Anders用匯編寫出來(lái)的、
對(duì)于編譯器,還可用“滾雪球”的方式來(lái)開發(fā):
以C語(yǔ)言為例,第一個(gè)版本可以先選擇C語(yǔ)言的一個(gè)子集,例如只支持基本的數(shù)據(jù)類型,流程控制語(yǔ),句函數(shù)調(diào)用.......我們把這個(gè)子集稱為C0,然后用匯編語(yǔ)言寫個(gè)編譯器。只搞定這個(gè)語(yǔ)言的子集C0,這樣寫起來(lái)就容易不少了。C0這個(gè)子集可以工作了,然后我們擴(kuò)展這個(gè)子集,例如添加struct指針......把新的語(yǔ)言稱為C1,那C1這個(gè)語(yǔ)言的編譯器由誰(shuí)來(lái)寫呢?自然是C0,等到C1可以工作了,再次擴(kuò)展語(yǔ)言特性,用C1寫編譯器,得到C2,然后是C3,C4.......最后得到完整的C語(yǔ)言,這個(gè)過(guò)程被稱為bootstraping,中文叫做自舉。