邵 兵,楊海燕,張 莉
(1. 北京航空航天大學(xué) 軟件學(xué)院,北京 100191; 2. 北京航空航天大學(xué) 計(jì)算機(jī)學(xué)院,北京 100191)
編譯原理課程的教學(xué)改革與實(shí)踐
邵 兵1,楊海燕2,張 莉1
(1. 北京航空航天大學(xué) 軟件學(xué)院,北京 100191; 2. 北京航空航天大學(xué) 計(jì)算機(jī)學(xué)院,北京 100191)
編譯原理的新概念、新算法和新理論比較多,被計(jì)算機(jī)及軟件專(zhuān)業(yè)學(xué)生視為最難以掌握的專(zhuān)業(yè)基礎(chǔ)課之一。針對(duì)課程教學(xué)中難點(diǎn)比較集中的問(wèn)題,為了讓學(xué)生能平緩地接受該課程的基礎(chǔ)理論和知識(shí),提出兩遍教學(xué)法的思路,闡述如何將編譯原理的實(shí)踐環(huán)節(jié)和教學(xué)環(huán)節(jié)有機(jī)結(jié)合,對(duì)教學(xué)和實(shí)踐的各個(gè)環(huán)節(jié)進(jìn)行合理安排,并說(shuō)明已取得的教學(xué)效果。
編譯原理;課程實(shí)踐;課程改革
編譯原理課程作為本科計(jì)算機(jī)和軟件專(zhuān)業(yè)的專(zhuān)業(yè)基礎(chǔ)課,一直被學(xué)生公認(rèn)為是大學(xué)期間最難掌握的課程之一。該課程之所以難,從學(xué)生的角度看,主要表現(xiàn)在其理論性比較強(qiáng),新的概念和算法較多,具有很強(qiáng)的抽象性。從教師的角度看,主要表現(xiàn)在以下兩個(gè)方面:一方面是編譯原理課程的重點(diǎn)和難點(diǎn)較為集中;另一方面則是該課程的理論講授和實(shí)踐鍛煉兩部分之間的銜接關(guān)系不好處理。
1.1 編譯原理知識(shí)體系的特點(diǎn)
編譯原理課程的知識(shí)體系一般由詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生產(chǎn)以及符號(hào)表管理和錯(cuò)誤處理幾個(gè)章節(jié)組成。講解該課程一般也是按照這一順序遞進(jìn)展開(kāi),且差異多表現(xiàn)在后面幾個(gè)章節(jié)的前后順序上。這些章節(jié)中,最難理解的部分是詞法分析和語(yǔ)法分析,學(xué)生一旦在該部分的學(xué)習(xí)與理解上出現(xiàn)問(wèn)題,就會(huì)產(chǎn)生挫敗感,將直接影響其后章節(jié)的學(xué)習(xí)興趣。
各章節(jié)難度系數(shù)如圖1所示,數(shù)據(jù)由我們對(duì)北京航空航天大學(xué)軟件學(xué)院部分已修過(guò)該課程的學(xué)生進(jìn)行問(wèn)卷調(diào)查而來(lái),共發(fā)放問(wèn)卷60份,回收55份。問(wèn)卷將每章內(nèi)容的難度分為6檔:非常難、較難、一般、容易、很容易和不知道,分別對(duì)應(yīng)難度系數(shù)1.0、0.75、0.5、0.25、0.0和不計(jì)入。
從圖1可以看出,語(yǔ)法分析和語(yǔ)義分析兩章的難度明顯高于其他章節(jié)的難度,在此形成一個(gè)頂峰,其次為代碼優(yōu)化。目標(biāo)代碼生成作為編譯器最末端的一章內(nèi)容,受不同目標(biāo)機(jī)器指令體系的影響,因此內(nèi)容變化較大,教師授課中可視學(xué)時(shí)數(shù)和教學(xué)目標(biāo)而作取舍。編譯器前端(分析部分)各章節(jié)依賴(lài)性很強(qiáng),而后端(綜合部分)各章節(jié)依賴(lài)性則較弱。如何在講授中克服語(yǔ)法分析等章節(jié)的難度,讓學(xué)生平緩地接受各部分知識(shí),是授課教師在制訂教學(xué)計(jì)劃時(shí)必須考慮的一個(gè)問(wèn)題。
圖1 各章節(jié)難度系數(shù)示意圖
1.2 編譯原理實(shí)踐環(huán)節(jié)
編譯原理的理論性很強(qiáng),因此,為了把書(shū)本上的理論知識(shí)轉(zhuǎn)化為學(xué)生的實(shí)際技能,不少學(xué)校都為編譯原理課程配備了一定學(xué)時(shí)的實(shí)驗(yàn)環(huán)節(jié),包括課程中間的實(shí)驗(yàn)性作業(yè)或大作業(yè)形式的完整實(shí)驗(yàn)課程(權(quán)且稱(chēng)之為編譯實(shí)踐),以便學(xué)生親自動(dòng)手編程,實(shí)現(xiàn)一個(gè)小型編譯器或者完成其中的某些部分,進(jìn)一步鞏固對(duì)理論知識(shí)的理解與掌握。
對(duì)于編譯實(shí)踐課程的安排,各院?;诟髯缘恼n程體系有自己的考量和安排。一些學(xué)校將編譯原理和編譯實(shí)踐作為完全獨(dú)立但有依賴(lài)關(guān)系的兩門(mén)課程分開(kāi)講授;而有的學(xué)校則是將兩門(mén)課程融合成一門(mén)課程,或者雖然作為兩門(mén)課,但是同時(shí)安排在一個(gè)學(xué)期先后或交叉進(jìn)行。這兩種方法各有千秋,前者便于課程安排,但課程持續(xù)時(shí)間較長(zhǎng),理論部分和實(shí)踐部分脫節(jié);后者雖然解決了理論與實(shí)踐脫節(jié)問(wèn)題,但是在一定時(shí)期內(nèi)如何合理地安排兩部分內(nèi)容,對(duì)課程組織來(lái)說(shuō)構(gòu)成了挑戰(zhàn)。
在編譯原理課程的所有內(nèi)容中,最難的知識(shí)點(diǎn)莫過(guò)于自底向上方法中的LR分析法,學(xué)生尤其對(duì)如何構(gòu)造識(shí)別規(guī)范句型活前綴的自動(dòng)機(jī)較為困惑;其次可能是識(shí)別正則文法的有窮自動(dòng)機(jī)的確定化及最小化問(wèn)題。這兩個(gè)難點(diǎn)恰恰是自動(dòng)(機(jī)器)構(gòu)造語(yǔ)法分析器和詞法分析器的方法,對(duì)于手工編寫(xiě)程序以實(shí)現(xiàn)一個(gè)編譯程序而言并沒(méi)有影響。因此,編譯原理的講授可以分成兩遍進(jìn)行。
首先,講授構(gòu)造一個(gè)編譯器的基礎(chǔ)知識(shí),在詞法分析部分只講授用狀態(tài)圖構(gòu)造詞法分析器的手工方法;然后,跳過(guò)有窮自動(dòng)機(jī)的相關(guān)知識(shí),直接進(jìn)入語(yǔ)法分析部分;在語(yǔ)法分析一章,先給出一個(gè)語(yǔ)法分析器的總體概念,第一遍只講授所有手工實(shí)現(xiàn)語(yǔ)法分析器的方法,包括自頂向下分析法中的遞歸子程序法和自底向上分析法中的算符優(yōu)先分析法,跳過(guò)自頂向下的LL分析法和自底向上的LR分析法,所講授的遞歸子程序法足以保證學(xué)生能夠手工編寫(xiě)一個(gè)語(yǔ)法分析程序;此后,按正常的教學(xué)順序依次講授后面的內(nèi)容。這種方法的具體過(guò)程和知識(shí)點(diǎn)組織如圖2所示。
圖2 編譯過(guò)程和知識(shí)點(diǎn)組織
這種方法中,第一遍首先給學(xué)生介紹一個(gè)完整的最簡(jiǎn)單的編譯過(guò)程,如圖2中A列和B列對(duì)應(yīng)的知識(shí)點(diǎn)。這些內(nèi)容是構(gòu)造一個(gè)編譯器時(shí)必不可少的知識(shí)和技能,掌握了這些知識(shí),就能保證學(xué)生可以做出一個(gè)可用的編譯程序。
第一遍講授結(jié)束時(shí),所有手工編寫(xiě)編譯程序的方法全部講完,學(xué)生可以憑借這些知識(shí)開(kāi)始編寫(xiě)自己的編譯程序;此時(shí),可以開(kāi)始第二遍的講授。第二遍講授的內(nèi)容包括編譯程序的自動(dòng)生成技術(shù),包括詞法分析部分的正則文法、自動(dòng)機(jī)理論和LEX以及語(yǔ)法分析部分的LL分析法和LR分析法。代碼優(yōu)化和目標(biāo)代碼生成兩部分的內(nèi)容可以根據(jù)培養(yǎng)要求和課時(shí)長(zhǎng)短選擇性地講授,可以放在第一遍講授,也可以放到第二遍中。
在第一遍講授過(guò)程中,每講到一個(gè)知識(shí)點(diǎn),教師就可以安排學(xué)生以作業(yè)的方式完成相應(yīng)部分的編譯程序,如講完詞法分析,可以讓學(xué)生編寫(xiě)詞法分析模塊程序;講完遞歸子程序法,讓學(xué)生編寫(xiě)語(yǔ)法分析模塊程序等。第一遍講授全部結(jié)束后,學(xué)生基本上學(xué)習(xí)了編寫(xiě)一個(gè)簡(jiǎn)單編譯程序的所有知識(shí)點(diǎn),中間完成的各個(gè)編譯程序子模塊拼接起來(lái)實(shí)際上就構(gòu)成一個(gè)內(nèi)容基本完整的編譯程序;也可以將上述作業(yè)僅僅作為課后練習(xí),而在第一遍講授結(jié)束后再布置一個(gè)大作業(yè)(或啟動(dòng)編譯實(shí)踐實(shí)驗(yàn)課程),讓學(xué)生利用后半學(xué)期課程的時(shí)間編寫(xiě)一個(gè)編譯器。與此同時(shí),再進(jìn)行第二遍講授,并將第一遍講授中剩下的所有內(nèi)容全部補(bǔ)齊。這樣做的好處在于等到最難的LL和LR分析法講完時(shí),正好趕上期末考試,學(xué)生可以趁熱打鐵,較好地理解和掌握自動(dòng)化實(shí)現(xiàn)編譯器的相關(guān)內(nèi)容。
在編譯大作業(yè)文法的選擇上,教師可以考慮選擇文獻(xiàn)[1-2]提供的PL/0文法和文獻(xiàn)[1]提供的Pascal-S文法或C0文法。
對(duì)于大作業(yè),針對(duì)學(xué)有余力的學(xué)生,教師可以在他們完成一個(gè)完整的小型編譯器所有內(nèi)容的基礎(chǔ)上,鼓勵(lì)其對(duì)相應(yīng)文法進(jìn)行適當(dāng)擴(kuò)充或者是添加代碼優(yōu)化等選做內(nèi)容,以期讓學(xué)生從實(shí)踐方法上得到更多的鍛煉。針對(duì)學(xué)習(xí)能力一般的學(xué)生,教師可以采用為學(xué)生提供不完整的源代碼,讓其以填空方式完成其中一些模塊;此類(lèi)題目由于提供了大部分源程序,只是讓學(xué)生參考教材或課堂上的示例,集中精力解決一些關(guān)鍵問(wèn)題,以保證大多數(shù)學(xué)生能完成實(shí)踐任務(wù),真正達(dá)到通過(guò)課程實(shí)踐加深對(duì)編譯過(guò)程理解的目的。針對(duì)那些學(xué)習(xí)能力相對(duì)較弱的學(xué)生,教師則可以采用讓他們分析現(xiàn)有編譯器程序的做法;也就是說(shuō),并不要求他們自己設(shè)計(jì)開(kāi)發(fā)一個(gè)具體的編譯器,而是通過(guò)讀懂現(xiàn)有的編譯程序,了解其工作原理,哪怕讓他們依葫蘆畫(huà)瓢地逐行輸入并調(diào)試現(xiàn)有的程序,找出現(xiàn)有程序中的印刷錯(cuò)誤和不合理之處,都將對(duì)提升其動(dòng)手能力起到一定作用??傊幾g大作業(yè)的完成一定要因材施教,避免一刀切的教學(xué)模式[3]。
通過(guò)對(duì)比實(shí)施兩遍教學(xué)法前后3年的教學(xué)效果發(fā)現(xiàn),雖然學(xué)生的編譯原理課程期末考試成績(jī)并沒(méi)有明顯提高,這可能是試題不同所致,但是學(xué)生普遍反映對(duì)整個(gè)編譯過(guò)程“有了更清晰地了解”。實(shí)施兩遍教學(xué)法之前,學(xué)生對(duì)編譯實(shí)踐課程的學(xué)習(xí)興趣不高,選修比例一直在低位徘徊,如2009級(jí)選修比例為22%、2010級(jí)無(wú)一人選修;而實(shí)施兩遍教學(xué)法之后,學(xué)生選修比例持續(xù)高達(dá)90%以上。
在上述調(diào)查問(wèn)卷中,針對(duì)“您認(rèn)為編譯實(shí)踐課程(大作業(yè))的作用”一問(wèn),有44%的學(xué)生認(rèn)為很有幫助,有33%的學(xué)生選擇“有幫助”,認(rèn)為“一般”的占比13%,只有大約10%的學(xué)生認(rèn)為幫助不大或完全沒(méi)有幫助。由此可以看出,學(xué)生對(duì)實(shí)踐環(huán)節(jié)的效果還是比較認(rèn)同的。
筆者根據(jù)編譯原理課程的特點(diǎn)和對(duì)學(xué)生接受能力的分析,提出將其整個(gè)編譯原理課程知識(shí)體系的講授過(guò)程分為編譯器的手工編寫(xiě)和自動(dòng)化生成兩遍的教學(xué)方式;同時(shí),通過(guò)合理安排編譯實(shí)踐環(huán)節(jié),加深學(xué)生對(duì)相關(guān)知識(shí)的理解,培養(yǎng)學(xué)生的程序編寫(xiě)能力。該教學(xué)改革的嘗試已在北京航空航天大學(xué)計(jì)算機(jī)學(xué)院和軟件學(xué)院本科教學(xué)實(shí)踐中試運(yùn)行3年以上,取得了很好的教學(xué)效果。
將來(lái),我們準(zhǔn)備對(duì)編譯實(shí)踐環(huán)節(jié)進(jìn)行深入探索,計(jì)劃開(kāi)發(fā)基于云平臺(tái)的實(shí)驗(yàn)項(xiàng)目,為每位學(xué)生自動(dòng)生成實(shí)驗(yàn)題目和內(nèi)容。該平臺(tái)在結(jié)果考查環(huán)節(jié)能夠自動(dòng)生成測(cè)試用例,從而減少教師的工作量;對(duì)學(xué)生而言,通過(guò)該平臺(tái)能夠及時(shí)獲得相應(yīng)的指導(dǎo)和幫助。
[1] 張莉, 楊海燕, 史曉華, 等. 編譯原理及編譯程序構(gòu)造[M]. 北京: 清華大學(xué)出版社, 2011: 366-438.
[2] 陳英, 陳朔鷹, 王貴珍, 等. 編譯原理[M]. 2版. 北京: 北京理工大學(xué)出版社, 2006: 286-304.
[3] 邵兵. 軟件學(xué)院編譯原理實(shí)踐課程的教學(xué)探索[J]. 計(jì)算機(jī)教育, 2016(8): 115-117.
(編輯:宋文婷)
1672-5913(2017)02-0073-03
G642
邵兵,男,副教授,研究方向?yàn)榫幾g技術(shù)和交互式設(shè)計(jì),shaobing@buaa.edu.cn。