- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一种脚本化在线评测系统的实现课件
一种脚本化在线评测系统的实现
中山纪念中学
唐适之
@The_Roast_Duck
YAUJ = YET ANOTHER UNIVERSAL JUDGE
本项目是基于中山纪中原有的Fortuna OJ部分重构的,重写了大部分后台和小部分前端,目前仍处于测试阶段。在此感谢原作者moreD学长的前期工作。
Fortuna OJ项目源码可以在/roastduck/fortuna-oj/找到(没有文档)
YAUJ = YET ANOTHER UNIVERSAL JUDGE
YAUJ是受VFK的UOJ启发编写的,感谢VFK同学提供了一个封装得非常好的sandbox。我用它替代了我一开始使用的libsandbox作为评测核心。
YAUJ = YET ANOTHER UNIVERSAL JUDGE
YAUJ是我的一个尝试。解决了一些问题但是也有自己的一些缺点
什么是脚本化
这里的脚本化是指,让OJ支持使用脚本定制试题,以支持更灵活的题目类型。
为什么是脚本化
为什么不直接使用SPJ?
为什么是脚本化
OJ并不是一个简单的测试器,需要与选手进行大量的操作。最简单的,也需要让选手知道每个点的时间、空间限制是多少(或没有?),也需要显示每个测试点的详细结果(时间、空间、状态、信息?)
实现对不同类型试题的通用处理,不仅要定义如何评测,也要影响网页前端的行为。
使用脚本以避免繁杂的表单。
为什么是脚本化
用UOJ上已经举过的一个例子:提交两个程序,一个压缩一个解压?那时空消耗怎么显示?
为什么是脚本化
用UOJ上已经举过的一个例子:提交两个程序,一个压缩一个解压?那时空消耗怎么显示?
或者说提交答案题需要提供数据下载。网页前端怎样知道有那些文件可以允许下载?
为什么是脚本化
用UOJ上已经举过的一个例子:提交两个程序,一个压缩一个解压?那时空消耗怎么显示?
或者说提交答案题需要提供数据下载。网页前端怎样知道有那些文件可以允许下载?
稍微复杂一点但也很常见的另一种情况?USACO上有一些题要求选手程序读入一个在所有测试点都不变的、可供选手下载的一个字典。怎样体现?
一.实现脚本
用什么实现脚本?
找一个现成的脚本语言?Lua听起来不错。语法简单,并且有将其解释器嵌入在C中的库。JavaScript?现在它已经不仅仅能在浏览器上运行了,这样可以用Js在后端评测而在前端预处理以节约编译时间。
一.实现脚本
用什么实现脚本?
可惜这些优点是我后来才想到的……
一.实现脚本
用什么实现脚本?
我自己实现了一个(解释器?编译器?)……嗯,翻译器。
一.实现脚本
用什么实现脚本?
我自己实现了一个(解释器?编译器?)……嗯,翻译器。
将脚本翻译成C++,编译后执行。
一.实现脚本
这是重复造轮子吗??
这样实现还是有一点好处的……
一.实现脚本
1. 编译语言执行效率更高。后来的调试证明,这种脚本也是有效率要求的。
2. 不用专门禁用一些可能危及系统安全的函数,也便于添加新的函数
3. 语法更贴近OIer习惯……这是一种脚本化的C++语法,支持动态类型、内建list和dict。
一.实现脚本
如何实现?
一.实现脚本
1. Bison + Flex。Bison是一个语义分析器,Flex是一个词法分析器,协同使用。通过指定语法规则,它们内部通过建立自动机最终输出一段代码的语法树。
(可以通过这种方法实现一个作弊检测工具吗?
一.实现脚本
2. 实现动态类型解释器。
二.与网页交互:文件授权
这是一种意在简化与网页交互的模型。
评测中涉及的文件分为5类(可重复):
0. 选手程序对其有读权限
1. 选手程序对其有写权限
2. 选手提交的文件(源码或纯文本)
3. 数据文件
4. 可执行文件
哪个程序读?
哪个程序写?
可用那些语言?
属于哪个(些)点?
提供下载?
源程序是哪个?
每个点的运行时空限制?(如果是spj程序则不用指定)
二.与网页交互:文件授权
脚本分为两部分:初始化、执行
二.与网页交互:文件授权
脚本在评测机上执行“初始化”和“执行”。读取文件权限以添加sandbox的限制规则。
脚本在网页服务器执行“初始化”,获取文件授权,其中包含的信息足以满足页面展示要求
二.与网页交互:通信
网页服务器和评测机分置在不同的机器上,使用JSON-RPC通信。
评测机是RPC Server,网页服务器是RPC Client。这是因为脚本需要执行以执行评测,而网页服务器只需发起评测以及获得信息。
二.与网页交互:通信
在网页Server和RPC Server间通信也带来了一些新的麻烦之处。要怎么从网页Server异步地向RPC Server发送并接受请求?
由于Fortuna OJ使用了php作为服务器脚本语言,对实现异步构成了一些障碍。我使用php-resq
文档评论(0)