高雪瑤 張春祥


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