鄭曉娟
摘要:本文論述了計算機(jī)學(xué)科“編譯原理”課程在軟件工程專業(yè)進(jìn)行工程化改造的方法和必要性,創(chuàng)建了“編譯原理”課程工程化實踐教學(xué)體系,提出了知識的先期注入、工程化編譯理論以及階梯狀迭代工程實踐項目的教學(xué)方法,從根本上解決了該課程教、學(xué)、實踐中存在的難講授、難理解和難開發(fā)的“三難”問題,為其他計算機(jī)學(xué)科核心課程面向軟件工程專業(yè)的工程化改造提供了一定的理論依據(jù)。
關(guān)鍵詞:編譯原理;軟件工程;工程化;知識先期注入;工程化編譯理論;階梯狀迭代教學(xué)法
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:B
作為信息產(chǎn)業(yè)的核心和國民經(jīng)濟(jì)信息化的基礎(chǔ),軟件產(chǎn)業(yè)日益受到國家的高度重視。權(quán)威數(shù)據(jù)顯示,我國軟件產(chǎn)業(yè)每年人才需求量近一百萬,然而令人尷尬的是,許多軟件企業(yè)卻招聘不到真正合適的軟件人才。信息社會不斷增長的軟件人才需求與優(yōu)質(zhì)軟件專業(yè)教育供給不足的矛盾已成為計算機(jī)高等教育發(fā)展面臨的一個重要問題。
2001年12月,經(jīng)國家教育部和國家計委聯(lián)合發(fā)文批準(zhǔn),全國首批35所示范軟件學(xué)院正式成立,目的是批量培養(yǎng)具有國際競爭能力的高層次、應(yīng)用型、復(fù)合型軟件工程人才。自示范軟件學(xué)院成立以來,我國軟件工程教育事業(yè)得到了很大發(fā)展,學(xué)科建設(shè)逐步走向成熟,初步實現(xiàn)了與國際學(xué)科發(fā)展的接軌,軟件工程教育實現(xiàn)了歷史性跨越。
然而,軟件工程是一個迅速發(fā)展的交叉性學(xué)科,相關(guān)的新概念、新技術(shù)、新方法不斷涌現(xiàn),這就要求教育機(jī)構(gòu)要不斷調(diào)整策略,以應(yīng)對專業(yè)的快速變化。尤為突出的是,無論是全國首批35所示范軟件學(xué)院還是非示范軟件學(xué)院,大部分都根植于計算機(jī)學(xué)院,因此很多軟件工程專業(yè)學(xué)科課程體系與計算機(jī)科學(xué)與技術(shù)專業(yè)基本相似,而計算機(jī)科學(xué)與技術(shù)專業(yè)的教學(xué)內(nèi)容是遠(yuǎn)遠(yuǎn)不能適應(yīng)軟件工程學(xué)科的發(fā)展要求的。
從根本上解決上述問題的關(guān)鍵是,結(jié)合中國軟件產(chǎn)業(yè)和軟件學(xué)院已有的硬、軟件基礎(chǔ)設(shè)施及辦學(xué)的具體情況,研究和定制適合本學(xué)院特色的軟件工程學(xué)科的課程設(shè)置、教學(xué)內(nèi)容、教學(xué)方法,形成一個良好的軟件工程學(xué)科課程體系,使軟件工程教學(xué)更具先進(jìn)性、目的性和系統(tǒng)性,其中對計算機(jī)科學(xué)核心課程的工程化改造勢在必行。
本文將研究計算機(jī)學(xué)科的“編譯原理”課程在軟件工程專業(yè)如何進(jìn)行工程化改造,怎樣創(chuàng)建適合軟件工程專業(yè)知識體系要求的“編譯原理”實踐教學(xué),從而在科學(xué)的軟件工程學(xué)科課程體系的保證下,形成一個融基礎(chǔ)理論、實驗教學(xué)、工程實踐為一體的整體化培養(yǎng)機(jī)制,以適應(yīng)軟件工程學(xué)科教學(xué)要求,使軟件工程學(xué)科教學(xué)質(zhì)量得到不斷發(fā)展,使軟件工程專業(yè)教育得到健康穩(wěn)步發(fā)展,培養(yǎng)社會需要的軟件人才。
1 “編譯原理”的工程化實踐教學(xué)體系
1.1教育教學(xué)理念
工程化實踐教學(xué)就是樹立工程化能力培養(yǎng)與基礎(chǔ)理論教學(xué)、專業(yè)能力培養(yǎng)并重的教學(xué)理念,把工程化教學(xué)作為人才培養(yǎng)的核心任務(wù)之一,通過全面改革軟件工程專業(yè)的人才培養(yǎng)模式、調(diào)整課程體系、充實教學(xué)內(nèi)容、改進(jìn)教學(xué)方法,在教學(xué)過程中全面體現(xiàn)能力和職業(yè)素質(zhì)培養(yǎng)的思路,并將軟件工程知識內(nèi)容由淺入深、階梯狀、循序漸進(jìn)地貫穿在工程化實踐教學(xué)的各個開發(fā)項目中。
基于上述軟件工程專業(yè)的知識體系、本科課程設(shè)置的指導(dǎo)原則以及工程化實踐教學(xué)教育教學(xué)理念,下面將給出“編譯原理”課程的工程化實踐教學(xué)體系。
1.2 “編譯原理”的工程化實踐教學(xué)體系
如圖1所示,“編譯原理”課程的工程化實踐教學(xué)體系由六個部分組成:編譯原理課程工程化實踐教學(xué)環(huán)境、編譯原理理論教學(xué)、軟件工程能力培養(yǎng)、階梯狀迭代工程實踐項目、配套教材和評價體系。構(gòu)建理念為以計算機(jī)科學(xué)為基礎(chǔ),以軟件工程為核心,以目標(biāo)應(yīng)用為導(dǎo)向。
1.2.1 “編譯原理”課程工程化實踐教學(xué)環(huán)境
“編譯原理”課程工程化實踐教學(xué)環(huán)境由實驗室、項目團(tuán)隊、教師講座以及團(tuán)隊匯報組成。
(1) 實驗室。以工程化培養(yǎng)理念指導(dǎo)教學(xué)實驗室建設(shè),為“編譯原理”課程工程化實踐教學(xué)提供強(qiáng)有力的基礎(chǔ)設(shè)施支持。提供全天開放機(jī)房,機(jī)房實行開放型管理。項目開發(fā)時間規(guī)定為開時間和閉時間,閉時間為固定時間,要求授課教師到機(jī)房現(xiàn)場指導(dǎo),開時間內(nèi),學(xué)生可以自由選擇時間,以小組為單位進(jìn)行自行討論、設(shè)計,要求實驗室人員在現(xiàn)場,以便解決設(shè)備問題。機(jī)房的使用和維護(hù)要有嚴(yán)格的管理制度,保證項目的順利完成。
(2) 項目團(tuán)隊。將4~5個學(xué)生分為一個項目小組,一名組長作為負(fù)責(zé)人;每名學(xué)生分配一臺微型計算機(jī),在開發(fā)小組中以分工協(xié)作的方式完成指定的軟件開發(fā)任務(wù),完成項目設(shè)計報告,并提交完整的軟件開發(fā)文檔和源代碼。學(xué)生在團(tuán)隊環(huán)境下使用最新的軟件開發(fā)工具,獲得較真實的軟件開發(fā)經(jīng)驗,提高學(xué)生在項目規(guī)劃、隊伍組織、工作分配、成員交流等多方面的能力,培養(yǎng)學(xué)生團(tuán)隊合作及工程項目研發(fā)能力。
(3) 教師講座。指導(dǎo)教師在整個的項目開發(fā)中縱覽全局,項目的開始、結(jié)束及中間的每個模塊都要進(jìn)行全面的講解、引導(dǎo)和組織。教師要系統(tǒng)講解軟件工程知識點和軟件技術(shù),統(tǒng)一講解項目開發(fā)過程中學(xué)生普遍存在的問題,不斷地發(fā)現(xiàn)問題,解決問題。
(4) 團(tuán)隊匯報。理論教學(xué)中教師唱主角,而工程化實踐教學(xué)應(yīng)讓學(xué)生唱主角,讓開發(fā)小組自己擬定演講方案、內(nèi)容,由教師審核修改后進(jìn)行匯報演講。這樣可以有效地提高學(xué)生總結(jié)概括、研究立項、口頭表達(dá)、演講和交流溝通的能力,培養(yǎng)學(xué)生獨(dú)立思考、分析問題的能力和創(chuàng)新能力。
1.2.2 “編譯原理”理論教學(xué)
由知識的先期注入和工程化理論教學(xué)組成。
(1) 知識的先期注入?!熬幾g原理”課程的理論性較強(qiáng),整個課程內(nèi)容由幾個功能模塊組成,學(xué)生對課程的完全理解應(yīng)在最后一個模塊,即課程結(jié)束時。鑒于教學(xué)內(nèi)容的特殊性,應(yīng)在一門程序設(shè)計語言之后安排“CO釋程序的面向?qū)ο笤O(shè)計與實現(xiàn)”項目,作為前導(dǎo)實踐環(huán)節(jié),配套教材為《C++實戰(zhàn):解釋程序的面向?qū)ο蟪绦蚺c設(shè)計》。這可以使學(xué)生在學(xué)習(xí)理論之前對程序設(shè)計語言的解釋執(zhí)行有較深的理解,由傳統(tǒng)的“填鴨式”被動學(xué)習(xí)轉(zhuǎn)變?yōu)閷W(xué)生自主式學(xué)習(xí)。學(xué)生對“編譯原理”課程的學(xué)習(xí)由問“這是什么”變成“這是我需要的什么”,從根本上解決了“編譯原理”課程的教學(xué)困難。實踐表明,這種方法在鍛煉學(xué)生實踐能力的同時先期注入了理論教學(xué)需要的解釋程序的知識和概念,有很好的教學(xué)效果。
(2) 工程化理論教學(xué)。編譯程序是龐大而復(fù)雜的,這使得如何介紹編譯原理本身就是一個難題。中外編譯原理教材很多,如果從工程化的角度去詮釋編譯程序的實現(xiàn)過程及其原理,即對一個完整的源程序到目標(biāo)程序的轉(zhuǎn)換過程進(jìn)行詳細(xì)講解,不失為一個新的途徑。我們的配套教材《編譯程序的實現(xiàn)原理》的編寫形式如下:先給出編譯器的輸入——一個C語言小程序;再給出編譯器的輸出——目標(biāo)機(jī)上的目標(biāo)語言,完成這樣的轉(zhuǎn)換需要進(jìn)行的工作包括詞法分析、語法分析等幾個功能模塊;再針對每個功能模塊給出本模塊的輸入和輸出,如詞法分析為一個C語言小程序,模塊的輸出形式為TOKEN鏈表,完成這樣的轉(zhuǎn)換需要進(jìn)行的工作由理論和實現(xiàn)兩部分組成。這種講述方法實現(xiàn)了五化:
工程化:以對一個完整的源程序到目標(biāo)程序的轉(zhuǎn)換作為教學(xué)載體介紹編譯程序的實現(xiàn)及其原理,以反映編譯的工程性。
模塊化:將一個完整的源程序到目標(biāo)程序的轉(zhuǎn)換作為總目標(biāo),將不同的子轉(zhuǎn)換作為各個子模塊的目標(biāo),以反映編譯的模塊性。
鏈接化:將一個完整的源程序到目標(biāo)程序的轉(zhuǎn)換所需的知識處理成總目標(biāo)與子模塊、子模塊內(nèi)所需知識點之間的鏈接,以反映編譯的整體性。
需求化:將編譯原理內(nèi)容的平鋪直敘轉(zhuǎn)換為實現(xiàn)一個完整的源程序到目標(biāo)程序的轉(zhuǎn)換的所需知識,解決了編譯內(nèi)容的龐雜、不分主次、敘述冗長的問題。
形式化:將形式語言的內(nèi)容介紹放置在為完成目標(biāo)所需知識的位置,突出形式語言的地位、內(nèi)容及其應(yīng)用。
1.2.3軟件工程能力培養(yǎng)
在工程化實踐教學(xué)體系中,軟件工程能力的培養(yǎng)是至關(guān)重要的。
軟件工程能力包括軟件需求、軟件設(shè)計、軟件構(gòu)造、軟件工程基礎(chǔ)結(jié)構(gòu)、軟件配置管理、軟件維護(hù)等知識單元。有些知識單元在早期學(xué)習(xí),以促進(jìn)學(xué)習(xí)條件的成熟;而有些知識單元的學(xué)習(xí)需要一定的成熟條件,應(yīng)該放在后期講授,如階梯狀迭代工程實踐項目是整個教學(xué)過程中理論聯(lián)系實際,培養(yǎng)學(xué)生動手能力、觀察能力、分析和解決問題能力、團(tuán)隊合作以及創(chuàng)新精神的重要環(huán)節(jié)。把軟件工程知識單元分期、分階段引入階梯狀不同開發(fā)項目的全過程,形成了特色鮮明的工程化實踐教育體系,使學(xué)生的軟件工程能力在實際項目開發(fā)中得到鍛煉和提升。“編譯原理”課程工程化實踐項目內(nèi)容安排如表1所示。
“實踐性、個性化、逐步工程化”是工程化人才培養(yǎng)的重要環(huán)節(jié),也是學(xué)生成為合格軟件工程化人才的實踐過程。以上教學(xué)組織方法既保證了教學(xué)的系統(tǒng)性、知識性,又保證了教學(xué)案例的先進(jìn)性和實踐性。
1.2.4階梯狀迭代工程實踐項目
編譯器代碼的長度可從10 000行到1 000 000行不等,編寫甚至讀懂這樣一個程序都非易事,更何況是開發(fā),因此編譯器的實現(xiàn)比以前任何課程中學(xué)生承擔(dān)的設(shè)計要大得多、難得多??v觀國內(nèi)外大學(xué)研究現(xiàn)狀,一般都是先設(shè)計一個語言,面向過程式或面向?qū)ο笫?然后對設(shè)計的語言進(jìn)行面向過程或面向?qū)ο蟪绦蛟O(shè)計方法的開發(fā),早期采用面向過程語言編譯器的面向過程開發(fā),如吉林大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院的編譯原理實踐課程“編譯程序的設(shè)計與實現(xiàn)”,近期采用面向過程語言編譯器的面向?qū)ο箝_發(fā),或是面向?qū)ο笳Z言編譯器的面向?qū)ο箝_發(fā),如“Modern Compiler Implementation in Java”。無論哪一種,學(xué)生都是一次性為具有上百條產(chǎn)生式語法的語言開發(fā)編譯器,難度極大,這使實踐課程的收效甚小。采用階梯狀迭代教學(xué)法創(chuàng)建的編譯原理課程工程化實踐項目從根本上解決了這個問題,配套教材為《編譯程序的面向?qū)ο蟪绦蚺c實現(xiàn)》。
如圖1和圖2所示,編譯原理課程工程化實踐項目內(nèi)容包括“C0解譯程序的面向?qū)ο笤O(shè)計與實現(xiàn)”,“C1編譯程序的面向?qū)ο笤O(shè)計與實現(xiàn)”,“C2編譯程序的面向?qū)ο笤O(shè)計與實現(xiàn)”,“C3編譯程序的面向?qū)ο笤O(shè)計與實現(xiàn)”。整體項目的源語言定義為C語言的子集,采用階梯狀迭代教學(xué)法后,將源語言定義為C0、C1、C2、C3,Cn是Cn-1的擴(kuò)展。
編譯原理課程工程化實踐項目的優(yōu)點有:
(1) 起點低:降低了開發(fā)難度。學(xué)生根據(jù)自己的實際水平選擇源語言級別,有不同收效。從根本上解決了軟件開發(fā)水平低的學(xué)生對編譯程序開發(fā)望而生畏甚至放棄的問題。
(2) 階梯上升:項目內(nèi)容的選擇不是零散的、隨機(jī)的、重疊的,而是相互關(guān)聯(lián)的??v向為編譯理論,是主要內(nèi)容;橫向為軟件工程,是輔助內(nèi)容。主要內(nèi)容將難點分散,處理成階梯狀;輔助內(nèi)容也將難點分散,同樣處理成階梯狀。
(3) 迭代發(fā)展:每一個項目需求是前一個項目的擴(kuò)展,因此,每一次的軟件開發(fā)可以看作是前一次開發(fā)的迭代,使學(xué)生面對大型軟件開發(fā)項目中最難處理的用戶需求不斷變更的問題,最大程度地使用重用技術(shù)。所有項目的開發(fā)承上啟下、循序漸進(jìn)、階梯狀迭代發(fā)展,為研究和學(xué)習(xí)軟件生產(chǎn)線新技術(shù)埋下伏筆。
(4) 知識滲透:將軟件工程核心內(nèi)容及工程化軟件開發(fā)思想由淺入深逐步滲透到各個項目中,每個項目具有不同級別的培養(yǎng)目標(biāo),學(xué)生從不同項目循序漸進(jìn)地掌握工程化軟件開發(fā)理念,降低了工程化軟件開發(fā)的難度。
階梯狀迭代工程實踐項目發(fā)揮了學(xué)生的主體意識,給學(xué)生足夠的空間,激發(fā)了學(xué)生的活力與創(chuàng)新思維,并培養(yǎng)了學(xué)生的“三個能力”(自我管理能力、組織策劃能力、社會實踐能力)和“五種意識”(責(zé)任意識、服務(wù)意識、創(chuàng)新意識、團(tuán)隊意識、競爭意識)。
1.2.5配套教材
編譯原理課程工程化實踐教學(xué)配套教材共有3部,前導(dǎo)教材《C++實戰(zhàn):解釋程序的面向?qū)ο蟪绦蚺c設(shè)計》與“編譯原理”理論教學(xué)知識的先期注入配套;《編譯程序的實現(xiàn)原理》與“編譯原理”工程化理論教學(xué)配套;《編譯程序的面向?qū)ο蟪绦蚺c實現(xiàn)》與階梯狀迭代工程實踐項目配套,3部教材前后關(guān)聯(lián)且各呈完整體系。本套教材為清華大學(xué)出版社“編譯原理及其實踐課程的工程化教學(xué)課群研究”立項項目,已出版1部,另2部明年中旬出版。
1.2.6評價體系
編譯原理課程的工程化實踐教學(xué)評價體系包括對學(xué)生工程素質(zhì)和對教學(xué)體系的評價。
學(xué)生工程素質(zhì)的評價采用過程化考核管理標(biāo)準(zhǔn),即把工程化能力和職業(yè)素質(zhì)引入學(xué)生工程素質(zhì)的評價體系,加大工程化實踐環(huán)節(jié)的比重,形成專業(yè)理論知識和實踐能力并重的考核體制,將期末一張試卷定成績的考評機(jī)制改為由工程化實踐項目、隨堂測驗、論文、面試、考試、團(tuán)隊等多種形式相結(jié)合的評價機(jī)制,防止實驗抄襲現(xiàn)象。編譯原理課程考核采取理論知識和工程化實踐項目完成情況的綜合考核方式,工程化實踐項目根據(jù)項目設(shè)計報告、軟件開發(fā)文檔、源代碼和運(yùn)行系統(tǒng)的質(zhì)量進(jìn)行考核,學(xué)生成績以登記評定方式給出。
教學(xué)體系的評價采用回饋化考核管理標(biāo)準(zhǔn),即把企業(yè)回饋和畢業(yè)生回饋引入教學(xué)體系的評價。對企業(yè)和畢業(yè)生進(jìn)行跟蹤調(diào)查,通過收集企業(yè)和學(xué)生的反饋指導(dǎo)教學(xué)和實踐項目的設(shè)置和修訂,形成良性循環(huán),為進(jìn)一步提高教學(xué)質(zhì)量打下堅實基礎(chǔ)。
2結(jié)論
軟件工程是集計算機(jī)科學(xué)與技術(shù)、數(shù)學(xué)、經(jīng)管等多學(xué)科的交叉性學(xué)科。作為一名軟件工程教育者,我們必須建立一套具有自身特色的工程化人才培養(yǎng)體系,培育具有國際競爭力的一流軟件產(chǎn)業(yè)高級/高端人才,結(jié)合軟件工程人才的學(xué)科交叉性、偏重實用、職業(yè)定位等特點,系統(tǒng)深入地研究軟件產(chǎn)業(yè)對技術(shù)型、管理型的人才需求,注重學(xué)生綜合能力和專業(yè)素質(zhì)的培養(yǎng),才能在計算機(jī)系統(tǒng)、軟件工具、軟件工程和管理上循序漸進(jìn)地提高學(xué)生的能力。
參考文獻(xiàn):
[1] Aho, Alfred V., Ravi Sethi, Jeffrey Ullman. Compilers: Principles, Techniques and Tools[M]. Reading, MA: Addison-Wesley, 1986.
[2] Appel, Andrew W. Modern Compiler Implementation in Java[M]. Cambridge, UK: Cambridge University Press,1997.
[3] Kenneth C. Louden. Compiler Construction: Principles and Practice[M]. PWS Publishing Company,1997.