专栏首页嵌入式Linux系统开发C语言这么厉害,它自身又是用什么语言写的?

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

“C语言本身用什么语言写的?”

换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

1

我们假设世界上不存在任何编译器, 先从机器语言说起,看看怎么办。

机器语言可以直接被CPU执行,不需要编译器。

然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了(以后就不用了)。

汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写C语言的编译器,我们说这是C编译器的老祖宗。

有了这个老祖宗,就可以编译任意的C语言程序了,那是不是可以用C语言本身写一个编译器?只要用老祖宗编译一下就可以了。

OK, 这么一层层上来,终于得到了一个用C语言写的编译器, 真是够麻烦的。

到这个时候,之前那个汇编写的C语言编译器就可以抛弃了。

当然,如果在C语言之前,已经出现了别的高级语言,例如Pascal,那就可以用Pascal来写一个C语言的编译器。

第一个Pascal的编译器据说使用Fortran写的。而做为第一个高级语言的Fortran,它的编译器应该是汇编语言写的。

2

关于编译器,这里边有个有趣的传说:

传说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。

3

可能有人问:我用汇编写一段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 , 中文叫做自举。

建议阅读博主上一篇文章的中间部分,语言的发展:

博主的 Java 那些事

·················· END ··················

本文分享自微信公众号 - 嵌入式Linux系统开发(Jason_Linux_)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

    诸葛青云
  • 自学C语言的最大难题是什么?

    万事开头难,自学C语言最大的困难在于遇到问题不知道如何解决,还有不知道学到什么程度才能找到工作,这是自学编程语言最大的障碍,学到中间不知道什么时候是个头,遇到问...

    程序员互动联盟
  • C语言学不会,编程能力无法提升?你的问题我来解决!

    C语言学不会,编程能力无法提升?这篇文章助你走上编程大牛之路。现在很多小伙伴都在学习C语言,C语言作为一门入门语言可以让你更加容易的了解计算机原理且C语言想单片...

    企鹅号小编
  • 跨平台这件事儿

    跨平台很神秘吗 刚刚开始做开发的时候,感觉跨平台是那么高大上,就像夕阳下,湖面上的一朵白莲花,只可远观,不可亵玩焉。那么,跨平台到底是怎么一回事儿。难道真的有什...

    古时的风筝
  • 一周播报|东厂小情报:同为P6,阿里资深与蚂蚁高级工程师的差别竟然是这样……

    1、“养码场·一周技术职位清单”改版成“养码场·职位优选”。图片上的每个职位,都是场主为养码人精心挑选的,带有各自极其亮眼的标签福利。

    养码场
  • 为什么C语言依然是必学的编程语言,这3点告诉你答案

    如今,市面上编程语言几百种,很多人觉得Python、 JAVA这种语言比较火,是不是C语言就不行了呢?

    诸葛青云
  • 一个32岁入门的70后程序员给我的启示

    大家好,今天为大家带来一个非常励志,让我反思的故事。今天为大家讲的是我父亲是如何用行动教会我成为程序员的。 岁月的锤炼   圆口接口的键盘,2003 年的 ? ...

    java思维导图
  • 初学者究竟该如何学习编程呢?

    一个厉害的将军必定是经历过地狱般的磨炼,绝对不是天生的!一个天才一定是经过无数次失败,走上来的,那才叫天才。天才不努力,还不是蠢材。蠢材去努力照样是天才!不怕失...

    小林C语言
  • 一个32岁入门的70后程序员给我的启示

    一个32岁入门的70后程序员给我的启示 大家好,我是帅气小伙,今天为大家带来一个非常励志,让我反思的故事。今天为大家讲的是我父亲是如何用行动教会我成为程序员的。...

    用户1289394
  • 一个32岁入门的70后程序员给我的启示

    IT派 - {技术青年圈} 持续关注互联网、大数据、人工智能领域 大家好,我是帅气小伙,今天为大家带来一个非常励志,让我反思的故事。今天为大家讲的是我父亲是...

    IT派
  • 一个32岁入门的70后程序员给我的启示

    大家好,我是帅气小伙,今天为大家带来一个非常励志,让我反思的故事。今天为大家讲的是我父亲是如何用行动教会我成为程序员的。

    哲洛不闹
  • 一个32岁入门的70后程序员给我的启示

    大家好,我是帅气小伙,今天为大家带来一个非常励志,让我反思的故事。今天为大家讲的是我父亲是如何用行动教会我成为程序员的。 岁月的锤炼 ? 圆口接口的键盘,200...

    用户1667431
  • 一场编程语言之战

    进入2020年3月,新的编程语言排行榜新鲜出炉,TIOBE 最新发布了 3 月编程语言排行榜。

    润森
  • 绝了!Python又放大招,逆袭宇宙语言!

    自2017年国务院印发《新一代人工智能发展规划》,明确指出在中小学阶段设置人工智能相关课程后,Python一路逆袭, 作为人工智能时代最合适的语言,Python...

    诸葛青云
  • 绝了!Python又放大招,逆袭宇宙语言!

    自2017年国务院印发《新一代人工智能发展规划》,明确指出在中小学阶段设置人工智能相关课程后,Python一路逆袭, 作为人工智能时代最合适的语言,Python...

    Python之道
  • 学了十几种编程语言后,我有哪些感受?

    学编程 5 年多了,我学过十几种编程语言,比如 C、C++、Java、Python、JavaScript、Go、PHP、C#、SQL、Scala 等。

    程序员鱼皮
  • 人生苦短,我用Python之小游戏

    虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,G...

    小Bob来啦
  • C语言入门精髓

    上篇说到了C语言还是很基础的编程语言,还是值得去学,那么怎么去学?什么人才能学好?为什么学到一半就早早缴械投降了?众多迷雾,众多的困难,怎么破局? 很多对编程感...

    程序员互动联盟
  • 开发 7 年,我学到了什么?

    oschina.net/news/106798/7-years-as-a-developer-lessons-learned

    Java技术栈

扫码关注云+社区

领取腾讯云代金券