計衛星 王貴珍



摘 要:目前我國高等教育從規模擴展全面轉向內涵式發展,改進培養模式和方法,提高各領域人才培養質量,一流課程建設是關鍵之舉。本文詳細闡述了在“云大物智”等新技術快速演進的新時期如何基于開源社區構建編譯原理研究型課程,具體包括在現有研究型課程定義的基礎上進一步明確研究型課程的具體特征,說明基于開源社區構建編譯原理研究型課程的原因和具體方案,結合基于問題的學習和U型七步法給出教學組織與實施的具體步驟,最后通過實踐說明方案的可行性。
關鍵詞:編譯原理;課程建設;開源生態;人才培養
一、引言
經過長時間的積累和孕育,中國的芯片制造和系統軟件研發步入了一個新的歷史發展階段,各種國產芯片呈現百花齊放的良好局面,不僅出現了面向服務器、桌面系統和智能終端的各類芯片,而且部分企業也已經制訂了“生產一批、研制一批、規劃一批”的長遠發展路線圖。雖然大部分芯片的研制基于已有的指令架構,并且融合了開源資源,但是正在逐漸形成具有自身特色和差異性的產品體系。芯片和系統軟件也逐步向開源靠攏,產學研正在大力推動開源社區的建設和發展。在此基礎上,源于國內的開源協議和代碼托管平臺逐漸走進普通開發者的視野。從整體上看,國產芯片和系統軟件正在融合形成一體化開發生態的良好趨勢,部分頭部IT企業更加重視人才生態體系建設的重要性,不斷加大資源投入,加速構建和形成產學研一體化的開源人才生態。
在此背景下,隨著智能技術的不斷發展和受國際形勢的影響,編譯器及其社區建設也正在逐漸發生改變。例如華為公司開源了部分方舟編譯器的源碼,并大力打造基于方舟和鴻蒙系統的開源社區。人工智能技術的發展,特別是深度神經網絡及大量加速芯片的出現,推動了TVM等開源項目的創建和不斷發展。各大公司也在基于自己的芯片設計和實現支撐智能應用快速構建的工具鏈軟件,量子計算機的不斷突破推動相關編程語言和仿真工具的快速發展。程序設計語言和編譯理論與技術也迎來了在新的歷史時期再次發展和應用的新機遇。與傳統編譯技術相比,目前以及將來的需求與應用貼合得更加緊密,并且面向的問題也更加抽象和復雜,這就對編譯人才的培養提出了新的需求。
首先,編譯人才的培養應緊跟時代發展和技術進步,注重應用的引領發展作用。隨著“云大物智”的不斷發展和成熟,應用不僅驅動了計算機體系架構的發展變化,也逐步在影響系統軟件的地位和作用。關注應用的發展和未來趨勢,能夠預先布局人才培養,引領技術發展。例如量子計算正逐步走進大眾視野,面向量子計算機的編程語言和工具鏈也逐步成為大家關注的熱點。
其次,編譯人才的培養應面向產業需求,走產學研相結合的發展路線,讓“所學即所用”更早地貫徹到教學過程中。直接面向產業實際需求,讓學生能夠直觀地感受學習的有用性和實用性。同時要讓“科研引領教學”成為潮流,培養學生的超前創新意識以及引領技術發展和進步的領導和責任意識。
最后,編譯人才的培養要面向現實,直面課堂學習和工程實踐之間的差異性。教學的組織實施面臨眾多的問題,這些問題既有整體設計、全局規劃不到位的原因,也有資源受限、時間和空間受限的實際情況,如何調和二者之間的矛盾是解決問題的關鍵。
滿足產業需求是整體教學設計的基礎和出發點,科教融合是核心理念,產學協同是教學組織實施的具體路線。本文基于開源生態,探討編譯原理研究型課程的革新方案,考慮到學生學習特點和時間特點,提出基于開源社區的編譯課程建設與人才培養方案,兼顧學校理論學習與工業強度訓練,實現創新與實踐相結合,形成具有特色的編譯人才培養路徑。
本文首先對研究型課程的基本概念和內涵進行闡述,接下來討論基于開源社區進行研究型課程建設以及編譯人才培養的優勢與特點,而后詳細闡述對應的課程教學方案設計與實施方式,最后通過一學期的教學實踐對所提出的方法進行驗證。
二、研究型課程內涵
行為主義、認知主義、建構主義和人本主義是教育心理學的四種代表流派,其中建構主義認為學習的過程是學習者主動建構知識的過程,學習是建構內在心理表征的過程,學習者并不是把知識從外界搬到記憶中,而是以原有的經驗為基礎,通過與外界的相互作用來建構新的理解。因此學習活動不是由教師單純向學生傳遞知識,也不是學生被動地接受信息的過程,而是學生憑借原有的知識和經驗,通過與外界的互動,主動地生成信息內在表示的過程。建構主義的主要應用是探究式學習,亦即研究型教學。研究型教學首先是一種新型的教學模式。所謂教學模式,就是在一定教學思想指導下,為實現教學目標而建立的比較穩定的教學操作程序及理論化的教學結構[1]。
目前關于研究型教學并沒有統一的認識[2-4],其中文章[5]給出的具體定義為:“以課程內容和學生的知識經驗為基礎,在教學過程中選擇恰當的科學問題為載體,以學生為中心創設情境,引導學生充分參與、主動探究,使學生能夠自主地發現問題、研究問題和解決問題,并從中體驗資料收集、方案設計、方案研討、實驗驗證、得出結論完整的科學研究過程,進而學習科學知識、掌握研究方法,并培養其創新能力和探究精神。”文章[6]認為研究型教學模式則是以知識傳授為依托,以能力培養為主要內容,把學習、研究、實踐有機結合以引導學生深度參與、主動發揮創造性地運用知識和能力,自主地發現問題、研究問題和解決問題,在研討中積累知識、培養能力和鍛煉思維,同時養成科學研究的精神和科學態度,以培養高層次、復合型、多樣化的高素質創新型人才的一種教學模式。文獻[7]也給出了類似的定義。
沈其華等人對近年一項面向二十多所研究型大學的調研結果進行分析,梳理了這些研究型大學課程改革的主要議題和重點,總結了5個關鍵詞,它們分別是:科教融合、學術素養、學科交叉、國際聯結和社區參與。其中科教融合要求在微觀的課程設計和教學實施層面,建立以科研成果為主導的教學、以科研方法訓練為導向的教學、基于科研項目的教學和由教學研究支撐的教學等幾個路徑,使得科研項目不再游離于專業核心課程之外;學術素養主要指的是學術寫作和表達交流的能力,學術素養的培養主要體現為在專業的主干、核心課程中打造相關的閱讀、寫作與表達訓練模塊;學科交叉則主要是指部分學校對于本科生交叉學科學習的有效性進行了自審,對如何保持課程深度與廣度之間的平衡展開了討論;國際聯結主要強調培養“全球公民”意識,提高所有在校生的跨文化意識和技能;社區參與是指大學通過和地方以及國家組織、社團和社區的合作,拓展活動和影響邊界、進行知識傳播與創造,許多大學都認識到,從本科教學和學生發展的角度,社區參與能夠培養學生的社會責任心,提高其應用知識、解決復雜實踐問題的能力,促進全面發展,以及提供潛在的就業創業機會等[8]。這是對課程觀察的結果,從其中的論述不難發現,科教融合與學術素養其實對應著問題導向的教學模式,國際聯結和社區參與在問題的解決方式和參與深度上給出了具體的要求。
關于研究型教學的設計與組織實施,文章[5]同樣也提出課程教學應以PBL(Problem Based Learning)策略為主線,以“專題研討”和“案例研討”為主要教學方法,并將有助于開展研究型教學的多種啟發式、互動式教學方法有機結合。無論是“專題研討”,還是“案例研討”,都是以問題為先導,由問題的解決而引發討論。因此,在授課過程中結合課程內容精心創設情境引出問題,注重培養計算思維和創新能力,幫助學生學會如何學習,符合研究型教學理念,有效地提高了課堂教學效果和課程教學質量。關于問題的研討過程,文章[9]提出了U型七步探究法,老師充當教練,學習中的問題可以由老師事先設定或者從討論組中征集,然后指定某組一位學生作為案主,依次進行“定題(確定問題)、躬問(提出問題)、探究(討論問題)、定見(找出真正的問題)、解析(解決問題)、反思(自己是否存在這樣的問題)、心得(本次收獲)”這七步,使每個學生都能在U型七步探究中獲得受益。
綜上所述,我們發現研究型課程是以知識傳授為依托,以培養學生的創新能力和探究精神為主要目標,通過創設情境和提出問題,引導學生充分參與、主動探究,學習科學知識,掌握研究方法,培養能力和鍛煉思維,養成科學研究的精神和科學態度的一種教學模式。科教融合、學科交叉、國際聯結和社區參與是研究型課程應具有的基本特征。
三、基于開源社區的編譯原理研究型課程設計
軟件的開源運動始于對專有代碼限制的回應,是一種分散的軟件開發模式,鼓勵開放式協作。隨著互聯網的興起,開源軟件得到快速的發展,許多大型企業和機構紛紛支持開源運動的發展。開源社區是一個由來自世界各地的貢獻者組成的松散的、臨時的社區,社區成員對滿足一個共同的需求有著共同的興趣,使用一個高效的協作開發環境完成從小型項目到大型項目的開發,并且組織架構和協作方式隨著時間的推移逐步形成。例如,github是全球知名的開源項目托管平臺,目前有4000萬名活躍開發人員,2018年10月到2019年10月總計有4400萬個新項目創建,這其中包括170萬名在校學習的學生。目前有3.1萬名教師使用github向學生講授實際生產環境中的開發流程,并且這一數字在快速增長中。開源項目的參與者通常是全球各地的維護者、開發人員、研究人員、設計者、寫作人員以及其他類型的人員,平均情況下,github上每個項目有來自41個國家和地區的貢獻者參與。開源項目之間也存在著廣泛的關聯,最流行的50個項目平均每個被360萬個項目使用[10]。
目前大部分高級程序設計語言的實現從一開始就是開源的,現在能夠從開源社區獲取到的高級程序設計語言實現包括C/C++,Java,Ruby,Haskell,Python,Go,Rust等,并且同一個高級程序設計語言可能存在多個開源項目的不同實現,例如Ruby有C語言版本的、Java版本的以及基于.net版本的。Python對應有Cpython,Jython,IronPython和PyPy等。基于開源社區進行編譯原理研究型課程建設有眾多優勢,主要包括:
·開源項目大多是計算機科研成果的實現載體,也易于科研成果的植入和再現,例如LLVM是一個研究項目,后來逐漸演化為工業級的編譯器;
·開源項目源碼和文檔易于獲取,具有活躍的開放社區,方便學生獲取資源和與社區互動;
·開源社區代表著先進技術發展的趨勢,學習和探究開源項目易于向工業強度項目過渡;
·開源項目已有建設基礎,方便問題的設置以及構建增量型的探究問題,減少了對學時的要求;
·優秀的學生學習成果能夠在開源社區共享,提高學生的參與感和成就感,推動開源項目的持續發展,培養學生的開源意識;
·開源社區是一個開放的國際型社區,多方多員參與,能夠提升國際視野,培養開源意識。
因此,基于開源社區構建的編譯原理研究型課程能夠滿足科教融合、國際聯結和社區參與等基本特征。以開源項目為參與和探究對象,在具體操作上,結合教學內容又分為4個不同的層次設置研究問題,包括分析現有開源項目的工作原理和實現技術路徑,發現現有開源系統中存在的問題并提出改進建議,基于現有開源系統的問題進行增量設計與實現,創建有影響力的可持續發展的開源項目。目前玩具型教學實踐一直受到工業界的質疑,但是在實際教學過程中實施工業強度的教學實踐又存在眾多的困難。首先是教學學時非常有限,沒有足夠的時間從頭開始構建工業強度的實際項目;其次,工業強度的項目難度比較高,不適合于所有的學生學習和實踐。因此通過不同層次的分解和組織能夠覆蓋不同學生群體,以學生為中心實現個性化培養。
結合研究型課程的定義以及基于問題學習的方法,依托開源社區進行研究型課程建設的主要思路如圖1所示。首先,場景創設與問題設計要從課程教學內容出發,結合身邊的熱點事件和現象,充分考慮和利用開源資源進行構建。一方面,結合身邊的熱點事件能夠激發學生的學習興趣,提高解決實際問題的能力;另一方面,以開源社區為依托,能夠使得問題的研究與實踐更接地氣,易于在有限的學時內完成教學組織和實施,也能使學生更早接觸開源社區,培養開源精神。其次,在具體教與學的過程中,課程教學和問題研究都是以問題為中心,課程教學重在介紹問題的起源、發展與現狀,從知識體系和問題解決思路上進行引導;而問題研究則以某個開源項目為依托,重在學習和閱讀相關文檔和源碼,自我學習、思考與動手實踐,與開源社區的交互、討論與合作等方面。最后,問題的研究成果作為課程評價的一部分計入課程成績,而這也能反過來有效推動研究成果的產出。更為重要的是,學生對特定問題的研究與實踐成果可以反饋到開源社區,例如提交最新發現的bug,為開源項目編制文檔,在開源項目的基礎上貢獻新的代碼,甚至創建新的開源項目并持續建設。這些提交的內容一旦被開源社區所接受,將極大地激勵學生對相關問題的進一步學習和探討。
針對編譯原理課程的具體教學內容,大量的開源項目貫穿整個編譯教學過程,這里既有重量級的項目(例如GCC和LLVM),也有輕量級的(例如lcc和Vlint等)。以Soot為例,Soot是一個Java代碼分析框架,現在隨著Soot的不斷優化改進,Soot已經成為一個廣泛應用于Java 程序分析和優化的通用框架。Soot提供4種類型的代碼中間表示形式:Baf,Jimple,Shimple和Grimp。基于Soot框架,能夠方便地完成全局方法調用圖的構建,結合其IFDS數據流分析框架,可以完成到達定值等數據流問題的實現,進一步拓展可以在全局方法調用圖和數據流分析的基礎上基于該框架構建代碼缺陷分析工具。由于空間有限,圖2僅僅羅列了很少部分開源項目。如前所述,每個語言幾乎都能找到開源實現,并且存在非常多的編譯分析框架和工具,其他開源項目也可以成為編譯分析和優化的對象,因此實際可用的開源項目遠遠超出圖中所列的部分。
四、編譯原理研究型課程實施方案
針對編譯原理教學目標和教學內容,按照U型七步探究法給出教學組織與實施方案。在研究型課程教學的過程中,教師和學生各有分工,且互相合作,課上課下有銜接,線上線下相結合,具體方案如圖3所示。
首先,在開課前教師圍繞教學內容創設情境、提出問題、調研開源項目并完成教案設計。在這里情境創設應選擇學生身邊發生的,易于代入的事件和人物,并在此基礎上提出初步問題。還需要根據教學內容和所提出的問題選擇合適的開源項目供學生進行學習、分析和實踐。在面向大規模學生群體授課時,開源項目的選擇應具有層次性,能夠滿足不同學生的需求。也可以根據需要構建新的開源項目,由教師進行項目管理,多名學生聯合參與完成。
其次,教師開課后在適當的時間拋出情境、問題和資料,留出一定的時間給學生做調研與實踐。最重要的是在課堂上進行組織討論,經過課堂上的討論和思想的碰撞,要求學生在課后進行深入調研、總結和驗證。
最后,教師對這段教學活動進行評價和總結。除了課堂上的展示之外,學生還應該積極向開源社區反饋經與教師確認后有價值的成果,積極參與開源項目建設,以獲得開源社區的認可。
與U型七步法中的定題、提問、探究、定見、解析、反思、心得相對應,其中定題和提問由教師在開課前完成,探究和定見是對問題的進一步深入和分析,由教師和學生互相配合、由淺入深、從課上到課下完成,而問題的解析是通過同學課堂討論和教師引導、結合開源項目實際調研、分析和實踐完成。最后教師和學生都要進行反思,學生對問題進行總結、鞏固深化,教師對教學效果進行評價和總結,以便于完成課程的持續改進。
在這個過程中,開源項目是老師和學生工作的對象。學生不再是被動的知識接受者,而是主動的思考者、探究者和建構者,他們通過研究開源項目主動發現和重構知識;教師成為教學活動的設計者、組織者、參與者、指導者和幫助者,主要做法是以不同粒度的“問題”為主線來進行組織和設計,使學生在問題調研的過程中更主動、更廣泛、更深入地激活自己的原有經驗,幫助理解當前的問題情境,通過分析推理得到新結論,從而構建自己的新知識,豐富自己的實踐經驗。
采用“問題導向式教學”策略進行編譯原理課程教學設計,其核心思想是強調把學習設置在復雜的、有意義的問題情境中,通過讓學生合作解決真實世界中的現實問題,來探究隱含于問題背后的科學知識。以教學內容為基礎,設計明確適當的學習場景來開展“問題導向式教學”,提出切合實際的“現實問題”,這二者是能否成功實施研究型教學的關鍵。場景應與當前的熱點相關,與時代發展相符,場景決定了問題的代入是否成功,現實問題要有一定的挑戰性,也要符合學生當前的學習時限和未來工作與研究需要。如前所述,解決實際問題,符合近工業強度,實現國際聯結,開源項目是非常好的切入點。下面以運行時系統和程序設計語言為例簡單介紹筆者在實踐中提出的兩個問題。
(1)華為為什么要構建自己的編譯器?2019年8月,華為部分開源了方舟編譯器的源碼,在此之前已經有較多的新聞報道,甚至一度成為大家討論的熱點問題。在此背景下深入探討方舟編譯器出現的背景,有利于學生對編譯器以及計算機系統工作過程的深入理解。這一問題的解析可以貫穿整個教學過程,覆蓋編譯引論、前端實現、中間代碼呈現、運行時系統構建、目標代碼生成等各個教學環節。在解析方舟編譯器部分開源代碼的基礎上,還可以為其實現新的前端,構建一個輕量級的虛擬機對中間代碼進行解釋執行,甚至可以在后端沒有發布出來之前,將其MAPLE代碼翻譯到ARM或者x86等平臺上執行。為了引導學生完成工作,教師需要講授相關的原理,提供相關的源碼和文檔資料,并給出建議的分析重點、分析方法和工具、實現技術路徑,需要解決的關鍵問題等。
(2)什么樣的編程語言適合青少年學習?隨著大數據技術和人工智能技術的深入發展和普及,目前關于青少年計算思維培養和編程教育的廣告隨處可見,各個教育機構和研究機構也紛紛推出了自己的培訓方案。很多家長在為小孩學習C++還是學習Python而苦惱,除此之外,還有Scratch之類的圖形化編程語言。基于此場景構建的初步問題就是什么樣的編程語言適合青少年學習。在這個問題的調研中,需要了解目前流行的編程語言有哪些,有何不同,分別適合于哪些應用領域和人群?進一步的延伸討論問題包括什么是一個好的編程語言,為什么會有這么多編程語言?在實踐階段可以對目前主流程序設計語言進行調研、對比分析,并對現有的語言進行改造和擴展,當然也可以引導學生設計并實現適合于青少年學習的新的編程語言。在這個過程中涉及的開源項目包括Scratch,Python以及各種IDE和OJ系統。
五、教學實踐及其效果
筆者基于上述思路進行了實踐,首先搭建了一個半開源的編譯器實現框架BIT-MiniCC,要求大部分學生在實踐中基于該開源項目進行增量開發。此外,在小部分學生中進行了深入實踐,針對相應的場景和問題,成立了7個研究小組,分別從程序設計語言比較與分析、新語言設計與實現、已有語言實現分析、數據庫軟件中用到的編譯原理技術等方面進行深入研究。在課程結束的時候,7個研究小組中,有1個小組向開源社區提交了問題,2個研究小組對已有的開源項目進行深入分析,1個小組對已有的開源項目進行了升級改造,3個研究小組建立自己的開源項目。
如圖4所示,通過對課程教學過程中完成基礎實驗部分使用的開源項目BIT-MiniCC進行統計分析,發現接近85%的同學選擇使用了該項目作為增量開發的基礎,也有少部分同學由于對BIT-MiniCC開發使用的Java語言不熟悉,選擇使用了自己更為熟悉的C/C++或者Python進行開發,還有部分同學前期自己開發,但是后期感覺時間壓力比較大,所以轉為使用開源框架提高開發效率。
圖5展示了在課程學習過程中大家對開源項目的使用情況,普遍使用比較多的是詞法和語法自動生成工具,以及學習和分析已有編譯器LLVM,GCC,Python的內部具體實現方式,還有JSON解析、MIPS和RISC-V模擬器等相關開源項目。目前大部分獲取閱讀、修改和提交主要集中在BIT-MiniCC上,也有部分同學將自己的完整實現進行了開源。
最后,基于開源社區的顯著變化就是,由于大家了解了開源項目實現過程中使用的中間代碼的多樣性,部分同學還對部分開源項目進行了深入的分析,因此在編譯課程實驗中就有了更多的選擇。其中最大的變化是更多的同學選擇了華為方舟編譯器的MAPLE IR進行課程實驗。
六、結語
國產自主化計算機系統的快速發展離不開開源社區的建設和運營,因此基于開源社區進行研究型課程的建設具有良好的根基,并且符合研究型課程的科教融合、國際聯結和社區參與等基本特征。本文雖然對研究型課程的定義和特征作了進一步的推演,但是其內涵和外延還有待進一步深入研究和明確。基于開源社區和U型七步法構建的研究型課程教學方案是在一流課程建設背景下的一次重要嘗試,所給出的方案在局部進行了教學實踐并取得了顯著的效果,對其他研究型課程建設具有較好的參考價值。
參考文獻:
[1]陳琦,劉儒德. 當代教育心理學[M]. 北京:北京師范大學出版社,2007.
[2]卞素萍. 美國研究型教學的啟示[J]. 江蘇高教,2019(11):65-68.
[3]李彩飛. 馬克思主義基本原理概論課研究型教學的模式創新與功能價值[J]. 教學研究,2017,40(2):73-77.
[4]葉國榮,陳達強,吳碧艷. 高校本科生教育中研究型教學模式探討[J]. 中國高教研究,2009(3):90-91.
[5]李春,鄒逢興,周宗潭,等.《計算機硬件技術基礎》精品課程研究型教學探索與實踐[J]. 高等教育研究學報,2013,36(1):26-29.
[6]李曉東,李玉川,李曉萌. “功能高分子材料”研究型課程初探[C]. Proceedings of 2018.
[7]席酉民. 研究型教學:并非在傳統教學中加點研究佐料[J]. 中國高等教育,2016(21):42-44.
[8]里瑟琦智庫. 歐美研究型大學本科課程改革的五個關鍵詞[EB/OL]. http://www.idmresearch.com/news/html/?3558.html, 2020.
[9]殷開梁. 研究型教學的新方法——U型7步探究法[J]. 化學教育,2019,40(4):40-42.
[10] Github. The State of the Octoverse[EB/OL]. https://octoverse.github.com/, 2020.
[責任編輯:余大品]