彭源,張安勤,孫超超,田秀霞
(上海電力學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,上海 200090)
《編譯原理》課程主要講授編譯器構(gòu)造的一般原理和基本方法。該課程具有很強(qiáng)的原理性和實(shí)踐性。實(shí)驗(yàn)教學(xué)是《編譯原理》課程教學(xué)的重要內(nèi)容,學(xué)生通過(guò)完成設(shè)定的實(shí)驗(yàn),可深入理解編譯器的基本原理和技術(shù)、掌握編譯原理中涉及的基本算法、結(jié)構(gòu)和主要技術(shù);在系統(tǒng)級(jí)的層次上理解高級(jí)程序設(shè)計(jì)語(yǔ)言源程序翻譯成計(jì)算機(jī)能處理的目標(biāo)代碼語(yǔ)言的整個(gè)過(guò)程。通過(guò)實(shí)驗(yàn),培養(yǎng)學(xué)生的計(jì)算思維,訓(xùn)練抽象問(wèn)題、分析問(wèn)題、解決問(wèn)題的能力,鞏固數(shù)據(jù)結(jié)構(gòu)應(yīng)用,增強(qiáng)編程水平,從而達(dá)到學(xué)會(huì)知識(shí)和提升能力的效果。
《編譯原理》課程理論性較強(qiáng),使用的描述工具,如正規(guī)式、有限自動(dòng)機(jī)、正規(guī)文法、屬性文法等較為抽象。且整個(gè)課程實(shí)際上在解決一件事情:如何構(gòu)造編譯器?知識(shí)綜合性高,學(xué)生感到理解困難和掌握算法困難。
在編程實(shí)現(xiàn)算法的時(shí)候,學(xué)生經(jīng)常會(huì)不知如何著手。原因在于實(shí)驗(yàn)對(duì)學(xué)生分析、抽象和解決問(wèn)題的能力要求較高,學(xué)生的計(jì)算思維在前續(xù)的課程中并未經(jīng)過(guò)系統(tǒng)的訓(xùn)練,而本課程常規(guī)的教學(xué)方式不能完全覆蓋到這些方面。
編譯器的構(gòu)造遵循模塊化設(shè)計(jì)的思路,每個(gè)模塊完成不同的任務(wù),相對(duì)較為獨(dú)立。但模塊前后又緊密相連,前一個(gè)模塊的輸出是后一個(gè)模塊的輸入。例如:語(yǔ)法分析在詞法分析出一個(gè)個(gè)具體單詞的基礎(chǔ)上進(jìn)行,而語(yǔ)義分析與中間代碼的生成則是在語(yǔ)法分析的基礎(chǔ)上,對(duì)文法配備了相關(guān)的語(yǔ)義子程序來(lái)實(shí)現(xiàn)的。
實(shí)驗(yàn)的目的是掌握編譯器構(gòu)造的整個(gè)過(guò)程,這就要求各個(gè)實(shí)驗(yàn)間不能是割裂的,而應(yīng)該是一個(gè)漸進(jìn)的統(tǒng)一的整體。但出于學(xué)生實(shí)踐的角度考慮,又希望各個(gè)實(shí)驗(yàn)間具有較好的獨(dú)立性,一個(gè)實(shí)驗(yàn)項(xiàng)目的失敗不會(huì)影響到其他實(shí)驗(yàn)項(xiàng)目的進(jìn)行。
每個(gè)編譯原理的實(shí)驗(yàn)項(xiàng)目都是一個(gè)完整的編譯模塊。以往的實(shí)驗(yàn)對(duì)所有學(xué)生提出了統(tǒng)一要求,注重對(duì)基礎(chǔ)的強(qiáng)訓(xùn)練。但班級(jí)中學(xué)生的能力水平是參差不齊的,統(tǒng)一的實(shí)驗(yàn)要求只能滿足中等水平學(xué)生的能力培養(yǎng)需求。能力較弱的學(xué)生會(huì)覺(jué)得太難,不知從何做起,造成他們沒(méi)有編程實(shí)現(xiàn)的動(dòng)力,進(jìn)而影響學(xué)習(xí)的氣氛;而少數(shù)動(dòng)手能力很強(qiáng)的學(xué)生會(huì)覺(jué)得實(shí)驗(yàn)偏簡(jiǎn)單,不利于其創(chuàng)新意識(shí)的培養(yǎng)。
以最常用的語(yǔ)法規(guī)則表示工具“文法”為例,在默認(rèn)的寫法中,均以大寫字母表示非終結(jié)符(語(yǔ)法范疇),小寫字符表示終結(jié)符(不可再分割的語(yǔ)法單位)。這種形式表示的產(chǎn)生式不容易和實(shí)際的語(yǔ)法概念對(duì)應(yīng)起來(lái),學(xué)生在做實(shí)驗(yàn)時(shí)不知道究竟在分析什么,造成了認(rèn)知上的困難。
在掌握了算法的理論基礎(chǔ)后,學(xué)生仍然會(huì)出現(xiàn)上手困難的問(wèn)題,經(jīng)多年實(shí)驗(yàn)教學(xué)實(shí)踐發(fā)現(xiàn),原因主要在于以下兩個(gè)方面:
大量的細(xì)節(jié)問(wèn)題。例如:詞法分析實(shí)驗(yàn)中關(guān)鍵字是在識(shí)別為標(biāo)志符的基礎(chǔ)上匹配關(guān)鍵字表來(lái)實(shí)現(xiàn)、遞歸下降分析時(shí)需將讀入的單詞設(shè)置為全局量、語(yǔ)法分析時(shí)需加入特殊的符號(hào)以表達(dá)已讀到源程序結(jié)尾等。
學(xué)生沒(méi)有見過(guò)實(shí)際的運(yùn)行代碼,理論與程序聯(lián)系不上,心理上有畏難情緒。
但隨著教學(xué)條件的改善,提供了大量上機(jī)實(shí)踐的機(jī)會(huì),學(xué)生實(shí)際上對(duì)自己動(dòng)手實(shí)現(xiàn)算法,甚至是一個(gè)完整的編譯器是很有興趣。在課后遇到問(wèn)題時(shí),雖可借助QQ、微信等網(wǎng)絡(luò)通訊工具與教師溝通,但效果上不如課堂上的面對(duì)面溝通。
課程以貼近學(xué)生熟悉的編程語(yǔ)言的詞法、語(yǔ)法、語(yǔ)義規(guī)則的實(shí)際案例為引導(dǎo)開展算法的講解,即對(duì)于每個(gè)算法搭配實(shí)際可執(zhí)行的程序。在講解算法的過(guò)程中,兼顧理論知識(shí)和算法實(shí)現(xiàn),使得學(xué)生在理解算法理論的同時(shí),能建立起用樹、棧、表等數(shù)據(jù)結(jié)構(gòu)描述問(wèn)題的計(jì)算思維。
“案例教學(xué)”模式好處有兩個(gè):一是增強(qiáng)了學(xué)生實(shí)現(xiàn)的信心,學(xué)生能看到算法是實(shí)實(shí)在在可以實(shí)現(xiàn)和運(yùn)行的,并不是僅飄在空中的抽象理論;二是代碼實(shí)現(xiàn)中有許多細(xì)節(jié)處理,可以幫助解決實(shí)現(xiàn)時(shí)的困惑,以及引導(dǎo)學(xué)生開拓思路,培養(yǎng)創(chuàng)新意識(shí)。
對(duì)表示工具較為抽象、和實(shí)際有脫離的問(wèn)題,采用的辦法是在相對(duì)較為簡(jiǎn)單的遞歸下降分析程序中,給出一個(gè)簡(jiǎn)單語(yǔ)言的完整的、用文字形式表示語(yǔ)法范疇的語(yǔ)法描述規(guī)則:
通過(guò)此種方式,在仍舊采用了文法作為描述工具的同時(shí),盡量使用自然語(yǔ)言和學(xué)生較為熟悉的編程語(yǔ)言語(yǔ)法結(jié)構(gòu)來(lái)設(shè)計(jì)語(yǔ)法規(guī)則,從而貼近學(xué)生的認(rèn)知,搭建起語(yǔ)法規(guī)則和實(shí)際應(yīng)用間的關(guān)聯(lián)。
在實(shí)驗(yàn)內(nèi)容體系設(shè)計(jì)時(shí),遵循了兩條主線:一是實(shí)驗(yàn)項(xiàng)目間的漸進(jìn)式一體化,二是實(shí)驗(yàn)項(xiàng)目?jī)?nèi)的多層次教學(xué)。實(shí)驗(yàn)內(nèi)容體系如圖1所示。
本課程設(shè)計(jì)了五個(gè)實(shí)驗(yàn):詞法分析器、語(yǔ)法分析器之遞歸下降分析器、語(yǔ)法分析器之LL(1)分析器、語(yǔ)義分析器、中間代碼生成器。每個(gè)實(shí)驗(yàn)圍繞編譯系統(tǒng)中一個(gè)獨(dú)立的模塊進(jìn)行安排,每個(gè)實(shí)驗(yàn)在保持獨(dú)立性的同時(shí)前后承接,建立了漸進(jìn)式一體化的實(shí)驗(yàn)內(nèi)容,以逐步深入培養(yǎng)學(xué)生設(shè)計(jì)和實(shí)現(xiàn)一個(gè)小型編譯系統(tǒng)的能力。
圖1 編譯原理多層次、漸進(jìn)式一體化的實(shí)驗(yàn)內(nèi)容體系
在語(yǔ)法分析的遞歸下降分析器和LL(1)分析器兩個(gè)實(shí)驗(yàn)中均給出了一個(gè)不依賴于詞法分析的版本和一個(gè)依賴于詞法分析器的版本;而在語(yǔ)義分析器和中間代碼生成器中,給出了YACC語(yǔ)法分析器自動(dòng)生成工具的使用說(shuō)明,這為學(xué)生是在上一個(gè)實(shí)驗(yàn)的基礎(chǔ)上開展,或是獨(dú)立的開展這兩個(gè)實(shí)驗(yàn)提供了選擇。使得一些動(dòng)手能力較弱的學(xué)生盡量不受之前實(shí)驗(yàn)的影響。
傳統(tǒng)的實(shí)驗(yàn)題目設(shè)計(jì)得較為單一,也未考慮差異化的需求。學(xué)生們的水平參差不齊,導(dǎo)致動(dòng)手能力較弱的學(xué)生做不出,而動(dòng)手能力較強(qiáng)的學(xué)生則感覺(jué)過(guò)于簡(jiǎn)單。我們?cè)诿總€(gè)功能模塊都提出了一個(gè)以能力導(dǎo)向的“基礎(chǔ)目標(biāo)—進(jìn)階目標(biāo)—拓展視野—自我探索”由易到難的多層次教學(xué)目標(biāo)。基礎(chǔ)目標(biāo)是最低的教學(xué)要求,一般情況的同學(xué)應(yīng)能達(dá)到進(jìn)階目標(biāo)的層次。鼓勵(lì)學(xué)生擴(kuò)展視野,如對(duì)于詞法分析和語(yǔ)法分析有自動(dòng)生成工具LEX和YACC。實(shí)驗(yàn)中給出了關(guān)于這些自動(dòng)生成工具的可選實(shí)驗(yàn)內(nèi)容,以供學(xué)有余力的學(xué)生熟悉這些工具的部署和使用。實(shí)驗(yàn)中還給出了一些探索型的研究?jī)?nèi)容,如設(shè)計(jì)對(duì)HTML代碼進(jìn)行分析的詞法規(guī)則和語(yǔ)法規(guī)則,從而實(shí)現(xiàn)編寫網(wǎng)絡(luò)爬蟲軟件,引導(dǎo)學(xué)生將課內(nèi)的知識(shí)應(yīng)用到其他相關(guān)領(lǐng)域。
協(xié)作式學(xué)習(xí)[1]是一種以小組或團(tuán)隊(duì)的形式組織學(xué)生進(jìn)行學(xué)習(xí)的一種策略。我們將其引入到實(shí)驗(yàn)教學(xué)中。實(shí)驗(yàn)項(xiàng)目的開展以團(tuán)隊(duì)的形式組織,組內(nèi)成員共同學(xué)習(xí)、討論和編程解決問(wèn)題以達(dá)到實(shí)驗(yàn)教學(xué)的目標(biāo)。每個(gè)團(tuán)隊(duì)包括3-4名隊(duì)員,學(xué)生可以自由組隊(duì)。組內(nèi)各個(gè)成員需分工協(xié)作,每人均承擔(dān)一定的任務(wù),最終成績(jī)的評(píng)定以團(tuán)隊(duì)為單位給出,個(gè)體的努力程度會(huì)影響到團(tuán)隊(duì)每個(gè)人的成績(jī),從而強(qiáng)調(diào)了個(gè)體的責(zé)任心。該模式的好處在于組內(nèi)成員可以將個(gè)人的學(xué)習(xí)心得、實(shí)現(xiàn)思路等在組內(nèi)共享,使得每個(gè)人的學(xué)習(xí)收益最大化,同時(shí)促進(jìn)了團(tuán)隊(duì)合作精神。并更進(jìn)一步,在翻轉(zhuǎn)課堂匯報(bào)時(shí)與全班同學(xué)共享與討論,達(dá)到相互學(xué)習(xí),激發(fā)創(chuàng)新思維的目的。
傳統(tǒng)實(shí)驗(yàn)開展的形式是首先布置實(shí)驗(yàn)任務(wù),然后講解相關(guān)實(shí)現(xiàn)細(xì)節(jié),接著留給學(xué)生編程實(shí)現(xiàn),最后上交實(shí)驗(yàn)程序和報(bào)告。學(xué)生在接收任務(wù)的時(shí)候并未開始建立自己的實(shí)現(xiàn)邏輯,對(duì)于實(shí)現(xiàn)細(xì)節(jié)不能完全吸收內(nèi)化,課后仍舊會(huì)碰到各種問(wèn)題,且沒(méi)有足夠的時(shí)間和機(jī)會(huì)與教師互動(dòng)。從以往實(shí)驗(yàn)的情況來(lái)看,班級(jí)上交的實(shí)驗(yàn)代碼較為雷同,說(shuō)明學(xué)生遇到困難時(shí)無(wú)法自我解決,又缺少與教師的大量溝通,導(dǎo)致實(shí)驗(yàn)效果不好。
近年來(lái)提出的翻轉(zhuǎn)課堂[2-3]改變了實(shí)驗(yàn)展開的前后順序。實(shí)驗(yàn)在理論課程之前已布置,學(xué)生在理論課上熟悉算法原理,課下通過(guò)教師提供的微視頻和實(shí)驗(yàn)指導(dǎo)手冊(cè)來(lái)建立計(jì)算思維,并試著編程實(shí)現(xiàn)。實(shí)驗(yàn)課堂上學(xué)生通過(guò)演講報(bào)告,闡述自己對(duì)問(wèn)題的描述方法、算法實(shí)現(xiàn)的思路、實(shí)驗(yàn)環(huán)境搭建的過(guò)程,及演示程序代碼和運(yùn)行結(jié)果。教師(包括其他組同學(xué))與報(bào)告的同學(xué)通過(guò)互動(dòng)方式討論實(shí)驗(yàn)中存在的困惑,針對(duì)學(xué)生自學(xué)過(guò)程中無(wú)法自己解決的問(wèn)題由教師進(jìn)行講解。課后學(xué)生進(jìn)一步完善實(shí)驗(yàn)程序,最終上交實(shí)驗(yàn)報(bào)告和程序。
實(shí)踐表明,該種方式調(diào)動(dòng)了積極性和創(chuàng)造力,學(xué)生經(jīng)常會(huì)有一些創(chuàng)新性的想法出現(xiàn);演示和匯報(bào)激發(fā)了學(xué)生的表現(xiàn)力,也給學(xué)生施加了一定的壓力,使其能以更加認(rèn)真的態(tài)度對(duì)待實(shí)驗(yàn);課堂上的集中討論有助于形成活躍的學(xué)習(xí)氛圍,突顯了實(shí)驗(yàn)中的重點(diǎn)和難點(diǎn),通過(guò)教師的講解,能以較高的效率解決實(shí)際中的困難。
本文對(duì)編譯原理實(shí)驗(yàn)教學(xué)的特點(diǎn)和存在的問(wèn)題進(jìn)行了總結(jié),從改革課堂教學(xué)、更新實(shí)驗(yàn)內(nèi)容體系、更新實(shí)驗(yàn)組織形式、引入翻轉(zhuǎn)課堂等方面進(jìn)行了實(shí)驗(yàn)改革和探索。從對(duì)近幾屆學(xué)生的實(shí)施情況來(lái)看,學(xué)生的主動(dòng)學(xué)習(xí)能力和主動(dòng)探索能力得到有效提高,以往照抄照搬的現(xiàn)象大大減少,取而代之的是親自編程實(shí)現(xiàn);期末成績(jī)反映出學(xué)生對(duì)算法的掌握程度有較大提高,說(shuō)明改革是合理有效的。未來(lái)我們?cè)谌粘=虒W(xué)中將進(jìn)一步研究創(chuàng)新和改革,以期達(dá)到更好的教學(xué)效果。
參考文獻(xiàn):
[1]張水波.分組協(xié)作式學(xué)習(xí)在計(jì)算機(jī)教學(xué)中的實(shí)踐與思考[J].寧德師專學(xué)報(bào)(自然科學(xué)版),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競(jìng)賽理念的C++程序設(shè)計(jì)教學(xué)模式改革[J].計(jì)算機(jī)教育,2013(7):70-73.
[5]田秀霞,彭源,孫超超,等.創(chuàng)新實(shí)踐項(xiàng)目驅(qū)動(dòng)的信息安全專業(yè)教學(xué)改革[J].計(jì)算機(jī)教育,2015,No.251(23):30-33.
[6]田玲,余盛季,王曉斌,等.《編譯原理》實(shí)驗(yàn)教學(xué)改革及探索[J].實(shí)驗(yàn)科學(xué)與技術(shù),2013,11(6):297-299.
[7]夏斌,張慧,閭素紅.編譯原理課程實(shí)驗(yàn)教學(xué)改革與探索[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014(10):135-135.