首页 > 应用 > 嵌入式
[导读] C编译器是C程序运行的核心,那么C编译器是采用什么语言编写的呢?又或者问,为什么C编译器可由C语言编写而成呢?如果你想深入的了解C编译器,不妨跟着小编一探究竟。

所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。

其本质在于对文件的读入,分析,及处理。这些操作,C语言都是可以实现的。

所以用C语言来做C语言的编译器是完全可行的。

但是,历史上的第一个C语言编译器,肯定不是C语言写的,因为在没有编译器时,无法把C语言转换成可执行文件。只要有了第一版其它语言的编译器,就可以用C语言写编译器了。

1231432.png

那么世界上第一个C语言编译器又是怎么编写的呢?

还是让我们回顾一下C语言历史:

1970年Tomphson和Ritchie在BCPL(一种解释型语言)的基础上开发了B语言,

1973年又在B语言的基础上成功开发出了现在的C语言。

在C语言被用作系统编程语言之前,Tomphson已经使用B语言编写过操作系统。可见在C语言实现以前,B语言已经可以投使用了。

因此第一个C语言编译器的原型完全可能是用B语言或者混合B语言与PDP汇编语言编写的。

事实上,B语言的执行效率比较低,但是如果全部用汇编语言来编写,不仅工作量巨大,而且汇编语言的可读性极差,很容易就会出错!

上一张图大家感受一下这巨大的差别!!!

21434.png

为了克服这个困难,早期的C语言编译器就采取了一个取巧的办法:先用汇编语言编写一个C语言的一个子集的编译器,再通过这个子集去递推完成完整的C语言编译器。

大致过程如下:

434234.png

先创造一个只有C语言最基本功能的子集,记作C0语言,C0语言已经足够简单了,可以直接用汇编语言编写出C0的编译器。

依靠C0已有的功能,设计比C0复杂,但仍然不完整的C语言的又一个子集C1语言,其中C0属于C1,C1属于C,用C0开发出C1语言的编译器。

在C1的基础上设计C语言的又一个子集C2语言,C2语言比C1复杂,但是仍然不是完整的C语言,开发出C2语言的编译器……如此直到CN,CN已经足够强大了,这时候就足够开发出完整的C语言编译器的实现了。

至于这里的N是多少,这取决于你的目标语言(这里是C语言)的复杂程度和程序员的编程能力。

那么这种大胆的子集简化的方法,又有什么理论依据呢?

先介绍一个概念,“自编译”Self-Compile。

对于某些具有明显自举(不知道哪个鬼才起的名字)性质的强类型编程语言

可以借助它们的一个有限小子集

通过有限次数的递推来实现对它们自身的表述

(所谓强类型就是程序中的每个变量必须声明类型后才能使用,比如C语言,相反有些脚本语言则根本没有类型这一说法,比如python。)

满足自编译这样的语言有C、Pascal、Ada等等,至于为什么可以自编译,可以参见清华大学出版社的《编译原理》,书中实现了一个Pascal的子集的编译器。

总之,已经有计算机科学家证明了,C语言理论上是可以通过上面的方法实现完整的编译器的。

 

换一批

延伸阅读

[汽车电子] 软件与整车电子架构结合将重新定义汽车行业

软件与整车电子架构结合将重新定义汽车行业

随着智能互联、自动驾驶、电动汽车及共享出行的发展,软件、计算能力和先进传感器正逐渐取代发动机的统治地位。与此同时,这些电子系统的复杂性也在提高。以当今汽车包含的软件代码行数(SLOC)为例,2010年,主流车型的SLOC约为1000万行;到......

关键字:SLOC ADAS HAD

[嵌入式] 乱花渐欲迷人眼的C编译器中,谁才是“编译之王”?

乱花渐欲迷人眼的C编译器中,谁才是“编译之王”?

C语言作为“万物的始祖”,所有刚接触的小伙伴都在使用C语言,然而不胜枚举的C语言编译器让人眼花缭乱,VScode、GCC、TCC……那么到底哪些C语言编译器是大佬们用的最多的?又有哪些C语言编译器是兼容性最强的呢?到底谁才是编译之王?......

关键字:C编译器 C语言 VScode GCC

[汽车电子] 视觉系统在当代汽车中得到进一步应用

视觉系统在当代汽车中得到进一步应用

驾驶员最重要的任务之一是观察周围环境并做出相应的反应,随着汽车制造商实施先进驾驶员辅助系统(ADAS),视觉系统已引起人们对其作用的重视。......

关键字:视觉系统 ADAS 汽车电子

[行业观察] 汽车主动安全成重中之重,开易科技闪耀CITE 2019

汽车主动安全成重中之重,开易科技闪耀CITE 2019

大家可能对ADAS并不陌生,但却并没有切实应用过。ADAS是Advanced Driver Assistance System的简称,翻译成中文的意思就是高级驾驶辅助系统,简单来讲就是紧急情况下在驾驶员在主观反应之前作出主动判断和预防措施,......

关键字:主动安全 开易科技 ADAS

[模拟技术] TDK推出适用于ADAS应用的微型薄膜金属功率电感器

TDK推出适用于ADAS应用的微型薄膜金属功率电感器

TDK株式会社(TSE:6762)推出了TFM252012ALVA薄膜金属功率电感器,该款电感器可与12 V汽车电池直接相连,同时保持小型尺寸。......

关键字:ADAS 功率电感器 汽车电源电路

[单片机应用] AVR c语言优秀编程风格

AVR c语言优秀编程风格

文件结构模块化的程序应该是有一个很好的程序结构的。AVR C语言程序有两种用户文件,.c程序文件,.h头文件,程序中编写过程中需要在.c文件中包含.h头文件。初学者往往出现重复包含或者头文件包含错误的问题,我当时也......

关键字:AVR c语言 编程风格

[汽车电子] 放开方向盘更安全! 图像传感器是ADAS和自动驾驶的关键

放开方向盘更安全! 图像传感器是ADAS和自动驾驶的关键

随着先进驾驶辅助系统(ADAS)越来越先进,我们作为驾驶员,正面临着挑战将越来越多的控制和决策权交给汽车本身。这代表了信心的一个重大飞跃,尽管在最近的历史中已证实机器在一些领域不会像人类那样犯错和做出错误判断。 ......

关键字:图像传感器 ADAS 自动驾驶

[汽车电子] 终于熬出头!特斯拉汽车第三季度实现季度盈利,股价暴涨逾12%

终于熬出头!特斯拉汽车第三季度实现季度盈利,股价暴涨逾12%

特斯拉汽车今天公布了2018财年第三季度财报。报告显示,特斯拉汽车第三季度营收为68.24亿美元,远高于去年同期的29.85亿美元;净利润为2.55亿美元,相比之下去年同期的净亏损为6.71亿美元;归属于普通股股东的净利润为3.12亿美元,......

关键字:特斯拉 马斯克 Model 3

[智能家居] 智能家电真的需要能说会道吗?

智能家电真的需要能说会道吗?

在智能家居、智能硬件中使用语音交互,替代遥控器,可以解放用户双手,带来很多便捷性,但是,目前使用在线语音交互功能还需要先解决一些现有存在的缺点。......

关键字:智能家电 语音交互 人工智能

我 要 评 论

网友评论

技术子站

更多

项目外包

更多

推荐博客