肥宅钓鱼网
当前位置: 首页 钓鱼百科

c语言属于什么类型的编程语言(C语言这么厉害它自身是用什么语言写的)

时间:2023-08-08 作者: 小编 阅读量: 3 栏目名: 钓鱼百科

机器语言可以直接被CPU执行,不需要编译器。OK,这么一层层上来,终于得到了一个用C语言写的编译器,真是够麻烦的。到这个时候,之前那个汇编写的C语言编译器就可以抛弃了。第一个Pascal的编译器据说使用Fortran写的。可是仍然不管用,Thompson依然可以用root登录,真是让人崩溃!这个过程被称为bootstraping,中文叫做自举。

作者 | 刘欣

本文经授权转载自码农翻身(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】

    推荐阅读
  • 牛肉小丸子的家常做法和配方(怎么做牛肉小丸子)

    下面希望有你要的答案,我们一起来看看吧!牛肉小丸子的家常做法和配方主料:牛里脊500g。辅料:食盐适量、淀粉适量、调和油适量、鸡蛋1个、花椒粉适量、姜粉适量。将牛里脊肉剁成馅。打入一个鸡蛋清,放入淀粉,花椒粉,精盐,白胡椒粉,姜粉适量。油烧至6成热,左手握住肉馅,在虎口处挤出,用大拇指配合将丸子搓圆,用右手大拇指将丸子挑如油中,炸至金黄,即可。

  • 论文具体格式要求(论文格式是什么样子的)

    用证据支持你所做的每一个陈述。与没有事实的陈述相反,陈述事实而不作评论。避免许多长的,直接的引号。虽然你的论文是基于研究,但重点是你提出了自己的想法。由于几个原因,在导言之前写一个结论是个好主意。避免重复你在结论中使用的确切短语。检查您的论文,纠正所有错误,并在必要时重新整理信息。调整字体、行距和页边距,以满足教授或专业的要求。确保保存文件,再论文查重通过后并打印出您的最终草稿。

  • 企业养老补缴申请流程(企业养老补缴申请流程是什么)

    我们一起去了解并探讨一下这个问题吧!企业养老补缴申请流程如果是单位补交的,用人单位可以向劳动保障部门提出书面补缴申请,并提交申请补缴期间与被保险人存在劳动关系的证明以及工资收入凭证。经确认后,由企业和职工个人从规定实行企业和个人共同缴费之月起,补交养老保险。

  • 安全生产责任履职汇报(理清什么是安全生产责任制)

    近年来的一系列事故警示,生产经营单位的主体责任,需要进一步“责任到人”。既要盯住负责人,也应“建立健全并落实本单位全员安全生产责任制”。

  • 媒妁之言是什么意思(词语媒妁之言的意思)

    我们一起去了解并探讨一下这个问题吧!媒妁之言是什么意思媒妁之言,汉语成语,拼音是méishuòzhīyán,意思是指媒人的介绍。

  • 有哪些来自历史故事的成语(关于历史人物有哪些脍炙人口的成语呢)

    公元前581年去世,在位共计十九年,之后由其子晋厉公继位。秦始皇死后,赵高发动沙丘政变,他与丞相李斯合谋伪造诏书,逼秦始皇长子扶苏自杀,另立始皇幼子胡亥为帝,是为秦二世,并自任郎中令。他在任职期间独揽大权,结党营私,征役更加繁重,行政更加苛暴。公元前208年又设计害死李斯,继之为秦朝丞相。第三年他迫秦二世自杀,另立子婴为秦王。不久被子婴设计杀掉,诛夷三族。

  • lg手机发展现状(被抛弃的LG手机从靠)

    消息发布后,LG股价应声上涨3.9%,但在当日午后走低,截至收盘下跌2.52%。面对残酷的现实,权邦锡于今年1月公开表示,将考虑包括出售LG手机业务在内的各种可能性。中国被LG视为走出韩国、走向世界的重要战略市场。根据市场调研机构Omdia最新数据,2020年LG的TV出货量与销量均位列全球第二,但同比分别下滑了4.6%和1%。去年有媒体报道LG电视撤出中国家电卖场,LG电子对此始终未做出回应。

  • 明基ew2880u显示器评测(明基PD2705U专业设计显示器)

    前不久,明基PD系列又添一员猛将,它便是明基PD2705U。具体来说,明基PD2705U在该模式下的显示效果要更为接近苹果原生色彩。不再因为不同屏幕间的较大色差,而导致视觉不适。明基PD2705U作为一款专业设计显示器,从实际使用场景出发。测试前已把显示器恢复出厂设置,并进行一小时的预热。在色域覆盖度的测试上,明基PD2705U对sRGB色域的覆盖度为99%,AdobeRGB色域的覆盖度为75%,P3色域的覆盖度为75%。

  • 微山湖西属徐州还是属济宁(微山湖到底属于微山县还是属于沛县)

    微山湖是位于中国山东省微山县南部的断陷湖。四湖中以微山湖面积最大,达660平方千米,水深3米左右。铜山区方表述:徐州市铜山区辖微山湖湖区水面面积约100多平方公里,湖岸线长60公里。其实,微山湖水面归山东济宁市微山县管理,也就是微山对整个微山湖面拥有行政管理权。江苏省只有南部湖区西岸土地使用权,同时京杭大运河归沛县管辖,千岛湖湿度归沛县。希望湖区周边的地域共同发展,和谐幸福。

  • 家谱谱序要怎么写 家谱的谱序怎么写

    谱序是每一部家谱都不可缺少的内容,它包括本族人写的序和邀请外族人写的序,以及跋语等等。家谱序跋的内容一般可包含修谱缘由、修谱经过、家族的渊源传承以及谱学理论等。随着族谱纂修次数的增多,序跋也不断增多,故一些大型的族谱,至清末民国时历经数修之后,序跋多达十余篇乃至数十篇。为了让本族以后永远保持联系,勿忘祖宗等。