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