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

編譯原理與技術的一整套理論在整個計算機科學領域佔有相當重要的地位,學習它對程序設計人員有很大的幫助。我們考究歷史會發現那些人人稱頌的程序設計大師都是編譯領域的高手,像寫出BASIC語言的BILL GATES,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編譯器開發過程,是理論聯繫實際在編譯領域的最好闡釋。
發佈了21 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章