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

发布时间:2025-09-30 点击:10
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 , 中文叫做自举。


租用云服务器的安全问题应该怎么解决?
网页设计时如何把控整个网站的布局和风格
网站维护的方法有哪些呢?(一)
服装网站建设开发有哪些好处
深圳网站建设需要具体注意哪些细节
一个小企业的网站运营怎样给网站定位
企业网站建设方案与网站项目执行计划两者的关系
火星网络网站建设专家分享企业网站建设的基本常识