几行代码实现一个叙利亚版的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下载完整代码查看


总结


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

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

你我皆加油!


目录
打赏
0
0
0
0
221
分享
相关文章
微服务启动jar包脚本
微服务启动jar包脚本
129 0
通过ACR快速部署网站应用实践
本场景介绍如何在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
Zig
Zig 是一门系统编程语言,旨在提供一种简单、安全且高效的方式来构建软件。它的设计受到了 Rust、C 和 C++ 的影响,但与这些语言相比,Zig 更加简单易用。Zig 的语法和抽象级别使得它易于学习和使用,同时它还提供了许多现代编程语言的功能,如高级类型、模块化编程和内存安全等。
472 6
阿里云主机的Milk-V Duo开发板python环境搭建
Milk-V Duo是一款基于算能CV1800B芯片的开发板。搭载阿里云平头哥玄铁C906处理器核心,最高频率为1GHz,视频解码、2D图形加速能力强,可应用于智能语音、智能汽车及高清显示等领域。开发板身材小巧,大小和树莓派Pico相当,引脚也基本一致,但是功能更强大一些,能够运行基于LINUX和RTOS的操作系统。
1334 0
恒生电子联合蚂蚁金服、阿里云,发布新一代技术平台
5月16日,恒生电子联合蚂蚁金服、阿里云发布“新一代分布式服务开发平台”。
3352 0
从 0 到 1 搭建大数据平台之计算存储系统
从 0 到 1 搭建大数据平台之计算存储系统
441 0
DataWorks 功能实践速览02期
DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率!
1380 0
DataWorks 功能实践速览02期
ET工业大脑开放平台,全球首个工业智能的孵化基地
8月1日,阿里云ET工业大脑开放平台正式发布!赋能生态从感知,到知识,到智慧,阿里云匠心打造,让工业设备真正实现自感知、自诊断、自决策、自配置。为智能工业带来划时代助推力!
4674 0

热门文章

最新文章

AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等