彭源 孫超超 田秀霞 張安勤
摘要:編譯原理作為專業(yè)核心課程,具有較強的理論性和實踐性。該文結(jié)合多年的教學(xué)經(jīng)驗,以培養(yǎng)學(xué)生能力為目標(biāo),從合理組織教學(xué)內(nèi)容、突出實踐的重要性、更新考核方式等方面給出了一些編譯原理教學(xué)改革的基本思路。
關(guān)鍵詞:編譯原理;教學(xué)改革;教學(xué)實踐
中圖分類號:G424 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)03-0134-02
Abstract:As a professional core course, compiler principles have strong theoretical and practical natures. Based on the teaching experience of many years, this paper puts forward some basic ideas of teaching reform of compiler principles from the aspects of organizing the teaching content reasonably, highlighting the importance of practice and updating the method of examination.
Key words: compiler principles;teaching reform; teaching practice
1 概述
《編譯原理》是信息安全、網(wǎng)絡(luò)工程、計算機科學(xué)與技術(shù)等專業(yè)的一門重要專業(yè)核心課程,主要介紹編譯程序構(gòu)造的一般原理和基本方法。在理論、技術(shù)、方法上對學(xué)生提供系統(tǒng)而有效的訓(xùn)練,從而提高學(xué)生的素質(zhì)和能力。課程的特點是理論性和技術(shù)性都非常強,綜合知識集成度高,因此較難掌握和理解。許多學(xué)者對該門課程教學(xué)進(jìn)行了探討,如文獻(xiàn)[1]提出了分階段、實驗報告+答辯的考核方式;文獻(xiàn)[2]將ACM在線評測引入了本課程的實踐教學(xué);文獻(xiàn)[3]在課程中引入了建構(gòu)主義學(xué)習(xí)理論;文獻(xiàn)[4]設(shè)計了一個支持自定義語言的可視化編譯教學(xué)輔助工具等。
為了更好的提升教學(xué)效果,近幾年來我們在編譯原理課程的教學(xué)改革與實踐中做了一定的探索,獲得了一定的方法,總結(jié)了一定的經(jīng)驗,也取得了一些成效。本文介紹我們在課程教學(xué)改革和實踐中的經(jīng)驗和體會。
2 以“能力導(dǎo)向的教育”為目標(biāo)指導(dǎo)教學(xué)過程
編譯原理課程有著較為成熟的理論體系,除算法知識本身外,更蘊含了問題求解的典型思路和方法,因此在課程的教學(xué)過程中,不僅要考慮知識的傳輸,更要考慮對學(xué)生能力和素質(zhì)的培養(yǎng)。授之以魚,更要授之以漁。
2.1 課程內(nèi)容作為知識的載體
專業(yè)的課程體系是一個整體,課程之間互相關(guān)聯(lián),如編譯程序使用的數(shù)據(jù)結(jié)構(gòu)和算法是前面“數(shù)據(jù)結(jié)構(gòu)”、“離散數(shù)學(xué)”等課程的典型應(yīng)用。課內(nèi)所講的內(nèi)容也不是孤立的,課程中蘊含的許多軟件技術(shù),如介紹的經(jīng)典語言分析方法和工具,對于設(shè)計一些實用的工具和軟件,像自然語言理解、網(wǎng)絡(luò)信息處理、網(wǎng)絡(luò)協(xié)議的分析與實現(xiàn)等都是必備的基礎(chǔ)。課程教學(xué)不能狹隘的只關(guān)注于本課程知識點的講解,而應(yīng)從人才培養(yǎng)的角度,承前啟后,結(jié)合與融入更多相關(guān)的內(nèi)容,從課程特定的知識和算法,引申到普遍適用的知識和算法,引導(dǎo)學(xué)生開闊視野,激發(fā)其探索興趣。
2.2 計算思維的能力培養(yǎng)
課程學(xué)習(xí)的目的并不僅僅是為了構(gòu)建一個編譯器,實際上只有極少數(shù)的學(xué)生以后會從事編譯系統(tǒng)的設(shè)計與實現(xiàn)。但編譯原理課程作為傳統(tǒng)的核心課程,蘊涵了計算機學(xué)科中解決問題的思路、抽象問題和解決問題的方法,因此是實施能力培養(yǎng)的最佳載體。
計算思維指運用計算機科學(xué)的基礎(chǔ)概念去求解問題、設(shè)計系統(tǒng)和理解人類的行為,由卡內(nèi)基梅隆大學(xué)的周以真教授于2006年提出。它包含了一系列的計算機科學(xué)的思維方法,如遞歸、抽象和分解、啟發(fā)式推理等。課程從淡化推導(dǎo)、證明等理論形態(tài)的內(nèi)容,強調(diào)編譯原理中抽象和設(shè)計形態(tài)內(nèi)容的角度出發(fā),教學(xué)中注意對算法核心思想的分析,挖掘知識背后的內(nèi)容,模擬大師們的創(chuàng)新思維,使學(xué)生能夠掌握其關(guān)鍵,從而培養(yǎng)學(xué)生的創(chuàng)新意識和創(chuàng)新能力,訓(xùn)練學(xué)生“計算機問題求解”的基本能力,強化其計算思維。學(xué)生通過學(xué)習(xí)不僅可以在系統(tǒng)級的層次上對程序變換和算法有更為深入的理解,更是學(xué)到了問題的求解方法和思路。達(dá)到不僅學(xué)知識、而且培養(yǎng)能力的效果。
3 教學(xué)內(nèi)容組織
編譯器是一個完整的體系,在有限的教學(xué)時間內(nèi)不可能事無巨細(xì)、面面俱到。因此教學(xué)內(nèi)容的選擇是教學(xué)中非常重要的一環(huán)。筆者在選擇教學(xué)內(nèi)容時,主要從以下方面來進(jìn)行考慮:
1) 作為整個課程理論基礎(chǔ)的基本概念、工具和原理,以及具有典型意義、效果好、應(yīng)用比較廣泛的主要編譯技術(shù)和方法細(xì)致深入的進(jìn)行討論。
以有限自動機為例,它不僅應(yīng)用于本課程表示詞法規(guī)則、識別活前綴等,也是計算機領(lǐng)域中經(jīng)常用到的概念和工具,因此需詳細(xì)介紹。講授的內(nèi)容應(yīng)包括有限自動機的確定化、最小化的過程,以及該工具與其他工具如正規(guī)文法、正規(guī)式的轉(zhuǎn)換方法。
在編譯技術(shù)方面,如遞歸下降分析算法、LR分析算法是典型的軟件技術(shù),體現(xiàn)了抽象問題、遞歸解決問題、自動化處理的思路,具有典型的意義,對學(xué)生的能力培養(yǎng)具有舉足輕重的意義,應(yīng)詳細(xì)講述并在實踐中深化理解。而對一些較為陳舊的算法,如算符優(yōu)先分析,其在現(xiàn)代編譯系統(tǒng)中已不再廣泛使用,因此可以去掉。
2) 根據(jù)學(xué)生的認(rèn)識規(guī)律來組織安排教學(xué)內(nèi)容,層次清晰,重點突出,難點分散。
課程開展按照詞法分析、語法分析、屬性文法和語義分析、中間代碼生成、符號表和內(nèi)存空間組織、優(yōu)化的主線展開。將編譯程序各組成部分的基本功能、邏輯關(guān)系、實現(xiàn)思路深入淺出地闡述清楚,不盲目的追求全而深,不過分糾纏于一些繁瑣的具體技術(shù)細(xì)節(jié)。強調(diào)對編譯原理和技術(shù)的宏觀理解和掌握,而不是一些微觀的算法。如符號表的插入和查找方法,基本的思路在數(shù)據(jù)結(jié)構(gòu)等課程中已有體現(xiàn),雖然針對編譯器中的符號表,有一些特定的處理算法,但對編譯器的整體理解貢獻(xiàn)不大,無需多費課時。
以掌握工具、體驗思路為主,淡化理論證明過程。如文法、正規(guī)式、DFA間等價性的證明就無需強調(diào),只需告訴學(xué)生此結(jié)論即可。對于LR分析算法系列,LR(0),SLR,LR(1),LALR的分析表構(gòu)造只是從分析能力和工作量角度考慮,采用了不同的折中策略,思路是一致的。因此在講授時,以一個算法為主,其他的算法順帶提及,或在課外作為課程內(nèi)容的延伸。
3) 結(jié)合專業(yè),微調(diào)教學(xué)重點
《編譯原理》課程在我校計算機科學(xué)與技術(shù)、軟件工程、網(wǎng)絡(luò)工程、信息安全等多個專業(yè)均有開設(shè),不同專業(yè)培養(yǎng)計劃不同,教授過程中的側(cè)重點和能力訓(xùn)練方面也應(yīng)有所區(qū)別。如網(wǎng)絡(luò)工程和軟件工程專業(yè)為工科專業(yè),與計算機科學(xué)與技術(shù)和信息安全專業(yè)偏理論不同,教學(xué)時應(yīng)注重工程性人才的培養(yǎng),更加強調(diào)算法實踐,在實現(xiàn)中更深入理解算法。
教學(xué)還應(yīng)結(jié)合專業(yè)特點開展。以信息安全專業(yè)為例,在開展運行時內(nèi)存空間的組織這部分的教學(xué)內(nèi)容時,引入了一個緩沖區(qū)溢出的例子,該例子在對程序分配的內(nèi)存空間結(jié)構(gòu)的詳細(xì)理解基礎(chǔ)上,通過精心構(gòu)造溢出數(shù)據(jù)的內(nèi)容,破壞了函數(shù)調(diào)用后返回的地址,使得程序運行到不期望的代碼處。從而引導(dǎo)學(xué)生思考程序運行時內(nèi)存分配可能會存在的安全問題以及延伸思考解決辦法。
4 實踐是最好的學(xué)習(xí)方式
學(xué)生通過教學(xué)過程能夠較好地掌握算法原理和思路,但在理論實現(xiàn)算法設(shè)計時仍有不知如何下手的困惑。通過長期教學(xué)分析,原因在如下兩個方面:1.大量的細(xì)節(jié)問題。例如:詞法分析實驗中需對超前搜索進(jìn)行字符回退處理、關(guān)鍵詞是在識別為標(biāo)志符的基礎(chǔ)上匹配關(guān)鍵詞表來實現(xiàn)、遞歸下降分析時需將讀入的單詞設(shè)置為全局量等。2.沒有見過實際的代碼,理論與程序聯(lián)系不上,心理上有畏難情緒。
學(xué)生雖在前續(xù)課程中學(xué)習(xí)與培養(yǎng)了編程能力,但本課程中算法對編程能力的要求更為系統(tǒng)和全面,需要用到多種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。但隨著教學(xué)條件和網(wǎng)絡(luò)溝通渠道的完善,現(xiàn)在的學(xué)生可以有更多機會和時間去上機實踐,遇到問題也可以通過微信、QQ等實時的獲得老師的指導(dǎo)與解惑。學(xué)生實際上對自己動手實現(xiàn)算法,甚至是一個完整的編譯器是有著更高的渴望的,這就要求課程應(yīng)當(dāng)尊重學(xué)生發(fā)展規(guī)律,滿足學(xué)生自我實現(xiàn)的想法,提升學(xué)生的編程能力,引導(dǎo)學(xué)生獲得成功的體驗。
4.1 課程以實踐為引導(dǎo)開展算法的講解
對于每個算法都配備了小型的可實際運行的程序,在講解算法過程中,就穿插入算法實現(xiàn)代碼的講解。這么做好處有兩個:一是讓學(xué)生看到算法并不是飄在空中的理論,而是實實在在可以實現(xiàn)和運行的,增強了學(xué)生實現(xiàn)的信心;二是算法中的一些小細(xì)節(jié)的處理可以直觀的通過代碼展示出來,幫助學(xué)生開拓思路。
4.2 實驗內(nèi)容前后銜接,鼓勵自我探索
將理論課與實驗課有機地結(jié)合,通過實驗課的實踐,讓學(xué)生將理論知識通過實驗進(jìn)行驗證并設(shè)計實現(xiàn);反之,在實驗中產(chǎn)生的各種問題,通過理論課的講解分析解決;如此相互促進(jìn),不僅加深了理論知識的理解,同時也提高了實際編程能力和學(xué)習(xí)興趣。每個實驗圍繞編譯系統(tǒng)中一個獨立的模塊進(jìn)行安排,由易到難,逐步深入,在保持每個實驗獨立性的同時,注意前后承接,以培養(yǎng)學(xué)生設(shè)計和實現(xiàn)一個小型編譯系統(tǒng)的能力。
鼓勵學(xué)生擴(kuò)展視野。對于詞法分析和語法分析,有LEX和YACC自動生成工具。實驗中給出了關(guān)于這些自動生成工具的可選實驗內(nèi)容,以熟悉這些工具的部署和使用。實驗中還給出了一些探索型的研究內(nèi)容,如編寫文本編輯軟件,引導(dǎo)學(xué)生將課內(nèi)的知識應(yīng)用到其他相關(guān)領(lǐng)域。
5 引入“一紙開卷”考核方式
在考試考核方面,考慮到編譯系統(tǒng)的算法相對復(fù)雜但固定、本門課程的目的是通過算法提高學(xué)生分析問題、抽象問題和解決問題的能力,記憶算法本身的步驟不是考核的要點。因此考慮采用“一紙開卷”的形式,即在考試時允許學(xué)生最多帶一張A4大小的紙進(jìn)去,上面可以由學(xué)生自行組織記錄知識要點和內(nèi)容。具體實施思路如下:考試專用紙于開考前兩周發(fā)放給學(xué)生,每人一張。學(xué)生必須在考前填寫完整專用紙上的相關(guān)欄目,可在專用紙上書寫任何內(nèi)容,可正反面書寫,但不能打印、復(fù)印,必須由本人手寫;學(xué)生在考試時可將專用紙帶入考場翻閱,但考試中不得與其他同學(xué)傳遞交流,否則以舞弊論處;不能在專用紙上粘貼其他紙張,否則以夾帶論處??紙鲆?guī)則和紀(jì)律按照閉卷考試執(zhí)行??荚嚱Y(jié)束后,考生將專用紙與試卷、答題紙一并上交。以備核查。
通過此種形式,這樣既使得學(xué)生通過對知識要點的組織鞏固了學(xué)習(xí)效果,又可以引導(dǎo)學(xué)生將學(xué)習(xí)的重點放到對原理的理解上,減輕了對算法步驟本身無意義的記憶(實踐設(shè)計中隨時可查)。
6 總結(jié)
課程的開展要符合人才培養(yǎng)的目標(biāo),并根據(jù)課程特點,合理組織教學(xué)內(nèi)容,突出實踐的重要性,并引導(dǎo)學(xué)生將精力放在對原理的理解和實踐上。近幾年的實踐證明,我們對《編譯原理》教學(xué)中的進(jìn)行的改革和探索取得了一定的成果,進(jìn)一步提高了教學(xué)質(zhì)量。在培養(yǎng)學(xué)生實踐能力、計算思維能力等方面取得了一定成效,值得進(jìn)一步的實踐和探索。
參考文獻(xiàn):
[1] 丁學(xué)雷, 吳春寒, 賀汛. 編譯原理課程考法改革探討[J]. 計算機工程與科學(xué), 2014,36(a02):169-173.
[2] 尤楓, 史晟輝. ACM在線評測在編譯原理實踐教學(xué)中的應(yīng)用探討[J]. 計算機教育, 2009(20):113-115.
[3] 朱文華, 王榮波. 基于建構(gòu)主義的編譯原理實踐教學(xué)研究[J]. 杭州電子科技大學(xué)學(xué)報:社會科學(xué)版, 2008(4):71-74.
[4] 褚文杰, 童蘭軒, 魏瑋,等. 支持自定義語言的可視化編譯教學(xué)輔助工具設(shè)計[J]. 計算機應(yīng)用, 2017,37(s1):331-335.