編譯,是將某種高級語言的源程序翻譯成等價的某種匯編語言或者機器語言程序的程序。計算機科學與技術專業圍繞著編譯開設有一些不同的課程。比較典型的有,編譯原理、編譯方法、編譯技術、編譯理論、編譯程序構造等,他們分別強調編譯系統及其構建的不同方面。無論強調什么,都是計算機科學與技術專業是一門非常好的技術基礎課程。它涉及的是一個比較適當的抽象層面上的數據變換(即抽象,又實際),而計算機學科是對信息描述和變換算法的系統研究,主要包括它們的理論、分析、效率、實現和應用。編譯原理除了給出一些具體的表示和變換算法外,還給出了計算機學科兩種重要的系統設計方法——“自頂向下的方法”和“自底向上的方法”(思想、方法、實現全方位討論),同時還清晰地給出了一個相當規模的系統的設計(含總體結構),這些對培養計算機專業學生的基本學科能力非常重要。按照我的想法,這是計算機專業最為恰當、有效的知識載體之一。本文討論編譯課程的教材建設問題。
一、教材是教學的基礎,承擔著重要責任
按照教育部有關文件的精神,高等院校要“牢固確立人才培養是高等學校的根本任務,牢固確立質量是高等學校的生命線,牢固確立教學工作在高等學校各項工作中的中心地位”,教材建設能夠很好地反映高等學校教育教學、科研水平及其成果。作為質量工程的重要方面的“四名工程”,教材建設是其重要內容之一。正是因為教材的重要性和優秀教材的示范帶頭作用,國家將在“十一五”期間,實施“萬種新教材建設項目”,加強新教材和立體化教材建設,鼓勵教師編寫新教材,積極做好高質量教材推廣和新教材選用工作,以促進教育教學水平的迅速提高。
因此,教材實際上承擔著“重要的責任”。優秀教材是促進素質教育、培養創新人才的重要保證,他們會在學生一生的發展中占據重要地位,一些經典教材更是會影響幾代人的成長。
二、課程指導思想及定位
編譯是計算機專業本科生的重要專業技術基礎課程,既有便于抽象的問題,又有較成熟的理論,屬于軟件技術系列課程,涉及學科抽象、理論、設計三個形態。除知識外,更含有基本問題求解的典型思路和方法,繼程序設計、數據結構與算法等課程后,從系統級再認識程序、算法。對于培養學生四大學科基本能力非常重要,根據課程容量和學生特點,選擇適當的知識為載體,向學生介紹本學科問題求解的基本思想、方法,使學生主要得到如下收獲。
(1) 掌握程序變換基本概念、問題描述和處理方法。
(2) 修養“問題、形式化描述、計算機化”問題求解典型過程,推進從“實例計算”到“類計算”和“模型計算”的跨越。
(3) 增強理論結合實際能力,獲得更多的“頂峰體驗”。
(4) 從宏觀到微觀、從微觀到宏觀,培養系統能力。
三、流行的編譯教材
目前,已經有許多版本的編譯教材,他們的基本內容大體相同,只是因講述、重點安排、甚至在容量等方面存在一些不同,而具有不同特色,分別適應不同的讀者。這里僅選擇幾個有代表性的教材進行討論。
1. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. Compilers Principles, Techniques, and Tools. Addison-Wesley Publishing Company,Inc.1996(中譯本:編譯原理,機械工業出版社,2003年8月,李建中、姜守旭譯);它是公認的編譯原理的經典教材,它內容豐富,作者Alfred V. Aho和 Jeffrey D. Ullman.是國際著名的計算機科學家,而且是著名的計算機教材的編寫人,他們在計算機科學理論、數據庫等很多領域都作出了杰出的貢獻,撰寫的教材具有很高的水平,他們的很多著作被國際公認為權威、“經典”之作,深受高水平讀者歡迎,一直被國際著名大學作為教科書,對我國有著重大的影響。
按照我國的大學教學風格,對絕大多數院校來說,這本教材的內容較多(翻譯本長達500余頁,估計有100萬字上),使得其許多內容難以在有限課時內涵蓋。另外,該書所表現的思維習慣以及問題的講述與我國讀者的習慣存在一定的差距,雖然有翻譯本,但此問題依然不會得到全部解決。所以,他被許多院校選作教學參考書。
2. 陳火旺、劉春林、譚慶平等,程序設計語言編譯原理,國防工業出版社,2000年1月。該教材的早期版本出版于1976年,是我國較早發行的“經典”編譯原理教材,作者在我國高水平的編譯系統的設計與實現工作中做了大量的工作,一些成果被納入教材中,該教材不僅有較好的發行基礎,而且由著名的計算機科學理論專家陳火旺院士領銜,是一本很好的教材。教材內容豐富,含12章,用大約一半的篇幅講述最基本的內容,主要篇幅用于語法分析、語義分析和中間代碼生成等內容;用1/4的篇幅講述符號表、存儲管理、優化、目標代碼生成等;最后講述并行編譯的基本問題。總篇幅估計在74萬字。這么大的篇幅對絕大多數院校來說也比較重,需要教師從中篩選。有的內容對一般讀者自學來說,有一定困難。
3. Kenneth C. Louden. Compiler Construction Principles and Practice, PWS Publishing Company. 1997(中譯本:編譯原理及實踐,機械工業出版社,2000年3月,馮博琴、馮嵐譯)。該書是在講述編譯原理的基礎上,以TINY語言的編譯實現為線索,講述一個完整的編譯系統的設計與實現。這可以說是該書的最大特色。所選取的教學內容是編譯原理課程的主要內容,適合該課程本科教學的要求。全書共8章:概論、詞法分析、CFG及其分析、自頂向下分析、自底向上分析、語義分析、運行環境、代碼生成,其基本內容框架符合我國大多數學校的教學基本要求,但它是按照作者的認識和習慣組織的,有一定的特色,是很好的閱讀材料。
這本書許多講述針對TINY進行,閱讀起來頗感實例化。內容雖然不多,敘述比較細,篇幅達80余萬字,與我國學生的讀書習慣有一定的偏差,特別是學生認為編譯比較“理論”,用這樣的“大部頭”作教材,會使不少讀者感到困難。將符號表管理歸入語義分析,將中間代碼和目標代碼的生成合并在同一章中,與將難點盡可能分散處理的思路不太一致。
4. 金成植. 編譯程序構造原理和實現技術. 高等教育出版社,2000年7月。這是我國組織的“面向21世紀課程教材”中的一本,共計48萬字,書中包括了金老師多年從事編譯系統和編譯技術的研究和教學的經驗。金老師曾經在1983年撰寫過《ALGOL60編譯方法》,由科學出版社出版。
該教材首先介紹了一個小型語言Micro的編譯器,意在使學生在開始學習編譯系統時能夠對該系統的總體結構有一個了解。然后介紹詞法分析和語法分析技術和原理,詞法分析以FA為基礎,語法分析則介紹LL和LR方法,省去了遞歸子程序和算符優先兩種分析法。估計作者認為這兩種方法在現代編譯系統中已經很少采用,忽略了這兩種方法對一個計算機專業人員的作用。在語義分析中,將符號表處理、類型處理等,單列一章講述動作文法和屬性文法,再用一章講述中間代碼生成、加強了代碼優化的內容(單獨一章),目標代碼部分用了4萬余字。
從總體上看,該書內容豐富,有自己的理解和特色,語義分析、動作文法、屬性文法、中間代碼生成等內容的處理比較特別。反映出作者的獨特見解,對一般的教學組織來說,存在需要重新組織的問題。
5. 侯文永,張東茉. 編譯原理. 電子工業出版社,2002年8月。
該書共有9章:引論、文法與語言、詞法分析、語法分析、語法制導翻譯和中間代碼生成、運行時存儲空間管理、代碼優化、代碼生成、并行編譯概述。總共33.3萬字,體現了“用有限的篇幅深入地討論編譯的主要內容”,“盡可能用較簡單的方式描述這些內容”。教材以有窮狀態自動機為主討論詞法分析器的構建;在語法分析中全面地討論了四種典型的分析方法;在語法制導翻譯中強調了傳統的做法。其他部分也選擇了適當的一些知識點,比較適應起點比較高得學生使用。對大多數學生來說,在少學時情況下,代碼優化、代碼生成(指目標代碼生成)、并行編譯不一定作為主要內容。這里并不是說這些內容不具有這種屬性,而是可能出現“吃不透”的問題。這一部分大約占30%,多多少少影響了語義分析中屬性文法和屬性翻譯的篇幅。
四、新教材建設想法
(1) 滿足國內外有關規范對課程的最新要求
首先考慮必須在內容上滿足教學的基本要求。
根據CC2001/CC2005和教育部計算機科學與技術學科教學指導分委員會制訂的計算機科學與技術專業規范的對課程的要求,結合國內大多數學校計算機科學與技術專業本科生的基本狀況組織內容。
(2) 充分考慮學時少和大多數院校的實際教學需求
目前教材多數是以原來學時較多(例如80學時)的教學要求撰寫的,而且更多地考慮盡可能將相關內容列入,關注“水平”更多一些。
新教材將在學時有限的情況下進一步精選內容,并在教材的易懂性、思想性上下功夫,特別是注意用通俗的語言,循序漸進地進行問題的討論和內容的敘述,并且最終給出適當的嚴格描述。通過這種努力,將一些看似抽象的形式化描述的內容講活,解決抽象、形式化所帶來的枯燥和難理解問題,消除一些讀者認為“編譯原理僅僅是用處不大的理論”的偏見。
特別要注意中國人的閱讀習慣,以及中國大多數院校的在校本科生的理解和閱讀能力,通過“講述性”、“啟發性”的語言來激發這類學生的閱讀興趣,從而在鼓勵學生認真閱讀教材和參考書,并從中體會閱讀的樂趣,達到提高學生自學能力,特別是對學科基本理論知識的興趣之目的。
(3) 強化能力培養
體現大學教育包含知識、能力、素質的基本教學思想。有些人認為,畢業生今后沒有幾個會去參加高級語言編譯系統的設計與實現,所以砍掉編譯原理課程。實際上,編譯原理課程中蘊含著計算機學科中解決問題的思路、抽象問題和解決問題的方法。這門課程中所接受的訓練很難在其他地方獲得。可以這樣說,像高等數學課程影響每一個理工科學生一生的工作學習一樣,編譯原理課程會讓計算機專業的學生“享用一輩子”。
新教材將以知識為載體,通過知識的講授,向學生傳授計算機問題求解的一些典型方法和思想。希望讀者掌握“編譯原理”中的基本概念、基本理論、基本方法,在系統級上再認識程序和算法,提升計算機問題求解的水平,增強系統能力,體驗實現自動計算的樂趣。在典型方法方面,則向學生傳授自頂向下、自底向上、逐步求精、遞歸求解,目標驅動,問題分析、問題的抽象與形式化描述,算法設計與實現,系統構建、模塊化等方法,培養他們的基本學科能力。教材中要對這些有探索性的引導,并通過對深挖知識背后的內容的挖掘,努力再現精華后的大師們的問題求解思考過程,引導讀者體驗大師們的思維,從而培養學生的思維能力和創新能力。
(4) 挖掘來源,促進理解
對一些難懂的內容進行適當分析,盡量講清道理,以便于學生理解。例如,先講明LR的項目集規范族起什么作用,為什么可以這樣建立,其根源(原理)是什么?然后再講識別規范句型活前綴的DFA如何構造,從而也說明LR分析法的精髓——為什么棧頂狀態能表達分析歷史,而不是簡單的定義LR(0)項目集閉包、規范族、搜索符及相關的構造算法。一方面進一步強化學生對計算機問題求解思路的掌握,另一方面也促進對內容的理解,減少學生的死記硬背。再例如,對屬性文法、屬性翻譯的設計,中間代碼生成等難以理解的部分,要通過講清“道理”以促進讀者對它們的掌握。
(5) 注重實踐
為了促進學生對基本原理的深入理解,同時加強對學生實踐能力的培養,構建適當的實驗是很重要的,編譯原理課程也不例外。
當前國內外的許多大學都在編譯原理課程中設置一個大作業,例如,Carnegie Mellon大學、加州大學伯克利分校、普林斯頓大學、斯坦福大學、南京大學、北京航空航天大學、哈工大等。新教材將在這一方面做出努力,將這樣一個適當規模和難度的系統的設計與實現貫穿全書,引導學生在學習課程的過程中隨時進行設計與實現,真正做到面向實際問題開展教與學,也只有這樣前后呼應,學生才會在有限的時間內完成一個相當規模的編譯器項目的設計與實現。加強引導是非常重要的。例如,我們在教學中發現,其中較復雜的一些數據結構的設計對學生來說既有難度,而且還非常重要,我們將根據需要,在數據結構的設計上進行適當的引導,以免學生開始時不知所措,消除學生這個階段可能存在的“恐懼感”。
(6) 準確刻畫,易于閱讀
強調教材的寫作特征,要牢記教材是寫給學生、教師、普通的讀者等,而不是寫給自己的,時刻考慮讀者的需要和對讀者的影響。時刻想到讀者,新教材會將作者二十余年來講授的經驗和建設精品課程的經驗、以及從事教材建設的經驗融入其中,將讀者理解的困難降到最低程度。特別注意敘述的流暢、易懂、準確、一致、清晰、完整,避免讓讀者猜測,最大限度降低讀者閱讀時的理解疲勞。