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