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

不知道大家有没有想过一个问题:为什么C语言编译器可以用C语言编写?

今天就带你一探究竟!

所谓C语言编译器,就是读取编程得到的文件,如.c、.h文件,分析内容,按照C语言的规则手机上的c语言编译器,转换成CPU可以执行的二进制文件.

其本质在于文件的读取、分析和处理。这些操作可以用 C 语言来实现。

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

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

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

或者让我们回顾一下C语言的历史:

1970年汤夫森和里奇在BCPL(一种解释语言)的基础上发展了B语言,

1973年,现在的C语言在B语言的基础上发展成功。

在 C 被用作系统编程语言之前,汤夫森曾用 B 语言编写过操作系统。可以看出,在C语言实现之前,B语言已经投入使用。

所以完全有可能第一个 C 编译器的原型是用 B 或 B 和 PDP 汇编的混合编写的。

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

你可以感受到上一张照片的巨大差异!!!

图片[1]-世界上第一个C语言编译器又是怎么编写的呢的?-老王博客

为了克服这个难点,早期的 C 语言编译器采用了一个棘手的方法:先用汇编语言编写 C 语言编译器的一个子集,然后通过这个子集递归地完成完整的 C 语言编译器。.

一般流程如下:

先创建一个只有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。

对于一些具有明显自举的强类型编程语言(不知道是哪个ghost命名的)

它们的一个有限的小子集

通过有限次数的重复来表示它们自己

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

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

总之,计算机科学家已经证明,通过上述方法手机上的c语言编译器,C语言理论上可以实现一个完整的编译器。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论