evol128[Blog]

I am the bone of my code

既然gcc是用c语言写的,那么我们是怎么编译gcc的?

 

今天看到一则新闻,gcc新版本引入c++实现的patch

忽然想起来,既然gcc是用c语言写的,那么人们是如何编译gcc的?

其实,大学里宋健健老师的教导我还依稀记得啦= =  为了确保准确性,我特地去翻了一下wikipedia,编译用X语言写的X编译器有以下几种方法:

1.最简单的方法,已经有别人用Y语言写了X的编译器,那你用它编译一下就好了

2.如果没有上面那种好事,那就只好自己用Y写一个了,譬如说,pascal最早的编译器是用fortran写的

3.上面方法的优化版本,用Y写的时候,你不用实现全部功能,只需要一个能够编译X编译器源代码的最低程度的子集就好了,然后用这个子集去编译X的编译器,Java和Haskell就是这样弄的

4.可以使用cross-compiler技术将别的平台上的X编译器迁移过来,C语言一般都是这样玩的

5.最牛逼的方法,先用X语言写一个X编译器,然后手动编译这个编译器(说白了就是直接写汇编,不过不需要完全优化),然后,用得到的结果去编译X编译器的源代码。

那么,gcc到底是如何编译的呢?

3个步骤:

1.在线编译第一个原始版本的编译器,这个编译器不管是效率也好功能也好都不完善

2. 用这个原始版本的编译器去编译gcc,这样我们得到了一个功能完善但是效率不怎么好的第二个编译器

3.用第二个编译器再次编译gcc,最终我们得到了完美优化过的第三个版本

感觉碉堡了吧,最后,列一下有自编译编译器的语言吧:

 

reference:http://en.wikipedia.org/wiki/Bootstrapping_(compilers)