彭源,張安勤,孫超超,田秀霞
(上海電力學院計算機科學與技術學院,上海 200090)
《編譯原理》課程主要講授編譯器構造的一般原理和基本方法。該課程具有很強的原理性和實踐性。實驗教學是《編譯原理》課程教學的重要內容,學生通過完成設定的實驗,可深入理解編譯器的基本原理和技術、掌握編譯原理中涉及的基本算法、結構和主要技術;在系統級的層次上理解高級程序設計語言源程序翻譯成計算機能處理的目標代碼語言的整個過程。通過實驗,培養學生的計算思維,訓練抽象問題、分析問題、解決問題的能力,鞏固數據結構應用,增強編程水平,從而達到學會知識和提升能力的效果。
《編譯原理》課程理論性較強,使用的描述工具,如正規式、有限自動機、正規文法、屬性文法等較為抽象。且整個課程實際上在解決一件事情:如何構造編譯器?知識綜合性高,學生感到理解困難和掌握算法困難。
在編程實現算法的時候,學生經常會不知如何著手。原因在于實驗對學生分析、抽象和解決問題的能力要求較高,學生的計算思維在前續的課程中并未經過系統的訓練,而本課程常規的教學方式不能完全覆蓋到這些方面。
編譯器的構造遵循模塊化設計的思路,每個模塊完成不同的任務,相對較為獨立。但模塊前后又緊密相連,前一個模塊的輸出是后一個模塊的輸入。例如:語法分析在詞法分析出一個個具體單詞的基礎上進行,而語義分析與中間代碼的生成則是在語法分析的基礎上,對文法配備了相關的語義子程序來實現的。
實驗的目的是掌握編譯器構造的整個過程,這就要求各個實驗間不能是割裂的,而應該是一個漸進的統一的整體。但出于學生實踐的角度考慮,又希望各個實驗間具有較好的獨立性,一個實驗項目的失敗不會影響到其他實驗項目的進行。
每個編譯原理的實驗項目都是一個完整的編譯模塊。以往的實驗對所有學生提出了統一要求,注重對基礎的強訓練。但班級中學生的能力水平是參差不齊的,統一的實驗要求只能滿足中等水平學生的能力培養需求。能力較弱的學生會覺得太難,不知從何做起,造成他們沒有編程實現的動力,進而影響學習的氣氛;而少數動手能力很強的學生會覺得實驗偏簡單,不利于其創新意識的培養。
以最常用的語法規則表示工具“文法”為例,在默認的寫法中,均以大寫字母表示非終結符(語法范疇),小寫字符表示終結符(不可再分割的語法單位)。這種形式表示的產生式不容易和實際的語法概念對應起來,學生在做實驗時不知道究竟在分析什么,造成了認知上的困難。
在掌握了算法的理論基礎后,學生仍然會出現上手困難的問題,經多年實驗教學實踐發現,原因主要在于以下兩個方面:
大量的細節問題。例如:詞法分析實驗中關鍵字是在識別為標志符的基礎上匹配關鍵字表來實現、遞歸下降分析時需將讀入的單詞設置為全局量、語法分析時需加入特殊的符號以表達已讀到源程序結尾等。
學生沒有見過實際的運行代碼,理論與程序聯系不上,心理上有畏難情緒。
但隨著教學條件的改善,提供了大量上機實踐的機會,學生實際上對自己動手實現算法,甚至是一個完整的編譯器是很有興趣。在課后遇到問題時,雖可借助QQ、微信等網絡通訊工具與教師溝通,但效果上不如課堂上的面對面溝通。
課程以貼近學生熟悉的編程語言的詞法、語法、語義規則的實際案例為引導開展算法的講解,即對于每個算法搭配實際可執行的程序。在講解算法的過程中,兼顧理論知識和算法實現,使得學生在理解算法理論的同時,能建立起用樹、棧、表等數據結構描述問題的計算思維。
“案例教學”模式好處有兩個:一是增強了學生實現的信心,學生能看到算法是實實在在可以實現和運行的,并不是僅飄在空中的抽象理論;二是代碼實現中有許多細節處理,可以幫助解決實現時的困惑,以及引導學生開拓思路,培養創新意識。
對表示工具較為抽象、和實際有脫離的問題,采用的辦法是在相對較為簡單的遞歸下降分析程序中,給出一個簡單語言的完整的、用文字形式表示語法范疇的語法描述規則:

通過此種方式,在仍舊采用了文法作為描述工具的同時,盡量使用自然語言和學生較為熟悉的編程語言語法結構來設計語法規則,從而貼近學生的認知,搭建起語法規則和實際應用間的關聯。
在實驗內容體系設計時,遵循了兩條主線:一是實驗項目間的漸進式一體化,二是實驗項目內的多層次教學。實驗內容體系如圖1所示。
本課程設計了五個實驗:詞法分析器、語法分析器之遞歸下降分析器、語法分析器之LL(1)分析器、語義分析器、中間代碼生成器。每個實驗圍繞編譯系統中一個獨立的模塊進行安排,每個實驗在保持獨立性的同時前后承接,建立了漸進式一體化的實驗內容,以逐步深入培養學生設計和實現一個小型編譯系統的能力。

圖1 編譯原理多層次、漸進式一體化的實驗內容體系
在語法分析的遞歸下降分析器和LL(1)分析器兩個實驗中均給出了一個不依賴于詞法分析的版本和一個依賴于詞法分析器的版本;而在語義分析器和中間代碼生成器中,給出了YACC語法分析器自動生成工具的使用說明,這為學生是在上一個實驗的基礎上開展,或是獨立的開展這兩個實驗提供了選擇。使得一些動手能力較弱的學生盡量不受之前實驗的影響。
傳統的實驗題目設計得較為單一,也未考慮差異化的需求。學生們的水平參差不齊,導致動手能力較弱的學生做不出,而動手能力較強的學生則感覺過于簡單。我們在每個功能模塊都提出了一個以能力導向的“基礎目標—進階目標—拓展視野—自我探索”由易到難的多層次教學目標?;A目標是最低的教學要求,一般情況的同學應能達到進階目標的層次。鼓勵學生擴展視野,如對于詞法分析和語法分析有自動生成工具LEX和YACC。實驗中給出了關于這些自動生成工具的可選實驗內容,以供學有余力的學生熟悉這些工具的部署和使用。實驗中還給出了一些探索型的研究內容,如設計對HTML代碼進行分析的詞法規則和語法規則,從而實現編寫網絡爬蟲軟件,引導學生將課內的知識應用到其他相關領域。
協作式學習[1]是一種以小組或團隊的形式組織學生進行學習的一種策略。我們將其引入到實驗教學中。實驗項目的開展以團隊的形式組織,組內成員共同學習、討論和編程解決問題以達到實驗教學的目標。每個團隊包括3-4名隊員,學生可以自由組隊。組內各個成員需分工協作,每人均承擔一定的任務,最終成績的評定以團隊為單位給出,個體的努力程度會影響到團隊每個人的成績,從而強調了個體的責任心。該模式的好處在于組內成員可以將個人的學習心得、實現思路等在組內共享,使得每個人的學習收益最大化,同時促進了團隊合作精神。并更進一步,在翻轉課堂匯報時與全班同學共享與討論,達到相互學習,激發創新思維的目的。
傳統實驗開展的形式是首先布置實驗任務,然后講解相關實現細節,接著留給學生編程實現,最后上交實驗程序和報告。學生在接收任務的時候并未開始建立自己的實現邏輯,對于實現細節不能完全吸收內化,課后仍舊會碰到各種問題,且沒有足夠的時間和機會與教師互動。從以往實驗的情況來看,班級上交的實驗代碼較為雷同,說明學生遇到困難時無法自我解決,又缺少與教師的大量溝通,導致實驗效果不好。
近年來提出的翻轉課堂[2-3]改變了實驗展開的前后順序。實驗在理論課程之前已布置,學生在理論課上熟悉算法原理,課下通過教師提供的微視頻和實驗指導手冊來建立計算思維,并試著編程實現。實驗課堂上學生通過演講報告,闡述自己對問題的描述方法、算法實現的思路、實驗環境搭建的過程,及演示程序代碼和運行結果。教師(包括其他組同學)與報告的同學通過互動方式討論實驗中存在的困惑,針對學生自學過程中無法自己解決的問題由教師進行講解。課后學生進一步完善實驗程序,最終上交實驗報告和程序。
實踐表明,該種方式調動了積極性和創造力,學生經常會有一些創新性的想法出現;演示和匯報激發了學生的表現力,也給學生施加了一定的壓力,使其能以更加認真的態度對待實驗;課堂上的集中討論有助于形成活躍的學習氛圍,突顯了實驗中的重點和難點,通過教師的講解,能以較高的效率解決實際中的困難。
本文對編譯原理實驗教學的特點和存在的問題進行了總結,從改革課堂教學、更新實驗內容體系、更新實驗組織形式、引入翻轉課堂等方面進行了實驗改革和探索。從對近幾屆學生的實施情況來看,學生的主動學習能力和主動探索能力得到有效提高,以往照抄照搬的現象大大減少,取而代之的是親自編程實現;期末成績反映出學生對算法的掌握程度有較大提高,說明改革是合理有效的。未來我們在日常教學中將進一步研究創新和改革,以期達到更好的教學效果。
參考文獻:
[1]張水波.分組協作式學習在計算機教學中的實踐與思考[J].寧德師專學報(自然科學版),2006,18(3):307-309
[2]Bergmann J,Overmyer J,Wilie B.The Flipped Class:Myths Versus Reality[OL].The Daily Riff,http://www.thedailyriff.com/articles/the-flipped-class-conversation-689.php.
[3]Davies R S,Dean D L,BallN.Flipping the Classroom and Instructional Technology Integration in a College-Level Information Systems Spreadsheet Course[J].Educational Technology Research and Development,2013(4):563-580.
[4]彭源,田秀霞,張安勤,等.基于ACM競賽理念的C++程序設計教學模式改革[J].計算機教育,2013(7):70-73.
[5]田秀霞,彭源,孫超超,等.創新實踐項目驅動的信息安全專業教學改革[J].計算機教育,2015,No.251(23):30-33.
[6]田玲,余盛季,王曉斌,等.《編譯原理》實驗教學改革及探索[J].實驗科學與技術,2013,11(6):297-299.
[7]夏斌,張慧,閭素紅.編譯原理課程實驗教學改革與探索[J].網絡安全技術與應用,2014(10):135-135.