当前位置:首页 > 实用技巧 >

编译器是用什么编写的(编译器是用什么软件写的)

来源:原点资讯(www.yd166.com)时间:2023-05-29 22:38:25作者:YD166手机阅读>>

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

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

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

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

编译器是用什么编写的,编译器是用什么软件写的(1)

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

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

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

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

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

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

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

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

编译器是用什么编写的,编译器是用什么软件写的(2)

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

大致过程如下:

编译器是用什么编写的,编译器是用什么软件写的(3)

先创造一个只有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语言理论上是可以通过上面的方法实现完整的编译器的。

21ic整理自网络

栏目热文

编译器是怎么写出来的(怎么自己写一个编译器)

编译器是怎么写出来的(怎么自己写一个编译器)

首先向C语言之父 Dennis Ritchie 致敬!当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编...

2023-05-29 22:45:24查看全文 >>

编译器是怎样编写的(java编写需要的编译器)

编译器是怎样编写的(java编写需要的编译器)

作者 | Akila Welihinda 译者 | 弯月出品 | CSDN(ID:CSDNnews)你知道有一种编译器后...

2023-05-29 22:48:25查看全文 >>

怎么看出编译器运行的过程(怎么看自己使用的编译器)

怎么看出编译器运行的过程(怎么看自己使用的编译器)

作者:阮一峰源码要运行,必须先转成二进制的机器码。这是编译器的任务。比如,下面这段源码(假定文件名叫做test.c):...

2023-05-29 22:59:42查看全文 >>

怎么查询运行的编译器(怎么看自己使用的编译器)

怎么查询运行的编译器(怎么看自己使用的编译器)

起因在去年看.Net Conf China大会中,看到龙芯.Net编译组组长分享的PPT,有一张是介绍JIT执行过程,当...

2023-05-29 22:42:50查看全文 >>

酵母可以替代碱面吗

酵母可以替代碱面吗

很多北方家庭都有吃馒头的习惯,在我国的一些西北地区,更是一日三餐都离不开馒头。相信大家都知道,我国北方地区的主食就是面食...

2023-05-29 22:33:02查看全文 >>

编译器是怎么运行的(python编译器怎么运行)

编译器是怎么运行的(python编译器怎么运行)

编译器的主要工作流程:源代码 (source code) → 预处理之前的翻译处理→预处理器 (preprocessor...

2023-05-29 22:27:01查看全文 >>

编译器使用方法(编译器的使用与技巧)

编译器使用方法(编译器的使用与技巧)

前言:C语言的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件...

2023-05-29 22:23:34查看全文 >>

编译器一直运行吗(没有编译器程序能执行吗)

编译器一直运行吗(没有编译器程序能执行吗)

大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一...

2023-05-29 22:40:17查看全文 >>

代码编译器怎么运行不了(编译器不能完成的步骤)

代码编译器怎么运行不了(编译器不能完成的步骤)

如果您的 VS2022 C# 控制台程序和 WPF 程序无法运行或者编译生成的文件在“杂项文件”夹中,可能是由于编译器或...

2023-05-29 22:58:07查看全文 >>

编译器是自带的吗(vs自带编译器吗)

编译器是自带的吗(vs自带编译器吗)

华为为什么要做编译器前一段时间在国内P30发布会的时候,顺便发布华为针对android一款编译器---方舟编译器,而且在...

2023-05-29 23:00:40查看全文 >>

文档排行