既然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,最终我们得到了完美优化过的第三个版本
感觉碉堡了吧,最后,列一下有自编译编译器的语言吧:
- BASIC
- Burroughs Algol
- C
- C++ (compilers: Visual C++, clang, probably others)
- Common Lisp
- Factor
- Haskell
- Java
- Mercury
- Modula-2
- Oberon
- OCaml
- Pascal
- Perl 6 (compilers: Rakudo Perl & Niecza Perl 6 are both self-hosting)
- PL/I
- Python
- Rust
- Scheme
- Scala
- XPL
reference:http://en.wikipedia.org/wiki/Bootstrapping_(compilers)