文章編號:1672-5913(2008)08-0024-03
摘要:本文介紹了我系對編譯原理課程實踐的改革,陳述了該實踐活動的內(nèi)容、方法、效果和經(jīng)驗教訓(xùn)。
關(guān)鍵詞:編譯原理;課程實踐;改革
中圖分類號:G642
文獻(xiàn)標(biāo)識碼:B
1引言
當(dāng)今本科生人數(shù)大幅增加,高校畢業(yè)生就業(yè)競爭加劇,用人單位對人才要求不斷提高,計算機及相關(guān)專業(yè)的不少畢業(yè)生在就業(yè)過程中暴露出動手能力差、分析問題解決問題能力薄弱、創(chuàng)新意識不強等問題。這些問題的出現(xiàn)在很大程度上反映出高校在學(xué)科的專業(yè)實踐(特別是課程實踐)教學(xué)方面的不足:
1) 各課程的課程實踐各自獨立,實踐內(nèi)容跟不上計算機科學(xué)與技術(shù)的發(fā)展,內(nèi)容陳舊、覆蓋面窄、綜合性不高、難度低、規(guī)模小,不注重對學(xué)生工程、質(zhì)量、團(tuán)隊等意識的培養(yǎng);
2) 學(xué)生數(shù)與助教數(shù)比率增加,一些學(xué)校采用研究生作為助教,助教對學(xué)生實驗的檢查力度和深度不夠,難以真實反映學(xué)生的實驗水平;
3) 未結(jié)合新形勢下學(xué)生的特點來規(guī)劃和組織實踐,學(xué)生的熱情不高,拷貝風(fēng)氣日益蔓延。現(xiàn)在的學(xué)生興趣廣泛,精力分散,多數(shù)有計算機,但是投在課程學(xué)習(xí)及實踐的時間大大減少;不少學(xué)生學(xué)習(xí)目標(biāo)不明確,遇到挫折容易退縮,在學(xué)習(xí)上的鉆勁和毅力有所降低。
針對這種現(xiàn)狀,筆者認(rèn)為加強和改善專業(yè)實踐應(yīng)首先抓課程實踐改革,而課程實踐改革則應(yīng)以整體規(guī)劃各計算機專業(yè)課的課程實踐為指導(dǎo)思想。專業(yè)實踐所能覆蓋的程度依賴于制度的保證、學(xué)科機構(gòu)的資源以及教職人員的利益。
就軟件類的課程而言,課程實踐主要圍繞著軟件的設(shè)計與實現(xiàn)展開。課程實踐的整體目標(biāo)是學(xué)生至少能參與完成一個有一定規(guī)模的軟件項目的設(shè)計與開發(fā),這樣的項目應(yīng)能涉及到對多門課程所學(xué)原理的綜合運用。在整體規(guī)劃課程實踐時,應(yīng)遵循由小到大、循序漸進(jìn)的原則,注意整體規(guī)劃課程實踐所涉及的語言、工具和環(huán)境,注意學(xué)生軟件工程意識、質(zhì)量意識和團(tuán)隊意識等的培養(yǎng)。
在內(nèi)容選取上,低年級的課程實踐(如C語言、數(shù)據(jù)結(jié)構(gòu))以鞏固課程知識的小實驗為主,訓(xùn)練學(xué)生基本的程序設(shè)計技能;而高年級的課程實踐(如編譯原理、操作系統(tǒng)等)則應(yīng)以綜合運用的課程設(shè)計為主,訓(xùn)練學(xué)生軟件工程的能力。
在上述思想的指導(dǎo)下,筆者經(jīng)過兩年多的調(diào)研和準(zhǔn)備,于2007年上半年在本系2004級學(xué)生的編譯原理教學(xué)實踐中開展了編譯原理課程實踐改革。本文將在以下各節(jié)依次介紹這次課程實踐改革的內(nèi)容、方法和實施效果,總結(jié)實踐中的經(jīng)驗教訓(xùn),供同行參考。
2課程實踐方案
2.1課程實踐的規(guī)劃及歷程
根據(jù)上述指導(dǎo)思想,我們將編譯課程實踐定位為綜合運用的課程設(shè)計,即學(xué)生(通過合作)為某個實用語言設(shè)計和開發(fā)一個可運行的編譯器。這不僅能使學(xué)生加深對編譯原理和技術(shù)的理解,還能提高學(xué)生的軟件開發(fā)水平。學(xué)生在實踐中將熟悉和掌握一些軟件工程工具、環(huán)境和規(guī)范,培養(yǎng)工程、質(zhì)量和團(tuán)隊等意識。
制定這樣的課程設(shè)計方案,首先要合理選擇編譯知識點,定義待實現(xiàn)的語言;然后對語言的編譯器進(jìn)行模塊劃分和預(yù)實現(xiàn),估計實現(xiàn)的難度和工作量;最后研制提供給學(xué)生的支持庫、樣例、工具和文檔,明確學(xué)生的任務(wù)。在方案研制中,既要注意使課程設(shè)計有一定的規(guī)模,又要考慮到學(xué)生和課時的實際情況,以使學(xué)生在有限的時間內(nèi)盡可能多地掌握編譯知識并得到綜合訓(xùn)練。
為此,我們于2004年秋開始調(diào)研國外一些知名大學(xué)的編譯課程設(shè)計,從中選擇美國加州大學(xué)伯克利分校的編譯課程設(shè)計進(jìn)行深入分析與研究。我們以本科畢業(yè)論文的形式讓學(xué)生做其中的部分實驗,從中感受和總結(jié)實驗的難度、難點以及工作量等。2006年起,我們著手設(shè)計適合國情的課程設(shè)計,它由一系列的小課程設(shè)計組成,學(xué)生通過循序漸進(jìn)地做其中的一部分即可實現(xiàn)一個實用語言。我們選取Java語言的一個子集MiniJOOL作為實驗語言,它不支持import和package指令,也不支持interface、抽象類和抽象方法、public等訪問控制修飾和異常等,程序中所有的類都放在同一個文件中。這樣的語言既具有相當(dāng)規(guī)模的語言特征,又比Java語言小得多。但是即便如此,實現(xiàn)這樣的語言也不容易。為循序漸進(jìn)地引導(dǎo)學(xué)生進(jìn)行語言的實現(xiàn),我們又對MiniJOOL進(jìn)行裁剪,定義了SimpleMiniJOOL和SkipOOMiniJOOL兩個非面向?qū)ο笳Z言。前者只允許程序中包含一個方法,后者則包含MiniJOOL的所有非面向?qū)ο筇匦?。目前,系列課程設(shè)計及支持庫等仍在不斷改進(jìn)之中,感興趣的同行可以從http://staff.ustc.edu.cn/~yuzhang/compiler獲得已研制并已在使用的相關(guān)課程實踐資源。
為檢驗系列課程設(shè)計及相關(guān)資源的合理性和效果,發(fā)現(xiàn)其中的疏漏和不足之處,我們在2007年上半年的編譯原理教學(xué)中開展了如2.2節(jié)描述的編譯課程實踐,并制定了如2.3節(jié)描述的考評方法來督促、激勵、評價學(xué)生的課程設(shè)計。
2.2課程實踐的任務(wù)
在這次課程實踐中,要求學(xué)生用Java實現(xiàn)SkipOOMiniJOOL語言,每個學(xué)生需要獨立完成編譯器的前端(或后端),并自行選擇完成后端(或前端)的合作伙伴。前端要求完成詞法分析、語法分析、語義檢查并生成抽象語法樹(AST);后端則要求由AST生成x86匯編碼,不要求代碼優(yōu)化,生成的匯編碼應(yīng)能直接用gcc匯編連接得到可執(zhí)行文件。前后端的學(xué)生需要定義好接口,不開放源代碼給對方,而只提供jar文件和接口說明,在運行時應(yīng)能輸出前端和后端的作者名。
我們規(guī)定采用Eclipse JDT(Java Development Tools)中的AST實現(xiàn),但不限制學(xué)生實現(xiàn)前端或后端所采用的方法。我們在3月底將已編寫的課程設(shè)計講義印發(fā)給學(xué)生,并將相關(guān)的工具和支持庫等發(fā)布在主頁上,供學(xué)生參考。下面簡述本次課程設(shè)計涉及的語言、工具、支持庫和樣例。
1) SkipOOMiniJOOL語言
一個合法的SkipOOMiniJOOL程序有且僅有一個名為Program的類定義;類中所有數(shù)據(jù)和方法成員都必須是static的;除主函數(shù)外,其余函數(shù)都允許有參數(shù)和返回值,所有函數(shù)都必須由return語句返回。出現(xiàn)在程序中的類型只能有int、boolean、String以及一維的int型數(shù)組(數(shù)組長度是常量)。
2) 工具
我們選擇一些開源的免費工具供學(xué)生使用,包括Java集成開發(fā)環(huán)境Eclipse (http://www.eclipse.org/)、Java SDK(http://java.sun.com)、Ant編譯工具(http://ant.apache.org,
編譯文件是XML格式,比GNU make的makefile更清晰易懂)、詞法分析器的生成工具JFlex (http://jflex.de/)、語法分析器的生成工具CUP(http://www2.cs.tum.edu/projects/cup/,
支持LALR(1)文法)或JavaCC (https://javacc.dev.java.net/,支持LL(k)文法)、GCC(http://gcc.gnu.org,Windows下可以用MinGWStudio (http://www.mingw.org/))。
3) 支持庫和樣例
講義中簡要描述了AST并列出要用到的AST節(jié)點類,提供AST的樹型顯示類ASTViewer便于學(xué)生顯示AST。我們以賦值語句序列語言為例,說明如何手工或利用工具構(gòu)造詞法、語法分析器,得到語法樹,并提供相關(guān)的文法文件、Java源代碼框架和ant編譯文件等。我們引入訪問者模式,并以此為基礎(chǔ)提供對AST的解釋器、語義檢查和x86代碼生成等的代碼框架。不過,語義檢查和代碼生成部分的講義和代碼框架還顯得非常粗糙,有待完善。
2.3考評機制
課程實踐的效果不僅取決于實踐的內(nèi)容,還取決于實踐中的激勵、過程管理和考評機制等。為調(diào)動學(xué)生的積極性,我們將競爭機制引入到實踐中,學(xué)生可以自行推銷和選擇前端(后端),如果某個學(xué)生的前端(后端)被采用得越多,則得分越高。我們在4月中旬和5月安排兩次課堂輔導(dǎo),并利用校bbs的CompilerTech版(http://fbbs.ustc.edu.cn/
cgi/bbsdoc?board=CompilerTech)和E-mail等進(jìn)行日常交流。
在考評方面,我們將學(xué)生分成15組,每組約10人。每組用近4小時的時間進(jìn)行現(xiàn)場測試、答辯和評分;評委由教師、助教和同組的所有同學(xué)擔(dān)任,教師主導(dǎo)測評過程、學(xué)生現(xiàn)場操作并采用投影儀顯示;所有評委均可以提問,學(xué)生需當(dāng)眾回答,所提問題主要圍繞其完成的設(shè)計和編程以及測試中暴露出的錯誤等展開。評委的評分依據(jù)主要包括編譯器的正確性、錯誤定位與恢復(fù)能力、生成的目標(biāo)代碼質(zhì)量、回答問題時所表現(xiàn)出的對本課程設(shè)計所涉及知識的掌握程度、對自己的前端(后端)的熟悉程度、操作的熟練程度、提交物的完整性和條理性及其中反映的分析和設(shè)計思想等。每個評委當(dāng)場給該組的全部同學(xué)排名;由助教根據(jù)各有效排名表給出最終排名;由教師根據(jù)本組情況確定本組的最高分和最低分,并依據(jù)排名確定每個同學(xué)的分?jǐn)?shù)。此外,還規(guī)定了其他一些評分細(xì)則。
3實施效果與經(jīng)驗教訓(xùn)
在這次課程實踐中,一些學(xué)生的積極性被充分調(diào)動起來。自2007年5月11日起的一個半月中,學(xué)生在校bbs的CompilerTech版發(fā)了約300封帖子討論課程實踐,改變了該版自2005年11月開版以來不太活躍的狀況(該版自開版到2007年底的總貼數(shù)僅為978封)。十來個學(xué)生編寫的前端或后端有較強的語義檢查和錯誤恢復(fù)功能,甚至支持一些代碼優(yōu)化功能,部分學(xué)生的潛力得到了挖掘。但是,仍有許多學(xué)生投入時間不足,采取臨時突擊的方式,使得結(jié)果不好或者沒有做完。下面分別總結(jié)本次實踐的一些經(jīng)驗和教訓(xùn)。
3.1經(jīng)驗
(1) 在所提供的程序框架和文檔說明下擴展實現(xiàn)語言的編譯器,既有挑戰(zhàn)性又有好的效果。實現(xiàn)一個完整的編譯器不僅工作量大而且有難度,提供程序框架和文檔給學(xué)生,讓學(xué)生先閱讀再設(shè)計編碼,這能使學(xué)生易上手并降低難度,不會出現(xiàn)大的設(shè)計偏差。在實踐效果上,學(xué)生不僅能鞏固從課本所學(xué)的編譯器各個階段的功能和技術(shù),增強實踐能力,而且補上了對編譯器的整體認(rèn)識。
(2) 以AST為中間結(jié)構(gòu)將實驗劃分為前后端兩類任務(wù),并允許自行設(shè)計接口,既控制了學(xué)生開發(fā)的規(guī)模又允許有自行設(shè)計的空間。由于規(guī)定了AST實現(xiàn),選擇前端或后端的學(xué)生可以以此為基礎(chǔ)分別獨立實驗;但是,Eclipse JDT的AST實現(xiàn)是面向Java語言的,在用它實現(xiàn)SkipOOMiniJOOL語言時需要進(jìn)行適當(dāng)?shù)臄U展,如數(shù)組類型的處理、變量的作用域等,這就需要學(xué)生自行設(shè)計和約定。
(3) 提供AST Viewer并要求生成x86匯編碼,便于測試和考評。有了AST Viewer,學(xué)生和評委可以方便地查看所生成或接收的AST是否正確;采用x86匯編碼,可以利用gcc得到可執(zhí)行文件,從而方便學(xué)生和評委測試代碼生成的正確性。
(4) 合作開發(fā)、自主推銷和選擇、整體評測,既培養(yǎng)了團(tuán)隊精神,又增強了質(zhì)量意識。學(xué)生雖然只實現(xiàn)前端或后端,但是在評測時要求看整個編譯器的優(yōu)劣,這促使學(xué)生相互合作溝通并增強工作責(zé)任心。通過自主推銷和選擇,一些學(xué)生積極深入其他宿舍推銷產(chǎn)品并承諾和履行售后服務(wù),使學(xué)生在實踐中建立質(zhì)量意識,并體會到市場上只接受高質(zhì)量的或者是提供良好服務(wù)的產(chǎn)品。
(5) 規(guī)定了統(tǒng)一的版本提交截止時間,既有公平性和工程性,又易于評測。評測同一時間節(jié)點的版本,可以避免后評測的學(xué)生根據(jù)之前的評測情況來完善程序,也可以避免評測開始后不斷有新版本來干擾評測。公布截止時間還可以培養(yǎng)學(xué)生的工程意識。
(6) 教師主導(dǎo)的集體公開評分方式,既有公平性又易評測。由學(xué)生參與評分,既能彌補教師對學(xué)生實際情況了解的局限性,又能調(diào)動學(xué)生的參與熱情。盡管存在少數(shù)人惡意打分的情況,但是采用記名的排名記分形式,大部分學(xué)生的打分都比較公正,惡意打分不起作用。
3.2教訓(xùn)及改進(jìn)之處
(1) 為使學(xué)生在有限的時間開發(fā)出一定規(guī)模的編譯器并培養(yǎng)工程意識,我們引入了不少開發(fā)工具和環(huán)境,這加寬了學(xué)生的技術(shù)層面,但也導(dǎo)致學(xué)生不能把精力集中到和編譯有關(guān)的技術(shù)上來。改進(jìn)的做法是讓學(xué)生在前導(dǎo)軟件課程實踐中逐步熟悉掌握其中的部分工具(如gcc、eclipse等),同時提供對使用這些工具的文檔說明和樣例。
(2) 講義中對SkipOOMiniJOOL語言的描述不夠精確,這使得學(xué)生對上下文有關(guān)的約束不夠重視或認(rèn)識不清;對后端沒有較明確的實現(xiàn)要求,所提供的代碼生成樣例采用逐變量存儲分配,并用運算棧完成表達(dá)式計算,學(xué)生基本上通過修改、擴展該樣例完成后端,降低了實驗難度。為此,需要進(jìn)一步形式化語言規(guī)范,吸收常規(guī)編譯器的代碼生成做法并改進(jìn)支持庫和樣例,細(xì)化對后端的實現(xiàn)要求。
(3) 講義中規(guī)定了開發(fā)環(huán)境目錄,但是對提交環(huán)境目錄和編寫能編譯運行編譯器的批處理文件等要求發(fā)布太遲,學(xué)生對統(tǒng)一的環(huán)境目錄、環(huán)境設(shè)置及批處理文件的編寫等沒有引起重視,這給評測帶來了麻煩。另外各個開發(fā)工具都有許多版本,由于沒有事先對版本做限定,造成在評測前臨時通知并準(zhǔn)備多種環(huán)境。今后的改進(jìn)是在講義中增加對提交環(huán)境目錄和批處理文件編寫指南的描述,說明要考慮哪些版本和環(huán)境問題,并給出幾種測試環(huán)境組合供參考;平時要注意對學(xué)生強調(diào)這些問題。
(4) 只規(guī)定了最后版本的提交截止時間,許多學(xué)生采取臨時突擊的方式,投入時間不足,使得結(jié)果不好或者沒有做完。對提交內(nèi)容描述不夠細(xì)致,缺少過程管理與控制措施,使得學(xué)生忽略了環(huán)境設(shè)置以及使用相對路徑和批處理文件等用來保證程序包在其他機器上快速運行的方法;不注重規(guī)范,有的學(xué)生沒有按要求實現(xiàn)語言,更多的人不按要求建立開發(fā)環(huán)境或進(jìn)行提交上傳;由于沒有事先發(fā)布一批測試程序,大家對測試關(guān)注不夠。今后的改進(jìn)是制定多時間節(jié)點和多次提交的過程管理與控制機制,如提交設(shè)計文檔、提交源代碼、發(fā)布測試程序、發(fā)布評測環(huán)境、提交最終版本等;在講義中細(xì)化對開發(fā)環(huán)境、提交環(huán)境、版本問題、批處理文件等的描述,平時反復(fù)強調(diào)這些事情。
(5) 課程實踐要求主講教師和助教必須熟悉2.2節(jié)所列的各種工具和環(huán)境。助教尤其需要熟悉開發(fā)和測試環(huán)境等,以便應(yīng)付學(xué)生在實驗過程中遇到的問題以及提交不規(guī)范所引起的問題等。要教育助教遵守規(guī)則,否則截止時間等各種規(guī)定變成虛設(shè)。對于這樣規(guī)模的實驗,研究生做助教不合適。
4結(jié)束語
這次課程實踐讓我們看到了少數(shù)學(xué)生在課程實踐中所表現(xiàn)出的才智與個性化特點,也暴露出了許多問題。但是,這些問題對于我們改進(jìn)系列課程設(shè)計,改善支持庫、樣例以及進(jìn)一步細(xì)化講義等是大有裨益的;它們也為我們進(jìn)一步細(xì)化過程質(zhì)量管理細(xì)則和考評細(xì)則提供了有力的指南。
參考文獻(xiàn)
[1] 中國計算機科學(xué)與技術(shù)教程2002研究組. 中國計算機科學(xué)與技術(shù)學(xué)科教程2002(CCC2002)[M]. 北京:清華大學(xué)出版社,2002.
[2] 張昱,陳意云. 編譯原理課程設(shè)計(草稿)[EB/OL]. http://staff.ustc.edu.cn/~yuzhang/compiler/.2007.