自己動手寫編譯器、鏈接器一書作者自序

《自己動手寫編譯器、鏈接器》

紙上得來終覺淺,絕知此事要躬行。
                                 ——陸游

編譯原理與技術的一整套理論在整個計算機科學領域佔有相當重要的地位,學習它對程序設計人員有很大的幫助。我們考究歷史會發現那些人人稱頌的程序設計大師都是編譯領域的高手,像寫出BASIC語言的比爾·蓋茨,Sun公司的Java之父等,在編譯領域都有很深的造詣。曾經在世界首富寶座上穩坐多年的比爾·蓋茨也是從給微機編寫BASIC語言編譯器起家的,也正是這個BASIC編譯器爲比爾·蓋茨和保羅·艾倫的微軟帝國奠定了基礎。這個編寫BASIC語言編譯器的經歷,開啓了比爾·蓋茨的輝煌職業生涯。
編譯器是一種相當複雜的程序,編寫甚至讀懂這樣的一個程序都非易事,大多數的計算機科學家和專業人員也從來沒有編寫過一個完整的編譯器。但是,幾乎所有形式的計算都要用到編譯器,而且任何一個與計算機打交道的專業人員都應掌握編譯器的基本結構和操作。除此之外,計算機應用程序中經常遇到的一個任務就是命令解釋程序和界面程序的開發,這比編譯器要小,但使用的卻是相同的技術。因此,掌握這一技術具有非常大的實際意義。
李國傑院士說: “隨着微處理器技術的飛速發展,處理器性能在很大程度上取決於編譯器的質量,編譯技術成爲計算機的核心技術,地位變得越來越重要。我國要發展自己的微處理器事業,必然要有自己的編譯技術作爲後盾。” 
回過頭來說一說是什麼樣的原因使我萌生了寫這樣一本書的想法。作者學習其他計算機課程感覺沒有特別難懂的,唯獨看編譯原理的教材,看完了雲裏霧裏的,感覺一知半解,我感覺可能是學的教材過於理論化,於是到書店把所有跟編譯原理有關的書籍統統買回家,當然這也包括大家公認的編譯原理三大經典書籍(龍書、虎書、鯨書)在內,每一本我都從頭到尾翻一遍,好像什麼都懂了,又感覺要真的自己動手寫個編譯器仍然是隻有大師才能完成,對自己還是可望而不可即的事情。並且作者也瞭解到許多關於編譯原理實踐的悲觀論調: “現有的編譯器都是用Lex和Yacc構造的,從頭開始手工編寫一個完整的編譯器幾乎是不可能的。”可作者偏偏是那種“明知山有虎,偏向虎山行”的人,要知道早期的編譯器可都是純手工構造的,苦辣酸甜的征程就此開始,可是寫個什麼語言的編譯器?這個編譯器怎麼定位?這一切都很茫然。
我開始研究編譯原理書上的樣例,希望能從中找到靈感,給上述問題找到答案。世界著名計算機科學家N.Worth編寫的PL/0語言的編譯程序是作者最先研究的編譯器,它功能簡單、結構清晰、可讀性強,被認爲是一個非常合適的小型編譯程序的學習模型,可這個編譯程序不支持數組、結構體、字符串,並且是以假想的棧式機器爲例來編寫的,而不是直接生成在某種CPU,某種操作系統環境下直接可以運行的目標語言程序。“PL/0語言的編譯程序”作爲編譯器的學習模型,也只能算“矬子裏面拔將軍”,因爲沒有更好的,也只好將就着用了。至此,編譯器定位問題算有了些眉目,作者希望構造一個更適合學習的編譯器。可是,另一個問題接踵而至,爲什麼那麼多開源編譯器不能直接用作編譯器學習模型呢?我開始研究各個開源編譯器的源代碼,其中包括GCC的源代碼,由於GCC支持多個前端語言和各種後端機器平臺、AST(Abstract Syntax Tree)和RTL(Register Transfer Language)又成了繞不過去的坎,還沒學會怎麼編寫針對一種源語言、一種目標機器的編譯器,就要去學習支持多種源語言多個機器平臺的編譯器,就好比一個嬰兒還沒學會走路就要學跑,這注定是要跌跟頭的。
自序自己動手寫編譯器、鏈接器一面是過於簡化的編譯器學習模型,另一面是過於複雜的開源編譯器,作爲學習模型都不太合適。到這裏,編譯器定位問題算是徹底想清楚了,作者要構造一個教大家如何自己動手寫編譯器的學習模型。這個模型包括兩大部分,第一部分是語言定義,第二部分是這個語言編譯器的實現,這個編譯器只支持一種源語言,目標語言也只支持一種。這個語言應該具備目前流行的高級語言的最主要特徵。這個編譯器要結構清晰,代碼量要儘可能少,要能體現編寫一個實用的編譯器的完整過程與技術。這個編譯器可以生成在操作系統中直接運行的exe文件,只要雙擊或在命令行執行就能看到結果的那種。
接下來作者開始思考另一個問題,編寫個什麼語言的編譯器?作者研究了目前最流行的幾種編程語言C、C++、C#、ObjectiveC、Java,其中C語言是最簡單的了,只有32個關鍵字,但是作者研究發現,C語言還是有許多冗餘的成分,作爲學習模型還可以更簡單一些。作者最終以C語言爲藍本,進行適當簡化定義了一門新的語言,僅有15個關鍵字,稱爲SC語言。目標語言選擇大家熟悉的Intel x86機器語言,編譯器命名爲SCC編譯器。
在本書中,讀者將看到從SC語言定義,到SCC編譯器開發的完整過程。讀完本書你將知道一門全新的語言如何定義,一個真實的編譯器如何編寫,這些對你來說將不再神祕,編譯原理講的理論與本書中講述的SC語言定義及SCC編譯器開發過程,是理論聯繫實際在編譯領域的最好闡釋。
如本書作爲編譯原理實踐教材,作者建議安排10學時講授。
本書投稿後,有幸請CSDN暨《程序員》雜誌總編、劉江老師閱讀了本書的初稿,併爲本書作序,在此向劉老師表示最衷心的感謝。
本書臨近出版之際,承蒙清華大學王生原老師閱讀了本書終稿,並對書稿做了中肯評價: “本書特色鮮明,內容有深度,文筆也很不錯,很值得出版。本書最大的特色是所選的目標平臺,即x86處理器以及微軟系統的COFF目標文件格式,這在教材中很少見到,可爲國內的編譯教學實踐提供別具一格的素材。”同時,王老師還對本書提出了寶貴建議。在這裏,向王老師表示由衷的敬意和最誠摯的感謝。
我還要感謝我的家人,他們的支持與鼓勵是本書得以完成的保障。
要列出所有對本書出版有所幫助的人名是不可能的,因爲有些困難是通過互聯網解決的,我甚至不知道他們的名字。在此,謹向他們一併表示感謝! 
最後,回想本書6年的寫作歷程,願以蒲松齡的一副對聯與讀者共勉:
有志者,事竟成,破釜沉舟,百二秦關終屬楚;
苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。

王博俊
2015年1月


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章