突發(fā)腦洞岖赋,C語言編譯器為什么能夠用C語言編寫檬果?

不知道大家有沒有想過一個(gè)問題:C語言編譯器為什么能夠用C語言編寫?

所謂C語言編譯器唐断,就是把編程得到的文件选脊,比如.c,.h的文件,進(jìn)行讀取脸甘,并對(duì)內(nèi)容進(jìn)行分析恳啥,按照C語言的規(guī)則,將其轉(zhuǎn)換成cpu可以執(zhí)行的二進(jìn)制文件丹诀。

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 钝的,領(lǐng)取學(xué)習(xí)資料

其本質(zhì)在于對(duì)文件的讀入,分析铆遭,及處理硝桩。這些操作,C語言都是可以實(shí)現(xiàn)的枚荣。

所以用C語言來做C語言的編譯器是完全可行的碗脊。

但是,歷史上的第一個(gè)C語言編譯器橄妆,肯定不是C語言寫的衙伶,因?yàn)樵跊]有編譯器時(shí),無法把C語言轉(zhuǎn)換成可執(zhí)行文件害碾。只要有了第一版其它語言的編譯器矢劲,就可以用C語言寫編譯器了。

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 慌随,領(lǐng)取學(xué)習(xí)資料

那么世界上第一個(gè)C語言編譯器又是怎么編寫的呢卧须?

還是讓我們回顧一下C語言歷史:

1970年Tomphson和Ritchie在BCPL(一種解釋型語言)的基礎(chǔ)上開發(fā)了B語言,

1973年又在B語言的基礎(chǔ)上成功開發(fā)出了現(xiàn)在的C語言儒陨。

在C語言被用作系統(tǒng)編程語言之前花嘶,Tomphson已經(jīng)使用B語言編寫過操作系統(tǒng)”哪可見在C語言實(shí)現(xiàn)以前椭员,B語言已經(jīng)可以投使用了。

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 笛园,領(lǐng)取學(xué)習(xí)資料

因此第一個(gè)C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP匯編語言編寫的隘击。

事實(shí)上侍芝,B語言的執(zhí)行效率比較低,但是如果全部用匯編語言來編寫埋同,不僅工作量巨大州叠,而且匯編語言的可讀性極差,很容易就會(huì)出錯(cuò)凶赁!

上一張圖大家感受一下這巨大的差別_掷酢!虱肄!

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 致板,領(lǐng)取學(xué)習(xí)資料

為了克服這個(gè)困難,早期的C語言編譯器就采取了一個(gè)取巧的辦法:先用匯編語言編寫一個(gè)C語言的一個(gè)子集的編譯器咏窿,再通過這個(gè)子集去遞推完成完整的C語言編譯器斟或。

大致過程如下:

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 ,領(lǐng)取學(xué)習(xí)資料

先創(chuàng)造一個(gè)只有C語言最基本功能的子集集嵌,記作C0語言萝挤,C0語言已經(jīng)足夠簡單了,可以直接用匯編語言編寫出C0的編譯器根欧。

依靠C0已有的功能怜珍,設(shè)計(jì)比C0復(fù)雜,但仍然不完整的C語言的又一個(gè)子集C1語言咽块,其中C0屬于C1绘面,C1屬于C欺税,用C0開發(fā)出C1語言的編譯器侈沪。

在C1的基礎(chǔ)上設(shè)計(jì)C語言的又一個(gè)子集C2語言,C2語言比C1復(fù)雜晚凿,但是仍然不是完整的C語言亭罪,開發(fā)出C2語言的編譯器……如此直到CN,CN已經(jīng)足夠強(qiáng)大了歼秽,這時(shí)候就足夠開發(fā)出完整的C語言編譯器的實(shí)現(xiàn)了应役。

至于這里的N是多少,這取決于你的目標(biāo)語言(這里是C語言)的復(fù)雜程度和程序員的編程能力燥筷。

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 箩祥,領(lǐng)取學(xué)習(xí)資料

那么這種大膽的子集簡化的方法,又有什么理論依據(jù)呢肆氓?

先介紹一個(gè)概念袍祖,“自編譯”Self-Compile。

對(duì)于某些具有明顯自舉(不知道哪個(gè)鬼才起的名字)性質(zhì)的強(qiáng)類型編程語言

可以借助它們的一個(gè)有限小子集

通過有限次數(shù)的遞推來實(shí)現(xiàn)對(duì)它們自身的表述

(所謂強(qiáng)類型就是程序中的每個(gè)變量必須聲明類型后才能使用谢揪,比如C語言蕉陋,相反有些腳本語言則根本沒有類型這一說法,比如python捐凭。)

滿足自編譯這樣的語言有C、Pascal凳鬓、Ada等等茁肠,至于為什么可以自編譯,可以參見清華大學(xué)出版社的《編譯原理》缩举,書中實(shí)現(xiàn)了一個(gè)Pascal的子集的編譯器垦梆。

在學(xué)習(xí)C/C++或者想要學(xué)習(xí)C/C++可以加入我們的學(xué)習(xí)交流QQ群: 954607083 ,領(lǐng)取學(xué)習(xí)資料

總之蚁孔,已經(jīng)有計(jì)算機(jī)科學(xué)家證明了奶赔,C語言理論上是可以通過上面的方法實(shí)現(xiàn)完整的編譯器的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杠氢,一起剝皮案震驚了整個(gè)濱河市站刑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鼻百,老刑警劉巖绞旅,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異温艇,居然都是意外死亡因悲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門勺爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃琳,“玉大人,你說我怎么就攤上這事琐鲁∥篮担” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵围段,是天一觀的道長顾翼。 經(jīng)常有香客問我,道長奈泪,這世上最難降的妖魔是什么适贸? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涝桅,結(jié)果婚禮上拜姿,老公的妹妹穿的比我還像新娘。我一直安慰自己冯遂,他們只是感情好蕊肥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著债蜜,像睡著了一般晴埂。 火紅的嫁衣襯著肌膚如雪究反。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天儒洛,我揣著相機(jī)與錄音精耐,去河邊找鬼。 笑死琅锻,一個(gè)胖子當(dāng)著我的面吹牛卦停,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恼蓬,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼惊完,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了处硬?” 一聲冷哼從身側(cè)響起小槐,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荷辕,沒想到半個(gè)月后凿跳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疮方,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年控嗜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骡显。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疆栏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惫谤,到底是詐尸還是另有隱情壁顶,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布石挂,位于F島的核電站博助,受9級(jí)特大地震影響险污,放射性物質(zhì)發(fā)生泄漏痹愚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一蛔糯、第九天 我趴在偏房一處隱蔽的房頂上張望拯腮。 院中可真熱鬧,春花似錦蚁飒、人聲如沸动壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琼懊。三九已至阁簸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哼丈,已是汗流浹背启妹。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醉旦,地道東北人饶米。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像车胡,于是被迫代替她去往敵國和親檬输。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容