这是来自我的星球的一个提问:“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 , 中文叫做自举。

END

我是刘欣,畅销书《码农翻身》作者,15年以上开发经验,前 IBM 架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。

每天仅需4毛钱, 加入码农翻身知识星球,和我以及来自腾讯、阿里、京东、滴滴、IBM、SAP等各路大牛深度交流技术学习,项目开发,编程技术,职业发展......

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

  1. 为什么《七周七语言》选中的是这几种语言?

    从众多语言中,挑出本书包含的几门语言,这一过程也许不像你想得那么复杂.我们只不过发了些调查问卷,向本书的潜在读者请教了一番.调查数据汇总上来时,有八门语言入选希望最大.不过,我先是把JavaScrip ...

  2. c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍

    对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...

  3. C语言 指针数组和数组指针区别 - C语言零基础入门教程

    目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组和数组指针区别 1.指针数组 2.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> ...

  4. 【Go语言】【13】再谈GO语言的结构体

    本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初 ...

  5. 红灯停绿灯行c语言编程,基于物联网应用的《C语言程序设计》教学模式研究

    [摘要] 物联网是信息技术的最新发展发向,C语言程序设计又是物联网相关专业中的基础课,在物联网中的应用广泛,本文结合所任教的技工院校学生特点,在分析了C语言教学中存在的问题后,对C语言的教学模式进行了 ...

  6. c语言小游戏vc,C语言探索之旅:第一个C语言小游戏

    C语言探索之旅:第一个C语言小游戏-1.jpg (37.05 KB, 下载次数: 0) 2018-10-8 19:23 上传 内容简介 1.课程纲领 2.第一部分第八课:第一个C语言小游戏 3.第一部 ...

  7. 为什么c语言编的爱心是歪的,C语言之后(歪谈语言史)

    众所周知,C语言是在B语言的基础上发展起来的,而B语言又是从A语言的基础上发展起来的.在学C的时候,我就曾经突发奇想,难道下一个取代C语言的是D语言吗?呵呵,当然不是,且不谈曾有D开头的语言(delp ...

  8. C语言k=xm gt xn gt p,C语言学习001:让程序跑起来

    编译工具下载 编译运行 #include int main(){ puts("C rocks!"); return ; } 编译运行程序 在命令提示符窗口中输入" gcc ...

  9. c语言程序的核心思想是什么,c语言程序设计心得(2)

    C语言编程学习心得篇一 学习C语言已经一年多,对C也算得上半个入门者,期间也写过一些自娱自乐的代码.其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以, ...

  10. 熟练掌握c语言后学习c++的方法,学习C语言的用途,C语言的学习方法

    一.C是基础的语言 C语言被广泛用于操作系统和编译器的开发 功能非常强 虽然现在不是最流行但是 最基础的东西是也比较好学的语言 如:金山的创始人江明 从30多岁开始学语言 学的就是C 对C的评价相当高 ...

最新文章

  1. powershell连接数据库_PowerShell 连接SQL Server 数据库
  2. map遍历删除异常:ConcurrentModificationException
  3. 【NLP】5 分钟理解百度 ERNIE 核心思想
  4. 主内存和工作内存交互
  5. 开发者必备英文网站合集
  6. MPLS LDP邻居建立
  7. 关于 Windows6.1-KB2999226-x64.msu 此更新不适用你的计算机解决办法
  8. Insyde uefi 隐藏设置_使用u盘GPT+UEFI模式安装windows10系统步骤详细图解
  9. VS2019 关闭安全检查
  10. 无线网络 开启nat共享服务器,wifi共享大师开启NAT服务出错的解决方案
  11. 从未改过的网名,一如既往的孤荷凌寒——我的信息技术之路之五
  12. uni-app使用 getUserInfo 报错 fail can only be invoked by user TAP gesture 解决方法
  13. 百度地图api之固定标记点(标记点自己设置样式)
  14. 数据中心机房物理建设
  15. 7家自媒体创业项目平台收益技巧和差异对比,你适合哪个?
  16. css自适应单位布局vm,vh
  17. 王兆星|贷款风险分类和损失拨备制度变革
  18. 【YBT高效进阶】1基础算法/4深度优先搜索/2数独游戏
  19. STM32上移植ds1307笔记
  20. 【ML】特征类别整理

热门文章

  1. Spring Boot Redis 实现分布式锁,真香!!
  2. 显示seata连接不上127.0.0.1:2181
  3. 《文明6》引言科普 引言出处讲解 【转】
  4. Hduoj1011【树状DP】
  5. 简易javascript图片轮播代码
  6. “前世青年照”又让你上套了?大数据时代,人生处处市“陷阱”...
  7. 域名遭到劫持怎么办?
  8. 各种格式文件转PDF的免费网站-转
  9. TCP 协议(序号和确认号)
  10. 殊荣双至,天翼云边缘计算再获两项大奖!