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 年的獲得者。