比尔盖子 博客

用编译器编译编译器

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

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

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

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

P.S:其实GCC的第一个版本是用Pascal写的。

Categories: IT生活, 代码如诗

对Gentoo的RAID bug进行Workaround » « 动态

1 Comment

  1. 我也想过这个问题…………

发表评论

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

Copyright © 2023 比尔盖子 博客

Theme by Anders NorenUp ↑