几行代码实现一个叙利亚版的OJ系统

简介: 参加过校园招聘机试的你, 在CSDN、力扣、牛客网上做过编程题目的你,肯定都有过在一个web页面输入代码,得到执行结果的经历。 聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?

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

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


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

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


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


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


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

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

image.png

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

关键代码:


第一步编译:


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界面:


image.png


运行结果:


image.png


构造出错场景


1.编译异常:


image.png


2、运行异常:


image.png

功能实现难度不大,但是过程还是挺有意思的,感兴趣的可以自行从我github下载完整代码查看


总结


其实无论是生活还是开发中,原以为很困难的事情,只要细心分析可能发现也就是分为几步而已,把大象装冰箱不也就三步而已,定个一亿的小目标,兴许也能实现呢?

今天多学一样本事,以后就少说一句求人的话,

你我皆加油!


目录
相关文章
|
10月前
|
存储
《通讯录》思路及代码实现详解
《通讯录》思路及代码实现详解
96 0
|
2月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
3月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
34 1
|
3月前
|
算法
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(上)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
32 1
|
3月前
|
存储 Java 编译器
链表面试题的总结和思路分享
链表面试题的总结和思路分享
|
算法 C语言 C++
【双指针问题】LeetCode344、345、 844、283问题详解及代码实现
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
69 0
|
算法 C语言 C++
【双指针问题】LeetCode:392、3、11问题详解及代码实现
本篇总结过去一周内遇到双指针问题。
103 0
|
存储 程序员 测试技术
单链表面试题思路分享二
我们紧接上文单链表面试题分享一来看看本章我要分享的题目,共四个题目,我还是把它在力扣或者牛客网的链接交给大家:1.合并两个有序链表力扣21题-----2.链表的分割牛客网cc149-----3.链表的回文结构力扣234题-----4.链表相交力扣160题,本次分享还是和之前一样,代码用c语言实现,我只分享我自己的思路和我认为容易想错的点(我曾经错过的点),如若我的代码有问题但是这个题刚好可以编译可以,请大家评论区提出.
力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现
力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现
135 0
|
机器学习/深度学习 存储 缓存
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
105 0