本文作者:bang

叙利亚风格的在线编程系统

bang 2021-06-07 92
叙利亚风格的在线编程系统摘要: 参加过校园招聘机试的你, 在CSDN、牛客网上做过编程题目的你,肯定都有过在一个web页面输入代码,得到执行结果的经历。聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?...

参加过校园招聘机试的你, 在CSDN、牛客网上做过编程题目的你,

肯定都有过在一个web页面输入代码,得到执行结果的经历。聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?

最近,笔者要做的一项工作是,编写各种demo程序、辅以各种JVM参数测试给出JDK1.8各种参数的建议值。要求给出在linux物理机、虚拟机和docker下的对比测试结果。

接到这个工作后,初步的计划是在windows上写程序,打个jar包,然后放在linux物理机、虚拟机和docker上分别测试。

完成两个demo后,发现这么做的工作量实在太大了,常用JVM参数就有数十个,每个参数都得测试,每个参数编译个jar包,不知道这个工作要做到何年何月。

于是,一个想法产生了, 能不能只编写一次程序,然后一直测试

很自然地想起了那些经历过的在线编程系统。这类系统是如何实现的呢?

其实,仔细想想很简单,Java代码得到结果不就是编译、运行两步么?简单设计下原型:

叙利亚风格的在线编程系统

实现过程中基本没遇上什么难度,

关键代码:

第一步编译:

ProcessBuilder pb = new ProcessBuilder();//编译文件pb.command("javac", "-encoding" ,"UTF-8", programInfo.getFileName() + ".java");pb.directory(new File(programInfo.getFilePath()));Process compileProcess = pb.start();int compileStatus = compileProcess.waitFor();//编译出错if (compileStatus != 0) {    String insResult = getResult(compileProcess.getInputStream());    String errorResult = getResult(compileProcess.getErrorStream());    return insResult + errorResult;}

第二步运行:

构造用户输入的运行参数

//构造运行时命令List<String> commands = new ArrayList<>();commands.add("java");if (jvmparas != null) {    String[] paras = jvmparas.toString().split("\n");    for (String para : paras) {        if (para != null) {            commands.add(para.trim());        }    }}

执行代码

commands.add("TestFile");ProcessBuilder execPb = new ProcessBuilder();execPb.command(commands);execPb.directory(new File(programInfo.getFilePath()));Process execProcess = execPb.start();compileProcess.waitFor();//把结果返回给界面return  getResult(execProcess.getInputStream())+ getResult(execProcess.getErrorStream());

叙利亚风格UI界面:

叙利亚风格的在线编程系统

运行结果:

叙利亚风格的在线编程系统

构造出错场景

1.编译异常:

叙利亚风格的在线编程系统

2、运行异常:

叙利亚风格的在线编程系统

功能实现难度不大,但是过程还是挺有意思的,感兴趣的可以自行从github下载完整代码,如果你也觉得有点意思点赞、关注走一波。

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享