這是來自我的星球的乙個提問:「c語言本身用什麼語言寫的?」
換個角度來問,其實是:c語言在執行之前,得編譯才行,那c語言的編譯器從**來? 用什麼語言來寫的?如果是用c語言本身來寫的,到底是先有蛋還是先有雞?
我們假設世界上不存在任何編譯器, 先從機器語言說起,看看怎麼辦。
機器語言可以直接被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 , 中文叫做自舉。
end
C語言這麼厲害,它自身又是用什麼語言寫的?
c語言本身用什麼語言寫的?換個角度來問,其實是 c語言在執行之前,得編譯才行,那c語言的編譯器從 來?用什麼語言來寫的?如果是用c語言本身來寫的,到底是先有蛋還是先有雞?1我們假設世界上不存在任何編譯器,先從機器語言說起,看看怎麼辦。機器語言可以直接被cpu執行,不需要編譯器。然後是組合語言,組合語...
C語言是用什麼語言寫的?雞與蛋的關係
來自乙個小白的提問 c語言本身用什麼語言寫的?換個角度來問,其實是 c語言在執行之前,得編譯才行,那c語言的編譯器從 來?用什麼語言來寫的?如果是用c語言本身來寫的,到底是先有蛋還是先有雞?我們假設世界上不存在任何編譯器,先從機器語言說起,看看怎麼辦。機器語言可以直接被cpu執行,不需要編譯器。然後...
Golang 本身是用什麼語言寫的?
原文 首先,問題的說法是有問題的。golang本身是用什麼語言寫的?從問題描述和下面的回答來看,題主真正想問的是 golang 的編譯器是用什麼語言寫的?看起來像是個 雞生蛋,蛋生雞 的問題,實際上不是的。這個問題的關鍵在於理解,編譯器本身就是乙個程式,它的功能就是把源 翻譯為計算機可執行的程式。對...