C语言这么厉害它自身又是用什么语言写的

12次阅读

共计 1862 个字符,预计需要花费 5 分钟才能阅读完成。

这是来自我的星球的一个提问:“C 语言本身用什么语言写的?”

换个角度来问,其实是:C 语言在运行之前,得编译才行,那 C 语言的编译器从哪里来?用什么语言来写的?如果是用 C 语言本身来写的,到底是先有蛋还是先有鸡?

1

我们假设世界上不存在任何编译器,先从机器语言说起,看看怎么办。

机器语言可以直接被 CPU 执行,不需要编译器。

然后是汇编语言,汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了(以后就不用了)。

汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写 C 语言的编译器,我们说这是 C 编译器的老祖宗。

有了这个老祖宗,就可以编译任意的 C 语言程序了,那是不是可以用 C 语言本身写一个编译器?只要用老祖宗编译一下就可以了。

OK,这么一层层上来,终于得到了一个用 C 语言写的编译器,真是够麻烦的。

到这个时候,之前那个汇编写的 C 语言编译器就可以抛弃了。

当然,如果在 C 语言之前,已经出现了别的高级语言,例如 Pascal,那就可以用 Pascal 来写一个 C 语言的编译器。

第一个 Pascal 的编译器据说使用 Fortran 写的。而做为第一个高级语言的 Fortran,它的编译器应该是汇编语言写的。

2

关于编译器,这里边有个有趣的传说:

传说 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。

3

可能有人问:我用汇编写一段 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

我是刘欣,畅销书《码农翻身》作者,15 年以上开发经验,前 IBM 架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。

每天仅需 4 毛钱,加入码农翻身知识星球,和我以及来自腾讯、阿里、京东、滴滴、IBM、SAP 等各路大牛深度交流技术学习,项目开发,编程技术,职业发展 …… 更多写作与参考学习材料等可登录 ZG 文库网 http://www.zgwenku.com/

正文完
 0