胡 慧 鄭立華 高萬林 周緒宏
?
基于MOOC的編程語言自動(dòng)評(píng)測(cè)*
胡 慧1鄭立華1高萬林1[通訊作者]周緒宏2
(1.中國農(nóng)業(yè)大學(xué)信息與電氣工程學(xué)院,北京 100083;2.上海宏第網(wǎng)絡(luò)科技有限公司,上海 200000)
針對(duì)大規(guī)模在線教育編程語言學(xué)習(xí)中存在的學(xué)生需要安裝IDE開發(fā)環(huán)境編譯程序、教師評(píng)判費(fèi)時(shí)耗力等問題,文章研究了編程語言自動(dòng)評(píng)測(cè)的應(yīng)用模式和方法,開發(fā)了基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng),并通過實(shí)驗(yàn)驗(yàn)證了該系統(tǒng)的評(píng)判效率。該系統(tǒng)可以為大規(guī)模在線教育平臺(tái)學(xué)習(xí)計(jì)算機(jī)程序設(shè)計(jì)課程提供在線編輯程序、編譯程序、運(yùn)行程序的分布式集群測(cè)試環(huán)境;可以根據(jù)教師設(shè)置的程序用例,實(shí)時(shí)、自動(dòng)地評(píng)判程序的正確性;還可以對(duì)提交的程序代碼進(jìn)行大數(shù)據(jù)分析,找出不同作業(yè)之間的相似度,自動(dòng)、智能化地防范抄襲等行為。
MOOC;編程語言;自動(dòng)評(píng)判;防抄襲;大數(shù)據(jù)
近年來,一種新的網(wǎng)絡(luò)課程教學(xué)模式——MOOC(Massive Open Online Course,大規(guī)模開放在線課程)在教育領(lǐng)域興起。以edX為例,由于其免費(fèi)、公開,無數(shù)學(xué)子對(duì)其競(jìng)相追捧,其用戶也逐漸增加,早在2013年就已經(jīng)擁有超過90萬的注冊(cè)者[1]。C語言、C++語言、Java語言是目前計(jì)算機(jī)程序設(shè)計(jì)中應(yīng)用廣泛的編程語言,也是各類高等院校計(jì)算機(jī)及相關(guān)專業(yè)必修的基礎(chǔ)課。但學(xué)生學(xué)習(xí)這些編程語言時(shí),需要在機(jī)房或個(gè)人電腦上安裝IDE開發(fā)環(huán)境來編輯程序、編譯程序、運(yùn)行程序,而在編輯、編譯、運(yùn)行中碰到常見的問題時(shí),往往不知如何解決;教師在評(píng)判學(xué)生的編程題作業(yè)時(shí),也需要拷貝程序、編譯程序、運(yùn)行程序后才能給出分?jǐn)?shù),費(fèi)時(shí)耗力。
為了解決上述問題,相關(guān)人員對(duì)程序設(shè)計(jì)題在線評(píng)測(cè)做了一些研究。在國外,程序評(píng)測(cè)系統(tǒng)主要應(yīng)用于程序競(jìng)賽,對(duì)源代碼進(jìn)行自動(dòng)編譯運(yùn)行以及記時(shí)、評(píng)分、統(tǒng)計(jì)等[2]。目前,國外影響力最大的程序評(píng)測(cè)系統(tǒng)是PC2程序測(cè)試控制系統(tǒng),它由美國加州大學(xué)專為支持ACM/ICPC而設(shè)計(jì)研發(fā)。該系統(tǒng)提供了完整的程序競(jìng)賽評(píng)測(cè)解決方案,競(jìng)賽舉辦方可在系統(tǒng)的后臺(tái)操作、制定具體的競(jìng)賽規(guī)則,從而對(duì)競(jìng)賽選手提交的源代碼進(jìn)行檢查、編譯、執(zhí)行,最終將評(píng)測(cè)結(jié)果返回給參賽者[3]。對(duì)比國外,國內(nèi)的程序評(píng)測(cè)系統(tǒng)起步較晚,但隨著國內(nèi)ACM/ICPC的逐漸興起,國內(nèi)不少高校和組織紛紛對(duì)程序評(píng)測(cè)系統(tǒng)進(jìn)行了研發(fā),比較典型的有北京大學(xué)在線評(píng)測(cè)系統(tǒng)(PKU Online Judge)[4][5]、浙江大學(xué)在線評(píng)測(cè)系統(tǒng)(ZJU Online Judge)[6]、中國科技大學(xué)在線評(píng)測(cè)系統(tǒng)(USTC Online Judge)[7]以及高中生程式解題系統(tǒng)(An Online Judge System For Beginners)[8][9]等。
在大規(guī)模在線開放課程中,“大規(guī)模”意味著參與者的數(shù)量不受限制;“開放”意味著任何人都可以參與學(xué)習(xí),并且是免費(fèi)的;“在線”則意味著參與者通過網(wǎng)絡(luò)參與課程,不受地域限制[10]。面對(duì)如此大的用戶量和訪問量,已有的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)能否滿足其需求還有待評(píng)估,而且目前也沒有有效的數(shù)據(jù)或方法能夠進(jìn)行證明。鑒于此,本研究采用了云計(jì)算和大數(shù)據(jù)的相關(guān)技術(shù),構(gòu)建了基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng),可以為大規(guī)模在線教育平臺(tái)的計(jì)算機(jī)程序設(shè)計(jì)課程(如“C程序設(shè)計(jì)”、“C++程序設(shè)計(jì)”等課程)提供在線編輯程序、編譯程序、運(yùn)行程序的分布式集群測(cè)試環(huán)境;可以根據(jù)教師設(shè)置的程序用例,實(shí)時(shí)、自動(dòng)地評(píng)判程序的正確性,并返回相應(yīng)的分?jǐn)?shù);還可以對(duì)提交的程序代碼進(jìn)行大數(shù)據(jù)分析[11],找出常見的編譯錯(cuò)誤、參考程序代碼等,能夠有效解決教師對(duì)學(xué)生提交的編程題作業(yè)不能簡(jiǎn)單快速地予以驗(yàn)證、不能有效客觀給分、不能給出編譯運(yùn)行出錯(cuò)的幫助信息、不能給出程序參考代碼等問題,從而更好地為編程語言類課程提供服務(wù)。
大規(guī)模在線教育為教學(xué)提供了一種全新的模式,其中對(duì)編程語言類課程習(xí)題的評(píng)判也應(yīng)該本著更好、更便捷地服務(wù)于用戶的目標(biāo),為教學(xué)/學(xué)習(xí)編程者提供便利的測(cè)試環(huán)境和大數(shù)據(jù)分析環(huán)境。也就是說,要?jiǎng)?chuàng)設(shè)一個(gè)環(huán)境,使學(xué)生不需要在本地電腦上安裝IDE開發(fā)環(huán)境,就可以隨時(shí)隨地通過電腦、手機(jī)、平板電腦等學(xué)習(xí)編程題;教師也不需要為批改、評(píng)判編程題作業(yè)而頭疼,而是可以從編程題作業(yè)的大數(shù)據(jù)分析中獲取有助于教學(xué)的信息。
鑒于此,本研究提出了編程語言自動(dòng)評(píng)測(cè)的三種應(yīng)用模式,不同用戶可以根據(jù)自身的需求選擇使用其中的一種或多種應(yīng)用模式,如表1所示。
表1 編程語言自動(dòng)評(píng)測(cè)的三種應(yīng)用模式
1 簡(jiǎn)單應(yīng)用
簡(jiǎn)單應(yīng)用是用戶以某種方式提交程序代碼(用戶自定義輸入)到服務(wù)器端,服務(wù)器端編譯、運(yùn)行該程序代碼,并返回編譯、運(yùn)行結(jié)果——如果有編譯錯(cuò)誤,會(huì)顯示代碼程序哪一行錯(cuò)誤、什么錯(cuò)誤;如果有運(yùn)行錯(cuò)誤,則顯示代碼程序哪一行錯(cuò)誤。簡(jiǎn)單應(yīng)用方式只編譯、運(yùn)行用戶程序,不評(píng)判程序的運(yùn)行結(jié)果,也不給出分?jǐn)?shù)。
2 高級(jí)應(yīng)用
高級(jí)應(yīng)用是用戶以某種方式提交程序代碼、測(cè)試用例輸入、測(cè)試用例輸出、測(cè)試用例權(quán)重、測(cè)試用例分?jǐn)?shù)到服務(wù)器,服務(wù)器端編譯、運(yùn)行該程序代碼,同時(shí)使用測(cè)試用例輸入進(jìn)行運(yùn)行測(cè)試,并將運(yùn)行結(jié)果和測(cè)試用例的期望值進(jìn)行精確比較,根據(jù)權(quán)重計(jì)算出每組測(cè)試用例的得分。有幾組測(cè)試用例就運(yùn)行比較幾次,最終計(jì)算出所有測(cè)試用例的總分,并返回運(yùn)行結(jié)果、總得分到用戶客戶端。高級(jí)應(yīng)用方式既要編譯、運(yùn)行用戶程序,又要用測(cè)試用例來評(píng)判程序的運(yùn)行結(jié)果并給出分?jǐn)?shù)。
3 智能應(yīng)用
智能應(yīng)用是用戶以某種方式提交程序代碼、測(cè)試用例輸入、測(cè)試用例輸出、測(cè)試用例權(quán)重、測(cè)試用例分?jǐn)?shù)到服務(wù)器,服務(wù)器自動(dòng)編譯、運(yùn)行該代碼程序,系統(tǒng)對(duì)輸出結(jié)果進(jìn)行智能匹配,顯示更多的調(diào)試信息,并給出代碼的修改建議;同時(shí),對(duì)提交的程序代碼進(jìn)行大數(shù)據(jù)分析,搜索出類似的程序代碼返回給學(xué)生參考,并列出類似的、常見的編譯錯(cuò)誤供學(xué)生找出問題,從而更好地學(xué)習(xí)編程語言。智能應(yīng)用方式既要編譯、運(yùn)行用戶程序,又要用測(cè)試用例來評(píng)判程序運(yùn)行結(jié)果并給出分?jǐn)?shù),還要對(duì)程序代碼進(jìn)行大數(shù)據(jù)分析,找出類似的代碼或常見的編譯錯(cuò)誤。
1 分布式集群系統(tǒng)設(shè)計(jì)
本研究構(gòu)建的基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)的服務(wù)器端采用部署在云計(jì)算平臺(tái)的分布式集群系統(tǒng)(如圖1所示),包括評(píng)測(cè)管理節(jié)點(diǎn)(Manager Node)、程序運(yùn)行節(jié)點(diǎn)(Program Run Node)、作業(yè)管理節(jié)點(diǎn)(Job Manager Node)、任務(wù)節(jié)點(diǎn)(Task Node)、數(shù)據(jù)管理節(jié)點(diǎn)(Name Node)、數(shù)據(jù)節(jié)點(diǎn)(Data Node)。
圖1 基于分布式集群的自動(dòng)評(píng)測(cè)系統(tǒng)
圖2 系統(tǒng)功能模塊圖
具體來說,評(píng)測(cè)管理節(jié)點(diǎn)用于在收到客戶端的連接請(qǐng)求后,通過數(shù)據(jù)管理節(jié)點(diǎn)將待測(cè)評(píng)代碼保存到分布式文件系統(tǒng)中,并根據(jù)當(dāng)前的負(fù)載情況給待測(cè)評(píng)代碼分配程序運(yùn)行節(jié)點(diǎn);然后,由程序運(yùn)行節(jié)點(diǎn)編譯程序、運(yùn)行程序、評(píng)判程序,而程序編譯結(jié)果等數(shù)據(jù)保存在分布式文件系統(tǒng)中。作業(yè)管理節(jié)點(diǎn)用于提交搜索查詢代碼作業(yè),然后分配作業(yè)到各個(gè)任務(wù)節(jié)點(diǎn),通過各個(gè)任務(wù)節(jié)點(diǎn)并發(fā)進(jìn)行代碼的大數(shù)據(jù)搜索與匹配,并將匹配結(jié)果返回到作業(yè)管理節(jié)點(diǎn);最后,將程序運(yùn)行節(jié)點(diǎn)返回的結(jié)果、作業(yè)管理節(jié)點(diǎn)返回的結(jié)果,經(jīng)過處理返回到客戶端。數(shù)據(jù)管理節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)則組成分布式文件系統(tǒng)(Distrubuted File System),為其它各個(gè)節(jié)點(diǎn)處理數(shù)據(jù)提供保存程序代碼和其它數(shù)據(jù)的環(huán)境。
總之,基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)服務(wù)器端的各個(gè)節(jié)點(diǎn),都是由云計(jì)算平臺(tái)提供的虛擬機(jī)節(jié)點(diǎn),可以根據(jù)需要?jiǎng)討B(tài)地調(diào)整各種節(jié)點(diǎn)虛擬機(jī)的數(shù)量,以更合理地利用服務(wù)器的資源,滿足實(shí)際運(yùn)行的需要。
2 評(píng)測(cè)系統(tǒng)的安全性保障
為保障基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)的安全,服務(wù)器端對(duì)客戶端提交的程序代碼要進(jìn)行特殊的云安全檢查:
(1)對(duì)程序代碼進(jìn)行病毒、惡意代碼掃描檢查;
(2)對(duì)程序代碼是否含有不允許執(zhí)行的系統(tǒng)命令或調(diào)用特殊的系統(tǒng)API進(jìn)行掃描檢查;
(3)對(duì)程序代碼內(nèi)存分配、釋放、檢查,程序運(yùn)行結(jié)束后,系統(tǒng)應(yīng)自動(dòng)釋放、回收用戶程序未顯示釋放的內(nèi)存。
(4)對(duì)程序代碼中出現(xiàn)的問題或設(shè)計(jì)缺陷(如程序死循環(huán)、空耗CPU資源等)進(jìn)行檢查,一旦檢測(cè)到某個(gè)運(yùn)行程序異常,則立刻終止該程序的運(yùn)行。
本研究基于中國農(nóng)業(yè)大學(xué)的MOOC平臺(tái)——雨虹學(xué)網(wǎng),運(yùn)用上述編程語言自動(dòng)評(píng)測(cè)的方法,設(shè)計(jì)并開發(fā)了基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)。
1 系統(tǒng)功能
本系統(tǒng)的功能模塊如圖2所示,主要分為三個(gè)模塊:
(1)教師出題模塊
在教師出題模塊,教師可以添加編程題,設(shè)置編程題的類型、分?jǐn)?shù),起止時(shí)間等,然后填寫編程題目、描述問題、測(cè)試用例、點(diǎn)擊提交,即可生成一道編程題。其中,測(cè)試用例可以設(shè)置多組,每組測(cè)試用例有不同的輸入和可以預(yù)計(jì)得到的輸出;每組測(cè)試用例可以設(shè)置不同的權(quán)重,從而得到不同的分值。也就是說,即使代碼程序采取投機(jī)取巧的方式,也只能通過一組測(cè)試用例,而不能通過所有或部分的測(cè)試用例。
(2)學(xué)生答題模塊
在學(xué)生答題模塊,學(xué)生可以在“編輯代碼”區(qū)域內(nèi)進(jìn)行待測(cè)評(píng)代碼的編輯,程序自動(dòng)評(píng)測(cè)成功頁面如圖3所示。如果代碼需要輸入值,可以填寫相應(yīng)的輸入值。點(diǎn)擊“運(yùn)行”按鈕,可以對(duì)代碼進(jìn)行編譯。如果代碼有錯(cuò)誤、編譯未通過,會(huì)顯示編譯報(bào)錯(cuò),“編譯結(jié)果”輸出框會(huì)給出相應(yīng)的編譯出錯(cuò)信息提示;如果代碼運(yùn)行正常,則顯示相應(yīng)的運(yùn)行結(jié)果。當(dāng)學(xué)生點(diǎn)擊“提交”按鈕后,代碼就上傳到服務(wù)器端并進(jìn)行自動(dòng)評(píng)測(cè),并根據(jù)教師預(yù)先設(shè)置的一組或者多組測(cè)試用例的輸入和輸出,與學(xué)生提交的待測(cè)評(píng)代碼進(jìn)行模糊匹配——如果源代碼通過了測(cè)試用例,即可獲得滿分;如果有一組測(cè)試用例沒被通過,則會(huì)根據(jù)相應(yīng)的比重計(jì)算分?jǐn)?shù)。
圖3 程序自動(dòng)評(píng)測(cè)成功頁面圖
圖4 學(xué)生代碼相似度詳情頁面
(3)學(xué)生作業(yè)防抄襲模塊
學(xué)生作業(yè)防抄襲模塊采用大數(shù)據(jù)分析方法,主要用于教師查看學(xué)生與學(xué)生之間編程題作業(yè)的雷同情況。對(duì)任意兩個(gè)學(xué)生A和B同一道編程題的作業(yè)進(jìn)行相似度計(jì)算的方法是:將A同學(xué)待檢測(cè)作業(yè)的每一行代碼與B同學(xué)作業(yè)的每一行代碼計(jì)算相似度(字?jǐn)?shù)少于15字的代碼行不進(jìn)行計(jì)算),最高值作為兩同學(xué)作業(yè)的該行代碼的相似度;然后,計(jì)算所有行代碼相似度的平均值,作為兩同學(xué)該道編程題作業(yè)的相似度,具體頁面如圖4所示。
2 系統(tǒng)效率測(cè)試
為了進(jìn)行系統(tǒng)的負(fù)載測(cè)試(壓力測(cè)試),本研究編寫了C語言程序文件test.c和測(cè)試Shell腳本。其中,test.c包括9行代碼,時(shí)間復(fù)雜度為O(1),即執(zhí)行該程序所需要的計(jì)算工作量為常量,并且與問題規(guī)模n無關(guān)。在測(cè)試Shell腳本中指定test.c的兩組測(cè)試用例的輸入、輸出、權(quán)重以及分?jǐn)?shù),并使程序test.c連續(xù)運(yùn)行500次。在運(yùn)行腳本前輸出時(shí)間,運(yùn)行腳本后再次輸出時(shí)間,以兩次時(shí)間間隔作為這個(gè)程序連續(xù)運(yùn)行500次耗費(fèi)的時(shí)間。運(yùn)行結(jié)果顯示:這個(gè)程序test.c運(yùn)行500次耗費(fèi)的時(shí)間是55秒,這大致相當(dāng)于每運(yùn)行一次程序約耗時(shí)100毫秒——當(dāng)然,如果服務(wù)器配置比較好,那么耗費(fèi)的時(shí)間也就更少。
本研究通過對(duì)已有在線評(píng)測(cè)系統(tǒng)的分析和總結(jié),結(jié)合MOOC發(fā)展的切實(shí)需求,提出了基于云計(jì)算平臺(tái)和大數(shù)據(jù)分析的編程語言在線自動(dòng)評(píng)測(cè)方法,并開發(fā)了基于MOOC的編程語言自動(dòng)評(píng)測(cè)系統(tǒng)。該系統(tǒng)可以對(duì)用戶提交的C、C++等語言源代碼進(jìn)行在線自動(dòng)評(píng)判,實(shí)時(shí)地得到程序編譯、運(yùn)行結(jié)果。與傳統(tǒng)的人工評(píng)測(cè)方法相比,該系統(tǒng)大大提高了評(píng)測(cè)的效率和準(zhǔn)確程度。不僅如此,該系統(tǒng)還可以根據(jù)測(cè)試用例對(duì)用戶提交的源代碼進(jìn)行黑盒測(cè)試,并根據(jù)測(cè)試用例的輸入、輸出、權(quán)重、分?jǐn)?shù),計(jì)算出該用戶的最終得分。而對(duì)于用戶代碼的輸出結(jié)果,本研究使用了模糊匹配算法對(duì)程序進(jìn)行分?jǐn)?shù)計(jì)算,不會(huì)因?yàn)槠渌栴}而導(dǎo)致程序運(yùn)行得不到正確的結(jié)果。同時(shí),本研究利用大數(shù)據(jù)分析方法,通過分析對(duì)比計(jì)算出兩兩程序源代碼之間的相似度,智能化地檢測(cè)出抄襲行為,為鼓勵(lì)學(xué)生自主學(xué)習(xí)、獨(dú)立作業(yè)并在理解消化知識(shí)的基礎(chǔ)之上提高編程能力奠定了基礎(chǔ)。上線試運(yùn)行表明,該系統(tǒng)具有較高的評(píng)測(cè)效率,能夠?qū)崿F(xiàn)500人并發(fā)提交編程題,且運(yùn)行穩(wěn)定,具有較好的可擴(kuò)展性。
[1][10]李華,龔藝,紀(jì)娟,等.面向MOOC的學(xué)習(xí)管理系統(tǒng)框架設(shè)計(jì)[J].現(xiàn)代遠(yuǎn)程教育研究,2013,(3):28-33.
[2]魯靜軒,孫晶,李元嵩.程序在線評(píng)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].硅谷,2008,(24):38.
[3]黃隴,陳致明.軟件測(cè)試數(shù)據(jù)生成中的區(qū)間削減方法研究[J].南京大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,(z1):663-667.
[4]陳東東,須文波.基于ASP.NET技術(shù)的綜合業(yè)務(wù)管理平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦與電信,2008,(8):85-86、98.
[5]Collins M, Duffy N. Convolution kernels for natural language[J]. Advances in Neural Information Processing Systems, 2002,(l):625-632.
[6]范立新.改進(jìn)的中文近似字符串匹配算法[J].計(jì)算機(jī)工程與應(yīng)用,2006,(34):172-174、207.
[7]徐瑩.匯編程序在線評(píng)測(cè)系統(tǒng)的研究與開發(fā)[D].河南:鄭州大學(xué),2010:2-5.
[8]Wang J X, Chen L, Zhou W W. Design and implementation of an internet-based platform for C language learning[A]. Li F, Zhao J, Shih T, et al. Advances in Web based Learning - ICWL 2008[C]. Berlin: Springer-Verlag, 2008:187-195.
[9]王春霞.自動(dòng)閱卷系統(tǒng)的開發(fā)[J].鹽城工學(xué)院學(xué)報(bào)(自然科學(xué)版),2002, (1):47-49.
[11]馬金鐘.依托MOOC平臺(tái)的高校課程聯(lián)盟運(yùn)行機(jī)制及實(shí)施策略[J].中國電化教育,2014,(12):81-84、116.
編輯:小米
The Automatic Judge of MOOC-based Programming Language
HU Hui1ZHENG Li-hua1GAO Wan-lin1[Corresponding Author]ZHOU Xu-hong2
Aiming at the problems existing in the learning of massive online education programming language that students have to install IDE development environment to compiler program, and teachers take a lot of effort to judge students’ programming assignments, this paper studied the application patterns and methods of automatic judge of programming language, and further developed an automatic judge system of MOOC-based programming language. The judging effectiveness of this system was verified through experiments. Firstly, the system could provide distributed cluster test environment for learners that included online editing, compiling and running program to study computer programming courses on massive online education platform. Secondly, this system judged the validity of program automatically and in real-time based on the use cases set by teachers. Finally, this system could also conduct big data analytics on submitted program code, which found out the similarity between different programs, automatically and intelligently preventing plagiarism.
MOOC; programming language; automatic judge; anti-plagiarism; big data
G40-057
A
1009—8097(2016)09—0080—06
10.3969/j.issn.1009-8097.2016.09.012
本文為2014年度北京高等學(xué)校教育教學(xué)改革項(xiàng)目“MOOCs與課堂相結(jié)合的混合式教學(xué)模式在程序設(shè)計(jì)課程中的應(yīng)用研究與實(shí)踐”(項(xiàng)目編號(hào):2014-ms044)的階段性研究成果。
胡慧,在讀博士,研究方向?yàn)檗r(nóng)業(yè)信息化、云計(jì)算、在線教育等,郵箱為cauhuhui@163.com。
2015年11月17日