摘要:“能力導向”教學符合本科教育的基本追求,更有利于培養學生的可持續發展能力。“編譯原理”作為計算機專業的傳統核心課程,其所含知識是本專業實施能力培養的最佳載體之一,對學生專業能力的培養具有重要意義。本文從專業能力培養的視角討論“編譯原理”的教學。
關鍵詞:計算機;專業能力;編譯原理;面向能力培養
中圖分類號:G642 文獻標識碼:B
高等教育為國家的現代化建設培養人才。根據我國現代建設的需要,計算機科學與技術專業要為信息化建設的需要培養計算機人才——每年約十萬的招生量和約十萬的畢業生可以看成是社會對計算機專業本科人才的基本需求。教育部高等學校計算機科學與技術教學指導委員會的發展戰略研究報告指出,他們應該被分為科學型、工程型、應用型人才,而且絕大多數應該是工程型和應用型的。從本科畢業生的基本工作情況看,他們中確實只有極少數人專門從事計算機科學理論的研究,也只有很少數人從事操作系統、編譯系統、數據庫系統等的研究和開發。作為計算機科學與技術專業的“經典”核心課程,“操作系統原理”、“編譯原理”、“數據庫系統原理”等還有什么樣的存在價值?計算機專業的學生為什么還要學習這些課程呢?這涉及到本科教育的基本問題,本文以“編譯原理”課程為例,討論有關問題。
1培養專業能力
根據《中華人民共和共教育法》,本科教育應當使學生比較系統地掌握本學科、專業必需的基礎理論、基本知識,掌握本專業必要的基本技能、方法和相關知識,具有從事本專業實際工作和研究工作的初步能力——這規定了高等教育在知識、能力、素質三方面的具體要求。其中的“能力”在學生的可持續發展和創新精神與能力的形成中具有非常重要的作用。所以,教育不僅要強調知識基礎,更要強調能力基礎。
在知識基礎和能力基礎的追求上,東西方教育存在一定的差異。相對而言,東方教育表現出更注重夯實扎實知識基礎的傾向,而西方教育更注重夯實能力基礎。實際上,“知識基礎”和“能力基礎”并不矛盾,兩者是相輔相成的關系:以知識為載體,通過對知識的學習,掌握恰當的問題求解思想和方法,培養學生的(專業)能力;能力的增強,會促進學生學習、掌握甚至發現更多的知識。所以,先進的教育倡導研究型“教”與“學”,尊崇的是“能力導向”。
在大學里,學習一門課程,不能簡單、膚淺地看成是對這門課程所含內容的研究、設計和開發,而是關注是否在有限的時間內最有利于專業能力的培養。所以,我們不僅反對面向系統的教育,更反對產品教育。由于計算學科仍然是一個年輕的學科,其專業教育總體上還不夠成熟,所以才有了今天的“操作系統”、“數據庫系統”、“網絡系統”、“編譯系統”等面向系統的課程。相信隨著學科的發展,計算機專業教育會不斷成熟,會有更能體現專業教育需要的課程出現。就目前的情況,應該努力做到“使用工具、探索規律”、“實現具體系統、研究基本原理”,也就是“使用工具,不可忽略規律”、“學習系統,切莫冷落原理”。
那么,作為計算機專業的學生,應該具有什么樣的基本能力呢?首先,作為一名受過高等教育的高級人才,交流、獲取知識與信息的基本能力、基本學科能力、創新能力、工程實現能力、團隊合作能力等,是不可或缺的。另外,作為接受專業教育的專業人員,更應該具備專業基本能力。自2002年開始,筆者就將計算機專業人才的專業基本能力歸納成計算思維(目前看,它的含義應該既有廣義的,還有狹義的)、算法設計與分析能力、程序設計與實現能力(硬件和軟件實現)、系統能力(系統的認知、分析、開發與應用)。4大基本能力有著自己豐富的內涵,它們的培養需要落實到各個教學環節中,特別是各門主干課程的教學中。
例如,系統能力要求學生站在系統的全局去看問題、分析問題和解決問題,并實現系統優化,對計算機專業人才來說,狹義的系統能力包括對一定規模系統的“全局掌控能力”(全局地掌控一定規模系統)和在構建系統時能夠系統地考慮問題的求解。要想培養學生的系統能力,就需要在基本思想的指導下從教學的點滴入手。例如,自頂向下是系統設計的重要思想方法,學習它是為了引導學生分層次考慮問題,逐步求精;鼓勵學生由簡到繁,進行復雜程序的設計,是一個逐漸深入、逐漸擴展規模的過程;結合計算機硬件系統、編譯系統、操作系統等的教學,可以使學生學會關注和掌握系統邏輯,引導學生從宏觀到微觀去分析、理解和把握系統;通過讓學生參與較大型系統的設計與實現,鼓勵他們在工作過程中努力掌握系統的總體結構,關心本人承擔工作在系統中的地位等方式來增強學生的系統觀和合作能力。教學中要不斷提升學生的眼光,實現學生從系統級上對算法和程序的再認識。
2計算機專業的一門好課程
“編譯原理”是一門非常好的課程。Alfred V.Aho編著的《Compilers: Principles, Techniques, and Tools》被認為是編譯領域里的經典教材,加上其“封面龍”的造型,被人們尊稱為“龍書”。作為第一章的第一句話,作者這樣寫道:“編寫編譯器的原理和技術具有十分普遍的意義,以至于在每個計算機科學家的研究生涯中,本書中的原理和技術都會反復用到。”這句話給出了這門課程的真正教學定位。
從課程體系總體設計看,“編譯原理”課程的主要教學目標之一是使學生在系統的級別上重新認識算法和程序,提升學生的系統能力。實際上,除了這些之外,該課程還在于進一步培養學生的形式化描述能力:如何給出問題的形式化描述,基于這種描述設計出自動化處理的過程,最后實現“自動計算”。
雖然編譯課程(通常稱為“編譯原理”、“編譯方法”、“編譯技術”等)是計算機專業的重要經典課程,但是隨著高等教育的大眾化,有些人對計算機專業是否需要開設“編譯”課程出現了疑問,特別由于該課程的基本內容涉及到的一些重要理論基礎具有抽象性,使得學生對其的理解產生了較大困難,加上有些人認為畢業生中很少有人將來設計與實現編譯系統,使得該課程的“重要性”、“經典性”受到了懷疑。課程的設置雖然要看知識的“直接有用性”,但更要考慮專業能力培養的重要性。如果忽視了本科教育培養學生基本專業能力、可持續發展能力這一基本目的,課程設置就是不恰當的。實際上,計算機科學與技術專業的本科生是否要開設編譯課程,要考慮具體的培養目標等因素,要從總體目標的需求上去考慮,要看它是否是在總學時的限制下,是實現總目標的最佳課程。
計算學科問題求解的基本思路是“問題、形式化描述、計算機化”,以抽象、理論、設計為其學科形態。編譯原理涉及的是一個比較適當的抽象層面上的數據變換,既有明確的、便于抽象的問題,又有較成熟的理論,而且在限定規模下又容易實現(設計),所以“編譯原理”是計算機專業本科生的重要專業技術基礎課程,屬于教學計劃中四大系列之軟件技術系列。
除了知識外,該課程內容還含有基本問題求解的典型思想、技術和方法,所以該課程對于培養學生的計算思維、程序設計與實現、算法設計與分析、計算機系統的認知、開發和利用等4大學科基本能力非常重要。學生是在程序設計、數據結構與算法等課程中受到一定的鍛煉后,從系統的級別上對程序、算法的認識進行再提高,通過該課程進一步提升計算機問題求解的水平,增強系統能力,體驗實現自動計算的樂趣。這些方法和思想包括掌握程序變換基本概念、問題描述和處理方法(自頂向下、自底向上、逐步求精、遞歸求解,目標驅動,問題分析、問題的抽象與形式化描述,算法設計與實現,系統構建、模塊化)。通過學習這些知識、思想和方法,學生養成“問題、形式化描述、計算機化”問題求解習慣,實現從“實例計算”到“類計算”和“模型計算”的跨越;增強理論結合實際能力,獲得更多的“頂峰體驗”;從宏觀到微觀、從微觀到宏觀,形成系統能力。所以,鼓勵有條件的計算機專業為本科生開設“編譯”課程,并通過強調課程恰當的形態的內容,達到與專業培養目標吻合的課程教學目標。
3瞄準專業能力培養開展教學
總體上,我們可以將“編譯原理”課程目標定義為:掌握編譯原理中的基本概念、基本理論、基本方法,在系統級上再認識程序和算法,提升計算機問題求解的水平,增強系統能力,體驗實現自動計算的樂趣,具體從如下幾方面實現對學生能力的培養:
(1) 掌握程序變換基本概念、問題描述和處理方法
這些方法主要有:自頂向下、自底向上、逐步求精、遞歸求解,目標驅動,問題分析、問題的抽象與形式化描述,算法設計與實現,系統構建、模塊化等方法。這些都是本學科最經典、最常用的問題求解和系統設計方法。
(2) 實現“問題、形式化描述、計算機化”的修養
修養“問題、形式化描述、計算機化”這一典型問題的求解過程,推進從“實例計算”到“類計算”和“模型計算”的跨越。
計算機學科發展到今天,早已經從一些單一的具體問題的求解發展到對一類問題的求解,也就是尋求一類問題的系統求解。完成單一的具體問題求解的計算稱為“實例計算”;完成一類問題系統求解的計算稱為“類計算”。當然,在“類計算”中,一大部分高層次的計算是“模型計算”。這是區別于其他專業的學生的重要方面之一。學生的培養,通常都是從“實例計算”開始,逐漸推進到“類計算”,實現學生“計算”理念的跨越。
(3) 增強理論結合實際能力,獲得更多的“頂峰體驗”
“編譯原理”是理論和實踐結合最好的計算機課程之一,不僅含有恰當的理論知識,而且直接涉及到這些理論的實踐,讓學生親歷理論結合實踐的樂趣,使優秀的學生獲得更多的“頂峰體驗”,培養他們理論結合實際的能力。
(4) 從宏觀到微觀、從微觀到宏觀,培養系統能力
站在系統的全局去看問題、分析問題和解決問題,并實現系統優化。經驗表明,培養學生以系統的觀點去看問題,是非常重要的,也是比較困難的,可稱之為“系統”能力。軟件技術系列課程接在程序設計與算法系列之后,實現學生的系統認知、分析、設計和應用能力的培養,并使學生進一步在系統級別上認識程序和算法。
“編譯系統”雖然是一個具有相當規模和相當復雜度的系統(含總體結構),但對問題本身的分析和處理的分解非常清楚,使得其規模和復雜度可控,宜于讓學生掌握,通過教師的引導,強化對學生系統能力的培養,這對應用型計算機專業人才非常重要。
(5) 不斷探索未知,培養創新能力
開展研究型教學,挖掘知識背后的內容,通過講授思想、方法,模擬大師們的創新思維,培養學生的創新意識和創新能力。
(6) 強調理論指導下的實踐,提升算法設計和程序設計能力
“編譯原理”課程涉及的是一個比較適當的抽象層面上的數據變換,除了相應的知識非常重要外,其中一些基本的問題求解方法、處理問題的思路也是非常重要的。所以,“編譯原理”課程的實踐必須在理論指導下進行。學生在學習了基本的理論之后進行實驗系統的設計與實現;教師在掌握系統總體構成和基本原理、方法的基礎上提出實驗的最基本要求。鼓勵學生選擇適當的方法進行系統的設計,包括選擇自動化生成的方法。為了實現相應的效果,學生一定要先完成設計,然后再進入到實現階段,以提高對復雜問題的求解能力。
另外,由于對問題的形式化描述及其系統的復雜性,許多理論知識需要在實踐教學中得到印證,只有這樣,才能使學生更好地掌握這些內容——就像吃梨子一樣,親自嘗嘗使用這些“一輩子都會不斷使用的方法”的“味道”。通過實踐,學生感受到成功的樂趣,提高了學習興趣,加深對理論知識的理解,提高了理論聯系實際的能力。
(7) 總體設計下的系統設計與實現,提升系統和程序實現能力
作為一個經典的、很成熟的系統,編譯系統的構建涉及多方面的內容,既有分析,又有綜合,對于培養學生的4大學科基本能力非常重要。無論從其復雜度還是技術含量上說,都是很適合教學的系統。
考慮到在一開始就講授編譯系統總體結構,可以在總體結構指導下,將其分解為“詞法分析器設計與實現”、“語法分析器設計與實現”、“語義分析與中間代碼器設計與實現”,每個程序將利用前一個程序的結果,最終形成一個簡單的編譯系統。這樣就采用了功能遞增的方式對實驗進行引導性劃分,使學生在學習詞法分析時就可以著手進行相關的設計,隨著教學的開展和教學內容的深化,組織系列化的上機實驗,學生逐步完成詞法分析器的設計與實現、語法分析器的設計與實現,優秀的學生進一步完成語義分析與中間代碼生成器的設計與實現。在最后一個實驗完成后,學生已經開發出一個滿足要求的程序變換程序,完成整個系統的構建。
參考文獻:
[1] 教育部高等學校計算機科學與技術教學指導委員會. 高等學校計算機科學與技術專業核心課程教學實施方案[M]. 北京:高等教育出版社,2009.
[2] 教育部高等教育計算機科學與技術教學指導委員會. 高等教育計算機科學與技術專業公共核心知識體系與課程[M]. 2版. 北京:清華大學出版社,2008.
[3] 蔣宗禮. 堅持抽象第一的基本原理,追求問題的系統求解[C]//林闖. 第七屆全國高校計算機系系主任論壇論文集.北京:清華大學出版社,2004:77-82.
[4] 蔣宗禮. 論計算機學科的形態與研究生培養的關系[J]. 學位與研究生教育,2004.11:11-15.
[5] 蔣宗禮. 論“編譯”的性質及其知識載體屬性的開發利用[J]. 計算機教育,2004(Z1):53-56.
[6] 蔣宗禮. 談高水平計算機人才的培養[J]. 中國大學教學,2005(9):24-27.
[7] 蔣宗禮. 編譯原理教材需各取所長[J]. 教材周刊,2005(12):10.
[8] 蔣宗禮. 編譯課程教材建設[J]. 計算機教育,2007(11):74-76.
[9] 蔣宗禮. 推進編譯原理課程教學改革,提高課程效果[C]//大學計算機課程報告論壇組委會. 大學計算機課程報告論壇文集.北京:高等教育出版社,2007:558-561.
[10] 蔣宗禮. “編譯原理”教學設計[J]. 計算機教育2008(3):26-30.
[11] 蔣宗禮. 以能力培養為導向,提高計算學科教育教學水平[J]. 中國大學教學,2008(8):35-37.
[12] 蔣宗禮. 工程教育認證的特征、指標體系與評估的比較[J]. 中國大學教學,2009(1):36-38.
[13] 蔣宗禮. 研究專業核心課程教學實施方案,引導大眾化教育背景下的課程教學[J]. 計算機教育,2009(3):4-6.
[14] 蔣宗禮. 推進專業改革,提高辦學水平[J]. 計算機教育,2009(16):8-11.