前言
GCC(GNU Compiler Collection, GNU編譯器套件)是一套由GNU開發的程序設計語言編譯工具,是GNU工程中最重要的組成部分。經過近30年的發展,GCC不僅支持眾多的前端編程語言,還支持各種主流的處理器平臺和操作系統平臺,成為公認的跨平臺編譯器的事實標準,也成為編譯器設計的成功典范。
作為一名GCC編譯器的使用者和源碼閱讀的愛好者,我一直想寫一本關于GCC的技術書。
2002年,我開始在Linux系統上進行一些軟件開發,GCC就是我使用的編譯工具。我一直對從源代碼到目標代碼的轉換過程充滿好奇,想知道在這個過程中GCC到底都做了些什么?GCC是如何設計的,那些成千上萬個GCC的源代碼文件都表示了什么意義?那時我常常幻想,要是能透徹地分析和理解GCC源代碼,多好!從那時起,在教學科研之余,我偶爾會翻閱一下GCC的相關源代碼,可是看著繁多的GCC源代碼,也常常感覺手足無措,真有一種“老虎吃天,無法下爪”的尷尬。于是分析GCC源代碼的事情被擱置了,然而那種一探究竟的心情總是揮之不去。
2012年開始,我有了較多的閑暇時間,在經過一段彷徨之后,分析GCC源代碼的沖動又一次浮現在腦海。我知道,這次是要來真的了,我要做點自己喜歡的事。
Why?
我有空余時間了,我要干些自己感興趣的事情。在我創建的GCC愛好者交流群中經常有朋友問,有沒有介紹GCC的資料呀?大多人都會說,有——請看官方文檔!我也去看了看,沒錯,GCC有比較詳細的官方文檔,包括gccinternal及用戶手冊等。然而,這些文檔的內容龐雜,缺乏系統分析GCC設計框架和工作流程的內容,并且大多的內容對讀者來講都是零散的,讓初學者無所適從。于是我想,為什么不分析一下GCC系統,把GCC的設計實現用一種更清晰明了、更系統的方法介紹給GCC的愛好者呢?
What?
本書將圍繞GCC編譯過程,詳細介紹從源代碼到AST、從AST到GIMPLE、從GIMPLE到RTL,以及從RTL到最終的目標機器匯編代碼的詳細過程,涉及各個階段中間表示的詳細分析、生成過程。本書提供了大量的圖表和實例,展示了GCC編譯系統的總體工作流程和工作細節。本書的另外一個特點是結合GCC 4.4.0的源代碼進行分析,使讀者在了解編譯原理的基礎上進一步掌握其實現的總體流程和細節,讓更多讀者對編譯技術的認識不再只停留在理論層面,而是向其展示一個編譯系統實例的實現過程。
How?
GCC源代碼涉及的內容非常龐雜,很難在一本書中全面描述,因此本書以GCC中間表示為主線,詳細分析GCC從源代碼開始,直到生成目標機器匯編代碼的整個過程中所使用的三種中間表示(AST、GIMPLE及RTL),并對這三種中間表示的基本概念、生成過程進行詳細的描述,對基于GIMPLE和RTL的優化處理進行介紹,從而描述一條從源代碼到目標機器匯編代碼的清晰路線圖。
Who?
本書以熱愛編譯系統理論及其實現的在校大學生、研究生為主要讀者對象,也可以作為企業中研發編譯系統以及進行編譯系統移植的研發工程師的有益參考。
在編寫這本書的時候,有一種精神支撐著我,我相信“興趣”加上“堅持”就是勝利!分析GCC不是一年半載的事情,需要3年、5年,甚至更長時間,不過我可以堅持,我要用我的堅持換來對GCC的深入分析,讓更多的GCC愛好者熟悉它、接觸它、了解它,更多地參與GCC的開發與維護。
感謝我的愛人和孩子,給了我家的溫暖和親情。感謝病榻上的父親,雖然他不能和我說話,但他那一雙大手,依然經常撫摸在我的頭上。感謝年老體弱的母親,感謝她一直照顧我的父親,讓我知道什么是堅持,什么是不離不棄!感謝西安郵電大學GPU項目組的各位同事在本書的寫作中提出的寶貴建議。
本書的寫作得到國家自然科學基金重點項目(項目編號:61136002)以及陜西省教育廳科研計劃項目(項目編號:14JK1674)資助。
鑒于作者水平有限,在分析和寫作本書的過程中也引入了一些個人觀點,因此難免有一些理解的偏差和錯誤,敬請讀者批評指正并不吝賜教,如有意見和建議,請聯系作者lazy_linux@126.com,在此一并感謝!
王亞剛
2016年10月于西安郵電大學