问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-10-22 03:15

我来回答

1个回答

热心网友 时间:2023-11-10 16:49

来自一个小白的提问:“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】进入!

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
mac电脑死机后重启移动硬盘读取不了移动硬盘苹果电脑不识别怎么办 苹果电脑关机后还是关不了机苹果电脑关机关不了怎么办 普通电脑安装macosx普通电脑可以安装苹果系统吗 苹果电脑启动后白屏苹果电脑启动白屏怎么回事 上高中一般多大 wr指标是什么指标 证劵图中wr是什么 鲁大师跑分90000多,玩魔兽直接卡死,请高手看看这配置还有升级的必要么... 鲁大师电脑跑分第一 论文的参考文献如何添加 人生遇见的经典句子大全 ...谁堪月下俦?蟾光如有意,先上玉人楼. 是什么意思?在线等。。急_百度... 月下相逢什么意思? 日语"我们确实如此啊!"(要有很重的叹气声的感觉) 怎么说?要日文与... 日语翻译,我想说确实好,确か良い? 日语的确実和中文的确实有什么区别? 日语 翻译 1、なんてな ─さあ、好きにやれ ロマンチスト! 2、确实に... 【日语】“确実”和“确実に”分别是什么意思?如何用(请造个句子)? 【日语】“确実”是什么意思?如何用(请造个句子)? 跪求niktia-deep kiss feat little s 歌词,带时间轴 ディープキス的翻译是:什么意思 求一个以前看过的有关心理的推理漫画或者动画 可不可以用苏打粉除掉花虫 ? 法式烤鲷鱼的做法步骤图,法式烤鲷鱼怎么做 美味烤鲷鱼怎么做 苹果手机skype视频通话 ...推出美团外卖满减劵,兑换成功后活动礼品多久到账?若没到账怎么办... ...我家后面是鱼塘,我梦见鱼塘里面的水上下翻腾过一会有一匹马上来我... 如果说一个人写字好看的话,握笔的方式是否还重要呢? 湘潭到长沙的城际铁路今天晚上有几趟 太阳白羊座与月亮双子座组合 印度脱裤子是什么礼仪 有失业证但就业了可以申请失业金吗 充绒机充绒口有多大 苹果六电源键和home键都有响声 iphone6电源键按下去有两次声音 杭州联合银行的丰收卡和浙江省农村信用社的丰收卡一样么 杭州联合银行信用卡一定要在杭州联合银行开卡吗 为什么温室气体减排目标通常被设定为减少碳强度? 全球变暖与人类大量排放温室气体有关,温室气体主要是指???举处一种减... 温室气体减排三机制是:履行职责 清洁发展机制 “碳减排”贸易 购买温室气体减排量是什么意思?谁能帮我解释一下?谢谢 LED灯泡,是E27头220V,18个LED串联电流14MA,在环境温度23℃做灯泡点亮... 到日本EMS速递过三个月还没收到,这是丢失了吗? EMS显示离开出口互换局,尚未抵达中国邮政,已经40天了,中国说没收到,日... 有关游泳的古诗词 在powerpoint2000中的哪种模版可有多页幻灯片? 搬藤椅是什么词性? canon l11121e驱动 WN7可以用吗?有的话大家直接给网址或者邮箱53424023... 上海528路公交车路线转哪路车到上海鸿文