首页
/
每日頭條
/
生活
/
c語言屬于什麼類型的編程語言
c語言屬于什麼類型的編程語言
更新时间:2024-10-01 15:27:44

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)1

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)2

作者 | 劉欣

本文經授權轉載自碼農翻身(ID:coderising)

這是來自我的星球的一個提問:“C語言本身用什麼語言寫的?”

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

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)3

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

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

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

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

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

OK,這麼一層層上來,終于得到了一個用C語言寫的編譯器, 真是夠麻煩的。

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

當然,如果在C語言之前,已經出現了别的高級語言,例如Pascal,那就可以用Pascal來寫一個C語言的編譯器。

第一個Pascal的編譯器據說使用Fortran寫的。而做為第一個高級語言的Fortran,它的編譯器應該是彙編語言寫的。

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)4

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

傳說Unix 發明人之一的 Ken Thompson在貝爾實驗室,大搖大擺的走到任何一台Unix機器前,輸入自己的用戶名和密碼,就能以root的方式登錄!

貝爾實驗室人才濟濟,另外一些大牛發誓要把這個漏洞找出來,他們通讀了Unix的C源碼,終于找到了登錄的後門,清理後門以後編譯Unix , 運行,可是Thompson 還是能夠登錄進去。

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

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

後來Thompson 本人解開了秘密,是第一個C 語言編譯器有問題,這個編譯器在編譯Unix源碼的時候,當然會植入後門,這還不夠,更牛的是,如果你用C 語言寫了一個新編譯器,肯定也需要編譯成二進制代碼啊,用什麼來編譯,隻有用Thompson寫的那第一個編譯器來編譯,好了,你寫的這個編譯器就會被污染了,你的編譯器再去編譯Unix , 也會植入後門 :-)

說到這裡我就想起了幾年前的XcodeGhost 事件,簡單來說就是在Xcode(非官方渠道下載的)中植入了木馬,這樣XCode編譯出的iOS App都被污染了,這些App就可以被黑客利用做非法之事。

雖然這個XCodeGhost和Thompson的後面相比差得遠,但是提醒我們,下載軟件的時候要走正規渠道,從官方網站下載,認準網站的HTTPS标準,甚至可以驗證一下checksum。

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)5

可能有人問:我用彙編寫一段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 , 中文叫做自舉。

作者簡介:劉欣,暢銷書《碼農翻身》作者,15年以上開發經驗,前 IBM 架構師,領導過多個企業應用架構設計和開發工作;洞察技術本質,擅長用故事去講解複雜技術。

【END】

c語言屬于什麼類型的編程語言(C語言這麼厲害它自身是用什麼語言寫的)6

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
關于生日發朋友圈文案
關于生日發朋友圈文案
關于生日發朋友圈文案?承蒙時光不棄,終究又長大了一歲,感謝每個階段不同的自己,我來為大家科普一下關于關于生日發朋友圈文案?下面希望有你要的答案,我們一起來看看吧!關于生日發朋友圈文案承蒙時光不棄,終究又長大了一歲,感謝每個階段不同的自己。希...
2024-10-01
姜湯熬多久
姜湯熬多久
姜湯熬多久?熬姜湯一定得選用老姜,洗淨不去皮,切片加水一碗(一人份)大火燒開後改文火熬制15分鐘左右加入紅塘至糖完全化開即可,趁熱服用,今天小編就來說說關于姜湯熬多久?下面更多詳細答案一起來看看吧!姜湯熬多久熬姜湯一定得選用老姜,洗淨不去皮...
2024-10-01
傅雷家書主要内容概括
傅雷家書主要内容概括
傅雷家書主要内容概括?傅雷家書寫的是傅雷在國外學習期間給兒子傅聰跟兒媳彌拉的書信内容,這些信是1954年傅雷遠赴波蘭留學時寫的,終結到1966年傅雷夫婦自盡結束,整整十二年寫了上百封信件給兒子,十二年通信數百封,貫穿着傅聰出國學習、演奏成名...
2024-10-01
工程造價費用劃分
工程造價費用劃分
工程造價的内容包括四方面,即建築安裝工程費、設備工具、器具購置費、工程建設其他費用和預備費。1.建築安裝工程費:建築安裝工程費由直接工程費、間接費、其他費用等三部分組成。(1)直接費,即施工過程中耗費的構成工程實體和有助于工程形成的各項費用...
2024-10-01
黑米有什麼營養價值為什麼能補腎
黑米有什麼營養價值為什麼能補腎
黑米有什麼營養價值為什麼能補腎?黑米具有補腎壯陽的營養價值黑米的營養豐富,含有蛋白質、脂肪、B族維生素、鈣、磷、鐵、鋅等物質,營養價值高于普通稻米因此逐漸被人們所熟悉并且黑米在皇帝時代是“貢米”,具有良好的醫療保健作用,一般老百姓是吃不到的...
2024-10-01
Copyright 2023-2024 - www.tftnews.com All Rights Reserved