楊海燕 史曉華 張 莉
摘 要:“編譯技術”作為一門核心專業必修課,其實踐環節對本科學生培養動手能力有重要作用。但在教學過程中,筆者發現對于這種軟件類課程的實踐環節而言,通常的題目設置和考核方案并不能真正確保學生獨立完成、學有所獲,在過程中加強監督和控制才是有效的辦法。本文給出在教學實踐中采用的質量管理體系,并通過兩年來的應用情況分析了該體系的效果。
關鍵詞:編譯技術;實踐環節;質量管理體系
中圖分類號:G642 文獻標識碼:B
1 引言
“編譯器的原理和技術具有十分普遍的意義,在每一個計算機科學家的研究生涯中,這些原理和技術都會反復用到”。為了讓學生了解“編譯技術”這個推動了計算機學科發展的重要研究領域,北京航空航天大學計算機學院將“編譯技術”課程作為一門核心專業必修課。這門課不僅要求學生掌握有關編譯的經典基礎理論,還要其學會運用先進的軟件開發技術構造實際編譯系統的方法,是一門理論和實踐要求都很高的課程,是學生在本科學習階段培養動手能力的一個非常重要的環節,在教學中具有重要地位。
在教學中,“編譯技術”課分為兩個部分:理論部分和實踐環節(課程設計)。學生學習了編譯程序的基本概念、原理、方法和技術之后,要完成一個小型語言的編譯系統。在教材[2]中,提供了由國際著名計算機科學家N.Wirth編寫的“PL/0語言編譯程序”和“Pascal-S編譯系統”這兩個經典教學編譯系統實例作為參考,目的是通過對編譯系統實例“小麻雀”的剖析,使學生較快地對一個高級語言編譯的全過程建立起完整的概念。
但是在實踐環節的教學過程中,筆者發現,雖然編譯系統的構造在理論上已形成完整的體系,實現技術也相當完善,但要使學生從學習基本理論、理解原理、掌握編譯器的構造技術到實現一個完整的編譯系統卻是十分困難的,是一門公認的難教難學的課程。對于一些學生來說,難度太大導致的后果就是完全放棄自己的努力,轉而向其他學生尋求“舶來品”。另外,課程設計的題目大都是基于PL/0和Pascal-S兩個教學編譯系統的,這兩個系統的源代碼是完成課程設計的基礎,因此,即便是自己獨立完成的作業,在源代碼上也有一些相似性,從源代碼相似性的角度來甄別兩份作業是否抄襲未免有些偏頗。這種現象在其他軟件類課程的實踐環節中也是類似的。筆者認為,要讓學生在這類課程的實踐環節中真正做到獨立完成、學有所獲,在題目的設置上不能“一概而論”,既要滿足基本的教學要求,又要考慮各種不同程度學生的實際情況;同時,不能僅對最終提交的作業進行考量,還需要在實踐環節的整個過程進行質量監控,才能達到預期的目的和效果。
從2005年開始,筆者在教學過程中設計了一套用于保證實踐環節質量的管理體系,讓學生在完成課程設計的過程中,自始至終受到督促和監控,幫助并促使學生在實踐環節中真正獨立完成。下面對質量管理體系及兩年來的實踐效果進行介紹。
2 質量管理體系
在“編譯技術”課程的實踐環節中,從布置題目到提交作業的時間跨度通常有3個月。為了讓學生在這段時間內有計劃、按步驟、保質量地完成作業,筆者從題目設置、題目分配和考核方案等方面考慮,多方位、多角度促進學生提高作業的質量。這套辦法,本文稱之為質量管理體系,如圖1所示。
(1) 題目設置
設置不同難度的題目,讓學生按需選取。為了避免因題目難度過大而讓學生放棄自己的努力,將題目設計為五個不同的難度等級,每個等級有不同的難度系數(即最高分數),讓學生根據自身的情況進行選取。在“編譯技術”課程設計中,題目的總體要求為實現一個小型語言的編譯器,難度的不同主要在于文法和生成的目標代碼的不同。
(2) 題目分配
隨機分配文法。同一難度的題目有多個不同的文法,這些文法是語法成分有所不同的類Pascal、類C語言的文法。借助于教學輔助平臺,學生能夠在選取難度等級后,獲得一個隨機分配的文法。
(3) 考核方案
區別于通常只對學生提交的最終作業進行考核,本質量管理體系中,在四個不同時間設置了考核點,規定了每次考核的內容和方式。
① 對教學示例系統的源代碼閱讀情況進行考核。教材上提供的PL/0、Pascal-S編譯系統的源代碼是學生完成課程設計的主要參考資料,對它們的深入理解和分析是學生完成課程設計的重要基礎。這部分內容是讓學生自學,為了不讓自學的要求流于形式,本體系對此環節采用面試的方式進行考核,師生一對一讓學生回答與示例系統源代碼有關的問題。
② 要求學生提交詳細設計文檔,進行中期檢查。為了讓學生的課程設計有規劃、有進展地進行,本體系要求學生在課程設計的中期提交詳細設計文檔作為考核內容。
③ 最終成果進行現場考核。當學生在完成課程設計后,通過教學輔助平臺提交包括源代碼、可執行文件和文檔的最終成果。教師安排統一的時間對每個學生逐一進行現場考核,具體方案如下:
? 在指定的計算機上編譯、運行、演示自己的作業(用自備的測試程序),并回答老師提出的問題;
? 用老師指定的測試程序對作業進行檢測,并對運行的結果進行解釋;
? 對測試程序進行修改,以獲得老師要求運行結果(含出錯信息)。
④ 組織申優答辯。對于申優(即希望成績在90分以上)的學生,除了要求選擇難度等級為“高”的題目外,還要在通過了現場考核之后,進行10~15分鐘的申優答辯。
(4) 文檔規范化
讓學生按軟件工程的要求完成課程設計,在開發過程中形成規范的文檔。在教學平臺上給學生提供了文檔模板,教師對學生提交的文檔逐一進行檢查。
(5) 評分精細化
制定了精細的評分規則。每次考核有若干考核項,每個考核項有相應的評分標準。評分規則在布置作業時就公布給學生,讓學生有明確的努力方向。在每次考核時,記錄下各個考核項得到的分數,最終借助Excel表的公式計算出一個總成績。

3 實踐效果分析
通過對上述質量管理體系的應用,筆者發現,在教學中產生的作用是顯著的:
(1) 設置不同難度的題目,有助于對學生因材施教。在這樣的安排下,即便是程度稍差的學生也能夠完成一個完整的編譯程序,讓他們對編譯系統從理論到實踐都有明確、直觀的認識。而對于學有余力的優秀學生,鼓勵他們對文法進行擴充或自選題目,將編譯原理應用到實際遇到的問題中,這樣極大地調動了他們的積極性和主動性,也培養和發揚了創新精神。
(2) 對于同一難度的題目,借助于教學輔助平臺隨機分配文法,這能夠有效地杜絕學生的抄襲。文法之間差別不大,但卻各不相同,學生必須踏踏實實地按自己獲得的文法構造編譯程序,才能順序通過檢測。從別人那里拿過來的程序一經測試程序檢測,立即會“露餡”。
(3) 通過考核的方式確保學生對教學示例系統的源代碼進行閱讀,不僅有利于讓學生深入了解編譯程序的組織結構和構造方法,也讓學生對課程設計題目的難度有更準確的認識,讓學生有勇氣選擇難度更大的題目。在教學中的安排是讓學生閱讀完源代碼并進行考核之后,再讓他們通過教學輔助平臺進行選題。從2003級和2004級兩屆學生的選題情況可以看出,選擇難度較大的學生的比例在大幅度增加,如圖2所示。

(4) 筆者在以前的教學過程中發現,很多學生完成作業的時限取決于交作業的最后期限。在前面有充足的時間時,拖拖拉拉,漫不經心,而發現截止日期快到時,才匆匆忙忙,加班加點。這樣造成的后果是學生并沒有充分利用時間進行仔細鉆研,而在最后草草了事,甚至在沒有時間自己解決問題的情況下,拷貝別人的程序來應付。要求提交作為中期檢查內容的詳細設計文檔之后,筆者發現這種方式確實能夠有效地敦促學生有計劃、按步驟地完成作業。
(5) 進行最終作業的逐一現場考核能夠讓這類實踐課程存在一個正規的考試環節,相比教師單獨評判作業給出一個分數更能給學生造成緊迫感和壓力,讓他們在完成作業的過程中認真對待。同時,一對一的現場交流能夠讓學生有更多的機會展示的成果,如果出現一些小小的失誤還可以在現場進行調試,既確保了學生的利益,也能調動起學生的主動性。
(6) 申優答辯是在現場考核之后進行的,提出申請的學生只有通過了現場考核才有資格參加申優答辯。答辯以一種嚴格規范的方式進行,要求學生準備10~15分鐘的演示文件,評委由課程組的幾位老師擔任。根據學生報告及回答問題的情況,老師給出自己的分數,各個分數綜合起來得到該生的申優答辯成績。申優答辯環節除了讓學生更充分地展示自己的成果外,還能培養學生的口頭表達能力和溝通能力,為今后的各種報告、答辯打下基礎。
(7) 按照工程化的方法完成軟件的開發是計算機專業的學生應有的技能和素質。“編譯技術”的課程設計作為本科學生要完成的第一個較大規模的編程作業,在工程化思想和方法的培養中起著重要的作用。這個環節也是學生在學習了“軟件工程”課程后的一次真正的實踐。
(8) 精細化的評分方式能夠讓學生的成績更客觀、公正。在上述各個階段,教師根據各次考核的情況給學生若干項具體的分數,并且大多數時候都是在考核現場直接給出的,這比以前由教師根據學生的作業單獨進行評判更公開、透明。同時,精細的分數計算公式也讓學生感受到工程技術領域的嚴謹和規范,有助于培養他們誠信、公正的品質。
4 結語
本文提出的質量管理體系已經在“編譯技術”課程設計中成功應用了兩年,并正在當前的課程設計中繼續應用。在這套質量管理體系的管理、監控之下,絕大多數學生都能按要求完成作業并收到應有效果。即便是最高難度的題目,也有不少學生能順利完成,2003級有36人申優,32人獲優,2004級有21人申優,18人獲優。學生對這種嚴格的過程質量管理是理解并贊同的。在課程設計提交的內容中,有“總結感想”一項,要求學生對完成“編譯技術”課程設計的情況進行總結,以此了解學生的意見和建議。從學生反饋的情況看,按照教學的要求完成課程設計后,他們均感到受益匪淺。
下面就摘錄幾個學生的總結片段作為本文的結束語:
“通過c0編譯器的實現,讓我得到了很大的鍛煉,不僅是技術能力方面的提高,更重要的是在自己的心態方面,只要自己努力了,就一定能夠取得一定的成績,也許不能成功,但至少努力了,不會遺憾。”(34060518)
“通過編寫編譯器,也使我明白了許多做項目的方法。在實際的項目中,會發生各種各樣的情況,因此需要有較好的處理異常的功能,就像編譯器中的錯誤處理一樣,不能一遇到錯誤就死掉。”(34060824)
“我希望這門課的老師們能繼續堅持這樣的作風,畢竟現在真正認認真真地檢查課程設計的科目是越來越少了,所以我很欣賞你們!希望我們的師弟師妹們能繼續‘被迫這樣認真地完成課程設計,因為這將是對他們大有好處的!:)”(34060328 )
“這個編譯器是自己讀計算機專業以來,第一個獨立實現的稍具規模的項目,雖然不敢說自己為之自豪,但確實有種成就感,對自己的專業學習也有了信心。那句話真的說得不錯‘世上無難事,只怕有心人,只要肯付出,肯努力學習,不管什么都能學會。
最后,很感謝老師給我這個自己鍛煉的機會,也很感謝老師的敦促,說實話如果沒有老師的敦促,我說不定會讓這個大好的機會溜掉。”(34060707)
參考文獻:
[1] Alfred V. Aho, Ravi Sethi, Jeffrey D.Ullman. 編譯原理[M]. 李建中,姜守旭,譯. 北京:機械工業出版社,2003.
[2]高仲儀,金茂忠. 編譯原理及編譯程序構造[M]. 北京:北京航空航天大學出版社,2001.