前言
作为一个Online Judge系统,最重要的一件事情,就是对用户提交给系统的代码进行编译,然后再将其加载进JVM中,然后才能通过反射的方式,调用入口方法,以此达到运行用户代码的目的。
首先需要的说明是,我下面的贴出的代码,由于篇幅等缘故,我只会贴出跟我讲的内容有关的代码,因此并不会贴出所有的代码,代码会因此有些不连贯,也无法直接复制进行使用。整个系统完整的代码,会在这个系列最后的博文中给出GitHub的地址。
代码约束
在开始讲我们实现之前,首先我说明几点,用户提交的代码必须要遵守的几点原则,至于为什么要有这样的规定呢,将会在后面慢慢给出答案:
- 有且只有一个外部类,并且是public并以Main命名,其余出现的类都必须是内部类
- 从系统标准输入流(System.In)中读取数据
- 将结果通过系统标准输出流(System.out)进行输出
- 必须拥有main方法并以此为程序入口
下图就是一个合格的代码规范示例:
-
代码编译
代码的编译在系统的web端进行的,大致流程就是从网络中接收到用户提交的代码后(其实就是一堆字符串),先用正则进行一些简单的判断,接着将其保存为一个文件,再然后利用JAVA提供的编译API(可以参考: