高雪瑤 張春祥
摘? 要:該文剖釋傳統(tǒng)編譯原理教學(xué)過程中存在的問題,在新工科和工程教育認(rèn)證背景下,面向OBE理念建立案例庫,充分利用多種教學(xué)平臺和線上、線下教學(xué)資源,綜合使用主動學(xué)習(xí)、啟發(fā)式教學(xué)、翻轉(zhuǎn)課堂等方法進行授課。以項目實踐為驅(qū)動,以案例分析為導(dǎo)引,提高學(xué)生自主學(xué)習(xí)能力,提升授課質(zhì)量,促使學(xué)生的計算機專業(yè)素質(zhì)得到全面發(fā)展。
關(guān)鍵詞:編譯原理;新工科;工程教育;案例庫;案例分析
中圖分類號:G642? ? ? 文獻(xiàn)標(biāo)志碼:A? ? ? ? ? 文章編號:2096-000X(2024)03-0064-04
Abstract: This paper analyzes the problems existing in traditional teaching process of Compiling Principles. Under the background of new engineering and engineering education certification, a case library is built facing OBE concept. Various teaching platforms, online and offline teaching resources are used, and active learning, heuristic teaching, flipped classroom and other methods are used for teaching. Driven by project practice and guided by case analysis, we aim to enhance students'self-learning ability, improve the teaching quality, and promote comprehensive development of students'computer professional qualities.
Keywords: Compiling Principles; new engineering; engineering education; case library; case analysis
編譯原理是計算機專業(yè)培養(yǎng)計劃中的一門核心專業(yè)課程,旨在培養(yǎng)學(xué)生系統(tǒng)分析和軟件設(shè)計的能力,培養(yǎng)學(xué)生的實際動手能力。在新工科和工程教育認(rèn)證背景下[1-2],編譯原理教學(xué)過程必須以學(xué)生為中心,鞏固理論知識,加強實踐教學(xué),注重學(xué)生創(chuàng)新意識的培養(yǎng)。為了達(dá)到新工科人才培養(yǎng)目標(biāo)[3],必須對編譯原理的教學(xué)方法和教學(xué)模式進行改革,以案例和項目實踐為導(dǎo)向,將案例教學(xué)和項目實踐教學(xué)貫穿于整個編譯原理知識的傳授過程之中,使學(xué)生更好地掌握編譯技術(shù),為今后工作打下堅實的基礎(chǔ)。
一? 傳統(tǒng)編譯原理教學(xué)中存在的問題
編譯原理是計算機專業(yè)的主干課程,也是后繼課程的基礎(chǔ)。編譯原理是一門很有用的課程,在項目開發(fā)、科學(xué)研究中都很有用處。
編譯原理課程的教學(xué)內(nèi)容豐富,理論十分抽象,能夠培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)倪壿嬎季S。此外,編譯原理除了有自身的一套完整的理論體系之外,還包含大量的理論知識,諸如形式語言與自動機、離散數(shù)學(xué)中的圖和大量重用的算法等。對于本科生而言,學(xué)習(xí)這些理論知識本身就具有一定的難度,更不要說再學(xué)好其上層的編譯原理知識了。
此外,編譯程序是一個大型的且十分復(fù)雜的軟件系統(tǒng)。在實現(xiàn)編譯程序時需要涉及到多門課程,例如,C++程序設(shè)計語言、算法、數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學(xué)和軟件體系結(jié)構(gòu)等。其實踐的綜合性與連貫性都很強,學(xué)生實驗和實踐的難度都很大。目前,很多教師對編譯課程的實驗和實踐環(huán)節(jié)重視不夠,在安排編譯原理的項目實踐和實驗時也比較隨意,從而導(dǎo)致學(xué)生學(xué)習(xí)效果很差。
二? 面向?qū)嵺`教學(xué)的編譯原理課程改革
根據(jù)新工科建設(shè)理念和面向工程教育認(rèn)證的要求,哈爾濱理工大學(xué)計算機科學(xué)與技術(shù)專業(yè)積極開展編譯原理課程的教學(xué)改革工作。根據(jù)新工科人才培養(yǎng)的要求,課程組建設(shè)了編譯原理案例庫,構(gòu)建了基于項目實踐的編譯原理教學(xué)模式,給出了融合多種教學(xué)資源和教學(xué)方法的編譯原理授課模式,提供了融合線上、線下資源的編譯原理課程評價體系。
(一)? 編譯原理教學(xué)案例建設(shè)
編譯原理是一門原理性和實踐性都很強的課程,應(yīng)以學(xué)生為中心,根據(jù)學(xué)生的知識基礎(chǔ)和個人興趣,設(shè)計教學(xué)案例[4-5]。編譯原理主要講述了編譯器的實現(xiàn)技術(shù),主要涉及詞法分析器、語法分析器、句法分析器、中間代碼生成與優(yōu)化器和目標(biāo)代碼轉(zhuǎn)換器等幾個部分。梳理編譯原理的課程體系,抽出所有的知識點,理清知識點之間的關(guān)聯(lián)關(guān)系。針對每一個知識點,設(shè)計一個教學(xué)案例。所設(shè)計的案例應(yīng)該是短小精悍的,既能夠反映出知識點所包含的教學(xué)內(nèi)容,又便于學(xué)生實現(xiàn)。合理安排教學(xué)案例的順序,講解案例。通過這些案例啟發(fā)學(xué)生主動思維,介紹案例背后的相關(guān)編譯理論和實現(xiàn)技術(shù)。通過講解案例,能夠?qū)⒕幾g原理的知識點形象地呈現(xiàn)在學(xué)生面前。在剖析案例的時候,應(yīng)該由“表”及“里”地分析,逐層撥開問題的表象,引出問題的本質(zhì),歸結(jié)到對應(yīng)的編譯知識點上。講解編譯知識點的運用過程,給出案例的求解過程,使學(xué)生掌握運用編譯技術(shù)來實現(xiàn)案例的全過程[6]。
編譯器的設(shè)計宜采用管道過濾器模式,即一個部分處理一項任務(wù),一個階段的輸出是另一個階段的輸入。編譯原理的所有知識點可以圍繞編譯器各個部分進行歸納,所有案例應(yīng)該按照各個部分的知識點進行組織。根據(jù)編譯原理課程的知識體系結(jié)構(gòu)圖,繪制出案例的組織結(jié)構(gòu)圖。分析知識點之間的上下位關(guān)系,將對應(yīng)的案例進行有機組織。對于關(guān)系緊密的知識點,應(yīng)該分析其之間的關(guān)聯(lián)關(guān)系,設(shè)計一個案例將所有知識點囊括進去。編譯原理重要知識點之間的關(guān)聯(lián)關(guān)系,如圖1所示。對于正規(guī)式、正規(guī)文法、NFA、DFA和NFA的確定化和DFA的最小化這些知識點,存在著相互的關(guān)聯(lián)關(guān)系,可以設(shè)計一個案例來講解這幾個知識點,讓學(xué)生掌握正規(guī)式、正規(guī)文法、NFA之間的轉(zhuǎn)換過程,NFA的確定化過程和DFA的最小化過程。將LL(1)文法的判定過程分解為FIRST集計算、FOLLOW集計算和Select集計算,可以設(shè)計一個運算較多的案例來講解這幾個知識點,讓學(xué)生弄清楚和掌握LL(1)文法的判定過程。LR(0)文法需要構(gòu)造LR(0)分析表,建立LR(0)分析表需要構(gòu)造識別文法活前綴和可歸前綴的NFA。在構(gòu)造識別文法活前綴和可歸前綴的NFA時,主要的方法包括:從特殊到一般的構(gòu)造方法、活前綴和可歸前綴的一般計算方法和項目集規(guī)范族構(gòu)造法。因此,設(shè)計一個LR(0)文法,通過使用3種不同方法來構(gòu)造其分析表,讓學(xué)生掌握LR(0)文法的判定、分析表的構(gòu)造和句子屬于文法的判別過程。
編譯原理的案例設(shè)計應(yīng)該是一個復(fù)雜且系統(tǒng)化的工程。需要借鑒其他課程案例設(shè)計的優(yōu)秀經(jīng)驗,最終形成精簡、行之有效、系統(tǒng)和全面的案例庫。在學(xué)習(xí)過程中,讓學(xué)生有針對性地主動地去學(xué)習(xí)解決案例所需要的編譯技術(shù),使學(xué)生自主地從各種資料中去學(xué)習(xí)編譯原理的相關(guān)知識點。
在教學(xué)過程中,首先描述案例所涉及的問題,然后介紹解決案例所使用的相關(guān)的編譯技術(shù)。讓學(xué)生對案例進行分析、討論和復(fù)現(xiàn),掌握案例的求解過程。同時,讓學(xué)生對現(xiàn)有案例進行擴展、改進和創(chuàng)新。每個學(xué)生都要針對現(xiàn)有的知識點,去設(shè)計一個獨有的案例。讓學(xué)生對自己設(shè)計的案例進行分析、講解和剖析,總結(jié)出自己特有的部分。通過對比所有學(xué)生設(shè)計的案例,尋找更好的、更具有代表性的和更典型的案例來擴充教學(xué)案例庫。
(二)? 基于項目實踐的編譯原理教學(xué)
以線上、線下教學(xué)資源為基礎(chǔ),指導(dǎo)學(xué)生開展編譯原理項目實踐,提高學(xué)生的學(xué)習(xí)成效[7]。編譯原理的主要知識內(nèi)容包括:語言和文法、詞法分析、語法分析、語法制導(dǎo)翻譯、中間代碼生成、存儲管理、代碼優(yōu)化和目標(biāo)代碼生成。編譯器的實現(xiàn)代碼主要包括:詞法分析模塊、語法分析模塊、語義分析模塊、中間代碼生成模塊、目標(biāo)代碼生成模塊、錯誤管理模塊和表格管理模塊。知識點與編譯器的模塊相對應(yīng)[8]。在學(xué)習(xí)編譯原理之前,所有的學(xué)生都已經(jīng)學(xué)習(xí)了C++語言。從編碼和執(zhí)行效率角度看,C++是一門實現(xiàn)編譯器的理想語言。學(xué)生在實現(xiàn)編譯器的同時,不僅能夠掌握編譯技術(shù),還能熟悉練習(xí)C++語言。讓學(xué)生全程參與編譯器項目的開發(fā)過程,突出“做中學(xué)習(xí)、做為學(xué)習(xí)、做即是學(xué)習(xí)”的思想,將編譯原理中難以理解的邏輯和算法融入到學(xué)生能體會、能感受的具體系統(tǒng)代碼中,變枯燥的學(xué)習(xí)過程為有趣的發(fā)現(xiàn)和創(chuàng)造過程,激發(fā)學(xué)生的好奇心,培養(yǎng)學(xué)生的創(chuàng)造潛力。隨著編譯課程的講解,整個項目分階段實施。每一階段都有具體的實現(xiàn)模塊與代碼,讓學(xué)生能從運行起來的工具上去學(xué)習(xí)和感受編譯技術(shù)。從實際應(yīng)用講解知識點,讓學(xué)生給出編譯器的設(shè)計方案并開發(fā)自己的編譯器,嘗試在解決問題的過程中運用知識,從而達(dá)到學(xué)習(xí)知識的目的。
在項目實施過程中,分為項目實施前、項目實施中和項目實施后三個階段。利用騰訊會議、慕課堂、QQ群等線上課堂發(fā)布項目實踐要求和知識點預(yù)習(xí)及討論話題,引導(dǎo)學(xué)生自主學(xué)習(xí)。同時,教師提出編譯器項目需求。根據(jù)學(xué)生掌握知識的程度和編程能力的優(yōu)劣進行分組,并選擇一名組長負(fù)責(zé)本組學(xué)生活動的調(diào)度安排和任務(wù)分配。每一組設(shè)計開發(fā)一個編譯器。教師整理項目實踐教學(xué)案例,分析教學(xué)原則,整合教學(xué)過程,實現(xiàn)學(xué)習(xí)與實踐的有機結(jié)合。根據(jù)課前項目需求,各組分階段進行設(shè)計開發(fā)。學(xué)生參考線上提供的教學(xué)資源,進行設(shè)計開發(fā)。整個開發(fā)過程要嚴(yán)格遵守軟件工程的流程,即需求分析、概要設(shè)計、詳細(xì)設(shè)計、代碼實現(xiàn)和測試。組內(nèi)所有的學(xué)生都要參與其中。在整個實施過程中,教師可以講解教學(xué)案例來為學(xué)生的設(shè)計開發(fā)作知識準(zhǔn)備。對項目需求進行整體分析,對涉及的重點難點進行講解。對各個小組的實際進度情況進行跟蹤指導(dǎo),及時解決項目實施過程中學(xué)生遇到的各種問題,如果出現(xiàn)共性問題,作統(tǒng)一分析講解。課程組每周召開教學(xué)研討會,根據(jù)學(xué)生項目實施的情況,及時調(diào)整教學(xué)方法和教學(xué)內(nèi)容。在項目結(jié)束之后,通過答辯檢查各組的成果。每組選擇一名同學(xué)講解自己編譯器的設(shè)計開發(fā)情況。教師通過提問了解項目完成情況和每一個學(xué)生所作的工作,并給出成績。
通過項目實踐,堅持“教、學(xué)、做”一體化教學(xué)模式,將教學(xué)過程“以教師為主”轉(zhuǎn)變?yōu)椤耙詫W(xué)生為中心”。學(xué)生通過設(shè)計開發(fā)編譯器,根據(jù)需要自主學(xué)習(xí)編譯技術(shù)的相關(guān)知識,將所學(xué)到的知識用于構(gòu)建編譯器,能從具體代碼去直觀地理解編譯過程,從而使學(xué)生更好地掌握和應(yīng)用編譯知識。同時,在整個項目實施過程中,鍛煉了學(xué)生項目開發(fā)能力和編程能力。
(三)? 融合線上、線下多種教學(xué)資源的編譯原理授課模式
案例能夠讓學(xué)生掌握編譯原理細(xì)微的知識點,項目則能讓學(xué)生在編譯器的構(gòu)建過程中將散落的知識點集成起來,形成整個知識體系結(jié)構(gòu)。一個是微觀的,一個是宏觀的,二者相互呼應(yīng),相互補充。應(yīng)該充分利用線上、線下多種教學(xué)平臺,來提高教學(xué)質(zhì)量。在授課過程中,采用主動學(xué)習(xí)、翻轉(zhuǎn)課堂、啟發(fā)式教學(xué)、案例教學(xué)和項目驅(qū)動教學(xué)等多種授課方法[9-10]。在班級課程群中,分享編譯知識點的相關(guān)案例。課前,要求學(xué)生自主學(xué)習(xí)這些案例。學(xué)生通過查閱資料,去尋找解決這些案例的相關(guān)編譯知識。通過問題倒推的方式,去學(xué)習(xí)編譯知識。帶著問題去學(xué)習(xí)編譯原理知識,會更有針對性、目標(biāo)性和方向性。在課堂上,采用翻轉(zhuǎn)課堂授課方式,讓學(xué)生介紹案例,闡述案例所關(guān)聯(lián)的知識點。讓學(xué)生使用知識點去求解案例,給出案例求解的完整過程。教師對學(xué)生的講解過程進行點評,指出其中的不足,給出改進意見。課后,要求學(xué)生重新實現(xiàn)案例,掌握編譯原理的相關(guān)知識點。
編譯原理課程的一個重要特點是理論與實際緊密結(jié)合,教學(xué)內(nèi)容中的很多知識點直接可通過編程實現(xiàn)作為編譯器的一個組成部件。編譯器包括:詞法分析部件、語法分析部件、句法分析部件、中間代碼生成部件、中間代碼優(yōu)化部件和目標(biāo)代碼生成部件。需要梳理編譯器各個組成部件與案例之間的對應(yīng)關(guān)系。
將案例按照編譯器組成部件進行組織。在同一個編譯器組成部件下,明確案例之間的先后關(guān)系,確定案例之間的上下位次序。畫出編譯器組成部件與案例、知識點之間的關(guān)聯(lián)關(guān)系。讓學(xué)生上機通過編程實現(xiàn)案例對應(yīng)的程序代碼。通過組裝案例代碼一步步地實現(xiàn)編譯器的組成部件。在授課過程中,采用啟發(fā)式引導(dǎo)、案例教學(xué)法、分析對比法和項目驅(qū)動法引導(dǎo)學(xué)生一步步地實現(xiàn)編譯器的組成部件。通過演示程序,給學(xué)生以直觀的印象。在演示詞法分析部件時,讓學(xué)生觀察它是如何將源程序劃分為單詞序列的;在演示語法分析部件時,讓學(xué)生觀察它是如何指出源程序中的語法錯誤的;在演示中間代碼生成部件時,讓學(xué)生觀察它是如何將源代碼轉(zhuǎn)化為三元組的形式;在演示中間代碼優(yōu)化部件時,讓學(xué)生觀察它是如何精簡三元組的;在演示目標(biāo)代碼生成部件時,讓學(xué)生觀察它是如何將三元組轉(zhuǎn)換成目標(biāo)代碼的。當(dāng)編程實現(xiàn)所有組成部件之后,通過組裝就構(gòu)建了高級程序語言的編譯器。通過演示編譯器,讓學(xué)生了解源程序代碼轉(zhuǎn)化為目標(biāo)程序代碼的全過程。在整個項目實施過程中,通過翻轉(zhuǎn)課堂讓學(xué)生自主設(shè)計實現(xiàn)編譯器。采用啟發(fā)式教學(xué)手段,讓學(xué)生將編譯任務(wù)分為一個個的案例,然后將案例轉(zhuǎn)化為知識點進行實現(xiàn)。在編譯器實現(xiàn)過程中,利用項目驅(qū)動教學(xué)手段,引導(dǎo)學(xué)生帶著問題去主動學(xué)習(xí)編譯原理的相關(guān)知識點與技術(shù)。采用討論教學(xué)方法,讓學(xué)生參與課程的學(xué)習(xí)過程。編譯項目、案例與教學(xué)方法之間的關(guān)系如圖2所示。
三? 融合線上、線下資源建立編譯原理課程評價體系
MOOC平臺提供了很多編譯原理的教學(xué)和實踐課程,學(xué)生可以從中獲取自主學(xué)習(xí)的資料。在每一段教學(xué)和實踐視頻之后,都有小測,可以要求學(xué)生在學(xué)習(xí)之后作答。教師利用MOOC堂的統(tǒng)計功能實時觀察學(xué)生觀看教學(xué)和實踐視頻的情況,觀察學(xué)生小測成績,客觀地度量每一個學(xué)生的課前學(xué)習(xí)成效。為每一個學(xué)生建立一個課前學(xué)習(xí)成績單。根據(jù)每次課前學(xué)習(xí)的成績,及時調(diào)整授課內(nèi)容和授課方式。
課堂上,根據(jù)聽課情況和學(xué)習(xí)反饋情況,為每一個學(xué)生建立一個課堂學(xué)習(xí)成績單。減少期末考試環(huán)節(jié)所占的比重,增加平時環(huán)節(jié)、實驗環(huán)節(jié)和實踐環(huán)節(jié)的占比。增加過程性考核的次數(shù)。在實驗環(huán)節(jié)中,細(xì)化實驗過程的考核,不止考察最終的實驗結(jié)果,更注重階段性考核,考察學(xué)生對每一個知識點掌握的情況。在實踐環(huán)節(jié)中,注重學(xué)生的項目設(shè)計和程序編寫能力的考核。通過答辯的形式,考查學(xué)生編譯器體系結(jié)構(gòu)的設(shè)計情況。通過程序演示和代碼講解,考查學(xué)生編程語言的掌握情況。同樣,在項目實踐考核中,也要增加過程性考核和考核的次數(shù),進一步細(xì)化學(xué)生對知識點掌握程度的考察。
課后,要求學(xué)生完成MOOC平臺上所發(fā)布的測試試題,來考核學(xué)生課堂的學(xué)習(xí)成效。課后測試應(yīng)該在每節(jié)課后都進行一次,測試題的數(shù)量大,覆蓋的課程知識點要多,試題的類型要多元化。同時,要定期安排一次階段性的課后大考,以檢驗學(xué)生的整個學(xué)習(xí)情況。為每一個學(xué)生建立一個課后學(xué)習(xí)成績單。
綜合課前學(xué)習(xí)成績單、課堂學(xué)習(xí)成績單和課后學(xué)習(xí)成績單,來為每一位學(xué)生打一個分?jǐn)?shù)。在課程成績考核時,應(yīng)該鼓勵學(xué)生多參加“藍(lán)橋杯”、ACM大賽和大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽,以提高學(xué)生的動手能力,并將大賽成績適度地計入學(xué)生平時成績之中。
期末考試所出的試題類型要多,覆蓋知識點要廣。盡量出一些答案不唯一的題目,以提高學(xué)生的創(chuàng)新能力。
四? 結(jié)束語
本文通過分析編譯原理教學(xué)中存在的重理論輕實踐的問題,為適應(yīng)人才培養(yǎng)的需要,建設(shè)了編譯原理案例庫。以開發(fā)編譯器項目為驅(qū)動,為案例分析為導(dǎo)引,設(shè)計了一種基于項目實踐的編譯原理新型教學(xué)方法。給出了融合線上、線下多種教學(xué)資源和多種教學(xué)方法的編譯原理授課模式,建立了編譯原理課程評價新體系。
參考文獻(xiàn):
[1] 楊志斌,周勇,王立松.面向航空航天特色新工科的編譯原理教學(xué)改革探索[J].軟件導(dǎo)刊,2021,20(10):232-235.
[2] 趙曉,孫連山.聚焦培養(yǎng)工程能力的編譯原理實驗教學(xué)改革[J].電腦與電信,2023(Z1):8-11.
[3] 諶志群,王榮波,黃孝喜.新工科背景下編譯原理課程工程案例設(shè)計[J].計算機時代,2020(12):91-93,96.
[4] 張卓.互動式案例教學(xué)法在“編譯原理”中的應(yīng)用[J].工業(yè)和信息化教育,2021(2):61-65.
[5] 計衛(wèi)星,王貴珍.基于開源社區(qū)的編譯原理課程構(gòu)建[J].中國大學(xué)教學(xué),2021(Z1):46-53.
[6] 韓敬利,夏青,宋麗華,等.基于函數(shù)式編程的編譯原理理實一體化“金課”建設(shè)[J].計算機教育,2023(2):44-48.
[7] 韓玉艷,王玉亭,李成友.淺談編譯原理“互聯(lián)網(wǎng)+”線上多樣化教學(xué)[J].大學(xué)教育,2021(7):95-97.
[8] 張昱,黃奕桐.編譯原理課程的在線綜合性軟件實踐構(gòu)建與實施[J].計算機教育,2021(4):41-45,50.
[9] 劉洪娟,宋經(jīng)平,韓春燕.編譯原理慕課建設(shè)與混合式教學(xué)設(shè)計[J].計算機教育,2020(4):98-101.
[10] 楊旭.新工科背景下基于混合式教學(xué)的編譯原理課程教學(xué)改革探析[J].計算機產(chǎn)品與流通,2019(12):225.