吳 清 許智宏
摘要:本文針對“編譯原理”在理論及實驗教學中存在難度的現狀,探討了如何提高該課程教學效果的有效途徑,主要研究了課堂教學、實驗教學及教學方法,并從中總結出規律性的策略,在有效幫助學生掌握扎實的基礎理論和技術的同時提高學生實際動手能力,培養他們開發大型軟件的工程意識、獨立思考和團隊合作的精神。
關鍵詞:編譯原理;教學研究;教學效果
中圖分類號:G642 文獻標識碼:B
編譯系統是計算機系統的基本組成部分,對它的研制是一項高難度的工程。作為一門理論性、實踐性均很強的課程,“編譯原理”對學生提高計算機軟件素質,拓寬思維方式,理解信息處理實質,綜合運用所學知識分析問題等具有重要作用。但由于這門課程的概念性強,具有嚴密的邏輯性,內容豐富且抽象,應用其他課程的知識較多,容易使學生望而生畏,是公認的計算機專業中既難教又難學的課程之一。同時由于編譯系統大而復雜,理論多而深奧,而且目前課時又被壓縮,課堂學習時間相對短暫,因此怎樣收到理想的教學效果是一個亟待解決的問題。
作者曾調查了往屆畢業生的學習情況,大部分學生表示在校期間沒有真正學好這門課。筆者根據多年的教學經驗,對該課程的教學進行了研究,逐步完善了課堂教學、實驗教學及其教學方法,通過改進教學實施環節,協調計算機課程的合理銜接,鍛煉了學生的系統分析設計能力。加強實驗教學,使課程實驗不再只是單純地實現編譯理論中的某些算法。我校學生在前續課程中從未開發過大型軟件系統,因此我們也對學生親身經歷大型系統軟件開發的全過程進行了研究。
1完善的教學內容
1.1理清課程的聯系,建立課程的有機銜接
課堂授課中,應讓學生體會本課程是如何建立在前續課程——高級語言、匯編語言的基礎上的,運用數據結構、離散數學、計算機組成等課程的相關知識來解決編譯問題,否則這門課就是孤立的,考完試就忘掉了。例如,以課堂討論的方式教學,用編譯理論分析C語言中的語法現象,培養學生靈活運用知識的能力。在課程設計方面,與同時開設的“軟件工程”課程結合,用軟件工程的思想規范指導學生完成一個小型編譯器的開發。課程快結束時,引導學生思考編譯理論對今后學習內容的指導意義。
為了跟上計算機技術的發展,教師還應加強課外閱讀指導。例如,讓學生從C到C++語言的分析中體會程序設計思想的不斷發展和由此帶來的編程語言從過程式到對象式的演變。鑒于教材對編譯算法和模型的描述仍沿用C這類結構化程序設計語言的編譯過程,所以教師除應在課堂授課時有重點地結合對象式思想講解外,還應向學生推薦文獻資料,引導學生思考在過程式語言基礎上引入對象式語言的編譯原理和特點,鼓勵學生探討面向對象編譯器對編譯前端(詞法、語法分析)和后端(語義分析)的影響。
另外,由于編譯程序使用的算法是較經典的,其思想和實現技術可廣泛應用于一般軟件的設計實現中,因此可鼓勵學生將學到的算法應用到實際問題中。這樣既對前期課程起到復習鞏固的作用,又能讓學生切實體會到本課程的實際應用價值。
1.2抓住各章節重點,注意各章節的聯系
一個典型的編譯程序的8個邏輯組成部分是相輔相成,互有聯系,緊密相關的,像一條鎖鏈,一環扣一環。教師要幫助學生觸類旁通,充分體會編譯程序體系的優美性與和諧性,注意概念間的聯系,達到事半功倍的教學效果。
編譯程序是大型復雜的軟件系統,在教學中要拆成各個部分,分階段講解,以使學習難度減低,但這卻往往導致學生到最后也不清楚各個部分是怎樣在整個系統中協調工作的。就像自然語言的翻譯工作,初學外語時,即使認識一個句子中所有的單詞,也不一定能譯出句子的正確意思;即使能譯出一個個句子的正確含義,若不會修辭加工,也得不到一篇優質的譯文——這實際就相當于割裂了編譯系統各章節之間的聯系。因此教師應幫助學生從宏觀和整體把握編譯技術,而不應使學生的注意力分散到局部算法上。
在講授各個章節時,教師所用實例應具有延伸性和完整性,以便容易把對此例的整個編譯過程分解后融入到各個開發階段,使學生體驗不同編譯階段成果的聯系與銜接。例如,將算術表達式賦值語句這一示例作為主線講解,不同章節各有側重。通過文法定義不同的算符優先級和結合性,向學生傳授問題抽象、形式化描述和句型分析等基本概念。通過將運算數擴展為數組,使學生理解不同語句語法制導翻譯及生成8086系列匯編代碼等。另外,示例只是授課載體,最重要的是要通過示例引導學生建立起對系統構建、模塊化、逐步求精、算法設計與實現等計算機學科常用的、經典的分析解決問題的思想。
1.3教學方法的研究與學生能力的培養
課堂教學的實施與教師緊密相關,要在傳授知識的同時講述問題求解的典型思路和方法,使課堂真正成為訓練學生科研方法和思路的重要場所,構建民主和諧、積極活潑的教學環境是至關重要的。這需要教師轉變教學方式,從權威到和學生平等對話。教師在認真備課,激情講課的同時,還應講究授課的藝術性,通過循循善誘,使學生在融洽寬松的氣氛中愉快學習。教師應充分肯定學生的探究成果,激發學生學習興趣和熱情,培養學生思維的批判性和創新性,引導他們從“這是什么”的學習心態轉變到“這是為什么”。
2行之有效的實驗教學方法
設計和組織良好的實踐教學環節可以使“編譯原理”課程獲得良好的教學效果。2007年起,我們將授課學時壓縮為48,實驗學時增加到30,且實驗成績單獨計算。我們在借鑒其他院校和專家優秀經驗的基礎上,不盲目追求與名校看齊,而是找準自己的定位。相對一流名校的學生,我校學生有的認真刻苦,但較為被動,缺乏主動思考、發現問題的能力和質疑精神,習慣于在引領之下按部就班地學習;也有的學生思想活躍,興趣廣泛,活動能力強,但學習自覺性不高,單純憑興趣,更缺乏自信心和持之以恒的耐力,需要外界的督促和鼓勵。鑒于以上實際情況,本著“以學生為本”的原則,我們采用驗證性實驗和綜合設計實驗相結合的兩階段實踐教學模式,認真設計實驗項目,劃分好各個實驗環節,并制定分階段的多指標評價體系,實施嚴格的過程考核和管理。
2.1優化驗證性實驗內容,制定前后銜接的任務鏈式實驗題目
為了配合課堂授課內容,使學練互動,教師需要選取合適工作量的、與授課同步的若干驗證性實驗題目,按照編譯原理的授課順序細化任務,使每個學生都逐個完成與授課內容相關的子模塊,使每次上機實驗的編譯程序逐步完善長大。由于每次實踐內容比較簡單,大部分學生都能完成,這就增加了他們的成就感和自信心,使他們養成一步一個腳印的扎實作風,循序漸進地完成實驗題目。教師在此過程中把自己擺在一個組織者和監督者的位置上,而不是一個和學生一起完成任務的執行者,避免了學生的依賴心理,激發其積極主動的學習態度。
這些與教學同步完成的小規模驗證性實驗只是幫助學生解決對編譯系統主要技術、算法的理解和設計,實驗內容還要讓學生掌握由這些理論和方法構造的編譯程序的各個部件是如何在整個系統中協調運行的。所以教師應引導學生從整體上把握編譯系統的結構,再將其分解,使之能夠相互協調地工作在一個統一體中。
這一階段的訓練使學生提高了對復雜問題求解和數據表達的程序設計能力,他們不僅關注方法本身,更注重方法的實現;不再拘泥于細節的記憶,而是轉到怎樣進行整體設計和程序實現上來,為完成一個完整的編譯過程打下了基礎。
2.2增加課程設計環節,培養學生開發大型系統軟件的能力
為了保證實踐環節的教學效果,一定規模的綜合訓練的課程設計不可缺少。學生在綜合訓練中親身經歷一個大型軟件開發的全過程,提高理論聯系實際的能力。該課程的教學安排采用靈活的組織方式,部分學生可以結合軟件工程課程的實踐環節完成一個規模適當的編譯程序的開發;或采用課內外一體化的教學模式,教師布置利用課外時間必須完成的工作。
設計內容要具有實用性和系統性,公布不同要求的題目,學生根據興趣選擇。學生組成4~5人的小組,選擇或自定設計題目,再由教師根據上一階段的表現和個體差異等平衡小組間實力,合理組織不同能力層次的學生分組開發,并就題目的難易程度和工作量與小組成員交流,最終確定要完成的主要工作。每組遵循完整的編譯器開發方式,融入軟件工程的思想,細化課程設計內容,分配角色和任務,推舉組長、分析員、設計員、程序員和測試員等,并在課程設計中進行角色互換。每個學生都體驗從分析設計、編碼測試到交付維護的軟件開發全過程,提高工程意識和開發大型軟件的系統結構設計能力。
2.3精心組織實踐過程,嚴格監督實驗結果
課程設計之初,教師要進行必要的輔導,鼓勵學生相互探討,調動學生共同參與的熱情,培養他們良好嚴謹的開發風格,從一開始就堅決杜絕抄襲現象。每次上機時注意抽查,并就其工作進行點評。如對運行當前獲得的編譯程序進行檢驗,成功后才能進行下一步實踐。加強過程管理,解決學習動力不足的問題。考察學生對所開發軟件的理解,有針對性地對系統中關鍵問題提出疑問。
實驗結束后,學生要提交完整的軟件開發文檔和源代碼。最終的成績評定包括教師對階段性成果和實驗報告等文檔的評分,還包括系統演示、答辯以及學生的自評和他評成績,按不同的比例構成。具體考核內容要細化,并在設計之初就向學生公布。例如小組成員依據參與熱情、努力程度、合作精神和貢獻大小等為每位學生評分。這種多項評價指標方式全方位鍛煉學生能力,重點考核學生的工作態度、是否獨立完成和自身收獲。
3必要的課程教學及實驗平臺
“工欲善其事,必先利其器”。為提高“編譯原理”這門抽象、難學、難懂課程的教學效果,教師要事先做大量工作,形成一套行之有效的教學保障體系。因此我們利用豐富的教學資源,結合畢業設計,指導學生開發建立了一個編譯系統的教學及實驗平臺。
要取得理想的教學效果,課程講授離不開傳統的板書,但多媒體輔助教學可以把抽象的概念和算法生動形象地演示出來,也是一種良好的教學手段。作為一種輔助教學手段,教師可在上課時演示部分關鍵算法和難點,使抽象的理論具體化,便于學生理解和記憶。配合綜合教學網站,學生也可在課下使用。
任何一個功能完整齊全的高級語言編譯程序的體積都很大,而且編程技巧高,學生感到閱讀理解困難。因此我們還利用畢業設計開發了一個教學用編譯程序及詳細的說明文檔,設計了若干合適的實驗題目和案例資料,有興趣的學生可以在參考前輩作品的基礎上自行開發構造編譯器,幫助學生融會貫通。
4結論
總之,每一位教師對教學效果的改善、教學質量的提高都是責無旁貸的。建立便于理論聯系實際的教學內容和課程體系;理清課程之間的有機銜接,整合本課程與其他課程的知識;抓住各章節重點,捋順每堂課之間的聯系;精心設計實驗內容,注意調動學生的積極性,培養學生獨立思考和分析解決問題的能力;加強實驗結果的監督;增加編譯系統課程設計,使學生親歷一個大型系統軟件開發的全過程;針對教學內容研制一個編譯原理課程教學及實驗的平臺;在傳授知識的同時,加強學生能力的培養,激發學生的學習興趣和創造精神等探索性的嘗試,需在實踐中不斷豐富、提高。
參考文獻:
[1] 陳火旺. 程序設計語言編譯原理[M]. 3版. 北京:國防工業出版社,2001.
[2] 蔣立源. 編譯原理[M]. 西安:西北工業大學出版社,2005.
[3] 陳意云,張昱,鄭啟龍. 編譯原理的教學與實際相結合的探討[J]. 教育與現代化,2005(4):32-36.
[4] 何炎祥,伍香春. 現代教學理論指導下的編譯原理教學綜合改革[J]. 計算機教育,2005(3):10-13.