C 语言这么厉害,它自身是用什么语言写的?
作者 | 刘欣
本文经授权转载自码农翻身(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 架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。
C 语言这么厉害,它自身是用什么语言写的?相关推荐
- C语言k=xm gt xn gt p,C语言学习001:让程序跑起来
编译工具下载 编译运行 #include int main(){ puts("C rocks!"); return ; } 编译运行程序 在命令提示符窗口中输入" gcc ...
- c语言程序的核心思想是什么,c语言程序设计心得(2)
C语言编程学习心得篇一 学习C语言已经一年多,对C也算得上半个入门者,期间也写过一些自娱自乐的代码.其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以, ...
- c语言表达式3178的值为,【C语言】C语言运算符
c语言 &取地址运算符的理解 对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址:但是根据我对代码的观察,我觉得&am ...
- 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...
语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...
- c语言s开头的函数以及作用,C语言函数大全-s开头-完整版.doc
C语言函数大全-s开头-完整版 C语言函数大全(s开头) 函数名: sbrk 功能: 改变数据段空间位置 用法: char *sbrk(int incr); 程序例: #include#include ...
- 为什么《七周七语言》选中的是这几种语言?
从众多语言中,挑出本书包含的几门语言,这一过程也许不像你想得那么复杂.我们只不过发了些调查问卷,向本书的潜在读者请教了一番.调查数据汇总上来时,有八门语言入选希望最大.不过,我先是把JavaScrip ...
- c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍
对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...
- java语言程序设计考点_计算机二级考试Java语言程序设计考点:关键字
大家回忆一下我们在学习汉语的时候,开始学的是什么?肯定是先学一些单个的字,只有认识了单个的字,然后才能组成词,然后才能慢慢的到句子,然后到文章.学习同计算机交流跟这个过程是一样的,首先我们得学习一些计 ...
- c语言程序执行时无法输入字符串,C语言程序设计中键盘输入数据的方法分析
1. 引言 C语言程序设计是一门实践性很强的语言课程,在程序设计过程中经常需要从键盘输入所需要的数据.C语言没有专门的输入语句,可以调用C语言编译系统提供的函数库中的库函数来实现.有些程序虽然调试成功 ...
- c语言怎么让他变成程序,用C语言编了个程序,怎样让它点击“下一步”后继续弹出窗口...
可以参考下面的代码: #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, ...
最新文章
- caffe finetune predict and classify the lung nodule( 肺结节的分类)
- C言语for轮回语句
- HTAP数据库 PostgreSQL 场景与性能测试之 28 - (OLTP) 高并发点更新
- FaceNet--Google的人脸识别
- 致盗窃,抄袭有三AI内容以及不可理喻的读者
- 前端学习(1325):await关键字
- 不会诈骗的公司 都倒闭了
- 算法题5 用数组实现队列
- python将图片转换为字符_python如何将图片转换为字符图片
- 深度学习自学(五):NCNN中openmp加速模块学习总结
- 系统架构设计笔记(19)—— 网络存储技术
- 手动安装shipyard
- git文件夹不显示绿勾
- 关于移动视频直播技术,关键干货都在这里了(三)编码和封装
- Increasing trend of scientists to switch between topics论文翻译
- 2022年厦门大学计算机考研复试分数线多少
- KNN最近邻算法理解
- 字符串操作函数strstr
- TikZ做思维导图并插入幻灯片
- 影响人类!写入历史!疫情年最值得铭记的6个大事件
热门文章
- SQL:查询、替换字符串中的回车、换行、回车换行
- 第12章 数据库完整性
- 华为鸿蒙系统适合机型,华为鸿蒙os2.0系统适用哪些机型
- 和python高级知识_Python中的5个高阶概念属性的知识点!你要了解明白哦!
- mdx格式的词典用什么软件打开_可能是目前PC端最好用的词典——Goldendict
- ES6 javascript 实用开发技巧 1
- android support v4 viewstub,Android 控件ViewStub
- 俄罗斯 Android 系统受限,或将转用 HarmonyOS?
- 做数据中心,腾讯是认真的!
- 《CSDN好师父》给你更好选择:“深圳工资、长沙房价、全球视野”