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


总结


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

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

你我皆加油!


目录
相关文章
|
存储 C语言
数据结构:循环链表
【7月更文挑战第21天】
189 2
|
8天前
|
数据采集 人工智能 安全
|
17天前
|
云安全 监控 安全
|
3天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
291 164
|
2天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
301 155
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
233 113
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
805 6