顏 雁,尹大力
(長春理工大學(xué)計(jì)算科學(xué)技術(shù)學(xué)院,長春 130022)
《編譯原理》是計(jì)算機(jī)專業(yè)的一門非常重要的專業(yè)必修課程,課程兼有很強(qiáng)的理論性和實(shí)踐性。它的主要任務(wù)是系統(tǒng)向?qū)W生介紹編譯系統(tǒng)的結(jié)構(gòu)、工作原理以及編譯程序各部分的設(shè)計(jì)原理和實(shí)現(xiàn)技術(shù)。其實(shí)驗(yàn)課程的目的是使學(xué)生具有設(shè)計(jì)、實(shí)現(xiàn)、分析和移植編譯程序等方面的初步能力,從而為今后的計(jì)算機(jī)軟件開發(fā)以及理論研究工作打下堅(jiān)實(shí)的基礎(chǔ)。
1.理論性強(qiáng),涉及的算法復(fù)雜。學(xué)習(xí)時(shí)需要很強(qiáng)的邏輯思維能力,要深入理解這些算法很困難。
2.編譯程序各個(gè)部分相對獨(dú)立。其內(nèi)容包括詞法分析、語法分析、語法制導(dǎo)翻譯、代碼生成與優(yōu)化這幾大部分。然而,整個(gè)編譯程序的構(gòu)造非常精妙,就像一部精確的時(shí)鐘,很多齒輪、部件協(xié)調(diào)地運(yùn)轉(zhuǎn),環(huán)環(huán)相扣,牽一發(fā)而動(dòng)全身。一步出錯(cuò),滿盤皆輸,構(gòu)建一個(gè)全局的小型編譯器并不容易。
一直以來,實(shí)驗(yàn)教學(xué)階段以驗(yàn)證性實(shí)驗(yàn)為主,指定題目要求學(xué)生編程實(shí)現(xiàn)編譯各階段的功能:構(gòu)建詞法分析程序,構(gòu)建語法分析程序,語義分析程序等;考核方式以考查程序?qū)崿F(xiàn)情況為依據(jù)。然而在長期教學(xué)過程中,發(fā)現(xiàn)存在如下問題:
(1)題目設(shè)置單一,各部分聯(lián)系不足,導(dǎo)致很多同學(xué)僅在代碼層面上盲目追求程序運(yùn)行,只見樹木不見森林,忽略編譯程序全局性,不能全面深刻理解整個(gè)編譯程序?qū)崿F(xiàn)原理。
(2)題目過于注重算法,與實(shí)際應(yīng)用結(jié)合不緊密。學(xué)生興趣不高,盲目學(xué)習(xí),并不清楚相關(guān)原理能解決什么實(shí)際問題。
(3)組織方式上,以班級為單位,統(tǒng)一做一個(gè)題目,忽略學(xué)生的個(gè)體差異,難免會(huì)造成“千篇一律”的局面。這不符合新時(shí)期“以人為本,因材施教”的教育理念。
(4)考核方式上,以程序的實(shí)現(xiàn)情況以及報(bào)告書寫是否全面做評價(jià)依據(jù)并不客觀。
1.調(diào)整傳統(tǒng)必做題目,加入源代碼預(yù)習(xí)環(huán)節(jié)
長期以來,傳統(tǒng)必做題目以驗(yàn)證性為主,提供給學(xué)生一種簡化語言,例如C語言的子集[1],要求學(xué)生針對該語言的詞法語法規(guī)則,實(shí)現(xiàn)其詞法分析子程序、語法分析子程序、語義分析子程序的設(shè)計(jì)[2],期望使學(xué)生掌握微型語言編譯程序的構(gòu)造原理。但實(shí)際教學(xué)中常常事與愿違。一則學(xué)生對語言語法規(guī)則整體把握不準(zhǔn)確;二則此類實(shí)驗(yàn)項(xiàng)目注重局部算法,較少涉及到編譯程序各部分的有機(jī)結(jié)合。因此,在上機(jī)實(shí)習(xí)時(shí),學(xué)生或沒有思路,或留于表面滿足于局部的程序運(yùn)行,有時(shí)連各部分基本的輸入輸出的真正含義都不甚理解,更談不上形成一個(gè)有機(jī)的編譯程序整體。此外,程式化的題目過于注重算法,與實(shí)踐脫節(jié),枯燥無味容易使學(xué)生產(chǎn)生畏難情緒與厭學(xué)心態(tài),違背實(shí)踐教學(xué)的初衷。
為此我們做出調(diào)整,加一個(gè)預(yù)習(xí)環(huán)節(jié)。為了加強(qiáng)學(xué)生對編譯程序整體的認(rèn)識(shí),我們直接提供給學(xué)生一個(gè)針對簡單語言的經(jīng)簡化的完整的編譯程序。要求學(xué)生認(rèn)真閱讀,在深入理解該編譯程序及其源語言語法成分后對其語言的語法成分進(jìn)行擴(kuò)充,如擴(kuò)充語句、數(shù)據(jù)類型或增加函數(shù)的說明和引用等(擴(kuò)充的內(nèi)容按難度分必做和選做,后面詳述)。最后在實(shí)驗(yàn)課上完善編譯程序相關(guān)功能(完善詞法分析、語法分析、語義分析程序)。這樣預(yù)先給定簡單語言編譯源碼,可以讓學(xué)生對理論教學(xué)相關(guān)原理充分消化,做個(gè)緩沖;同時(shí),完善功能設(shè)計(jì),比原先直接設(shè)計(jì)更為具體,從而解決學(xué)生“摸不著門”的問題,這樣更易達(dá)到良好的教學(xué)效果。
2.擴(kuò)充實(shí)踐應(yīng)用性題目為選做題目
一則能提高學(xué)生的學(xué)習(xí)興趣,二則能使學(xué)生知曉編譯原理技術(shù)知識(shí)不但可以用于構(gòu)造和維護(hù)編譯程序的工作,還可用于部分系統(tǒng)軟件和應(yīng)用軟件的開發(fā)。例如,在語法分析階段加入選做題目,利用編譯程序語法分析、語義分析的原理設(shè)計(jì)一個(gè)計(jì)算器,實(shí)現(xiàn)表達(dá)式的分析計(jì)算。這樣,可以克服以往模仿Windows系統(tǒng)的計(jì)算器,只有輸入和結(jié)果,不能直接輸入表達(dá)式;不能對好幾個(gè)表達(dá)式進(jìn)行計(jì)算;也不能選擇表達(dá)式中的一部分進(jìn)行計(jì)算;對輸入錯(cuò)誤不能確切報(bào)告表達(dá)式中的錯(cuò)誤位置等缺點(diǎn),具有很強(qiáng)的實(shí)用性。而且,它還能提高學(xué)生的興趣,加深學(xué)生對編譯程序應(yīng)用方向的整體認(rèn)識(shí),幫助他們走出“編譯無用”的認(rèn)知誤區(qū)。
針對不同水平的學(xué)生設(shè)定不同難度的實(shí)驗(yàn)題目,不同實(shí)驗(yàn)題目會(huì)有不同的要求,從而激發(fā)每個(gè)學(xué)生的學(xué)習(xí)興趣,使每個(gè)學(xué)生都能通過學(xué)習(xí)而有所收獲。以語法分析程序?yàn)槔?預(yù)習(xí)環(huán)節(jié)給定簡單C語言語法規(guī)則(其中語法變量僅包含賦值語句,表達(dá)式,項(xiàng)、因子),以及遞歸下降編譯器[3]。我們制定要求如下:對基礎(chǔ)一般的同學(xué),要求在源語言基礎(chǔ)上擴(kuò)充說明語句的語法規(guī)則,然后實(shí)現(xiàn)正確的語法分析;對于基礎(chǔ)較好的同學(xué),除要求說明語句以外還要求擴(kuò)充循環(huán)FOR,WHILE語句語法規(guī)則[4],實(shí)現(xiàn)語法分析;再者學(xué)有余力的同學(xué)還可以選做題目,建立面向?qū)ο蟓h(huán)境下的計(jì)算器。這樣,在內(nèi)容上實(shí)現(xiàn)難度階梯設(shè)計(jì),能按照學(xué)生對知識(shí)掌握的程度因材施教,避免個(gè)別學(xué)生或“吃不了”或“吃不飽”的現(xiàn)象,從而最大限度發(fā)揮學(xué)生的主觀能動(dòng)性和學(xué)習(xí)潛質(zhì),提高學(xué)生軟件開發(fā)整體能力。
對于優(yōu)秀的選作實(shí)驗(yàn)“作品”,我們將其放到課程網(wǎng)站以供其他學(xué)生學(xué)習(xí)借鑒,鼓勵(lì)學(xué)生找出程序不足并進(jìn)行完善補(bǔ)充[5]。學(xué)生可以將完善后的程序以報(bào)告的形式發(fā)給實(shí)驗(yàn)指導(dǎo)教師,教師根據(jù)完成情況與學(xué)生進(jìn)行網(wǎng)絡(luò)互動(dòng),給出指導(dǎo)意見。如果學(xué)生即將參加編譯課程設(shè)計(jì),則該報(bào)告可以直接作為課堂實(shí)驗(yàn)的報(bào)告參與評分,充分體現(xiàn)了教育的靈活性。
傳統(tǒng)考核以檢查程序的實(shí)現(xiàn)情況以及報(bào)告書寫做評價(jià)依據(jù)并不客觀。并且極易造成千篇一律的情況?,F(xiàn)采取課上考察程序?qū)崿F(xiàn)占30%、課后交總結(jié)報(bào)告占30%、期末抽簽答辯占40%的綜合立體化考核辦法。
期末答辯分必做和選做兩場。必做答辯全體同學(xué)參加,每個(gè)同學(xué)采取抽簽方式抽取答辯實(shí)驗(yàn)題目,要求答辯原理清晰,程序運(yùn)行良好;選做答辯自愿參加,根據(jù)個(gè)人的選做記錄,抽取題目答辯,視完成掌握情況予以加分。答辯成績即為必答和選答兩項(xiàng)的總和。如此立體考核辦法對學(xué)生具體而客觀,既能充分調(diào)動(dòng)學(xué)生積極性,又能最大限度杜絕學(xué)生“蒙混過關(guān)”的思想,起到監(jiān)督鞭策作用。
此外,必做題目以個(gè)人為單位,選做題目允許以小組(2~3人)為單位。改變傳統(tǒng)的實(shí)驗(yàn)報(bào)告模式,教師不再硬性規(guī)定報(bào)告的格式和內(nèi)容,而是要求學(xué)生將實(shí)驗(yàn)報(bào)告以小型科研論文的形式提交。讓學(xué)生把在分組討論時(shí)對編程結(jié)果進(jìn)行的分析和自己獨(dú)特的見解寫進(jìn)報(bào)告,避免實(shí)驗(yàn)報(bào)告“千人一面”的現(xiàn)象。這樣能夠培養(yǎng)學(xué)生實(shí)事求是的科學(xué)態(tài)度和獨(dú)立的科研素質(zhì)。
綜上,筆者作為多年從事編譯教學(xué)的一線教師,針對編譯原理課程特點(diǎn),以及實(shí)驗(yàn)教學(xué)中突顯的問題展開教學(xué)改革研究,總結(jié)有4點(diǎn):一是加入預(yù)習(xí)實(shí)驗(yàn),給定簡短編譯源碼,力使學(xué)生“有的放矢”。二是加強(qiáng)理論聯(lián)系實(shí)際,擴(kuò)充應(yīng)用型實(shí)驗(yàn)題目,幫助學(xué)生走出“編譯無用”的誤區(qū)。三是因材施教,題目難度成階梯狀分布,實(shí)現(xiàn)個(gè)性化教學(xué)。四是實(shí)施全面立體化三合一考核辦法,客觀評價(jià)學(xué)生。
編譯課程教學(xué)在新時(shí)期“因材施教,以人為本”的教育理念下仍然面臨巨大挑戰(zhàn)。如何能提高學(xué)生學(xué)習(xí)興趣,發(fā)揮學(xué)生最大潛能,獲得最優(yōu)的教學(xué)效果應(yīng)該是每位教師長期思考并致力解決的問題。
[1]劉銘,徐蘭芳,駱婷.編譯原理[M].3版.北京:電子工業(yè)出版社,2011.
[2]王雷.編譯原理設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2010.
[3]肖軍模.程序設(shè)計(jì)語言編譯方法[M].3版.大連:大連理工大學(xué)出版社,2000.
[4]何炎祥.編譯原理[M].武漢:華中理工大學(xué)出版社,2000.
[5]萬曉楓,郝曉青.改進(jìn)編譯實(shí)驗(yàn)教學(xué)方法提升實(shí)驗(yàn)教學(xué)效果[J].實(shí)驗(yàn)科學(xué)與技術(shù),2012(5).