張 晶 金 英 劉 磊
摘要:本文探討了目前國內(nèi)高?!熬幾g原理”實踐課程的現(xiàn)狀,研究了“編譯原理”實踐課程的“多層次—多目標—多效果”的教學方法,給出了該方法的實施方案和效果。該項研究對深化高校教學改革,更新實踐性教學模式,培養(yǎng)創(chuàng)新型人才具有一定的意義。
關鍵詞:編譯原理;實踐課程;教學模式;創(chuàng)新型人才
中圖分類號:G642 文獻標識碼:B
編譯程序作為連接應用程序和計算機系統(tǒng)的橋梁和紐帶,是不可或缺的一個系統(tǒng)軟件。具備一定的編譯程序設計原理和實現(xiàn)技術(shù)也是計算機專業(yè)的學生及工作者必備的基礎知識和技能。由于“編譯原理”課程中涉及形式語言、屬性文法等比較抽象的內(nèi)容,一直被學生認為是較難掌握的一門課程。所以,各高校相應地開設了“編譯原理”實踐課程,希望借此加強學生對理論知識的理解,建立理論和實際的聯(lián)系,強化動手能力,促進學生綜合素質(zhì)的提高。
目前,多數(shù)高校在“編譯原理”實踐課教學中采用的都是以實例語言為主導,貫穿整個編譯過程的教學模式。經(jīng)過幾年的教學實踐,取得了一定的教學效果,但也存在一些問題,比較典型的有以下兩種情況:(1)一般的實踐教學都是采用統(tǒng)一實驗題目,學生分組進行實驗的形式進行。實際上,由于學生水平參差不齊,針對統(tǒng)一的題目,一些水平較低的學生容易產(chǎn)生畏難情緒,而一些水平較高的學生則認為題目有些陳舊,沒有反映最新的應用要求,導致學習興趣降低,教學效果不好;(2)由于編譯程序是一個系統(tǒng)程序,開發(fā)一個完整的編譯程序涉及高級程序設計語言、數(shù)據(jù)結(jié)構(gòu)、算法分析、操作系統(tǒng)、匯編語言、軟件開發(fā)方法等領域許多內(nèi)容的綜合運用。尤其是高級程序設計語言、軟件開發(fā)方法等課程,如果基礎不好,學生很難完成既定的任務,即使勉強完成,效果也不是很好:有些同學會抄襲他人的程序,有些同學會給出結(jié)構(gòu)混亂的代碼。
筆者所在教研室實踐了“實例—階段—循環(huán)”的教學方法后,取得了較好的教學效果,在對該方法進行實踐、改進、再實踐的基礎上,提出“多層次—多目標—多效果”教學方法。該方法的中心思想是,針對不同水平的學生設定不同難度的題目,不同的題目有不同的要求,學生在不同的要求下達到不同的效果,從而激發(fā)每個學生的學習興趣,使每個學生都能通過學習而有所收獲和提高,真正達到培養(yǎng)創(chuàng)新型人才的目標。本方法對其他具有相似特點的課程也同樣適用。
下面從實驗準備、實驗實施、考核三個階段闡述“多層次—多目標—多效果”的“編譯原理”實踐課程教學方法實施的全過程。
1實驗準備
“編譯原理”實踐課程開設的目的是加深學生對編譯理論知識的理解,培養(yǎng)學生開發(fā)大型軟件的能力。為保證實踐課取得更好的效果,同時考慮到學生的整體水平和實踐課開設的時間,我們認為在正式進行實踐教學之前,應該使學生在以下三個方面做好準備:
一是編譯基礎理論知識的復習。目前,大多數(shù)高校的“編譯原理”理論教學安排在大三上學期進行,實踐教學安排在大三下學期進行。由于理論教學和實踐教學是分開進行的,因此常常會有一些基礎不好、知識掌握不扎實的學生將已經(jīng)學過的知識忘記,還有的學生理論知識掌握得比較好,但無法在理論知識和實際軟件開發(fā)之間建立聯(lián)系。所以在學生正式動手之前,有必要由專業(yè)指導教師進行理論知識的講解,并通過一些淺顯易懂的例子說明如何在抽象理論和實際實現(xiàn)之間建立聯(lián)系,幫助學生明確任務需求。
二是高級程序設計語言編程能力的培養(yǎng)。高級程序設計語言的編譯程序是一個龐大的系統(tǒng)程序,工作量較大,學生必須熟練地掌握編譯的理論知識和程序設計技能。然而,筆者從幾年的實踐發(fā)現(xiàn),有一部分學生沒能按時完成編譯實驗的原因是“高級語言程序設計”課程的學習不夠扎實,編程能力較弱。針對這一現(xiàn)象,我們加強了教師的輔導,即將開發(fā)編譯程序中可能用到的相關編程知識提前加以輔導,例如文件相關的操作、指針、數(shù)組、結(jié)構(gòu)體等數(shù)據(jù)結(jié)構(gòu)的設計和使用等,喚醒學生的記憶,提高編程的速度。
三是軟件開發(fā)方法的培訓。在以往的教學中,我們經(jīng)常會遇到這樣的情況,即教師講解完實驗目的和要求之后,仍會有一小部分學生不知從何處下手,還有的學生一拿到題目就動手編程,根本不做分析和設計,代碼通不過測試時,又東一塊西一塊地對代碼進行修正,最后導致代碼一團糟,自己都看不懂。針對以上這些情況,我們倡導學生在實踐中嚴格采用軟件工程的思想進行設計和操作,實踐證明,效果較好。
2實驗實施
“編譯原理”實踐課程的主要內(nèi)容是要求學生按照編譯程序功能結(jié)構(gòu)的劃分,完成某個程序語言的詞法分析、語法分析、語義分析和代碼生成程序,從而熟悉各個階段的功能和經(jīng)典算法。本方法在實施階段的重點主要體現(xiàn)在兩個方面:題目多樣化和實現(xiàn)工程化。
2.1題目多樣化
“編譯原理”實踐課程的目的是使學生在掌握編譯程序設計基本理論的基礎上,能夠針對具體的程序設計語言設計并開發(fā)出一個可用的編譯程序。由于當前流行的語言都比較龐大,不易處理,因此多數(shù)高校都采用小的實例語言模型的方法,較常用的實例語言有PL/0、SNL、tiny C、mini C等。前兩種是Pascal語言的子集,語言具有良好的結(jié)構(gòu)性,但由于Pascal語言在教學和應用中已經(jīng)很少使用,學生對其語法不熟悉,因此PL/0、SNL不適合繼續(xù)作為實例語言。C語言及其變種C++語言,以及近似的Java語言是應用中采用較多的語言,學生對其語法、程序結(jié)構(gòu)、語言特性等都有一定了解,所以C語言的子集比較適合作為實踐課程的教學語言。但即使是C語言的子集,其編譯程序也是非常龐大的,一些基礎較差的學生仍然感覺比較吃力,無法完成整個程序,而對于一些基礎較好的學生,則認為當今主流的程序語言都是面向?qū)ο蟮?特別希望掌握面向?qū)ο笳Z言的翻譯機制。
針對目前學生人數(shù)增多,學生質(zhì)量參差不齊,教學質(zhì)量和檔次得不到保證的情況,本文提出“多層次—多目標—多效果”的教學方法。首先由任課教師將題目分為較低難度、正常難度、較高難度三個等級,難度主要體現(xiàn)在實例語言的語法和語義功能上。
較低難度的語言是指具有表達式語法結(jié)構(gòu)及算術(shù)運算、關系運算功能的語言,記為Le,由于沒有聲明部分,因此Le的語義比較簡單。其語法如下:
程序P ::= E
表達式E ::= c | id | (E) | E + E | E * E | E < E | E > E | E = E
正常難度的語言是指具有語句語法結(jié)構(gòu)及子程序功能的語言,記為Ls,其語法如下:
程序P ::= D;S
聲明D ::= Dctv;Df
Dctv ::= Dc; Dt; Dv
Dc ::= const id C | Dc; Dc
Dt ::= type id T | Dt; Dt
Dv ::= var id T | Dv; Dv
Df ::= fun T id module | Df; Df
module ::= params D S
param ::= param id:T
params ::= param | param; params
語句 S ::= skip | ass(id,E) | read(id) | write(E) | if(E, S1, S2) | while(E,S)| seq(S1, S2) | block(Dctv,S) |
call(id, E1, …, En)
語言Ls在語言Le的基礎上,增加了聲明、語句、函數(shù)等功能,相應地增加了語義處理、代碼生成的難度和復雜性。
較高難度的語言是指加入面向?qū)ο髾C制的語言,記為Lo,Lo的詞法、語法分析與Ls的詞法、語法分析難度相當,但由于對象機制的加入,Lo的語義分析和代碼生成部分都要增加一些特殊的處理。Lo語法如下:
Prog ::= ClassDecList; VarDecPart; Body
ClassDecList ::= ClassDec |
ClassDec ; ClassDecList
ClassDec::= class cname ;
[super cname;]
[insvar IVDecList;]
[insmethod IMDecList]
end
IVDecList ::= IVDec | IVDec; IVDecList
IVDec ::= VarDec
IMDecList ::= IMDec | IMDec; IMDecList
IMDec ::= Type mid ? ParamDecPart ? FunBody
ParamDecPart ::= VarDecPart
FunBody ::= VarDecPart; Body
VarDecPart ::= var VarDecList
VarDecList ::= VarDec | VarDec; VarDecList
VarDec ::= id:Type
Type::= cname | integer | bool
Body ::= begin StmList end
StmList ::= Stm | Stm; StmList
Stm ::= new?id, cname? |
receiver?mid?RParamList? | id = Exp |
if (Exp, StmList, StmList)| delete (id)
RParamList ::= Exp | Exp, RParamList
receiver ::= id | self
Exp ::= n | x | tt | ff | id.id | Exp+Exp | Exp 由于在題目選擇上增加了靈活性,學生可以根據(jù)自己的實力和興趣選做不同的題目,極大地提高了他們的學習積極性。同時對于各個題目以及各個題目每個階段的實現(xiàn)方案,學生可以自由發(fā)揮,充分發(fā)揮想象力和創(chuàng)造力,無論對于基礎較好的學生還是一般的學生,都能達到很好的鍛煉目的。 2.2實現(xiàn)工程化 實踐課的目的是使學生能夠真正運用所學的知識去解決實際問題,是理論知識的升華。這就要求學生在掌握編譯原理的基礎上,能夠針對具體的程序語言設計并開發(fā)出可用的編譯程序。作為一個龐大而復雜的系統(tǒng)程序,編譯程序的開發(fā)應該遵循軟件工程的思想和規(guī)范的軟件開發(fā)過程,才能保證開發(fā)出的編譯程序具有較好的質(zhì)量和可維護性,同時實踐的過程也是對學生軟件開發(fā)實戰(zhàn)的一次演練。具體措施如下: (1) 由于編譯程序較大,課上時間又有限,所以實驗采用分組進行的方式,每個小組由4~5名學生組成,分工協(xié)作共同完成。在分工協(xié)作的過程中,特別強調(diào)明確任務劃分,統(tǒng)一命名規(guī)則,重視接口設計等關鍵問題。 (2) 在開發(fā)過程中,遵循需求、設計、實現(xiàn)、測試等標準的軟件過程,要求學生在相應的階段給出相應的文檔,明確每個階段要完成的任務,以及相應的解決方案。 3實驗考核 “編譯原理”實踐課程的一個難點在于如何對成績進行評定,因為任何一個語言的編譯程序都存在代碼較長、無法當堂測試的情況。因此,常規(guī)考察都是要求學生每個編譯階段提交一個階段性程序或在最后階段提交一個完整的編譯程序。經(jīng)過幾年的教學實踐,我們發(fā)現(xiàn)考核中經(jīng)常會出現(xiàn)部分代碼雷同和相似的現(xiàn)象,對于成績的評定和考試的公平性有一定的阻礙和影響。采用“多層次—多目標—多效果”的教學方法后,更是對成績的公平性提出了較大的挑戰(zhàn)。顯然,絕對的公平是不存在的,只能在盡可能大的范圍內(nèi)保證公平。本著公開、公正的原則,我們提出階段考核和匯總考核相結(jié)合的成績評定方法,并且采用加權(quán)形式,不同難度的題目,其權(quán)值也不同。不論哪種難度的題目,都按照編譯過程劃分成幾個階段,并規(guī)定每個階段完成的時間。每到一個規(guī)定時間,就對學生的當前階段成果進行考核,提供合理化建議,并對考核結(jié)果進行記錄,作為匯總考核的參考。在匯總考核階段,采取公開答辯的形式,答辯以小組為單位進行,每個小組負責給指導老師和其他同學展示自己編寫的程序,并講解程序的功能、工作過程和創(chuàng)新點。通過以上措施,較好地避免了以往考核中經(jīng)常出現(xiàn)的剽竊程序或偷懶現(xiàn)象,同時幫助學生樹立了榮譽感、責任心和成就感,將人格、品德培養(yǎng)融入教學中,真正做到教書育人。 4結(jié)語 筆者經(jīng)過在本校近三屆學生中開展“多層次—多目標—多效果”教學方法的教學活動后,發(fā)現(xiàn)教學效果較以往有了很大的提高,不同層次的學生實現(xiàn)了不同的實踐目標,不同的實踐目標鍛煉了不同的能力。任課教師和學生普遍反映,由于題目設定科學合理,極大地提高了學生的學習興趣,興趣帶動了能力的提高,能力的提高促進了創(chuàng)新性成果的產(chǎn)生,形成了很好的良性循環(huán)。 參考文獻: [1] 金成植. 編譯原理實現(xiàn)技術(shù)[M]. 北京:高等教育出版社,2007. [2] 劉磊. 編譯程序的設計與實現(xiàn)[M]. 北京:高等教育出版社,2003. [3] 趙曦.“編譯原理”實驗教學改革初探[J]. 實驗室科學,2006,8(4):26-27. [4] 朱莉. 改革實驗教學,培養(yǎng)創(chuàng)新能力[J]. 實驗技術(shù)與管理,2003,20(1):70-72. [5] 方凱晴. 計算機專業(yè)實驗教學改革的探討[J]. 實驗室研究與探索,2002,21(1):6-8. [6] 劉平安. 改革實踐性教學模式 加強學生工程素質(zhì)培養(yǎng)[J]. 機械工業(yè)高教研究. 2002(4):42-45. [7] 張晶,楊冬,郭德貴,等. 編譯原理實踐課程教學方法研究[J]. 吉林大學學報:信息科學版,2005,8(23):142-144.