劉 兵,張 辰,謝紅俠,劉明明
(1.中國礦業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,江蘇 徐州 221116;2.江蘇建筑職業(yè)技術(shù)學(xué)院 智能制造學(xué)院,江蘇 徐州 221008)
編譯原理是計算機科學(xué)與技術(shù)專業(yè)綜合性和實踐性都很強的課程,根據(jù)工程教育認(rèn)證標(biāo)準(zhǔn)的要求,需要強化學(xué)生對系統(tǒng)軟件的規(guī)劃、組織、設(shè)計和實現(xiàn)的綜合能力和素質(zhì),訓(xùn)練其對大型軟件工程實施的技術(shù)與能力。針對本科編譯原理課程教學(xué)特點的開源案例驅(qū)動的教學(xué)模式,即“案例—理論—概念”的模式通過將任務(wù)驅(qū)動與案例教學(xué)深度融合,以任務(wù)為載體,將開源編譯器案例與相應(yīng)理論知識、基本原理有機結(jié)合,鍛煉學(xué)生自主學(xué)習(xí)、團隊協(xié)作能力,保障工程教育認(rèn)證標(biāo)準(zhǔn)的真正落地。
面向工程教育認(rèn)證標(biāo)準(zhǔn),編譯原理課程以培養(yǎng)具有系統(tǒng)軟件開發(fā)與軟件工程實施能力的人才為導(dǎo)向[1-3]。工程教育質(zhì)量關(guān)注課程的培養(yǎng)目標(biāo)、畢業(yè)要求、課程體系和課程教學(xué)。要求從經(jīng)驗型的粗放辦學(xué)到科學(xué)精細(xì)化辦學(xué)的轉(zhuǎn)變、面向?qū)W科培養(yǎng)人才到面向社會需求培養(yǎng)人才的轉(zhuǎn)變、教為中心到學(xué)為中心的轉(zhuǎn)變、追求教了什么到追求學(xué)生學(xué)到了什么的轉(zhuǎn)變,始終以學(xué)生的學(xué)習(xí)和發(fā)展為中心,全面提升學(xué)生的工程技術(shù)創(chuàng)新能力。
然而,當(dāng)前編譯原理課程的實踐環(huán)節(jié)缺乏有效的開源編譯代碼支撐,傳統(tǒng)的GCC 編譯器代碼較為復(fù)雜,很難要求學(xué)生在短期實踐環(huán)節(jié)掌握。從知識傳授到能力培養(yǎng)的轉(zhuǎn)換方法不足。本科編譯課程的教學(xué)內(nèi)容與實踐是“兩層皮”,教學(xué)內(nèi)容以教師傳授為主,理論知識缺乏與實際案例的結(jié)合,學(xué)生很難與實際使用的語言進行關(guān)聯(lián)理解,而實踐環(huán)節(jié)往往缺乏對開源編譯器的分析,實驗內(nèi)容面向簡單的虛擬語言,學(xué)生很難對熟悉的高級程序語言進行驗證性實驗。此外,本科編譯教學(xué)內(nèi)容繁多,涉及編譯各階段使用的多種模型和算法。學(xué)生不僅要學(xué)習(xí)語言學(xué)相關(guān)理論,而且還需要學(xué)習(xí)詞法分析方法、語法分析以及中間代碼生成和優(yōu)化等。這些模型和算法組裝成一個完整的編譯器系統(tǒng)變得非常困難,如果沒有開源編譯器和案例的支撐,學(xué)生很難在短時期內(nèi)將種類繁多的分析算法進行整合、調(diào)試和運行。最后,盡管當(dāng)前有些章節(jié)內(nèi)容對高級程序語言(如C++)的編譯實例進行了介紹,但不夠深入、系統(tǒng)和全面,缺乏面向開源編譯器的系統(tǒng)性知識體系組織,從而導(dǎo)致學(xué)生出現(xiàn)學(xué)習(xí)編譯原理沒有用的錯覺。綜上,當(dāng)前分片式的教學(xué)內(nèi)容組織難以滿足工程教育認(rèn)證所要求的提高復(fù)雜工程問題解決能力的要求[4-6],因此,如何圍繞這一目標(biāo)開展編譯原理課程教學(xué),是當(dāng)前編譯原理教學(xué)改革面臨的突出問題。
為學(xué)生達到“對本領(lǐng)域復(fù)雜工程問題具有分析、設(shè)計和實現(xiàn)等能力”的專業(yè)培養(yǎng)目標(biāo)奠定基礎(chǔ),具體目標(biāo)如下:
(1)使學(xué)生掌握職業(yè)生涯中反復(fù)用到的基礎(chǔ)理論和基本方法,以用于解決難度較大的問題,處理復(fù)雜系統(tǒng)的設(shè)計與實現(xiàn)。對于畢業(yè)要求一達成提供支撐。
(2)強化學(xué)生數(shù)字化、算法、模塊化等專業(yè)核心意識,對自頂向下、自底向上、遞歸求解、模塊化等典型方法的掌握,培養(yǎng)其包括功能劃分、多模塊協(xié)調(diào)、形式化描述、程序?qū)崿F(xiàn)等在內(nèi)的復(fù)雜系統(tǒng)設(shè)計實現(xiàn)能力。對于畢業(yè)要求一的達成提供支撐。
(3)培養(yǎng)學(xué)生選擇適當(dāng)?shù)哪P?,以形式化的方法去描述語言及其翻譯子系統(tǒng),將它們用于系統(tǒng)的設(shè)計與實現(xiàn)的能力。對于畢業(yè)要求一的達成提供支撐。
(4)使學(xué)生經(jīng)歷復(fù)雜系統(tǒng)的設(shè)計與實現(xiàn),培養(yǎng)其對多種方法、工具、環(huán)境的比較、評價和選擇能力。方法選擇:選擇實現(xiàn)詞法、語法分析的方法;實現(xiàn)途徑選擇:直接設(shè)計實現(xiàn)、使用某種自動生成工具設(shè)計實現(xiàn)(自學(xué));工具與環(huán)境選擇:使用的開發(fā)語言和環(huán)境;比較與評價:通過按組完成系統(tǒng)設(shè)計與實現(xiàn)培養(yǎng)學(xué)生團隊協(xié)作能力。學(xué)生需要在分工、設(shè)計、實現(xiàn)、口頭和書面報告等環(huán)節(jié)中相互協(xié)調(diào)、相互配合。對畢業(yè)要求二的達成提供一定的支撐。
基于以上分析,課程目標(biāo)的制訂見表1。
表1 課程目標(biāo)的制訂
面向工程教育認(rèn)證標(biāo)準(zhǔn),編譯原理課程以培養(yǎng)具有系統(tǒng)軟件開發(fā)與軟件工程實施能力的人才為導(dǎo)向[1-3]。重點培養(yǎng)具有以下3 方面素質(zhì)的人才:一是理論性的,主要是對編譯原理中模型的理解和運用;二是實踐性的,主要是分析掌握開源編譯器系統(tǒng)軟件的能力;三是應(yīng)用性的,主要利用編譯原理中的方法解決具體行業(yè)應(yīng)用問題的能力。為了實現(xiàn)工程教育認(rèn)證所要求的解決復(fù)雜工程問題的要求,選擇Clang+LLVM 編譯器組織教學(xué)。課程體系的構(gòu)建步驟如圖1 所示。
以Clang+LLVM 為例組織教學(xué),不僅可以讓學(xué)生更深刻地理解編譯器整體框架和編譯的一般流程,還能鍛煉學(xué)生獨立分析和改進編譯系統(tǒng)軟件的水平,開拓學(xué)生獨立承擔(dān)科研任務(wù)的能力。通過課程知識體系與案例的融合,并與完成任務(wù)的相關(guān)知識串接起來,呈現(xiàn)一條明確的學(xué)習(xí)線索,同時結(jié)合案例,強調(diào)課程的基本原理和方法。學(xué)生易于建立對編譯器的整體概念。通過典型案例引領(lǐng)、任務(wù)驅(qū)動學(xué)習(xí)模式設(shè)計,使課程學(xué)習(xí)貼近工作實際,學(xué)生學(xué)習(xí)興趣濃厚,通過任務(wù)來驅(qū)動學(xué)生知識構(gòu)建并提升編程和解決實際問題的能力。課程內(nèi)容系統(tǒng)性更強,經(jīng)典案例全面覆蓋這些重要知識點。根據(jù)課程的知識體系,學(xué)生根據(jù)周教學(xué)目標(biāo)對應(yīng)學(xué)習(xí)目標(biāo),并對新知識進行自主探究式學(xué)習(xí)。同時學(xué)生進行分組,進行團體協(xié)作學(xué)習(xí),共同完成項目任務(wù)。學(xué)生的團隊合作意識顯著提高,能力差的同學(xué)也能夠通過主動學(xué)習(xí)和小組交流提高編程能力,能夠完成要求的可視化編譯子程序。
該教學(xué)方法以工程教育認(rèn)證標(biāo)準(zhǔn)為導(dǎo)向,以開源案例為載體,形成開源案例與任務(wù)驅(qū)動結(jié)合的教學(xué)模式。根據(jù)教學(xué)內(nèi)容組織,提出學(xué)生學(xué)習(xí)目標(biāo)和學(xué)習(xí)任務(wù)。教師需要引導(dǎo)學(xué)生以任務(wù)為主線,對相關(guān)任務(wù)進行自主學(xué)習(xí),鼓勵學(xué)生協(xié)作,鍛煉團隊合作精神,共同完成任務(wù),以學(xué)生為主體進行師生互動,具體方式如下。
(1)教師通過案例引出任務(wù)和目標(biāo)。教師需要精心設(shè)計案例與任務(wù)的對應(yīng)關(guān)系,并細(xì)化各教學(xué)階段的任務(wù),通過理論介紹與引導(dǎo),對任務(wù)進行分工,同時要對每個階段的任務(wù)進行評價和總結(jié)。
(2)學(xué)生為主體完成任務(wù)。學(xué)生通過理論知識學(xué)習(xí)和教師引導(dǎo),明確各階段任務(wù),通過自主學(xué)習(xí)和協(xié)作學(xué)習(xí),分析研究各階段任務(wù),最后通過教師的評價反饋進行總結(jié)和提高。
LLVM 是一個完整的編譯器架構(gòu),也可以認(rèn)為它是一個用于開發(fā)編譯器、解釋器相關(guān)的庫,是構(gòu)架編譯器(compiler)的框架系統(tǒng)。Clang 是一個C++編寫、基于LLVM、發(fā)布于LLVM BSD許可證下的C/C++/Objective-C/Objective-C++編譯器。相比于傳統(tǒng)的GCC 編譯器,Clang 是一個高度模塊化開發(fā)的輕量級編譯器。以輕量級的Clang+LLVM 架構(gòu)組織教學(xué),不僅可以讓學(xué)生更深刻地理解編譯器整體框架和編譯的一般流程,還能鍛煉學(xué)生獨立分析和改進編譯系統(tǒng)軟件的水平,開拓學(xué)生獨立承擔(dān)科研任務(wù)的能力,具體步驟如下。
(1)面向開源編譯器的教學(xué)內(nèi)容的劃分。根據(jù)課程的知識體系,以Clang+LLVM 編譯器為平臺,以開源案例驅(qū)動的教學(xué)內(nèi)容組織為核心,將編譯器劃分為一個個模塊。
(2)局部到整體的教學(xué)內(nèi)容組織。LLVM 整體架構(gòu)中各個子模塊又相對獨立,分別對應(yīng)不同的具體子階段,既能給學(xué)生提供整體概念,又能通過具體的案例庫設(shè)計實現(xiàn)學(xué)生對編譯系統(tǒng)各階段功能的掌握。
(3)課堂教學(xué)與實踐環(huán)節(jié)的有機融合。在教學(xué)內(nèi)容劃分的基礎(chǔ)上,將每個子模塊與實踐環(huán)節(jié)相對應(yīng),明確學(xué)習(xí)和研究的目標(biāo)。
課程評價是工程教育認(rèn)證的重要組成部分。課程評價仍然要以學(xué)生產(chǎn)出為導(dǎo)向,分析目標(biāo)的達成度和改進措施。要綜合考慮學(xué)生在解決復(fù)雜工程問題過程中所體現(xiàn)的認(rèn)知、態(tài)度、表達、實踐能力等多方面因素。要重視過程評價,在任務(wù)驅(qū)動的基礎(chǔ)上,發(fā)揮學(xué)生的主體作用,提高學(xué)生完成任務(wù)的積極性,并根據(jù)完成的情況進行分析評價,從而改變過去以期末考試為單一的評價方式,變單一評價為綜合評價。真正充分發(fā)揮課程評價機制的反饋、導(dǎo)向和激勵功能,完成工程教育認(rèn)證的目標(biāo)。本課程采用過程考核和結(jié)課考試(閉卷)相結(jié)合的評價方式。教師根據(jù)課程進度安排課外作業(yè)和隨堂測驗等過程考核,過程考核成績占課程最終成績比例為30%,結(jié)課考試成績占課程最終成績比例為70%。最終成績按百分制給出,60 分為及格。課程目標(biāo)、考核內(nèi)容與評價方式見表2。
編譯技術(shù)課程平時成績由1 次隨堂測驗、3次課后作業(yè)和實驗環(huán)節(jié)組成,隨堂測驗的內(nèi)容包括有限自動機、正規(guī)表達式及正規(guī)文法理論;課程實驗主要考核詞法分析、語法分析和中間代碼生成的設(shè)計與實現(xiàn)。隨堂測驗、課后作業(yè)均按照百分制計分,每次各占平時成績的25%。
1)隨堂測試評定。
隨堂測驗教師課前出題、課堂考試、限時答題。采取了書面答題的形式,考試提交紙質(zhì)答案。具體評定標(biāo)準(zhǔn)見表3。
2)課后作業(yè)評定。
作業(yè)評定依據(jù)包括:①對問題的理解是否準(zhǔn)確,特別是解決問題的思路是否正確;②算法分析與分析表構(gòu)造是否正確,書寫是否準(zhǔn)確和規(guī)范。具體評定標(biāo)準(zhǔn)見表4。
表3 課堂測試評定標(biāo)準(zhǔn)
表4 作業(yè)評定標(biāo)準(zhǔn)
3)實踐環(huán)節(jié)評價。
在實驗教學(xué)環(huán)節(jié),同樣以Clang+LLVM 編譯器為平臺,通過對開源案例與實驗任務(wù)進行分階段的設(shè)計,把整個編譯階段劃分成一個個獨立的子任務(wù)。針對每個任務(wù),對學(xué)生進行分組,以工程項目的形式組織開發(fā)團隊,利用軟件工程管理方法對項目開發(fā)進行管理,設(shè)置學(xué)生在項目開發(fā)過程中的角色定位。在項目開發(fā)中鍛煉學(xué)生的自主開發(fā)能力、團隊協(xié)作能力、項目管理能力以及復(fù)雜工程問題解決能力,不僅可以加深對課堂知識的理解,而且能夠在解決問題中自主、探究和協(xié)作學(xué)習(xí),巧妙地把工程教育認(rèn)證標(biāo)準(zhǔn)與實驗教學(xué)環(huán)節(jié)相對應(yīng)。我們通過過程評價機制對實踐環(huán)節(jié)進行綜合評價,引導(dǎo)學(xué)生由易到難、由淺入深、由局部到整體逐步深入地掌握課程要求的知識體系和工程實踐能力。
面向工程教育認(rèn)證的編譯原理課程教學(xué)改革,推動了開源編譯器案例驅(qū)動的教學(xué)體系建設(shè),有力地促進了課程教學(xué)與工程實踐的深度融合,實踐證明能夠更有效地培養(yǎng)學(xué)生解決編譯器復(fù)雜工程問題的創(chuàng)新實踐能力。然而,需要注意的是,教學(xué)評價是整個工程教育認(rèn)證中的重要一環(huán),新的教學(xué)體系需要根據(jù)教學(xué)效果和達成度進行持續(xù)改進,促進教學(xué)質(zhì)量的不斷提升。