計衛(wèi)星,王貴珍,李 侃
(北京理工大學(xué) 計算機(jī)學(xué)院,北京 100081)
計算機(jī)高級程序設(shè)計語言自20世紀(jì)50年代出現(xiàn)以來,至今已經(jīng)演化出成百上千種語言,這些語言面向不同的應(yīng)用領(lǐng)域被不同的群體使用。少數(shù)語言自誕生以來一直保持旺盛的生命力,在計算機(jī)發(fā)展歷史上發(fā)揮了重要作用;部分語言只在某個社區(qū)內(nèi)被廣泛使用,具有明顯的專業(yè)領(lǐng)域特點;還有一些新興的語言,一直在研究人員和相關(guān)社區(qū)的努力下不斷發(fā)展壯大,正在逐步完善并得到大家的認(rèn)可。TIOBE[1]排名顯示,目前最流行的前10種程序設(shè)計語言分別是Java、C、C++、Python、C#、Visual Basic .NET、PHP、JavaScript、SQL和R。在這些語言當(dāng)中,C語言屬于傳統(tǒng)的面向過程語言,C++、Java和C#是目前主流的面向?qū)ο蟪绦蛟O(shè)計語言,Visual Basic在.NET平臺上得以持續(xù)發(fā)展,PHP、Python和JavaScript是腳本語言,SQL是聲明式語言,R則是面向數(shù)據(jù)分析的專用語言。
各個學(xué)校依據(jù)各自的定位和培養(yǎng)目標(biāo),在計算機(jī)類相關(guān)本科專業(yè)培養(yǎng)方案中,通常會設(shè)置1~2門程序設(shè)計相關(guān)的課程。目前各個院校采用C語言的較多,非信息類逐步采用Python作為其首選程序設(shè)計語言,信息類學(xué)生在學(xué)期間也有選修C++、Java和C#課程的機(jī)會。盡管如此,有限的學(xué)時仍然無法讓學(xué)生學(xué)習(xí)、領(lǐng)略各種不同程序設(shè)計語言的特點,因而造成學(xué)生只會使用1~2種程序設(shè)計語言,教和學(xué)兩方面更多關(guān)注編程語言使用,而對高級編程語言自身的設(shè)計、改進(jìn)以及語言的實現(xiàn)認(rèn)識和思考不足,最終導(dǎo)致相關(guān)研究人才的缺乏。因此,如何在有限的學(xué)時內(nèi)彌補(bǔ)這個不足,讓學(xué)生盡可能多地接觸多種程序設(shè)計語言,是一個值得探討的問題。
各個學(xué)校在不斷加強(qiáng)實踐教學(xué)體系建設(shè)的同時[2],也逐步探索與語言設(shè)計和實現(xiàn)相關(guān)的內(nèi)容。文獻(xiàn)[3]中針對編譯原理課程理論完整性不足、課程定位模糊、與其他課程內(nèi)容重疊等問題,提出建設(shè)形式語言與編譯課程。文獻(xiàn)[4]認(rèn)為面向?qū)ο缶幊陶Z言和技術(shù)日益流行,對編譯原理課程建設(shè)和教學(xué)改革實踐提出新的挑戰(zhàn),因此提出基于面向?qū)ο蠹夹g(shù)的編譯原理課程建設(shè)。
語言認(rèn)知實驗的目的是通過一個課程實驗讓學(xué)生了解程序設(shè)計語言的多樣性,具體要求為使用多種指定的語言實現(xiàn)同一功能,如使用C語言、Java、Python、Haskell和匯編語言實現(xiàn)快速排序算法,并對用不同語言實現(xiàn)的程序進(jìn)行比較和分析,主要包括語言學(xué)習(xí)難度、代碼規(guī)模、運(yùn)行效率等。
該實驗的首要目的是讓學(xué)生了解語言的多樣性,語言實現(xiàn)方式的不同對程序編寫以及程序運(yùn)行效率帶來的影響,因此,選擇什么樣的語言和實現(xiàn)什么樣的功能是非常關(guān)鍵的。考慮到語言的發(fā)展歷史和現(xiàn)狀以及語言的類型,所選語言應(yīng)能夠覆蓋經(jīng)典的面向過程語言、面向?qū)ο蟪绦蛟O(shè)計語言、腳本語言(動態(tài)語言)、函數(shù)式編程語言、命令式編程語言等。從語言的實現(xiàn)角度考慮,則希望覆蓋編譯執(zhí)行和解釋執(zhí)行兩種方式。
為了方便對不同的語言進(jìn)行對比,應(yīng)選擇難度和規(guī)模適中的算法讓學(xué)生使用不同的語言實現(xiàn)。算法難度和規(guī)模過大時,一方面學(xué)生難以完成,另一方面學(xué)生關(guān)注的焦點容易發(fā)生偏移,無法達(dá)到實驗預(yù)期目標(biāo)。當(dāng)難度和規(guī)模適中時,學(xué)生會有更多的時間和精力進(jìn)行語言之間的比較,因此,一般應(yīng)該選擇已經(jīng)學(xué)習(xí)過的常見算法來實現(xiàn),如矩陣乘法、各種排序算法等。
在對比階段,主要關(guān)注代碼規(guī)模和程序運(yùn)行效率的對比。代碼規(guī)模以代碼行為單位進(jìn)行統(tǒng)計分析,包括輸入輸出和具體計算的代碼;而運(yùn)行效率則只關(guān)注計算部分的運(yùn)行時間,忽略輸入和輸出部分??紤]到輸入較小時,部分算法的運(yùn)行時間變化較大,應(yīng)考慮規(guī)模適中的輸入數(shù)據(jù),并多次運(yùn)行程序和采集運(yùn)行時間,取平均值作為最終的性能數(shù)據(jù)進(jìn)行對比分析。學(xué)生根據(jù)對比結(jié)果,撰寫實驗報告,提交相關(guān)資料,其中包括對比分析的算法選擇、對各個語言的認(rèn)識、實現(xiàn)方法、運(yùn)行結(jié)果、語言學(xué)習(xí)難度比較、程序規(guī)模比較、程序運(yùn)行時間比較等。
實驗評定階段,在尊重學(xué)生分析成果的基礎(chǔ)上進(jìn)行適當(dāng)引導(dǎo),觸發(fā)學(xué)生更深層次的思考,如為什么不同語言對同一算法的描述會造成程序規(guī)模的不同、腳本語言和C語言程序相比性能相差較大的原因是什么等。
根據(jù)編譯原理與設(shè)計課程的教學(xué)計劃,語言認(rèn)知實驗安排在第一章引言之后進(jìn)行。在引言部分主要介紹程序設(shè)計語言從機(jī)器語言到高級程序設(shè)計語言的發(fā)展歷史,重點解釋編譯程序的定義及其分類,特別強(qiáng)調(diào)編譯執(zhí)行和解釋執(zhí)行兩種不同的執(zhí)行方式、編譯程序的典型框架結(jié)構(gòu)以及從輸入高級語言程序開始到目標(biāo)代碼翻譯的工作流程和中間表示,最后以代表性編譯器為例進(jìn)行剖析,說明編譯器的構(gòu)造方法,這一部分的教學(xué)安排也是國內(nèi)眾多高校所采用的方案。這一部分的教學(xué)內(nèi)容存在多個與語言相關(guān)的知識點,主要包括:①語言的發(fā)展歷史以及編譯器產(chǎn)生的背景;②編譯程序的基本定義及其輸入和輸出;③編譯執(zhí)行和解釋執(zhí)行。
將語言認(rèn)知實驗安排在引言部分非常有利于學(xué)生對相關(guān)概念的認(rèn)識和深入理解。表1給出了從2014年到2018年,筆者在實踐過程中所選用的語言和要求學(xué)生實現(xiàn)的功能。對比可以發(fā)現(xiàn),在這個過程中主要的改進(jìn)在于將小眾的Ruby語言改為Python,并在2018年添加匯編語言,這主要是由于網(wǎng)絡(luò)安全、大數(shù)據(jù)、人工智能等學(xué)科專業(yè)的飛速發(fā)展,Python語言熱度不斷上升,學(xué)習(xí)的需求日益增大。添加匯編語言的目的是為了讓學(xué)生更好地了解編譯器的輸出,在第一章手動完成從高級程序設(shè)計語言到匯編語言的翻譯,并與后續(xù)實驗生成的匯編語言進(jìn)行對比,另外,也可以幫助學(xué)生提前預(yù)習(xí)匯編程序設(shè)計的相關(guān)內(nèi)容。
表1 2014—2018年教學(xué)實踐設(shè)置
在實驗完成后,要求學(xué)生提交相關(guān)源碼以及實驗報告。實驗報告中從3個方面對多個不同的語言進(jìn)行對比分析:①代碼規(guī)模:以代碼行對比實現(xiàn)同一功能的不同語言程序的規(guī)模大??;②運(yùn)行效率:在輸入相同時,對比分析不同程序?qū)崿F(xiàn)同一功能的運(yùn)行時間;③語言易用性:從學(xué)習(xí)曲線、編程效率等方面對不同的語言進(jìn)行對比,給出自己的結(jié)論。
為了更好地了解語言認(rèn)知實驗的教學(xué)效果,2018年教學(xué)考核完成之后,課程組設(shè)計了調(diào)查問卷并對收回的問卷進(jìn)行統(tǒng)計分析。經(jīng)統(tǒng)計,語言認(rèn)知實驗?zāi)軌蚣由顚W(xué)生對語言和編譯器的認(rèn)識,并對后續(xù)的學(xué)習(xí)和實踐產(chǎn)生深遠(yuǎn)的影響。
(1)認(rèn)識到語言的多樣性。如圖1所示,在語言認(rèn)知實驗之前,大多數(shù)學(xué)生熟悉的是C/C++,接近20%的學(xué)生熟悉Python語言,而大約10%的學(xué)生會使用Java語言;在語言認(rèn)知實驗之后,這一狀況發(fā)生了明顯變化,熟悉并喜歡Python的學(xué)生接近35%,對Java比較認(rèn)同的學(xué)生比例上升到了20%,同時Haskell從原來的0%變?yōu)榻咏?%。多個語言的學(xué)習(xí)和接觸讓學(xué)生有了更多的選擇機(jī)會,通過語言之間的比較分析,學(xué)生找到了更適合自己的語言。
圖1 語言多樣性認(rèn)識對比
(2)認(rèn)識到語言的差異性。語言認(rèn)知實驗的主要目標(biāo)之一是讓學(xué)生認(rèn)識到語言之間的差異性。從程序的執(zhí)行方式、編程效率、程序規(guī)模、學(xué)習(xí)曲線等方面進(jìn)行統(tǒng)計,結(jié)果如圖2所示。從圖2的統(tǒng)計結(jié)果可以看出,80%左右的學(xué)生認(rèn)識到不同語言實現(xiàn)同一個算法的效率是不同的,對應(yīng)的代碼規(guī)模也不相同。此外,50%左右的學(xué)生認(rèn)識到語言執(zhí)行方式不同和執(zhí)行效率不同,這有利于加強(qiáng)對編譯引論階段所給出的編譯執(zhí)行和解釋執(zhí)行的深入理解和直觀感受。此外,通過本次實驗,部分學(xué)生發(fā)現(xiàn)不同語言的程序結(jié)構(gòu)不同,對于程序語言自身的描述和表達(dá)方式有了更加深入的認(rèn)識。
(3)了解實施過程存在的問題。為了了解實施過程中存在的問題,調(diào)查問卷中包括實驗中遇到的主要困難等問題,如圖3所示,80%以上的學(xué)生認(rèn)為新的語言學(xué)習(xí)需要時間,而超過50%的學(xué)生認(rèn)為程序開發(fā)環(huán)境的搭建比較費(fèi)時費(fèi)力,由此也導(dǎo)致超過40%的學(xué)生認(rèn)為實驗時間比較緊張。
(4)獨(dú)立完成分析。由于每次選擇的算法規(guī)模和難度適中,因此不可避免能夠在網(wǎng)絡(luò)上找到已有的實現(xiàn)代碼,如使用Haskell實現(xiàn)的快速排序算法。在具體實踐的過程中,并沒有要求所有代碼自己從頭編寫,但是要自行理解和運(yùn)行代碼。代碼來源統(tǒng)計結(jié)果如圖4所示,大約21%的學(xué)生是完全自己編寫的代碼,而約74%的學(xué)生是從網(wǎng)上搜索部分代碼后運(yùn)行的,剩余5%的學(xué)生是從網(wǎng)絡(luò)搜索獲得全部的代碼。
新語言的學(xué)習(xí)是了解程序設(shè)計語言多樣性的必需過程,其中學(xué)生一部分精力主性化教學(xué)資源推薦,包括教學(xué)視頻(SPOC),或推送更多的參考練習(xí)題;(2)組成動態(tài)討論小組,由助教組織進(jìn)行再講解和分享。
課程教學(xué)一學(xué)期結(jié)束后閉卷期末考試,傳統(tǒng)班級和教改班級題目相同。傳統(tǒng)班級采用紙質(zhì)考試(編程題有過程分),教改班級在線考試(編程題沒有過程分,但有多個測試得分點)。兩個班級期末考試分?jǐn)?shù)對比如圖8所示。
圖8 教改班級和傳統(tǒng)班級期末考試成績對比
可以看出,敏捷教學(xué)模式大大地提高了學(xué)生能力水平及知識點的掌握程度。教改班級期末考試90分以上的學(xué)生占45%以上。傳統(tǒng)方式培養(yǎng)的學(xué)生分?jǐn)?shù)段集中在60~80分左右。值得注意的是,由于教改班級判分嚴(yán)格,不及格人數(shù)占比4%,而傳統(tǒng)教學(xué)班級紙質(zhì)考試判分較靈活,無不及格。還有一種可能是強(qiáng)節(jié)奏的能力沖擊是使個別學(xué)生跟不上,最終掉隊。
圖9顯示了教改班級期末考試知識點掌握情況柱狀圖,大部分學(xué)生掌握情況良好。但發(fā)現(xiàn)學(xué)生對指針、變量作用域等知識點掌握得不盡如人意,分析是因為臨近期末教學(xué)比較匆忙,指針內(nèi)容靈活難以消化;而變量作用域則是因為沒有專門進(jìn)行測試和布置作業(yè),造成知識消化不夠完全。令人驚奇的是,第一能力層級的輸入輸出語句得分率偏低,查閱下一層知識點掌握情況發(fā)現(xiàn),由于“格式化輸入輸出”記憶性和技巧性較強(qiáng),并學(xué)過的時間較長,很多學(xué)生已經(jīng)忘記或者忽略,提示下一輪教學(xué)中,考試前需要給學(xué)生強(qiáng)調(diào)記憶并加強(qiáng)練習(xí)。
我們提出對程序設(shè)計基礎(chǔ)課程進(jìn)行知識圖譜及能力層次構(gòu)建,利用在線考試平臺的不同平臺進(jìn)行概念測試和能力評估。進(jìn)而提出適合程序設(shè)計基礎(chǔ)課程的一種混合敏捷教學(xué)模式,在教學(xué)實踐中取得了較好的效果,有積極的推廣意義,并為其他工科課程改革提供了有益的參考。