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