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

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

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

机器语言可以直接被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】

    推荐阅读
  • 把握机会的正能量句子推荐(把握机会的正能量句子有哪些)

    把握机会的正能量句子推荐好花盛开,就该尽先摘,慎莫待美景难再,否则一瞬间,它就要凋零萎谢,落在尘埃。机遇只垂青那些懂得怎样追求她的人;人之抛弃机会,绝对多于机会抛弃人。生活中最重要的事情是懂得何时抓住机会,其次便是懂得何时放弃利益。当良机出现在我们面前时,我们要及时抓住它们,利用它们,这是生活的一大艺术。人生成功的秘诀是当好机会来临时,立刻抓住它。正如风只对于能利用它的人才是动力。

  • 车厘子要剥皮吃吗 车厘子要剥皮吃吗有点苦

    冬季吃完火锅,来几枚冻车厘子,可以帮助消化、解除油腻。因车厘子性温,体质过于燥热者,不宜食太多;食用过多容易恶心呕吐、上火,甚至出现流鼻血等症状。但应注意的是,车厘子性温,食之过多可引起上火、流鼻血、损肺等症状,一次性吃的过多还可导致胃痛、泛酸,甚至腹痛、腹泻。尤其是儿童,每天吃车厘子量应控制在12个左右,吃多易生热病,如果孩子咳嗽且有浓痰,就不宜吃车厘子。

  • 中老年奶粉什么时候喝最好(中老年奶粉喝的最佳时候)

    接下来我们就一起去研究一下吧!中老年奶粉什么时候喝最好老年人喝奶粉的最佳时间为晚上睡前或早餐后。睡前喝奶不仅有助于改善老年人的睡眠,而且对于合并有焦虑抑郁情绪的老年人,也能够缓解紧张情绪。早餐后喝奶也是一个好的选择,这样能够保证牛奶中蛋白质、钙质等营养成分充分消化吸收,而且能够保证白天精力充沛。牛奶不主张在空腹时喝,因为空腹喝奶容易引起腹胀,并且营养成分难以被有效吸收。

  • 猴痘猫会得吗(猴痘出现首例人传狗)

    报道称,当地的一对情侣出现猴痘病症的相关症状,在确诊后进行居家隔离。目前WHO已经收到数十个提案。这也符合本次世界卫生组织收集的数据。目前,猴痘病毒已然成为继新冠之后,最令全球各地政府头疼的病毒。鉴于猴痘病毒给人类造成的危害,以及猴痘疫情目前在世界范围内的传播,我们需要进行积极应对。同时,有必要出境的朋友也要谨慎行动,尽量不要前往猴痘疫情爆发的地区。

  • 华为在深圳新增用地(华为新产能布局回归深圳)

    南都记者刘有志摄龙华区一块新批出的产业用地,吸引了各方关注。10月19日,华为技术有限公司以底价2.98亿元,拿下51.49万平方米的地块。在寸土寸金的深圳,这块工业用地无疑属于“巨无霸”级别。目前,该地块已完成土地整备工作,现场有多辆挖掘机正在进行施工,清理土石。华为深圳拿地的消息一经公布,即引发各界热议。华为作为深圳乃至中国的明星企业,释放出的最新发展扩张和产业布局喜讯;具体到城市而言,华为对于深圳至关重要。

  • 有关放纵走私案刑事立案追诉标准是什么

    放纵走私罪是指海关工作人员徇私舞弊,放纵走私,情节严重的行为。涉嫌下列情形之一的,应予立案:1、放纵走私犯罪的;2、因放纵走私致使国家应收税额损失累计达10万元以上的;3、放纵走私行为3起次以上的;4、放纵走私行为,具有索取或者收受贿赂情节的;5、其他情节严重的情形。

  • 菠萝汁喝了有什么作用 菠萝汁有营养吗

    2、菠萝汁的味道酸甜可口,含有果糖、葡萄糖等甜味成分,食用可以促进口腔唾液分泌,同时含有的有机酸也能多,食用可以促进胃酸分泌,也可以帮助消化,因此饮用菠萝汁可以帮助消化。

  • 每晚做梦是什么原因引起的(每晚做梦是什么原因)

    每晚做梦是什么原因引起的睡眠环境不好,增加做梦概率。晚上睡觉时,如果没有好的睡眠环境的话,是非常容易有做梦的情况发生的,睡得好不好,有时候就是看睡眠的环境好不好。尤其是在不熟悉的环境当中,人的做梦概率会相对加大。此外在夏天,因为蚊虫、气温高等原因,人体会因为不舒适而做梦多。注意及时的改善,这种现象就会少得多了。压力大,负面情绪多,是导致多梦的重要原因。睡眠无规律,时间错乱导致多梦。

  • 煮熟的花生放冷藏可以放几天(煮熟的花生放冷藏时间)

    煮熟的花生放冷藏时间3天左右煮熟的花生含有丰富的营养物质,其中蛋白质含量约占营养的30%,蒸完花生后其本身带有较多的水分,如果将熟花生放到冰箱冷藏保存的话,一般能放3天左右,如果再继续放,可能熟花生内部的营养物质便会被细。

  • 芋头排骨的做法(芋头排骨怎么做)

    下面内容希望能帮助到你,我们来一起看看吧!芋头排骨的做法食材:槟榔芋头1/4个、蚝油1汤匙、盐1茶匙、砂糖1茶匙、生抽2汤匙、酒少许、蒜3粒、姜少许、排骨250克。加入料酒,生抽,蚝油和糖。搅拌均匀腌15分钟。芋头去皮切小块。不沾锅小火煎一下。煎香的芋头放在盘上.并淋上一大匙沙拉油,1大匙生抽和半茶匙糖调好的调味汁。准备蒸时撒点粉裹排骨。水烧开蒸15分钟即可。