C语言这么厉害,它自身又是用什么语言写的?编写过程被称为自举

来自一个小白的提问: “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 , 也会植入后门 :-)

说到这里我就想起了几年前的XcodeGhost 事件,简单来说就是在Xcode(非官方渠道下载的)中植入了木马,这样XCode编译出的ios app都被污染了,这些app就可以被黑客利用做非法之事。

虽然这个XCodeGhost和Thompson的后面相比差得远,但是提醒我们,下载软件的时候要走正规渠道,从官方网站下载,认准网站的HTTPS标准,甚至可以验证一下checksum。

可能有人问:我用汇编写一段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++编程学习交流俱乐部 (群),私信我【01】进入!

还有编程学习文件(源码,零基础教程,项目实战教学视频),欢迎初学者和正在进阶中的小伙伴们!



  • C璇█杩欎箞鍘夊,瀹冭嚜韬張鏄敤浠涔堣瑷鍐欑殑?缂栧啓杩囩▼琚О涓鸿嚜涓
    绛旓細鐒跺悗鏄眹缂栬瑷锛 姹囩紪璇█铏界劧鍙槸鏈哄櫒璇█鐨勫姪璁扮锛屼絾鏄篃闇瑕佺紪璇戞垚鏈哄櫒璇█鎵嶈兘鎵ц锛屾病鍔炴硶鍙兘鐢ㄦ満鍣ㄨ瑷鏉ュ啓杩欑涓涓紪璇戝櫒浜嗭紙浠ュ悗灏变笉鐢ㄤ簡锛夈傛眹缂栬瑷鐨勯棶棰樿В鍐充簡锛屽氨寰鍓嶈繄杩涗簡涓澶ф锛岃繖鏃跺欏氨鍙互鐢ㄦ眹缂栬瑷鍘诲啓C璇█鐨勭紪璇戝櫒锛屾垜浠杩欐槸C缂栬瘧鍣ㄧ殑鑰佺瀹椼傛湁浜嗚繖涓佺瀹楋紝灏卞彲浠ョ紪璇...
  • c璇█鏈韩鐢ㄤ粈涔堣瑷瀹炵幇
    绛旓細浣犺鐨勫簲璇ユ槸璇█鐨勭紪璇戝櫒銆傜紪璇戝櫒鐨勪换鍔″氨鏄妸绋嬪簭鐨勪唬鐮佽В鏋愶紝缂栬瘧鎴栬В閲婃垚鏈湴鐨勬満鍣ㄧ爜锛岀劧鍚庢墠鑳借繍琛屻傛墍鏈夎鐨勭涓涓紪璇戝櫒鍓嶈偗瀹氫笉鑳介氳繃鑷韩鏉ュ疄鐜颁簡锛屽彲浠ョ洿鎺ョ敤鏈哄櫒鐮侊紙浜岃繘鍒讹級銆佹眹缂栨垨鑰呭叾浠栧凡鏈夌殑璇█銆備絾鍙涓绉嶈瑷鏈夌紪璇戝櫒浠ュ悗锛岀敤瀹冨啀鍐欎竴涓紪璇戝櫒灏卞畬鍏ㄥ彲鑳戒簡銆傛墍浠ョ敤C璇█鍐欎竴涓狢...
  • ...VB,C璇█绛夋槸鑳藉缂栧叾浠栫▼搴忕殑,閭d粬鑷韩鍙堟槸鐢变粈涔堣瑷缂栧嚭鏉ョ殑...
    绛旓細閫氬父鏄C/C++ 涔熷彲浠ユ槸姹囩紪 鐒惰岀紪绋璇█鏄涓绉嶇煡璇 娌℃湁瀹炰綋 鏄笉鐢ㄧ紪鐨 缂栬瘧杞欢 鍖呮嫭寰堝閮ㄥ垎 姣斿閾炬帴绋嬪簭(Link) 缂栬瘧绋嬪簭(Combile)浠栦滑鏄笉鍚岀殑 鑰岀晫闈 姣斿VB6.exe TC.exe 鍒欏彲浠ョ洿鎺ョ敤VB绛鑷韩鏉ュ啓閮芥病闂 閫氬父鏉ヨ 寰蒋鐢ㄧ殑鏄眹缂(鏈哄櫒璇█)鍜孋/C++鏉ュ啓 ...
  • C璇█鏄敤浠涔堢紪鍐欏嚭鏉ョ殑
    绛旓細C璇█鏄Dennis Ritchie 鍦1972骞撮氳繃Thompson鐨凚璇█鐨勫熀纭涔嬩笂寮鍙戝嚭鏉ョ殑銆侰鏄綔涓轰粠浜嬪疄闄呯紪绋嬪伐浣滅殑绋嬪簭鐨勪竴绉嶅伐鍏疯屽嚭鐜扮殑锛屾墍浠ュ叾涓昏鐩爣鏄垚涓轰竴绉嶆湁鐢ㄧ殑璇█銆傚悓鏃讹紝 C 涔熸槸涓虹紪绋嬩汉鍛樺紑鍙戠殑璇█锛岃繖浣垮緱瀹冩垚涓哄綋浠婁汉浠鍏堢殑缂栫▼璇█涔嬩竴銆侰宸茬粡鎴愪负鏈閲嶈鍜屾祦琛岀殑缂栫▼璇█涔嬩竴銆傚畠涔嬫墍浠ュ緱鍒板彂灞曪紝...
  • C璇█鏄鐢ㄦ潵骞蹭粈涔堢殑鍟?
    绛旓細鐨勭‘锛鏄敤鏉ョ紪绋嬬殑 鍏蜂綋濡備笅锛歝璇█C璇█鏄洰鍓嶄笘鐣屼笂娴佽銆佷娇鐢ㄩ潪甯稿箍娉涚殑楂樼骇绋嬪簭璁捐璇█銆侰璇█瀵规搷浣滅郴缁熷拰绯荤粺浣跨敤绋嬪簭浠ュ強闇瑕佸纭欢杩涜鎿嶄綔鐨勫満鍚堬紝鐢–璇█鏄庢樉浼樹簬鍏跺畠楂樼骇璇█锛岃澶氬ぇ鍨嬪簲鐢ㄨ蒋浠堕兘鏄敤C璇█缂栧啓鐨勩侰璇█鍏锋湁缁樺浘鑳藉姏寮猴紝鍙Щ妞嶆э紝骞跺叿澶囧緢寮虹殑鏁版嵁澶勭悊鑳藉姏锛屽洜姝ら備簬缂栧啓绯荤粺...
  • - - C璇█鏄浠涔
    绛旓細瀹冪敱缇庡浗璐濆皵鐮旂┒鎵鐨凞.M.Ritchie浜1972骞存帹鍑恒1978鍚锛孋璇█宸插厛鍚庤绉绘鍒板ぇ銆佷腑銆佸皬鍙婂井鍨嬫満涓娿傚畠鍙互浣滀负宸ヤ綔绯荤粺璁捐璇█锛岀紪鍐欑郴缁熷簲鐢ㄧ▼搴忥紝涔熷彲浠ヤ綔涓哄簲鐢ㄧ▼搴忚璁¤瑷锛岀紪鍐欎笉渚濊禆璁$畻鏈虹‖浠剁殑搴旂敤绋嬪簭銆傚畠鐨勫簲鐢ㄨ寖鍥村箍娉涳紝鍏峰寰堝己鐨勬暟鎹鐞嗚兘鍔涳紝涓嶄粎浠呮槸鍦ㄨ蒋浠跺紑鍙戜笂锛岃屼笖鍚勭被绉戠爺閮介渶瑕佺敤...
  • C璇█鍒板簳鏄粈涔堜笢瑗
    绛旓細闅忕潃UNIX鐨勫彂灞,C璇█鑷韩涔熷湪涓嶆柇鍦板畬鍠勩傜洿鍒颁粖澶,鍚勭鐗堟湰鐨刄NIX鍐呮牳鍜屽懆杈瑰伐鍏蜂粛鐒朵娇鐢–璇█浣滀负鏈涓昏鐨勫紑鍙戣瑷,鍏朵腑杩樻湁涓嶅皯缁ф壙Thompson鍜孯itchie涔嬫墜鐨勪唬鐮併俒2] 鍦ㄥ紑鍙戜腑,浠栦滑杩樿冭檻鎶奤NIX绉绘鍒板叾浠栫被鍨嬬殑璁$畻鏈轰笂浣跨敤銆C璇█寮哄ぇ鐨勭Щ妞嶆(Portability)鍦ㄦ鏄剧幇銆傛満鍣ㄨ瑷鍜屾眹缂栬瑷閮戒笉鍏锋湁绉绘鎬,涓簒86...
  • c璇█鏄浠涔
    绛旓細C璇█鐨勭畝浠嬨C璇█鏄涓绉嶈绠楁満绋嬪簭璁捐璇█锛屽畠鏃㈠叿鏈夐珮绾ц瑷鐨勭壒鐐癸紝鍙堝叿鏈夋眹缂栬瑷鐨勭壒鐐广傚畠鍙互浣滀负宸ヤ綔绯荤粺璁捐璇█锛岀紪鍐欑郴缁熷簲鐢ㄧ▼搴忥紝涔熷彲浠ヤ綔涓哄簲鐢ㄧ▼搴忚璁¤瑷锛岀紪鍐欎笉渚濊禆璁$畻鏈虹‖浠剁殑搴旂敤绋嬪簭銆傚洜姝わ紝瀹冪殑搴旂敤鑼冨洿骞挎硾锛屼笉浠呬粎鏄湪杞欢寮鍙戜笂锛岃屼笖鍚勭被绉戠爺閮介渶瑕佺敤鍒癈璇█锛屽叿浣撳簲鐢ㄦ瘮濡傚崟鐗囨満...
  • C璇█鏈変粈涔堝疄闄呭簲鐢?
    绛旓細KTV閲岄潰鐨勭偣姝岀郴缁燂紝鐢佃瘽绛夐兘鏄氳繃C璇█鏉ヨ繘琛屽簳灞傚紑鍙戠殑銆2銆佸仛杞欢UI璁捐鐨勯兘浼氱敤鍒癙S绛夊伐鍏凤紝鍏跺疄杩欎篃鏄疌璇█缂栧啓鐨勩3銆丆璇█鍏锋湁寰堝己鐨勭粯鍥捐兘鍔涘拰鍙Щ妞嶆э紝骞朵笖鍏峰寰堝己鐨勬暟鎹鐞嗚兘鍔涳紝鍙互鐢ㄦ潵缂栧啓绯荤粺杞欢銆佸埗浣滃姩鐢汇佺粯鍒朵簩缁村浘褰㈠拰涓夌淮鍥惧舰绛夈
  • C璇█鍒板簳鏄粈涔
    绛旓細C璇█鍙戝睍杩呴, 鑰屼笖鎴愪负鏈鍙楁杩庣殑璇█涔嬩竴, 涓昏鍥犱负瀹冨叿鏈寮哄ぇ鐨勫姛鑳姐傝澶氳憲鍚嶇殑绯荤粺杞欢, 濡侱BASE 鈪 PLUS銆丏BASE 鈪 閮芥槸鐢C 璇█缂栧啓鐨勩傜敤C璇█鍔犱笂涓浜涙眹缂栬瑷瀛愮▼搴, 灏辨洿鑳芥樉绀篊璇█鐨勪紭鍔夸簡,璞C- DOS 銆乄ORDSTAR绛夊氨鏄敤杩欑鏂规硶缂栧啓鐨勩 C璇█鐨勭壒鐐 1. 绠娲佺揣鍑戙佺伒娲绘柟渚 C璇█涓鍏卞彧鏈32...
  • 扩展阅读:c++编程 ... c语言二级通过率高吗 ... c++和python先学哪个 ... c++语言必背入门代码 ... 扫一扫题目出答案 ... c语言基础知识入门 ... c语言符号意义大全 ... c语言和python哪个厉害 ... c语言和c++和c#先学哪个好 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网