張 莉 楊海燕 史曉華
摘要:“編譯技術(shù)”是一門公認(rèn)的難教難學(xué)的課程,包含了看似晦澀的理論部分和覆蓋面廣的實踐部分。如何根據(jù)本學(xué)校的培養(yǎng)定位組織教學(xué)內(nèi)容,如何實施教學(xué)過程,是教師們普遍關(guān)注的主要問題。本文結(jié)合北京航空航天大學(xué)這類工科院校強(qiáng)調(diào)工程技術(shù)的特點,探討了“編譯技術(shù)”課程的組織方式,提出了以編譯過程為主導(dǎo)帶動課程知識點的課程安排模式,并針對不同類型高校給出了教學(xué)安排建議。
關(guān)鍵詞:編譯技術(shù);編譯原理;課程定位;課程內(nèi)容組織
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:B
1引言
“編譯原理/技術(shù)”是計算機(jī)專業(yè)的一門經(jīng)典課程。由于該課程包含了詞法分析、語法分析方法中與形式語言及自動機(jī)相關(guān)的讓人頗感晦澀的原理,以及在代碼生成和代碼優(yōu)化部分與計算機(jī)系統(tǒng)結(jié)構(gòu)有關(guān)的龐雜繁瑣的實現(xiàn)技術(shù),讓許多非計算機(jī)相關(guān)專業(yè)的學(xué)生望而卻步,幾乎成為計算機(jī)專業(yè)“科班出身”的一種標(biāo)志。與此同時,難教難學(xué)也是這門課的一個特點。如何讓那些看似晦澀的原理和龐雜的實現(xiàn)技術(shù)對學(xué)生來說更容易理解和掌握呢?筆者認(rèn)為,教學(xué)內(nèi)容的組織和課程安排模式是非常重要的因素。同樣的知識點,因不同的組織方式而變得邏輯性更強(qiáng),更容易理解和掌握。本文結(jié)合北京航空航天大學(xué)編譯課程的建設(shè),探討以編譯過程為主導(dǎo)帶動課程知識點的課程組織模式。
2課程定位
編譯課程在不同學(xué)校教學(xué)計劃中的教學(xué)定位可能不同。北京航空航天大學(xué)(簡稱北航)是一所具有航空航天特色和工程技術(shù)優(yōu)勢的多科性、開放式、研究型大學(xué)。北航計算機(jī)學(xué)院將編譯課程設(shè)置為一門核心專業(yè)必修課,并命名為“編譯技術(shù)”(而非“編譯原理”),意在秉承工程院校強(qiáng)調(diào)工程技術(shù)的特點,強(qiáng)調(diào)編譯系統(tǒng)的構(gòu)造及其相關(guān)技術(shù)。本課程安排在大三上學(xué)期,先修課要求:一門高級程序設(shè)計語言、“數(shù)據(jù)結(jié)構(gòu)和算法”以及“計算機(jī)原理和匯編語言”等課程。同時本課程安排在“操作系統(tǒng)”之前,是學(xué)生接觸到的第一個講述完整的軟件系統(tǒng)的課程。本課程理論和實踐并重,要求學(xué)生掌握編譯的基本理論、常用的編譯技術(shù),了解編譯過程及編譯系統(tǒng)的構(gòu)造(結(jié)構(gòu)和機(jī)理);能運用所學(xué)技術(shù)解決實際問題,能獨立編寫一個小型編譯系統(tǒng)。
曾經(jīng)一度,有人認(rèn)為學(xué)生畢業(yè)后很少做編譯器了,因此不必再開設(shè)編譯課了。Alfred V. Aho在其著名的《編譯原理》(龍書)中提到:編譯器設(shè)計的原理和技術(shù)還可以用于編譯器設(shè)計之外的眾多領(lǐng)域,這些原理和技術(shù)通常會在一個計算機(jī)科學(xué)家的職業(yè)生涯中多次被用到。因此,編譯課程在本科教學(xué)體系中應(yīng)該承載超越“編譯系統(tǒng)構(gòu)造”的使命。筆者認(rèn)為,“編譯技術(shù)”課程作為一個載體,在培養(yǎng)學(xué)生專業(yè)素質(zhì)方面起到了非常重要的作用,主要體現(xiàn)在:(1)讓學(xué)生理解高級程序設(shè)計語言的工作原理和相關(guān)概念;(2)通過編譯程序的構(gòu)造和相關(guān)算法,讓學(xué)生掌握軟件領(lǐng)域重要的程序(模型)等價轉(zhuǎn)換技術(shù)、程序(模型)優(yōu)化技術(shù);(3)通過編譯系統(tǒng)的介紹,讓學(xué)生了解軟件系統(tǒng)的概念和軟件系統(tǒng)設(shè)計的方法;(4)通過學(xué)習(xí)詞法分析程序、語法分析程序的自動生成技術(shù),讓學(xué)生對程序的自動生成技術(shù)有所了解。
基于這樣的理解,北航編譯課程的培養(yǎng)定位為:基礎(chǔ)和前沿相結(jié)合、理論和實踐相結(jié)合。要求學(xué)生既要掌握編譯的經(jīng)典基礎(chǔ)理論和算法,對編譯系統(tǒng)有完整的理解,又要求學(xué)生具備簡單編譯系統(tǒng)的構(gòu)造能力。
同時通過“編譯課程設(shè)計”實踐課程,讓學(xué)生:(1)掌握編譯程序構(gòu)造的主要技術(shù)和算法,理解編譯過程;(2)體驗一個比較完整的軟件系統(tǒng)的設(shè)計、開發(fā)、測試過程,建立系統(tǒng)設(shè)計觀念;(3)結(jié)合軟件工程課程,完成規(guī)范化文檔;(4)在本科培養(yǎng)體系中,進(jìn)一步提高數(shù)據(jù)結(jié)構(gòu)的綜合應(yīng)用能力和程序設(shè)計能力。
3課程的組織
基于以上的定位,筆者認(rèn)為“編譯技術(shù)”課程的組織應(yīng)強(qiáng)調(diào)過程完整性、系統(tǒng)性和實踐性。
(1) 過程完整性:編譯過程是一個翻譯的過程,編譯技術(shù)的實質(zhì)是介紹程序/模型從一種語言表達(dá)形式到另一種語言表達(dá)形式的等價轉(zhuǎn)化方法,所以在課程內(nèi)容的安排中應(yīng)該保證編譯過程的完整性,至少是一個完整的翻譯過程。
(2) 系統(tǒng)性:編譯器是一個完整的軟件系統(tǒng),也是學(xué)生接觸到的第一個系統(tǒng)(之前學(xué)生接觸到的主要是針對語言、數(shù)據(jù)結(jié)構(gòu)和算法的程序設(shè)計練習(xí))。應(yīng)該讓學(xué)生理解一個完整的系統(tǒng)是如何構(gòu)成的,各部分應(yīng)如何組織和協(xié)調(diào)。
(3) 實踐性:理論應(yīng)該和實踐相結(jié)合,無論是研究性大學(xué)、非研究性大學(xué),都應(yīng)該注重實踐和學(xué)生動手能力的培養(yǎng),尤其是對計算機(jī)專業(yè)的學(xué)生,實際動手能力關(guān)乎謀生大計,更不能小視。北航計算機(jī)學(xué)院為了突出實踐環(huán)節(jié)的重要性,將實踐環(huán)節(jié)部分設(shè)置為一門課程,單獨計算學(xué)分。我校該課程的組織如下:
(1) 教學(xué)內(nèi)容組織(理論課部分)
編譯課程中晦澀的原理和龐雜的算法總有些讓人望而生畏,它們都是必需的嗎?它們之間是什么關(guān)系?學(xué)生理解嗎?教師清楚嗎?因此,讓復(fù)雜的內(nèi)容簡化,讓課程更簡單易懂,成為本課程改革的一個重要指導(dǎo)思想。在十多年的教學(xué)過程中,筆者發(fā)現(xiàn)編譯過程是一根主線,所有的知識點都是為其服務(wù)的,為此提出了以編譯過程帶動課程知識點的課程組織方式。
通常,編譯過程可劃分為5個基本階段:詞法分析、語法分析、語義分析及生成中間代碼、代碼優(yōu)化、生成目標(biāo)程序,如圖1所示。經(jīng)過詞法分析、語法分析、語義分析及代碼生成這3個階段,就能完成將程序從一種形式轉(zhuǎn)化為另一種形式,這就體現(xiàn)了一個完整的翻譯過程。因此,最基本的要求是保證這3個階段的內(nèi)容完整。
要保證這3個階段的內(nèi)容完整,并不意味著要介紹這3個階段的所有內(nèi)容。其實,僅僅完成一個翻譯過程所涉及的內(nèi)容并不多、也不難。詞法分析部分只需要讓學(xué)生理解詞法分析的功能,能基于狀態(tài)圖(狀態(tài)圖以一種直觀的形式描述單詞符號的拼寫規(guī)則)構(gòu)造出相應(yīng)的詞法分析程序。而在語法分析部分,可以只介紹最簡單的且便于手工編程實現(xiàn)的遞歸子程序法。在確定了每種語法成分后,結(jié)合該語法成分的語義,可以及時完成語言的翻譯,這就是語法制導(dǎo)翻譯方法。每種語法成分加上其語義的屬性,便構(gòu)成了屬性翻譯文法。按照語法制導(dǎo)翻譯方法,對各種語法成分進(jìn)行語義分析并生成另一種形式的代碼,這就完成了程序從一種語言形式到另一種語言形式的翻譯過程。這個過程主要涉及到詞法分析、語法分析和語法制導(dǎo)翻譯技術(shù)、語義分析和代碼生成、源程序的中間形式等內(nèi)容。當(dāng)然,作為基礎(chǔ),學(xué)生應(yīng)該首先了解文法和語言的概念和表示等基礎(chǔ)知識,如圖1中A框所示。
要真正實現(xiàn)上述語言的編譯過程,還需要了解符號表管理技術(shù)、錯誤處理技術(shù),考慮到程序運行時需要解決的問題,還需要了解運行時的存儲組織及管理方式。這部分內(nèi)容構(gòu)成了基本翻譯過程之上第二個層次的知識點,如圖1中B框所示。
要生成高質(zhì)量的目標(biāo)代碼,還應(yīng)該了解代碼優(yōu)化和目標(biāo)代碼生成有關(guān)的技術(shù)和方法。這可歸于第三個層次,如圖1中C框所示。
學(xué)生掌握了上述知識點,便為實現(xiàn)一個帶有代碼生成和優(yōu)化的編譯器打下了基礎(chǔ),可以不用了解在教學(xué)過程中被認(rèn)為難講難學(xué)的詞法分析和語法分析的其他理論部分。這些讓人覺得晦澀的部分,究竟有什么作用呢?它們與編譯過程的前述知識點有什么關(guān)系呢?經(jīng)過多年的教學(xué),筆者發(fā)現(xiàn),學(xué)生覺得這部分知識難學(xué),并不是真正學(xué)不懂,他們更多的是不理解為什么要學(xué),不能很好地建立這之間的邏輯關(guān)系。首先,我們來看看占據(jù)詞法分析2/3的內(nèi)容,是介紹詞法分析器的自動生成技術(shù),而自動機(jī)理論是其自動生成的理論基礎(chǔ)。再看看語法分析部分,是學(xué)生認(rèn)為最難學(xué)的部分,往往也是各個學(xué)??疾閷W(xué)生的重點內(nèi)容??墒?大部分學(xué)生并不完全明白為什么要學(xué)習(xí)這些內(nèi)容,沒有認(rèn)識到(或者教師沒有講解)每種方法的局限性,沒有理解各種方法從簡到難,同時其處理語言的范圍也從小到大(見圖2),沒有理解這里還有相當(dāng)?shù)钠诮榻B語法分析器的自動生成技術(shù)。正是由于介紹了語法分析器的自動生成技術(shù),導(dǎo)致這部分內(nèi)容涉及了相當(dāng)多的理論原理和算法。對此,筆者建議不同學(xué)??梢愿鶕?jù)教學(xué)要求適當(dāng)選擇這部分內(nèi)容開展教學(xué)(見圖1(C))。
上述知識點的組織方式可以用圖1來表示。圍繞編譯過程,將編譯技術(shù)的知識點分為三個層次,黃色A框表示實現(xiàn)一個語言翻譯過程所需的最基本的知識點,建議各個學(xué)校都講。進(jìn)一步如果需要翻譯生成的程序能在虛擬機(jī)上運行,翻譯過程能夠進(jìn)行簡單的語義檢查和錯誤處理,還需要增加符號表管理、錯誤處理和運行時存儲組織管理等方面的知識,這些內(nèi)容不屬于編譯過程的某個具體階段,如綠色B框所示。其他有關(guān)詞法分析和語法分析自動生成的原理、代碼優(yōu)化和代碼生成的知識點,可以作為第三個層次的內(nèi)容,如紫色C框所示。不同的高校可以根據(jù)培養(yǎng)定位選擇相應(yīng)內(nèi)容講授。重要的是,所有內(nèi)容應(yīng)該圍繞一個完整的編譯過程,至少是一個完整的翻譯過程來進(jìn)行,而不應(yīng)該僅限于詞法分析和語法分析方法的介紹。
(2) 實踐環(huán)節(jié)要求
筆者認(rèn)為,在“編譯技術(shù)”的實踐環(huán)節(jié),應(yīng)讓學(xué)生自己動手實現(xiàn)一個完整的編譯程序,從源代碼翻譯為目標(biāo)代碼,并且要讓目標(biāo)代碼能夠運行(至少能運行在虛擬機(jī)上)。這樣不僅讓學(xué)生體會完整的編譯過程,同時也讓學(xué)生實現(xiàn)一個完整的編譯系統(tǒng)。為此,北航計算機(jī)學(xué)院的“編譯技術(shù)”實踐環(huán)節(jié)設(shè)計了三個層次的題目,分別對應(yīng)了不同的難度和分?jǐn)?shù),力求讓不同程度的學(xué)生都實現(xiàn)一個完整的編譯器,各難度的題目要求如表1所示。
從表1中可以看出,難度等級低的題目在文法要求上不高,與教材[3]中的PL/0文法類似,學(xué)生只要讀懂了教材中經(jīng)典的示例編譯器,就應(yīng)該能夠?qū)崿F(xiàn)。由于有示例編譯器為參考,降低了難度,但同時也為考查學(xué)生是否獨立完成增加了難度。為此,筆者設(shè)計了一套質(zhì)量管理體系,從題目設(shè)置、題目分配和考核方案等方面綜合考慮,加強(qiáng)過程管理,保證作業(yè)質(zhì)量。比如,每個難度的文法都有若干個,每個文法定義的語言在形式上都有差別,學(xué)生必須按照自己所獲得的文法編寫編譯器,才能通過測試程序的測試;借助于教學(xué)平臺,每個難度的若干個文法隨機(jī)分配給學(xué)生等,參見精品課程網(wǎng)站http://compile.buaa.edu.cn。
4總結(jié)
為了讓“編譯技術(shù)”課的內(nèi)容更好地被學(xué)生掌握,為了更好地實現(xiàn)編譯課程的教學(xué)使命,本文提出了以編譯過程為主導(dǎo)帶動課程知識點的課程組織模式,從另一個角度理清了那些看似晦澀的理論部分和編譯過程的關(guān)系,而以編譯過程為主導(dǎo)劃分的三個層次知識點,也有利于各種不同定位的高校安排教學(xué)內(nèi)容。筆者認(rèn)為,無論哪類學(xué)校,只要是工科院校,都應(yīng)該強(qiáng)調(diào)實踐,都應(yīng)該保證編譯過程的完整性,讓學(xué)生用最簡單的方式至少完成一個完整的翻譯過程。在此基礎(chǔ)上,根據(jù)各個學(xué)校的定位適當(dāng)增加詞法分析和語法分析的自動生成技術(shù),以及編譯優(yōu)化技術(shù)。
筆者在教學(xué)實踐中發(fā)現(xiàn),學(xué)生在自己編程實現(xiàn)了一個小型編譯程序之后,通常會感慨理論課上覺得已經(jīng)學(xué)會的東西,在實踐之后才發(fā)現(xiàn)真正理解和掌握了。北航計算機(jī)學(xué)院的“編譯技術(shù)”實踐部分,由于有寄存器分配、生成匯編碼等要求,需要學(xué)生運用C語言、數(shù)據(jù)結(jié)構(gòu)、計算機(jī)原理和匯編等知識,被學(xué)生譽(yù)為“綜合性的大作業(yè)”。盡管難度大,但是學(xué)生覺得收獲頗豐,這正是筆者不斷思考、嘗試新的教學(xué)方法的無窮動力。
參考文獻(xiàn):
[1]Alfred V. Aho, Monica S. Lam,Ravi Sethi,et al. 編譯原理[M]. 趙建華,鄭滔,戴新宇,譯. 北京:機(jī)械工業(yè)出版社,2009.
[2]Andrew W. Appel, Maia Ginsburg. Modern Compiler Implementation in C[M]. Cambridge: Cambridge University Press, 1998.
[3] 高仲儀,金茂忠. 編譯原理及編譯程序構(gòu)造[M]. 北京:北京航空航天大學(xué)出版社,2001.
[4] 楊海燕,史曉華,張莉.“編譯技術(shù)”實踐環(huán)節(jié)的質(zhì)量管理體系及實踐[J]. 計算機(jī)教育,2009(17):61-63.