GNU 编译器家族 GCC 介绍 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言,C++ 语言,java 语言,Objective C 语言,Pascal 语言,COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。
另一方面,说到 GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台,比如 Don Knuth 设计的 MMIX 计算机,GCC 都提供了完善的支持。
在这里先说一下 tree 这个数据结构。这是 GCC 围绕着 C 和 C++ 语言的语法分析,用到的主要数据结构。所有其它语言的编译器前端,也都需要在语法分析阶段结束以后,为 GCC 生成相应的 tree 结构的数据。然后 GCC 的后端就可以从 tree 生成独立于平台的 RTL 数据结构,并随后生成相应平台上的机器语言代码。所以作为 GCC 的编译器前端,这里的主要工作就是从一个文本文件,也就是源代码,生成这个 tree 结构的数据,喂给编译器的后端。我们看到,前端是依靠于编程语言的;后端是依靠于机器平台的;中间的 tree 和 RTL 则独立于编程语言和机器平台。但是话虽如此说,这个 tree 和 RTL 数据结构也还是主要以 C 和 C++ 语言为考虑问题的中心。这是不可避免的事情。
注重到这是被申明为 static 的变量。在 Samuel P. Harbison III 和 Guy L. Steele, Jr 所合著的 C: A Reference Manual 的英文版的第五版第八十三页上,关于 static 变量有如下说明:"On data declarations, it always signifies a defining declaration that is not eXPorted to the linker."换句话说,这个 static 的 symbol_table 变量,在 tree1.o 之外是看不见的。这不可能是我们所要寻找的全局变量。
* Internals of the GNU Compiler Collection http://gcc.gnu.org/onlinedocs/gccint/ 这其实也就是 info gccint 的内容。这份文档是除了源代码以外最权威的资料了。不过它的可读性恐怕不是那么好。初上手阅读的时候,恐怕会非常困惑的。
* The GNU Treelang Compiler 手册,这其实也就是 info treelang 的内容。这个作为例子的 Treelang 程序语言基于 Tim Josling(见下)为了阐明 GCC 前端的编写方法而发明的一个玩具编程语言。
* Sreejith K Menon 编写的 GCC Frontend HOWTO http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO.Html 被收录在 The Linux Documentation Project 的 HOWTO 文集中。这份资料可能是可读性最强的了吧?当然,这是说除了本文之外啦。:-)
* Using, Maintaining and Enhancing COBOL for the GNU Compiler Collection http://cobolforgcc.sourceforge.net/cobol_toc.html 这是由 Tim Josling 领导的 COBOL for GCC 项目的文档,其中原先由 Joachim Nadler 所编写的第十四章,后来由 Tim Josling 从德文翻译成英文;这一章讲述了 GCC 前端的编写方法。
* Using and Porting GNU Fortran 手册 http://gcc.gnu.org/onlinedocs/g77/ 中关于 Front End 的一章也讲述了我们感爱好的内容。
* 在阅读大型的 C 语言项目的源代码的时候,手头有一本好的、全的 C 语言参考手册也是很重要的。 关于 C 语言的一本比较好的书是 Samuel P. Harbison III 和 Guy L. Steele, Jr. 合著的 C: A Reference Manual 第五版。这本书的英文影印版最近在国内出版了。作者之一 Guy L. Steele, Jr. 是 Scheme 编程语言的发明人之一,也是 Java 语言规范的作者之一,更是 ACM 的 Grace Murray Hopper 奖 1988 年的获得者。