编译器是如何编写的

Posted 哦摩西罗伊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器是如何编写的相关的知识,希望对你有一定的参考价值。

 

     在学编译原理的时候,就有一个想法,现在的编译器是如何编写的。如果说是用纯粹的机器代码编写,这显然是不可能的,

因为编译器是个非常复杂且庞大的软件工程,用纯机器代码编写所花费的时间这显然是不能接受的。有人就会说,用高级语言

编写编译器呗,那么问题就来了,高级语言是不能被计算机直接识别的,所以这种说法也显然是不正确的。机器语言的开发效率

太低,高级语言又无法被计算机直接识别,所以我个人就想,会不会是采用一种折中的办法,即编译器最核心的部分用机器语言

编写,剩下其他的部分用高级语言编写。后来查看一下其他资料,发现果然是这样。这种情况被称为自编译

 

     大致过程如下:

设有自编译语言L,可以通过自展的方法为机器A生成该语言的编译程序L.Ao。首先,将语言L划分为核心部分和扩充部分,其核心部分为L1,其扩充部分分别为L2、L3、…、Ln,即L=L1+L2+L3+…+Ln
先用A机的机器语言或汇编语言编写核心语言L1的编译程序L1.Ao,然后用语言L1编写语言(L1+L2)的编译程序(L1+L2).L1。由于(L1+L2)语言仅是在核心语言L1的基础上稍加扩充,所以,其编译程序一般能够用核心语言编写出来。利用语言的自编译性,语言(L1+L2)的编译程序(L1+L2).L1经L1.Ao编译以后,则可生成(L1+L2).Ao。然后用语言(L1+L2)编写语言(L1+L2+L3)的编译程序(L1+L2+L3).(L1+L2),该编译程序经(L1+L2).Ao编译以后,生成语言(L1+L2+L3)的编译程序(L1+L2+L3).Ao,……,如此重复下去,其过程就像滚雪球一样直到生成整个语言L的编译程序L.Ao为止。
由于开始通过低级语言建立的编译程序可做得比较小而简单,因而可以在较少的人力和时间的情况下建立起来,以后都是用高级语言本身来编写较大语言的编译程序。由于有用高级语言进行程序设计的优点,所以这样做的结果是比用低级语言直接一次生成一个完整的编译程序要快,而且在程序的可靠性方面也更能得到保证。 
技术分享图片
 
通过这种方式大大提高了编译器的开发效率

以上是关于编译器是如何编写的的主要内容,如果未能解决你的问题,请参考以下文章

第一个编译器是如何编写的?

如何编写第一个语言

Linux2.6 如何编写Makefile,使驱动程序能够编译链接静态库

如何直接编译最初用 code::blocks 编写的代码

如何在 C++ 中编写简短的文字?

如何编写宏使跨平台编译更容易? [复制]