諶志群,王榮波,黃孝喜
(杭州電子科技大學 計算機學院,浙江 杭州 310018)
“能力導(dǎo)向”是本科教育的基本追求,有利于培養(yǎng)學生的可持續(xù)發(fā)展能力。 “能力導(dǎo)向”教學與“知識導(dǎo)向”教學并不矛盾,兩者是相輔相成的關(guān)系:以知識為載體,通過對知識的學習,掌握恰當?shù)膯栴}求解思想和方法,培養(yǎng)學生的(專業(yè))能力;能力的增強,反過來會促進學生學習、掌握甚至發(fā)現(xiàn)更多的知識。所以,先進的教育倡導(dǎo)研究型“教”與“學”,尊崇的是“能力導(dǎo)向”[1]。
計算思維能力是計算機類專業(yè)人才4 大專業(yè)基本能力之一 (另外3 個是算法設(shè)計與分析能力、程序設(shè)計與實現(xiàn)能力、系統(tǒng)能力)[2]。 計算思維是美國卡內(nèi)基·梅隆大學計算機科學系主任周以真(Jeannette M. Wing)教授提出的。 2006 年 3 月,周教授在美國計算機權(quán)威期刊 《Communications of the ACM》上給出了計算思維(Computational Thinking)的定義:計算思維是運用計算機科學的基礎(chǔ)概念進行問題求解、系統(tǒng)設(shè)計以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動。
過去幾十年來,盡管我國在計算機專業(yè)教育上取得了很大的成績,培養(yǎng)出了數(shù)量眾多勝任工作的畢業(yè)生,計算思維的諸要素也或多或少滲透在培養(yǎng)方案和課程大綱中,但執(zhí)行的情況還不夠理想[3]。不僅不同的學校在計算思維能力培養(yǎng)效果上差別大,而且計算思維能力培養(yǎng)的水平整體看還不夠高,學生對于計算思維要素掌握的程度還不夠深。 對此,我們需要更主動地采取有效措施, 從思想觀念、教學內(nèi)容、教學方法等方面入手,進一步強化對學生開展計算思維能力的培養(yǎng)。
“編譯原理”作為計算機專業(yè)的核心基礎(chǔ)課程,它所涉及的大量知識都是計算思維的恰當詮釋和生動案例[4]。 將計算思維培養(yǎng)與“編譯原理”教學相結(jié)合,不僅可以從計算思維的角度重新審視和組織“編譯原理”的課堂教學,而且可以加強對學生計算思維能力的培養(yǎng),使學生能夠更好地應(yīng)用計算思維來解決實際問題。
計算的根本是抽象和自動化。用計算機解決問題,首先要對問題進行抽象和形式化描述,然后將問題求解方法算法化, 最后用編程語言實現(xiàn)算法。要有效解決問題,算法的復(fù)雜度還必須在可承受的范圍內(nèi)[5]。 這是用計算思維解決實際問題的基本思路。 如何有效地將計算思維融入、滲透到課程的實際教學中,提高學生運用計算思維進行問題的抽象和分解能力,一直以來都是計算機教育界極為關(guān)心的熱點問題,也是一個巨大的挑戰(zhàn)。
“編譯原理”由于基礎(chǔ)概念繁雜、理論性內(nèi)容比重大、抽象程度高等特點,被師生們普遍反映是一門難教又難學的課程。學生在學習過程中經(jīng)常感到內(nèi)容抽象、算法復(fù)雜、難于理解。 另外,學生普遍認為“編譯原理”不實用,導(dǎo)致缺乏學習熱情,失去積極性和主動性。如果從計算思維的角度來重新審視“編譯原理”這門課程,我們發(fā)現(xiàn)“編譯原理”是訓(xùn)練學生計算思維、培養(yǎng)學生計算機專業(yè)素質(zhì)、提高學生系統(tǒng)能力的良好載體。教師在教學過程中利用計算思維來重新梳理和組織“編譯原理”的教學內(nèi)容,可以在一定程度上克服當前“編譯原理”教學中存在的問題,提高實際的“教”“學”水平。
以計算思維能力培養(yǎng)為導(dǎo)向,對“編譯原理”課程教學進行改革探索,可達到如下教學目標:
(1)培養(yǎng)學生對問題進行抽象的能力。 在計算機科學中,抽象化就是在解決問題時隱藏實現(xiàn)細節(jié)以減少問題的復(fù)雜度,使人們專注重要的、本質(zhì)的部分來把握事物本質(zhì)、發(fā)現(xiàn)事物的內(nèi)在規(guī)律。
(2)培養(yǎng)學生對問題進行形式化描述的能力。形式化方法就是發(fā)現(xiàn)邏輯規(guī)律、 定義邏輯規(guī)則、完善理論體系,進而對問題進行數(shù)學建模的過程。
(3)培養(yǎng)學生設(shè)計算法求解實際問題的能力。設(shè)計復(fù)雜度合理的算法是解決實際問題的可行途徑, 算法設(shè)計是將計算思維的成果實物化的過程,也是將理論成果應(yīng)用于具體技術(shù)的實踐過程。
(4)培養(yǎng)學生采用遞歸與迭代解決實際問題的能力。遞歸與迭代是解決復(fù)雜工程問題的強有力的方法。 遞歸與迭代在程序編譯過程中應(yīng)用非常廣泛,通過對實際案例的剖析,可培養(yǎng)學生解決復(fù)雜問題的能力。
以計算思維能力培養(yǎng)為導(dǎo)向的 “編譯原理”教學改革實踐的基本流程如圖1 所示。
圖1 “編譯原理”教學改革實踐基本流程Figure 1 Basic process of teaching reform practice for “Compilation Principle”
計算思維中包含的計算特點是采用計算機科學的基本概念來求解問題、設(shè)計系統(tǒng)和理解人類行為,涵蓋了計算機科學一系列的思維方法。例如,經(jīng)過數(shù)據(jù)仿真、嵌入實驗、等價轉(zhuǎn)化、合理約簡等步驟,把一個抽象復(fù)雜的問題解釋成簡單易懂、易解決的問題;通過分解和抽象解決復(fù)雜的任務(wù);選擇恰當?shù)谋硎痉绞奖硎鰡栴}或者對問題進行建模,進而把問題簡化處理;通過糾錯、冗余、容錯等方法預(yù)防、檢測或者以最差的情況恢復(fù)系統(tǒng);在空間與時間、存儲容量與處理能力等方面進行平衡;進行遞歸轉(zhuǎn)化等。以上計算思維方法都可以在“編譯原理”的很多理論和相關(guān)技術(shù)中得以體現(xiàn),并且很多編譯成果也利用了計算思維的核心。 例如,抽象和自動化就是編譯理論和方法產(chǎn)生的基礎(chǔ);編譯中介紹的詞法、語法分析,屬性文法和優(yōu)化等內(nèi)容,都體現(xiàn)了從實際問題中抽象出共性,并且運用科學思維方法求解問題的思想。 其中,詞法分析主要涉及形式化、轉(zhuǎn)化、約簡的方法;語法分析主要涉及形式化、遞歸、分解的方法; 語義分析與中間代碼生成主要涉及形式化、嵌入、分解的方法;代碼優(yōu)化主要涉及約簡、分解、仿真的方法;目標代碼生成主要涉及仿真、容錯的方法。 求解的成果建立在經(jīng)典理論的基礎(chǔ)上,并應(yīng)用到具體的實際問題中,進一步推動了編譯相關(guān)技術(shù)的進步。 因此,“編譯原理”課程處處滲透計算的特征,在理論和技術(shù)上都體現(xiàn)了計算思維。
通過對“編譯原理”課程知識框架的梳理,可提取計算思維與課程內(nèi)容之間的結(jié)合點,這些結(jié)合點可歸納為4 類,如圖2 所示。
圖2 計算思維能力培養(yǎng)與課程內(nèi)容結(jié)合點Figure 2 Combination of computational thinking ability training and course content
(1)提取問題抽象化與課程內(nèi)容的結(jié)合點。 編譯中的詞法分析、語法分析以及優(yōu)化等都是首先進行抽象化的過程, 是通過發(fā)現(xiàn)不同分析方法的規(guī)律,然后進行數(shù)學建模,直至最后自動分析的過程。以詞法分析和語法分析為切入點,給出一個實際的小型語言系統(tǒng)的文法,通過課堂講解,讓學生建立起抽象符號與實際語義之間的聯(lián)系,反復(fù)強調(diào)兩者之間的對應(yīng)關(guān)系, 最終使其專注于各種語法成分,把握分析對象的本質(zhì),忽略具體語言中各種語法成分的實現(xiàn)細節(jié)。
(2) 提取問題形式化描述與課程內(nèi)容的結(jié)合點。編譯中的形式語言理論部分,關(guān)于文法、語言以及各種范式的定義, 都是基于形式化的描述方法。通過這部分內(nèi)容的學習和練習,可以大大提升學生的形式化描述能力。這部分內(nèi)容密切結(jié)合各種語法分析中使用到的算法, 以 LL (1) 文法為例,求FIRST、FOLLOW 集的算法是以形式化的方式來描述的,未掌握形式化語言和形式化思維的學生理解起來非常吃力,更不用談去實際應(yīng)用。 在課堂講解的過程中,先讓學生接觸大量的實例,觀察FIRST、FOLLOW 集的構(gòu)成, 引導(dǎo)學生總結(jié)各種符號的來源,最終靠自己的領(lǐng)悟形成對算法的形式化描述。通過這一方法, 學生可以領(lǐng)悟形式化思維和實際問題的聯(lián)系, 使形式化的思維真正被學生所接受和理解。
(3)提取算法設(shè)計及算法復(fù)雜度與課程內(nèi)容的結(jié)合點。 編譯中自動生成工具LEX 和 YACC 的設(shè)計,就是在形式語言與自動機理論的前提下產(chǎn)生的高效詞法和語法自動產(chǎn)生器。算法及算法復(fù)雜度不僅體現(xiàn)在編譯程序本身的工作機制上, 更體現(xiàn)在編譯程序的生成工具的研究和設(shè)計上。
(4) 提取遞歸與迭代思想與課程內(nèi)容的結(jié)合點。編譯中的自上而下語法分析中的遞歸下降分析程序、語法制導(dǎo)翻譯中的遞歸下降翻譯器的設(shè)計都是有關(guān)遞歸問題的典型代表。
算法設(shè)計部分、復(fù)雜度分析部分及遞歸迭代部分穿插在各算法的剖析中, 包括有限自動機的轉(zhuǎn)換、DFA 化簡、 遞歸下降語法分析方法、LR 語法分析算法、寄存器分配算法、代碼生成算法等。
在教學過程中,除了系統(tǒng)講授編譯過程中涉及的主要理論、技術(shù)和算法,可留出一部分時間穿插介紹涉及計算思維能力培養(yǎng)的相關(guān)內(nèi)容,即跳出課程知識框架,從更高層次上審視編譯器的設(shè)計與實現(xiàn),引導(dǎo)學生從中歸納總結(jié)通用問題求解的基本范式,以及在面對復(fù)雜工程問題時解決問題的基本思路與可行途徑。
以杭州電子科技大學計算機學院計算機科學與技術(shù)專業(yè)“編譯原理”教學為例。 課程組在2021學年第一學期期末考核時設(shè)計了一套計算思維能力試卷,并在泛雅網(wǎng)絡(luò)教學平臺上發(fā)布,要求選課學生完成。 試卷含3 種題型:判斷題、單選題、簡答題,各題型題量與內(nèi)容見表1。
表1 計算思維能力考試題型與內(nèi)容Table 1 Computational Thinking Ability Test Question Type and Content
考試共472 人參加,平均得分為76.9 分,成績分布如圖3 所示。這次考試的成績作為期末成績中課程思政得分的主要依據(jù)(占總成績的5%),學生們比較重視,促使他們在學習過程中除了對編譯課程具體知識點的掌握之外,也會同時思考編譯器設(shè)計與實現(xiàn)中涉及到的理論、技術(shù)遷移到其他應(yīng)用領(lǐng)域的可能,在提高專業(yè)素養(yǎng)和計算思維能力的同時也提高了他們通用問題的求解能力。
圖3 計算思維能力考試成績分布Figure 3 Distribution of Computational Thinking Ability Test Scores
在2021 學年第一學期的“編譯原理”教學中,課程組兩位主講教師(A 教師、B 教師)采用新的教改方案,教學過程中注重強化對學生的計算思維能力的培養(yǎng)。另一位主講教師(C 教師)采用原有的教學模式。為客觀反映教改效果,比較了A 教師(4 個教學班)、B 教師(4 個教學班)與 C 教師(4 個教學班)之間客觀題的測試得分數(shù)據(jù)。 具體數(shù)據(jù)見表2。 從表 2 可以看出,A 和 B 兩位教師班級的得分率相對于C 教師來說有較大的優(yōu)勢。 課程組將在今后的教學過程中,根據(jù)反饋不斷優(yōu)化教改方案,如引入具體的工程案例,并從計算思維角度來剖析這些案例,將計算思維能力的培養(yǎng)落到實處。
表2 計算思維能力考試得分率比較Table 2 Scoring rate comparison of Computational Thinking Ability Test
本文提出以計算思維能力培養(yǎng)為導(dǎo)向的“編譯原理”課程教學模式,圍繞編譯程序邏輯結(jié)構(gòu)的各個部分,將計算思維的主要培養(yǎng)目標融合貫穿其中,有利于提高學生解決復(fù)雜工程問題的能力。 該教學模式將計算思維能力分解為問題抽象能力、問題形式化描述能力、算法設(shè)計能力、遞歸與迭代能力,并落實到“編譯原理”課程教學中,有利于提高學生的計算機專業(yè)素養(yǎng)和達成計算機專業(yè)對學生的能力培養(yǎng)目標。 提出的計算思維能力培養(yǎng)可推動學生從具備“實例計算(解決單一具體問題)”能力跨越到具備“類計算(完成一類問題系統(tǒng)求解)”能力,有利于培養(yǎng)學生的可持續(xù)發(fā)展能力。 教改方案實施后的評價結(jié)果初步展示了該教學模式的優(yōu)越性。