本書系統地介紹了可變目標ANSIC編譯器lcc的設計方法和實現技術。lcc是一個實用的編譯器,能夠為不同的目標機器(如MIPSR3000、SPARC、Intel386及其后續產品)生成代碼。本書結合lcc的具體實現,詳細講述了存儲管理、符號表、詞法分析、語法分析、中間代碼生成、優化、目標代碼產生等編譯程序的各個部分。全書共分19章,各章之后均附有練習。本書特色鮮明,實用性強,適合作為高等院校計算機專業的編譯原理課程的教材或參考書,對從事編譯相關工作的技術人員也有很好的參考價值。
前 言
A Retargetable C Compiler: Design and Implementation
編譯器是程序員使用的關鍵工具,程序員每天都在使用編譯器,并且非常依賴于其正確性和可靠性。編譯器必須接受程序語言的所有標準定義,以便源代碼可以實現跨平臺的可移植性。編譯器必須生成高效的目標代碼,但更重要的是,編譯器必須生成正確的目標代碼,只有可靠的編譯器才能生成可靠的應用程序。
編譯器本身是一個大而復雜的應用程序,值得我們深入分析研究。本書介紹了ANSI C語言編譯器lcc的大部分實現,對編譯器的介紹方式與B. W. Kernighan和P. J. Plauger合著的《Software Tools》(Addison-Wesley,1976)一書對文本處理(例如文本編輯和宏處理)的介紹類似。研究實用的工具軟件,是學習軟件設計和實現技術的最好方法。本書在代碼級詳細介紹了一個實用的編譯器,該編譯器的完整源代碼可在ftp.cs.princeton.edu(128.112.152.13)服務器的pub/lcc目錄下,通過匿名ftp服務得到。
lcc不是一個研究系統,而是一個實用的編譯器產品。從1988年開始,lcc就用于編譯實際程序,現在每天都有數百名C程序員在使用它。由于本書詳細分析了lcc編譯器的設計與實現,因此用于介紹相關支撐材料的篇幅較少,僅展示了涉及的理論知識,而更為系統的編譯技術的介紹可以參見其他教材。本書有意省略一些涉及瑣碎和重復實現的語言特征,而將這部分內容作為練習。
顯然,本書將使讀者對編譯器的構造有更多的了解。然而只有少數程序員需要了解編譯器的設計與實現,大多數程序員從事的是應用程序或其他系統程序的開發。但是,基于以下4個原因,大多數C程序員都可以從本書中受益。
第一,一般來說,如果程序員能夠理解C編譯器的工作原理,通常可以成為較好的程序員,特別是較好的C程序員。編譯器設計者必須全面準確地理解C語言的每一個特性,程序員通過學習這些特性的實現,能夠更好地掌握語言本身及其在現代計算機上的高效實現。
第二,大多數程序設計教材都是通過一些精簡的示例來說明編程技巧的,但大多數程序員都是在從事大型程序的開發,在開發過程中需要不斷修改程序,很少有帶詳細說明的示例可以作為大型程序設計的參考。lcc不是完美的,但是本書詳細說明了該程序的優缺點,可以作為大型程序開發的參考。
第三,編譯器是計算機科學中理論與實踐相結合的最好典范。lcc展示了理論與實踐的相互作用及其精美的結果,展示了實踐需求牽引理論的發展,這些都可以清楚地從代碼中找到。通過一個真實的程序來研究這些相互作用,可以幫助程序員理解何時、何地以及如何運用不同的技術。此外,lcc也闡明了眾多的C編程技術。
第四,這本書本身是一個文本程序(literate program),如同D. E. Knuth所著的《TeX: The Program》(Addison-Wesley,1986)一樣,本書包括lcc的源代碼及說明。為了方便讀者理解,本書并未按源程序的順序對程序代碼進行講解,而是有意進行了調整。
無論是對于在校學生還是專業技術人員,本書都非常適合自學使用。本書為lcc提供了說明完整的源代碼,希望進行編譯技術實踐的人員,以及在需要使用或實現基于語言的工具和技術的應用領域(如用戶接口)中工作的專業人員,將會對本書感興趣。lcc的相關信息可通過以下地址獲得:www.cs.princeton.edu/software/lcc。
本書全面而真實地展示了一個大型軟件系統,可作為軟件工程課程的分析實例。
對于編譯課程來說,本書彌補了傳統編譯教材的不足。本書介紹了C編譯器的一種實現方法,而傳統教材主要介紹編譯過程中遇到的各種問題的解決算法,因此傳統教材受篇幅限制只能介紹一些實驗性的編譯器,代碼生成也通常面向較高的級別,以避免與具體的機器相關。
因此,許多教師要求學生完成接近實際的編譯器項目,使學生獲得實踐經驗。通常,教師必須從頭開始編寫編譯程序,而學生復制其中的大部分,修改后利用其余的部分。然而,由于編譯器只是實驗性的,文檔往往顯得不夠充分,這種情形使教學雙方都不滿意。本書通過對一個實際編譯器的大部分程序進行文檔說明,并提供源代碼,為教師提供了一種新的選擇。
本書介紹了完整的代碼生成器,代碼生成面向MIPS R3000、SPARC和Intel 386及其后續體系結構等不同的平臺。本書利用了最新的研究成果,根據目標機器的緊縮規范(compact specification)生成代碼生成器。這些方法使得我們能夠針對多種機器展示完整的代碼生成器,這是其他書籍無法做到的。通過介紹多個代碼生成器,既避免了本書依賴于單一的機器,又有助于學生了解如何設計可變目標的軟件。
教師布置的作業可以是增加編譯器接受的語言特征、優化、改變目標機器等。本書如果與傳統教材配合使用,也可以要求學生使用不同的算法代替現有的模塊作為實踐作業。如果以實現一個實驗編譯器作為實踐作業,則可能在低級基礎結構和重復的語言特征上花費大量的時間。采取上述方法,就能夠更接近實際的編譯器工程實踐。本書的許多練習都涉及編譯器工程問題。