用编译器编译编译器

这是一个很有意思的话题,思考过后,特此记录。

我用Gentoo第一次升级GCC的时候,以为系统会下载一个二进制包来替代现有的GCC,结果却发现:系统用旧版本的GCC编译来编译新版本的GCC!GCC是什么语言写的?去查了查,真的是C语言。现在一个有趣的问题就出现了:GCC是一个C语言编译器,它本身就是用C语言写的,请问怎么编译GCC?

答案很简单:用旧版本的GCC编译新版本的GCC。但是世界上第一个GCC是怎么编译的?用其它C语言编译器编译出来的。世界上第一个C语言编译器是怎么编译出来?是用其它语言编写的……世界上第一个编译器是怎么来的?恐怕就是用机器语言写的吧。

比尔盖子又想到第二个问题。如果一个C语言编译器是用其它编译器编译出来的,那它本身的机器代码就和自己无关,和那个编译它的编译器有关了;如果一个编译器试图扩展C语言,那它本身也不能使用自己所支持的扩展特性了。因此,我们需要先用“不怎么舒服的语法”现得到一个这个编译器的二进制版本,然后再用他来编译包括扩展特性的编译器代码,然后用编译器再编译它自身才行。

文章来源:http://biergaizi.info/archives/2012/06/1370.html

你可能感兴趣的:(用编译器编译编译器)