c语言(C 语言这么厉害,它自身是用什么语言写的?)

更新时间:2024-04-02 15:53:54 所在栏目: 生活常识点击量:

C 言语这么凶猛,它本身是用什么言语写的?

作者 | 刘欣

本文担当权转载自码农翻身(ID:coderising)

这是来自我的星球的一个发问:“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 , 中文叫做自举。

作者简介:刘欣,热销书《码农翻身》作者,15年以上开发履历,前 IBM 架构师,向导过多个企业使用架构计划和开发事情;洞察武艺实质,善于用故事去解说繁复武艺。

【END】

声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。