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