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