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

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】

    推荐阅读
  • 指甲盖发黄是什么原因 指甲盖发黄是什么原因引起的

    可能是胡萝卜素血症引起胡萝卜素血症是一种因血内胡萝卜素含量过高引起的肤色黄染症。肝炎引起的黄疸以巩膜最为显著,且伴有肝肿大和肝功能损害进行区分。可能是黄疸引起黄疸,常见于新生儿,但其实这种病症除了新生儿会得,一些中老年人也是易得人群,患有黄疸的人,也会出现皮肤、指甲黄染的现象。注意对于甲亢病人治疗要防止过度造成甲减。

  • 起微信名(好听的微信名字示例)

    我以为我会忘了你拥江山居九五,下面我们就来说一说关于起微信名?我们一起去了解并探讨一下这个问题吧!起微信名我以为我会忘了你拥江山居九五先森你了解我吗雅轩先森柜子里的小强挽回不了的心拥有过厌学症晚期多想再次拥抱他不受折磨.年华已成无效信别太妥协好看就壳她没关系一个人也挺好不得了嘴角丄扬偷偷恋上ni"你说爱我的全部ωǒ的字典里没有不可能抽动式,疼痛屬於一個秂

  • 潍坊高密怎么给摩托车上牌?(潍坊摩托车上牌在哪)

    摩托车挂牌需携带的资料1.车主身份证明。到就近的县市区车管所报名考试。科目三道路驾驶技能考试项目:上车准备、起步、直线行驶、变更车道、通过路口、靠边停车。科目三安全文明考试为理论知识考试,考试50道题,满分100分,90分以上考试通过。通过考试后进行半小时的安全文明驾驶常识教育,并宣誓领证。

  • 蓝牙连接器能插在Ll盘的唱戏机上使用吗(蓝牙适配器怎样)

    以下内容希望对你有帮助!蓝牙连接器能插在Ll盘的唱戏机上使用吗可以使用,蓝牙接收器是指能接受传输方式为蓝牙的接收器,一般支撑PC与Mac,现今已经广泛运用于生活中,如我们常用的蓝牙耳机、蓝牙音箱、蓝牙鼠标、蓝牙键盘等都属于蓝牙接收器。蓝牙适配器一般用在电脑上,用来连接蓝牙设备,具有蓝牙信号的接收和发送功能,可以算是蓝牙接收器的一种;就像网络适配器用来连接网络设备一样。

  • 闺蜜网名二人仙气可爱(闺蜜网名二人仙气可爱有哪些)

    当年致青春——现致小时代盖世小可爱——混世小仙女,今天小编就来说说关于闺蜜网名二人仙气可爱?下面更多详细答案一起来看看吧!

  • 泰国礼服怎么穿(是什么泰国礼服)

    泰国礼服怎么穿?接下来我们就一起去研究一下吧!男装马褂被叫做sueaphraratchathen,正装穿长袖,日常装束穿短袖。女装是上衣下方裙,方裙被称为服新,是由一块长方形的丝绸把腰间紧紧的裹起来做成的裙子,用绳子调整松紧,再把腰绳藏在回到部分。上衣可以有夹克和衬衫搭配。正式的装束还要披一条斜穿上身的带子。

  • 加湿器和空气净化器的区别(加湿器和空气净化器的区别是什么)

    工作目的加湿器和空气净化器的工作对象从大体上说都是外界环境,只是他们的方向不同,加湿器的目的是空气湿度,而空气净化器则是空气质量,加湿器直接作用于水达到目的,空气净化器则是作用于空气。

  • 那些令人怀念的单机游戏(已经淡出视线的国产单机游戏)

    原因很简单,盗版猖獗,没有收入。这样,小公司就可以靠着一个程序员编写出像仙剑奇侠传这样的游戏了。这样,你就知道,以前写一个古剑奇谭,是有多难了吧?想一想,仙剑奇侠传这么好的游戏,为什么发展不起来呢?真正对国产单机游戏造成致命打击的,是互联网的高速发展。

  • 世界上最大的蚯蚓是哪里的(世界上最大的蚯蚓)

    ,我来为大家科普一下关于世界上最大的蚯蚓是哪里的?下面希望有你要的答案,我们一起来看看吧!

  • 人流会导致绝经吗(人流手术会导致绝经吗)

    此外,要保证补充足够的铁质,以预防流产后贫血的发生。由于子宫内膜留下创面,阴道分泌物增多,使之成为细菌感染、繁殖的温床。