C語言這麼厲害,它自身又是用什麼語言寫的?

2021-10-08 07:43:42 字數 1687 閱讀 2619

c語言本身用什麼語言寫的?」

換個角度來問,其實是:c語言在執行之前,得編譯才行,那c語言的編譯器從**來? 用什麼語言來寫的?如果是用c語言本身來寫的,到底是先有蛋還是先有雞?

1我們假設世界上不存在任何編譯器, 先從機器語言說起,看看怎麼辦。

機器語言可以直接被cpu執行,不需要編譯器。

然後是組合語言, 組合語言雖然只是機器語言的助記符,但是也需要編譯成機器語言才能執行,沒辦法只能用機器語言來寫這第乙個編譯器了(以後就不用了)。

組合語言的問題解決了,就往前邁進了一大步,這時候就可以用組合語言去寫c語言的編譯器,我們說這是c編譯器的老祖宗。

有了這個老祖宗,就可以編譯任意的c語言程式了,那是不是可以用c語言本身寫乙個編譯器?只要用老祖宗編譯一下就可以了。

ok, 這麼一層層上來,終於得到了乙個用c語言寫的編譯器, 真是夠麻煩的。

到這個時候,之前那個彙編寫的c語言編譯器就可以拋棄了。

當然,如果在c語言之前,已經出現了別的高階語言,例如pascal,那就可以用pascal來寫乙個c語言的編譯器。

第乙個pascal的編譯器據說使用fortran寫的。而做為第乙個高階語言的fortran,它的編譯器應該是組合語言寫的。

關於編譯器,這裡邊有個有趣的傳說:

傳說unix 發明人之一的 ken thompson在貝爾實驗室,大搖大擺的走到任何一台unix機器前,輸入自己的使用者名稱和密碼,就能以root的方式登入!

貝爾實驗室人才濟濟,另外一些大牛發誓要把這個漏洞找出來,他們通讀了unix的c原始碼,終於找到了登入的後門, 清理後門以後編譯unix , 執行, 可是thompson 還是能夠登入進去。

有人覺得可能是編譯器中有問題,在編譯unix的時候植入了後門, 於是他們又用c語言重新寫了乙個編譯器,用新的編譯器再次編譯了unix, 這下總算天下太平了吧。

可是仍然不管用, thompson 依然可以用root登入,真是讓人崩潰 !

後來thompson 本人解開了秘密,是第乙個c 語言編譯器有問題, 這個編譯器在編譯unix原始碼的時候,當然會植入後門, 這還不夠,更牛的是,如果你用c 語言寫了乙個新編譯器,肯定也需要編譯成二進位制**啊,用什麼來編譯,只有用thompson寫的那第乙個編譯器來編譯,好了, 你寫的這個編譯器就會被汙染了,你的編譯器再去編譯unix , 也會植入後門 ?

可能有人問:我用彙編寫一段hello world都很麻煩,居然有人可以用它寫複雜的編譯器?這可能嗎?

當然可能,在開發第一代unix的時候,連c語言都沒有, ken thompson 和 dennis ritchie 可是用彙編一行行把unix敲出來的。 wps第一版是求伯君用彙編寫出來的, turbo pascal 的編譯器也是anders 用彙編寫出來的,大神們的能力不是普通人能想象得到的。

對於編譯器來說,還可以採用「滾雪球」的方式來開發:

還是以c語言為例,第乙個版本可以先選擇c語言的乙個子集,例如只支援基本的資料型別,流程控制語句,函式呼叫… 我們把這個子集稱為c0。

然後用組合語言寫個編譯器,只搞定這個語言的子集c0,這樣寫起來就容易不少。

c0這個語言可以工作了,然後我們擴充套件這個子集,例如新增struct,指標… ,把新的語言稱為c1。

那c1這個語言的編譯器由誰來寫? 自然是c0。

等到c1可以工作了,再次擴充套件語言特性,用c1寫編譯器,得到c2。

然後是c3, c4… 最後得到完整的c語言。

這個過程被稱為bootstraping , 中文叫做自舉。

C語言它自身又是用什麼語言寫的?

這是來自我的星球的乙個提問 c語言本身用什麼語言寫的?換個角度來問,其實是 c語言在執行之前,得編譯才行,那c語言的編譯器從 來?用什麼語言來寫的?如果是用c語言本身來寫的,到底是先有蛋還是先有雞?我們假設世界上不存在任何編譯器,先從機器語言說起,看看怎麼辦。機器語言可以直接被cpu執行,不需要編譯...

C 用委託有什麼好處? 它起什麼作用?

什麼是委託 首先要知道什麼是委託,用最通俗易懂的話來講,你就可以把委託看成是用來執行方法 函式 的乙個東西。如何使用委託 在使用委託的時候,你可以像對待乙個類一樣對待它。即先宣告,再例項化。只是有點不同,類在例項化之後叫物件或例項,但委託在例項化後仍叫委託。宣告,如 1 namespace vczx...

快速排序用C語言可以這麼寫

include include 將nums中的資料,進行快速排序 param nums 待排序的陣列 param start 陣列中待排序序列的起始位置 param end 陣列中待排序序列的終止位置 void fastsort int nums,int start,int end 將樞紐元素歸位 ...