邵兵
摘要:軟件學(xué)院對(duì)學(xué)生的培養(yǎng)目標(biāo)集中體現(xiàn)在“實(shí)用”上面,因此對(duì)傳授計(jì)算機(jī)基礎(chǔ)理論知識(shí)的編譯原理課程必須加大實(shí)踐環(huán)節(jié)的側(cè)重。如何在傳授理論知識(shí)的同時(shí),大力培養(yǎng)學(xué)生的編程能力,一直是擺在各軟件學(xué)院面前的一道難題。文章針對(duì)這一現(xiàn)實(shí)問(wèn)題,通過(guò)分析學(xué)生的接受能力,有針對(duì)性地設(shè)計(jì)幾種課程實(shí)踐的實(shí)施方案,并說(shuō)明北京航空航天大學(xué)軟件學(xué)院編譯原理課程教學(xué)中的實(shí)踐情況和取得的效果。
關(guān)鍵詞:編譯原理;編譯技術(shù);課程實(shí)踐;編程能力
1 軟件學(xué)院編譯原理課程實(shí)踐環(huán)節(jié)的重要性
隨著本科生招生人數(shù)的大幅增加,高校畢業(yè)生就業(yè)競(jìng)爭(zhēng)加劇,用人單位對(duì)人才要求不斷提高,計(jì)算機(jī)及相關(guān)專(zhuān)業(yè)的不少畢業(yè)生在就業(yè)過(guò)程中暴露出動(dòng)手能力差、分析問(wèn)題解決問(wèn)題能力薄弱、創(chuàng)新意識(shí)不強(qiáng)等問(wèn)題。這些問(wèn)題的出現(xiàn)在很大程度上反映出高校在學(xué)科的專(zhuān)業(yè)實(shí)踐(特別是課程實(shí)踐)教學(xué)方面的不足。作為大學(xué)課程中第一個(gè)較為系統(tǒng)化的軟件設(shè)計(jì)類(lèi)課程實(shí)踐,編譯原理實(shí)踐對(duì)培養(yǎng)學(xué)生動(dòng)手能力無(wú)疑起著非常重要的作用。
編譯原理(在有些學(xué)校稱(chēng)為編譯技術(shù))是本科計(jì)算機(jī)專(zhuān)業(yè)的一門(mén)重要專(zhuān)業(yè)基礎(chǔ)課程,也是計(jì)算機(jī)系統(tǒng)軟件中非常重要的一個(gè)分支,其理論性和實(shí)踐性都很強(qiáng)。大部分高校在這門(mén)課程的開(kāi)設(shè)中,都會(huì)將其劃分為理論講授和課程實(shí)踐兩部分進(jìn)行實(shí)施,甚至將理論講授和課程實(shí)踐分列為兩門(mén)課程。
2002年,教育部在成立示范性軟件學(xué)院的批示中,將“軟件學(xué)院要培養(yǎng)市場(chǎng)急需的‘實(shí)用型人才”放在了比較重要的位置,這也構(gòu)成了軟件學(xué)院區(qū)別于傳統(tǒng)計(jì)算機(jī)學(xué)院的重要標(biāo)志。因此對(duì)于軟件學(xué)院的學(xué)生而言,編譯原理的教學(xué)情況則有所不同。首先,軟件學(xué)院的歷史都不長(zhǎng),受課時(shí)和師資等多方面因素的影響,一些學(xué)校甚至是示范性軟件學(xué)院,也會(huì)將該課程壓縮甚至完全砍掉;其次,即使是保留該課程教學(xué)的學(xué)校,也會(huì)不同程度地壓縮實(shí)踐環(huán)節(jié)的時(shí)間,多多少少地影響到學(xué)生對(duì)編譯技術(shù)的理解與掌握。筆者認(rèn)為,盡管編譯原理課程確實(shí)存在理論抽象、概念眾多、算法多等特點(diǎn),但這門(mén)課程對(duì)于培養(yǎng)學(xué)生掌握構(gòu)造高級(jí)程序設(shè)計(jì)語(yǔ)言、編譯程序的基本原理、結(jié)構(gòu)、設(shè)計(jì)與實(shí)現(xiàn)技術(shù),培養(yǎng)學(xué)生了解和掌握編譯原理的基本原理及典型技術(shù)并具備相當(dāng)?shù)膽?yīng)用能力,幫助學(xué)生為今后從事軟件開(kāi)發(fā)打下堅(jiān)實(shí)的理論基礎(chǔ),提升學(xué)生程序設(shè)計(jì)能力和創(chuàng)新能力等諸多方面,都有著其他課程不可替代的作用。因此編譯原理課程教學(xué)不但不應(yīng)該削弱,反而應(yīng)該受到重視和加強(qiáng)。
在此前提下,如何讓軟件學(xué)院的學(xué)生在掌握編譯技術(shù)基本原理的同時(shí),大力加強(qiáng)他們對(duì)編譯技術(shù)的理解與使用,從而提高其產(chǎn)品——計(jì)算機(jī)軟件(尤其是大型軟件)的結(jié)構(gòu)有效性和效率,則是擺在軟件學(xué)院編譯原理課程教學(xué)的—個(gè)重要問(wèn)題。
2 對(duì)學(xué)生能力的分析
在各高校的軟件學(xué)院中,普遍存在著生源參差不齊的現(xiàn)象。由于學(xué)生入學(xué)時(shí)對(duì)計(jì)算機(jī)軟件了解不多,所以即使是在示范性軟件學(xué)院,也有相當(dāng)一部分學(xué)生入學(xué)時(shí)對(duì)軟件專(zhuān)業(yè)的認(rèn)識(shí)不夠,大學(xué)階段的頭兩年如果沒(méi)有打下良好的基礎(chǔ),則直接導(dǎo)致對(duì)專(zhuān)業(yè)課的畏懼乃至厭學(xué)情緒。所以在對(duì)學(xué)生傳授知識(shí)和培養(yǎng)能力時(shí),更需要摸清學(xué)生基礎(chǔ),培養(yǎng)他們學(xué)習(xí)興趣,通過(guò)加強(qiáng)實(shí)驗(yàn)和實(shí)踐環(huán)節(jié),培育其分析問(wèn)題和解決問(wèn)題的能力。
通過(guò)觀(guān)察和調(diào)研可知,軟件學(xué)院的學(xué)生大致上可以分為以下幾類(lèi):一是對(duì)計(jì)算機(jī)知識(shí)很感興趣,且學(xué)習(xí)能力較強(qiáng)的學(xué)生;二是對(duì)計(jì)算機(jī)知識(shí)的興趣一般,且學(xué)習(xí)能力平常的學(xué)生;三是對(duì)計(jì)算機(jī)知識(shí)不感興趣,且學(xué)習(xí)較差的學(xué)生。
像北航這樣985高校的軟件學(xué)院中,學(xué)生的學(xué)習(xí)能力普遍比較高,學(xué)校給學(xué)生提供的實(shí)驗(yàn)環(huán)境和配備的師資力量也普遍較強(qiáng),因此比較容易形成良性循環(huán),為課程教學(xué)和實(shí)驗(yàn)教學(xué)提供重要的基礎(chǔ)保障。但根據(jù)歷年編譯原理期末考試的情況分析看,實(shí)際教學(xué)效果也并非完全符合正態(tài)分布。高分段(>85分)學(xué)生的人數(shù)相對(duì)較多,約占40-50%左右,且這部分學(xué)生的能力較強(qiáng),即使適當(dāng)加大試題難度對(duì)其考試分?jǐn)?shù)的影響也比較小;而不及格學(xué)生的人數(shù)大約占10%左右,且即使降低試題難度對(duì)其影響也較??;試題難度影響較大的是中間段的學(xué)生。
對(duì)學(xué)生的接受能力有一個(gè)正確的了解,才能有針對(duì)性地因材施教,使編譯原理的實(shí)踐環(huán)節(jié)達(dá)到應(yīng)有的效果。
3 因材施教
筆者在編譯原理與實(shí)踐課程教學(xué)過(guò)程中,嘗試過(guò)不同的實(shí)踐方式。通過(guò)不斷地摸索,發(fā)現(xiàn)采用如下的因材施教方式效果最佳。
(1)對(duì)于學(xué)習(xí)能力較強(qiáng)的學(xué)生,可以讓他們自己動(dòng)手編寫(xiě)小型編譯器。一個(gè)完整的編譯器包含詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成和代碼優(yōu)化等前端部分,也可以包含生成和具體計(jì)算機(jī)體系結(jié)構(gòu)相適應(yīng)的可執(zhí)行代碼后端。一般編譯原理實(shí)踐環(huán)節(jié)大多安排學(xué)時(shí)為32學(xué)時(shí)左右,因此要讓一個(gè)(或一組)學(xué)生在這么短的時(shí)間內(nèi)完成前端和后端兩部分是不現(xiàn)實(shí)的,可以讓學(xué)生單獨(dú)完成前端。
(2)對(duì)于學(xué)習(xí)能力一般的學(xué)生,在實(shí)施編譯程序?qū)嵺`教學(xué)中,除了可以采用第一種方法外,還可以讓他們利用LEX、YACC、JavaCC等工具來(lái)編寫(xiě)編譯器。由于YACC等語(yǔ)法分析程序是基于自底向上的分析方法,所以在編譯原理課程教學(xué)環(huán)節(jié),對(duì)LL等分析法就應(yīng)當(dāng)賦予較多的時(shí)間和精力,力爭(zhēng)讓學(xué)生在使用這些工具生成編譯器程序時(shí),清晰地了解它們的工作原理。
(3)對(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)手能力的提升起到一定的作用。具體編譯程序可選擇PL/0文法程序代碼,或者是Pascal-S文法程序代碼。當(dāng)然,其他類(lèi)似的編譯器程序都可選用。
還可以提供給學(xué)生不完整的程序源代碼,讓其采用填空的方式完成其中部分關(guān)鍵模塊。此類(lèi)題目由于提供了大部分源程序,只是讓學(xué)生參考教材或課堂上的例子集中精力解決一些關(guān)鍵問(wèn)題,這樣就能保證大多數(shù)學(xué)生都能完成實(shí)踐任務(wù),真正達(dá)到讓學(xué)生通過(guò)課程實(shí)踐加深對(duì)編譯過(guò)程理解的目的;同時(shí)學(xué)生在編譯器的實(shí)現(xiàn)過(guò)程中也能夠產(chǎn)生成就感,從而消除了對(duì)課程的恐懼感,增加學(xué)習(xí)的信心。
在對(duì)編譯源程序的選擇上,可以選取循序漸進(jìn)的指導(dǎo)思想,例如張晶等人提出的Lo文法就只包含了空語(yǔ)句、賦值語(yǔ)句、條件語(yǔ)句和循環(huán)語(yǔ)句等基本語(yǔ)法成分。可以讓學(xué)生在此文法基礎(chǔ)上使用相對(duì)簡(jiǎn)單的遞歸下降分析法先進(jìn)行實(shí)現(xiàn),完成后再逐步對(duì)其進(jìn)行擴(kuò)充。這種方法就像軟件工程中的原型開(kāi)發(fā)方法,有利于學(xué)生快速看到自己的成果,從而樹(shù)立信心,取得預(yù)計(jì)的效果。如果擴(kuò)充的文法只是同一種類(lèi)型的簡(jiǎn)單擴(kuò)張,則學(xué)生會(huì)陷入重復(fù)的勞動(dòng),從而讓他失去興趣,所以文法的擴(kuò)充一定是方法的擴(kuò)充。
對(duì)于部分學(xué)生,還可以讓其利用所學(xué)知識(shí)編寫(xiě)類(lèi)編譯器的工具,比如智能編輯器、公式編輯器等。只要是能夠?qū)⒕幾g技術(shù)的知識(shí)用到具體程序中去,所有的嘗試都應(yīng)當(dāng)予以鼓勵(lì),但這種嘗試一定要在老師的指導(dǎo)和監(jiān)督下進(jìn)行,以免出現(xiàn)學(xué)生出發(fā)點(diǎn)雖好,但遇到具體技術(shù)問(wèn)題無(wú)法克服進(jìn)而導(dǎo)致挫折性失敗的情況。
4 編譯原理實(shí)踐教學(xué)的時(shí)機(jī)
通過(guò)對(duì)不同學(xué)校的調(diào)查發(fā)現(xiàn),不同的學(xué)校對(duì)編譯原理實(shí)踐教學(xué)環(huán)節(jié)的安排主要有以下兩種情況。一種是將教學(xué)環(huán)節(jié)和實(shí)踐環(huán)節(jié)完全分開(kāi),而且分別放置到兩個(gè)學(xué)期中實(shí)施。這種方法雖然存在著界限分明、便于組織教學(xué)的好處,但實(shí)踐證明由于理論和實(shí)踐嚴(yán)重割裂,學(xué)生往往在第二個(gè)學(xué)期實(shí)踐環(huán)節(jié)中對(duì)上一學(xué)期所學(xué)的知識(shí)遺忘得非常厲害,導(dǎo)致教學(xué)效果很差,因此不建議采用;另外一種稍好的方法,是將教學(xué)和實(shí)踐環(huán)節(jié)雖然分開(kāi),也就是先進(jìn)行課程教學(xué),結(jié)束后再進(jìn)行實(shí)踐。這種方法雖然把兩個(gè)環(huán)節(jié)放在一個(gè)學(xué)期實(shí)施,解決了理論和實(shí)踐脫節(jié)的矛盾,但上述矛盾依然存在,只是理論和實(shí)踐脫節(jié)的程度稍輕一些而已。
經(jīng)過(guò)多年的實(shí)踐,作者認(rèn)為采用兩遍教學(xué)法可以較好地解決這個(gè)問(wèn)題。也就是說(shuō),把教學(xué)和實(shí)踐放在同一個(gè)學(xué)期實(shí)施,不要將它們完全分開(kāi)。首先可以講授編譯原理的最基礎(chǔ)知識(shí),例如詞法分析、語(yǔ)法分析中的自頂向下分析法、語(yǔ)法制導(dǎo)的語(yǔ)義分析等,與此同時(shí)安排學(xué)生進(jìn)行編譯器相應(yīng)部分的編寫(xiě)工作,即把整個(gè)實(shí)踐環(huán)節(jié)變成教學(xué)環(huán)節(jié)的一個(gè)大作業(yè)。待學(xué)生完成后,再進(jìn)一步講解詞法分析中自動(dòng)機(jī)理論、語(yǔ)法分析中的LL及LR分析法、代碼優(yōu)化以及目標(biāo)代碼生成等內(nèi)容,最后再完成利用編譯工具進(jìn)行編譯器自動(dòng)生成的實(shí)踐。在這種教學(xué)方法中,課堂教學(xué)和實(shí)踐環(huán)節(jié)交叉進(jìn)行,學(xué)生學(xué)到哪里就實(shí)踐到哪里,從而保證教學(xué)與實(shí)踐的緊密結(jié)合。
5 結(jié)語(yǔ)
筆者在北航軟件學(xué)院七年的教學(xué)實(shí)踐中,通過(guò)對(duì)學(xué)生學(xué)習(xí)能力的調(diào)查分析,摸索出了在教學(xué)過(guò)程中首先區(qū)分教學(xué)對(duì)象,然后因材施教的基本思路,并給出了具體的解決方案。
首先,在頭幾年的教學(xué)中采用的是簡(jiǎn)單的統(tǒng)一式實(shí)踐方式,即所有學(xué)生采用同一個(gè)題目、使用同一種文法,獨(dú)立完成一個(gè)編譯器前段。此時(shí)有大約五分之一的學(xué)生存在偷懶抄襲別人作業(yè)的現(xiàn)象。之后采用分題目實(shí)踐方式,即自我感覺(jué)水平較高的同學(xué)經(jīng)過(guò)申請(qǐng)可以采用CO文法,絕大部分同學(xué)使用PL0文法獨(dú)立完成一個(gè)編譯器前段;自我感覺(jué)水平較低的同學(xué)采用在部分已有Pascal-S文法基本模塊的基礎(chǔ)上,通過(guò)填空補(bǔ)充遞歸子程序語(yǔ)法分析模塊。此時(shí)沒(méi)有發(fā)現(xiàn)學(xué)生抄襲別人代碼的現(xiàn)象。為了保證成績(jī)的區(qū)分度,所有獲得優(yōu)秀(采用五級(jí)計(jì)分制)的學(xué)生必須參加答辯,經(jīng)過(guò)代碼講解和演示并通過(guò)教師提供的測(cè)試。
改革后學(xué)生們普遍反映“通過(guò)大作業(yè),對(duì)課本上的知識(shí)有了更深刻的認(rèn)識(shí)”、“編譯原理課程是我大學(xué)四年學(xué)過(guò)的最難課程,其中編譯實(shí)踐對(duì)我的幫助最大”。2015年一位同學(xué)更是由于在其博客中發(fā)表了對(duì)LLVM編譯相關(guān)的研究?jī)?nèi)容,被美國(guó)加州大學(xué)河濱分校的一位華人教授發(fā)現(xiàn),并表達(dá)了招收其為直博研究生的意愿。
事實(shí)上,北航軟件學(xué)院的編譯原理課程近幾年也經(jīng)歷了由必修課程改為選修課程,又由選修改為必修的曲折道路。在課程性質(zhì)為選修的時(shí)候,編譯原理和編譯實(shí)踐是分割到兩個(gè)學(xué)期的兩門(mén)獨(dú)立課程。一部分學(xué)生由于種種原理,在選修過(guò)編譯原理課程后不愿意再選修編譯實(shí)踐,導(dǎo)致對(duì)相關(guān)知識(shí)的掌握只是停留在表面。后來(lái)我們采用前述的兩遍教學(xué)法,將編譯原理和編譯實(shí)踐有機(jī)地融合到了一個(gè)學(xué)期,從而保證通過(guò)實(shí)踐環(huán)節(jié)對(duì)課堂上所學(xué)的理論知識(shí)有較深的理解,達(dá)到了提高教學(xué)效果的目的。
(編輯:史志偉)