APP下载

基于MOOC的编程语言自动评测*

2016-12-10郑立华高万林周绪宏

现代教育技术 2016年9期
关键词:程序代码编程语言测试用例

胡 慧 郑立华 高万林 周绪宏



基于MOOC的编程语言自动评测*

胡 慧1郑立华1高万林1[通讯作者]周绪宏2

(1.中国农业大学信息与电气工程学院,北京 100083;2.上海宏第网络科技有限公司,上海 200000)

针对大规模在线教育编程语言学习中存在的学生需要安装IDE开发环境编译程序、教师评判费时耗力等问题,文章研究了编程语言自动评测的应用模式和方法,开发了基于MOOC的编程语言自动评测系统,并通过实验验证了该系统的评判效率。该系统可以为大规模在线教育平台学习计算机程序设计课程提供在线编辑程序、编译程序、运行程序的分布式集群测试环境;可以根据教师设置的程序用例,实时、自动地评判程序的正确性;还可以对提交的程序代码进行大数据分析,找出不同作业之间的相似度,自动、智能化地防范抄袭等行为。

MOOC;编程语言;自动评判;防抄袭;大数据

引言

近年来,一种新的网络课程教学模式——MOOC(Massive Open Online Course,大规模开放在线课程)在教育领域兴起。以edX为例,由于其免费、公开,无数学子对其竞相追捧,其用户也逐渐增加,早在2013年就已经拥有超过90万的注册者[1]。C语言、C++语言、Java语言是目前计算机程序设计中应用广泛的编程语言,也是各类高等院校计算机及相关专业必修的基础课。但学生学习这些编程语言时,需要在机房或个人电脑上安装IDE开发环境来编辑程序、编译程序、运行程序,而在编辑、编译、运行中碰到常见的问题时,往往不知如何解决;教师在评判学生的编程题作业时,也需要拷贝程序、编译程序、运行程序后才能给出分数,费时耗力。

为了解决上述问题,相关人员对程序设计题在线评测做了一些研究。在国外,程序评测系统主要应用于程序竞赛,对源代码进行自动编译运行以及记时、评分、统计等[2]。目前,国外影响力最大的程序评测系统是PC2程序测试控制系统,它由美国加州大学专为支持ACM/ICPC而设计研发。该系统提供了完整的程序竞赛评测解决方案,竞赛举办方可在系统的后台操作、制定具体的竞赛规则,从而对竞赛选手提交的源代码进行检查、编译、执行,最终将评测结果返回给参赛者[3]。对比国外,国内的程序评测系统起步较晚,但随着国内ACM/ICPC的逐渐兴起,国内不少高校和组织纷纷对程序评测系统进行了研发,比较典型的有北京大学在线评测系统(PKU Online Judge)[4][5]、浙江大学在线评测系统(ZJU Online Judge)[6]、中国科技大学在线评测系统(USTC Online Judge)[7]以及高中生程式解题系统(An Online Judge System For Beginners)[8][9]等。

在大规模在线开放课程中,“大规模”意味着参与者的数量不受限制;“开放”意味着任何人都可以参与学习,并且是免费的;“在线”则意味着参与者通过网络参与课程,不受地域限制[10]。面对如此大的用户量和访问量,已有的编程语言自动评测系统能否满足其需求还有待评估,而且目前也没有有效的数据或方法能够进行证明。鉴于此,本研究采用了云计算和大数据的相关技术,构建了基于MOOC的编程语言自动评测系统,可以为大规模在线教育平台的计算机程序设计课程(如“C程序设计”、“C++程序设计”等课程)提供在线编辑程序、编译程序、运行程序的分布式集群测试环境;可以根据教师设置的程序用例,实时、自动地评判程序的正确性,并返回相应的分数;还可以对提交的程序代码进行大数据分析[11],找出常见的编译错误、参考程序代码等,能够有效解决教师对学生提交的编程题作业不能简单快速地予以验证、不能有效客观给分、不能给出编译运行出错的帮助信息、不能给出程序参考代码等问题,从而更好地为编程语言类课程提供服务。

一编程语言自动评测的应用模式

大规模在线教育为教学提供了一种全新的模式,其中对编程语言类课程习题的评判也应该本着更好、更便捷地服务于用户的目标,为教学/学习编程者提供便利的测试环境和大数据分析环境。也就是说,要创设一个环境,使学生不需要在本地电脑上安装IDE开发环境,就可以随时随地通过电脑、手机、平板电脑等学习编程题;教师也不需要为批改、评判编程题作业而头疼,而是可以从编程题作业的大数据分析中获取有助于教学的信息。

鉴于此,本研究提出了编程语言自动评测的三种应用模式,不同用户可以根据自身的需求选择使用其中的一种或多种应用模式,如表1所示。

表1 编程语言自动评测的三种应用模式

1 简单应用

简单应用是用户以某种方式提交程序代码(用户自定义输入)到服务器端,服务器端编译、运行该程序代码,并返回编译、运行结果——如果有编译错误,会显示代码程序哪一行错误、什么错误;如果有运行错误,则显示代码程序哪一行错误。简单应用方式只编译、运行用户程序,不评判程序的运行结果,也不给出分数。

2 高级应用

高级应用是用户以某种方式提交程序代码、测试用例输入、测试用例输出、测试用例权重、测试用例分数到服务器,服务器端编译、运行该程序代码,同时使用测试用例输入进行运行测试,并将运行结果和测试用例的期望值进行精确比较,根据权重计算出每组测试用例的得分。有几组测试用例就运行比较几次,最终计算出所有测试用例的总分,并返回运行结果、总得分到用户客户端。高级应用方式既要编译、运行用户程序,又要用测试用例来评判程序的运行结果并给出分数。

3 智能应用

智能应用是用户以某种方式提交程序代码、测试用例输入、测试用例输出、测试用例权重、测试用例分数到服务器,服务器自动编译、运行该代码程序,系统对输出结果进行智能匹配,显示更多的调试信息,并给出代码的修改建议;同时,对提交的程序代码进行大数据分析,搜索出类似的程序代码返回给学生参考,并列出类似的、常见的编译错误供学生找出问题,从而更好地学习编程语言。智能应用方式既要编译、运行用户程序,又要用测试用例来评判程序运行结果并给出分数,还要对程序代码进行大数据分析,找出类似的代码或常见的编译错误。

二编程语言自动评测的方法

1 分布式集群系统设计

本研究构建的基于MOOC的编程语言自动评测系统的服务器端采用部署在云计算平台的分布式集群系统(如图1所示),包括评测管理节点(Manager Node)、程序运行节点(Program Run Node)、作业管理节点(Job Manager Node)、任务节点(Task Node)、数据管理节点(Name Node)、数据节点(Data Node)。

图1 基于分布式集群的自动评测系统

图2 系统功能模块图

具体来说,评测管理节点用于在收到客户端的连接请求后,通过数据管理节点将待测评代码保存到分布式文件系统中,并根据当前的负载情况给待测评代码分配程序运行节点;然后,由程序运行节点编译程序、运行程序、评判程序,而程序编译结果等数据保存在分布式文件系统中。作业管理节点用于提交搜索查询代码作业,然后分配作业到各个任务节点,通过各个任务节点并发进行代码的大数据搜索与匹配,并将匹配结果返回到作业管理节点;最后,将程序运行节点返回的结果、作业管理节点返回的结果,经过处理返回到客户端。数据管理节点和数据节点则组成分布式文件系统(Distrubuted File System),为其它各个节点处理数据提供保存程序代码和其它数据的环境。

总之,基于MOOC的编程语言自动评测系统服务器端的各个节点,都是由云计算平台提供的虚拟机节点,可以根据需要动态地调整各种节点虚拟机的数量,以更合理地利用服务器的资源,满足实际运行的需要。

2 评测系统的安全性保障

为保障基于MOOC的编程语言自动评测系统的安全,服务器端对客户端提交的程序代码要进行特殊的云安全检查:

(1)对程序代码进行病毒、恶意代码扫描检查;

(2)对程序代码是否含有不允许执行的系统命令或调用特殊的系统API进行扫描检查;

(3)对程序代码内存分配、释放、检查,程序运行结束后,系统应自动释放、回收用户程序未显示释放的内存。

(4)对程序代码中出现的问题或设计缺陷(如程序死循环、空耗CPU资源等)进行检查,一旦检测到某个运行程序异常,则立刻终止该程序的运行。

三基于MOOC的编程语言自动评测系统的设计和开发

本研究基于中国农业大学的MOOC平台——雨虹学网,运用上述编程语言自动评测的方法,设计并开发了基于MOOC的编程语言自动评测系统。

1 系统功能

本系统的功能模块如图2所示,主要分为三个模块:

(1)教师出题模块

在教师出题模块,教师可以添加编程题,设置编程题的类型、分数,起止时间等,然后填写编程题目、描述问题、测试用例、点击提交,即可生成一道编程题。其中,测试用例可以设置多组,每组测试用例有不同的输入和可以预计得到的输出;每组测试用例可以设置不同的权重,从而得到不同的分值。也就是说,即使代码程序采取投机取巧的方式,也只能通过一组测试用例,而不能通过所有或部分的测试用例。

(2)学生答题模块

在学生答题模块,学生可以在“编辑代码”区域内进行待测评代码的编辑,程序自动评测成功页面如图3所示。如果代码需要输入值,可以填写相应的输入值。点击“运行”按钮,可以对代码进行编译。如果代码有错误、编译未通过,会显示编译报错,“编译结果”输出框会给出相应的编译出错信息提示;如果代码运行正常,则显示相应的运行结果。当学生点击“提交”按钮后,代码就上传到服务器端并进行自动评测,并根据教师预先设置的一组或者多组测试用例的输入和输出,与学生提交的待测评代码进行模糊匹配——如果源代码通过了测试用例,即可获得满分;如果有一组测试用例没被通过,则会根据相应的比重计算分数。

图3 程序自动评测成功页面图

图4 学生代码相似度详情页面

(3)学生作业防抄袭模块

学生作业防抄袭模块采用大数据分析方法,主要用于教师查看学生与学生之间编程题作业的雷同情况。对任意两个学生A和B同一道编程题的作业进行相似度计算的方法是:将A同学待检测作业的每一行代码与B同学作业的每一行代码计算相似度(字数少于15字的代码行不进行计算),最高值作为两同学作业的该行代码的相似度;然后,计算所有行代码相似度的平均值,作为两同学该道编程题作业的相似度,具体页面如图4所示。

2 系统效率测试

为了进行系统的负载测试(压力测试),本研究编写了C语言程序文件test.c和测试Shell脚本。其中,test.c包括9行代码,时间复杂度为O(1),即执行该程序所需要的计算工作量为常量,并且与问题规模n无关。在测试Shell脚本中指定test.c的两组测试用例的输入、输出、权重以及分数,并使程序test.c连续运行500次。在运行脚本前输出时间,运行脚本后再次输出时间,以两次时间间隔作为这个程序连续运行500次耗费的时间。运行结果显示:这个程序test.c运行500次耗费的时间是55秒,这大致相当于每运行一次程序约耗时100毫秒——当然,如果服务器配置比较好,那么耗费的时间也就更少。

四结论

本研究通过对已有在线评测系统的分析和总结,结合MOOC发展的切实需求,提出了基于云计算平台和大数据分析的编程语言在线自动评测方法,并开发了基于MOOC的编程语言自动评测系统。该系统可以对用户提交的C、C++等语言源代码进行在线自动评判,实时地得到程序编译、运行结果。与传统的人工评测方法相比,该系统大大提高了评测的效率和准确程度。不仅如此,该系统还可以根据测试用例对用户提交的源代码进行黑盒测试,并根据测试用例的输入、输出、权重、分数,计算出该用户的最终得分。而对于用户代码的输出结果,本研究使用了模糊匹配算法对程序进行分数计算,不会因为其它小问题而导致程序运行得不到正确的结果。同时,本研究利用大数据分析方法,通过分析对比计算出两两程序源代码之间的相似度,智能化地检测出抄袭行为,为鼓励学生自主学习、独立作业并在理解消化知识的基础之上提高编程能力奠定了基础。上线试运行表明,该系统具有较高的评测效率,能够实现500人并发提交编程题,且运行稳定,具有较好的可扩展性。

[1][10]李华,龚艺,纪娟,等.面向MOOC的学习管理系统框架设计[J].现代远程教育研究,2013,(3):28-33.

[2]鲁静轩,孙晶,李元嵩.程序在线评测系统的设计与实现[J].硅谷,2008,(24):38.

[3]黄陇,陈致明.软件测试数据生成中的区间削减方法研究[J].南京大学学报(自然科学版),2005,(z1):663-667.

[4]陈东东,须文波.基于ASP.NET技术的综合业务管理平台的设计与实现[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].计算机工程与应用,2006,(34):172-174、207.

[7]徐莹.汇编程序在线评测系统的研究与开发[D].河南:郑州大学,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]王春霞.自动阅卷系统的开发[J].盐城工学院学报(自然科学版),2002, (1):47-49.

[11]马金钟.依托MOOC平台的高校课程联盟运行机制及实施策略[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年度北京高等学校教育教学改革项目“MOOCs与课堂相结合的混合式教学模式在程序设计课程中的应用研究与实践”(项目编号:2014-ms044)的阶段性研究成果。

胡慧,在读博士,研究方向为农业信息化、云计算、在线教育等,邮箱为cauhuhui@163.com。

2015年11月17日

猜你喜欢

程序代码编程语言测试用例
基于JavaScript编程语言之 闭包技术在焦点轮播上的应用
回归测试中测试用例优化技术研究与探索
基于SmartUnit的安全通信系统单元测试用例自动生成
Java编程语言的特点与应用
浅谈不同编程语言对计算机软件开发的影响
计算机网络信息安全未来发展趋势
基于图元装接模式由程序流程图自动生成源代码
面向对象Web开发编程语言的的评估方法
基于依赖结构的测试用例优先级技术
软件回归测试用例选取方法研究