今天在 GitHub Trending 上看到一个很有意思的项目:OICPP IDE,一款专为信息学竞赛(OI/ACM)选手打造的轻量级集成开发环境,基于 Electron + Monaco Editor 构建,瞄准了"退役 OIer 对编程工具的热爱"这个细分需求。
一、项目概述
OICPP IDE 起源于一位退役高中 OIer 对信息学竞赛工具的深度思考。开发团队实地采访了现役 OI 选手(Genius_Star、Cby_、水星湖等),提炼出竞赛编程中真正的高频痛点,并围绕这些痛点打造了整套功能闭环。
核心功能矩阵:
- 代码编辑与运行:基于 Monaco Editor(VS Code 同款),支持语法高亮、代码补全、多标签页
- 一键下载编译器 & testlib:自动配置 GCC/Clang 工具链,无需手动折腾环境
- 样例测试器:支持文件大样例批量测试,输入输出比对一目了然
- 代码对拍器:差异高亮 + 数据导出,快速验证算法正确性
- 调试功能:内置调试支持,断点、变量监视一应俱全
- 平台样例抓取:通过浏览器插件自动抓取 Codeforces、AtCoder、Luogu、He Tao 的样例数据
- 云编译:一键测试代码在 Linux 环境下的编译是否通过
- 云空间:多设备间同步代码,项目随时随地可继续
- 内置终端 + PDF 阅读器 + Markdown 侧边预览
- 深浅主题切换 + 自定义背景图片 + 窗口透明度调节
技术栈方面,项目使用 Electron 37+ + Node.js 20+ + Monaco Editor 0.52+,构建工具为 electron-builder,支持 Windows(NSIS)、macOS、Linux(deb/rpm/AppImage)全平台打包。
二、技术原理
2.1 整体架构
OICPP IDE 采用经典的 Electron 多进程架构:
┌─────────────────────────────────────────────┐
│ Main Process │
│ (src/main.js — 窗口管理、系统交互、node-pty) │
└──────────────┬──────────────────────────────┘
│ IPC
┌──────────────▼──────────────────────────────┐
│ Renderer Process │
│ (Monaco Editor + React-like UI + Xterm.js) │
└─────────────────────────────────────────────┘
核心依赖解析:
// package.json 关键依赖
{
"dependencies": {
"monaco-editor": "^0.52.2", // 代码编辑器核心
"node-pty": "^1.0.0", // 跨平台终端模拟器(Go 实现)
"xterm": "^5.3.0", // 终端前端组件
"pdfjs-dist": "5.0.375", // PDF 渲染(内置 PDF 阅读器)
"markdown-it": "^14.1.0", // Markdown 渲染
"@iktakahiro/markdown-it-katex": "^4.0.1", // LaTeX 公式支持
"axios": "latest", // 网络请求(样例抓取)
"sharp": "^0.33.5", // 图片处理(图标生成)
"node-stream-zip": "^1.15.0" // ZIP 解压(安装包处理)
},
"devDependencies": {
"electron": "^37.2.0",
"electron-builder": "^26.0.0",
"webpack": "^5.101.0", // 打包 Monaco Editor 资源
"monaco-editor-webpack-plugin": "^7.1.0"
}
}
2.2 竞赛编程专用功能实现
样例抓取机制:通过 Electron 内置浏览器加载 Codeforces/Luogu 等平台页面,注入内容脚本提取题目描述和样例数据,然后通过 IPC 传回渲染进程,直接填入测试面板。这是典型的"浏览器自动化 + IPC 通信"模式。
对拍器原理:利用 node-pty 启动两个编译后的可执行文件,用随机生成器(或指定数据)分别喂入,比较输出差异,高亮显示不一致的位置。核心是一个典型的 diff 比对逻辑:
// 对拍器核心逻辑(示意)
const runProgram = (exePath, input) => {
return new Promise((resolve, reject) => {
pty.write(input + '\n');
pty.onData(data => resolve(data));
});
};
const compare = (out1, out2) => {
const lines1 = out1.trim().split('\n');
const lines2 = out2.trim().split('\n');
for (let i = 0; i < Math.max(lines1.length, lines2.length); i++) {
if (lines1[i] !== lines2[i]) {
return { equal: false, line: i, a: lines1[i], b: lines2[i] };
}
}
return { equal: true };
};
云编译:通过 HTTP 请求将源代码 POST 到编译服务器,服务器在 Linux 容器中执行编译并返回结果,客户端展示编译日志。这一步解决了 Windows 用户在本地编译通过但 Linux 下 CE(Compile Error)的问题。
2.3 构建与打包
Electron 应用的构建链路:
npm run build
# 等价于:
# npm run prebuild:buildinfo → 生成版本信息
# npm run prebuild:icons → 生成多尺寸图标(sharp 处理 PNG)
# npm run prebuild:clangd → 下载 clangd 语言服务器(代码补全后端)
# electron-builder → 打包为各平台安装包
各平台的 clangd(代码补全引擎)通过 scripts/download-clangd.js 按平台独立下载,放入 build/clangd/{platform} 目录,最终打包到 extraResources 中。
三、安装与快速开始
3.1 下载安装
方式一:从官网下载(推荐)
访问 oicpp.mywwzh.top 下载最新版本的安装包,对应你的操作系统。
方式二:从 GitHub Release 下载
进入 Releases 页面 下载 .exe(Windows)或 .dmg(macOS)安装包。
方式三:源码编译
git clone https://github.com/mywwzh/oicpp.git
cd oicpp
npm install
npm run build # 需要 Node.js 20+,Windows 需额外安装 Python 3
3.2 初始配置
首次启动后,OICPP 会自动检测编译器环境。若未检测到,点击菜单 工具 → 下载编译器,程序会自动下载 GCC 并配置到 PATH 中。
四、使用方法与实战
4.1 基础使用:完成一道 Codeforces 题目
- 打开 OICPP IDE,新建文件(
Ctrl+N) - 点击右侧 平台样例 面板,选择 Codeforces,输入题目链接
- 程序自动抓取题目描述和样例,填入测试面板
- 在 Monaco Editor 中编写代码,保存为
solution.cpp - 点击 ▶ 运行,查看所有样例的输出结果
- 点击 提交,程序将代码复制到剪贴板,跳转到 Codeforces 提交页面
4.2 对拍验证算法正确性
# 在 OICPP IDE 中:
# 1. 编写暴力解法(solution_brute.cpp),保存
# 2. 编写正解(solution.cpp),保存
# 3. 打开对拍器,加载两个文件
# 4. 设置测试数据范围(随机数据生成器)
# 5. 点击"开始对拍",程序自动运行并比对
对拍器会自动记录每次比对结果,发现不匹配时会暂停并高亮差异行,帮助你快速定位 bug。
4.3 深色主题 + 自定义背景
OICPP 支持完整的深色主题,并提供代码编辑器背景图片自定义和窗口透明度调节功能。进入 设置 → 外观,即可调整主题、背景图和透明度,适合长时间训练时保护视力。
五、常见问题与解决方案
Q1:首次启动提示"编译器未找到"?
A:OICPP 需要本地安装 GCC 或 Clang。进入 工具 → 下载编译器,程序会自动下载 MinGW-w64(Windows)或提示安装 Xcode Command Line Tools(macOS)。Linux 用户确保系统已安装 g++。
Q2:代码补全不工作?
A:检查是否成功下载了 clangd。进入 工具 → 下载 clangd,程序会自动为当前平台下载对应版本。clangd 下载完成后重启 IDE。
Q3:云编译显示连接失败?
A:云编译依赖网络连接。检查防火墙/代理设置,确保可以访问 oicpp.mywwzh.top。如果在内网环境中,可考虑自建编译服务器(项目提供了编译接口文档)。
Q4:对拍器提示"程序崩溃"?
A:检查代码中是否存在段错误(空指针访问、数组越界等),可在对拍器中开启 启用调试模式,程序崩溃时会自动进入调试界面定位问题。
Q5:macOS 版本无法打开,提示"已损坏"?
A:这是 macOS 对未签名应用的限制。进入 系统设置 → 隐私与安全性,找到 OICPP IDE 的安全提示,点击"仍要打开"。或执行:xattr -d com.apple.quarantine /Applications/OICPP\ IDE.app
六、总结
OICPP IDE 是一款定位非常清晰的产品——不做通用 IDE,而是聚焦信息学竞赛选手的真实工作流:写代码 → 调试 → 测样例 → 对拍 → 提交,每个环节都打磨到位。基于 Electron + Monaco Editor 的技术选型保证了跨平台能力和开发效率,而内置浏览器插件抓取样例、云编译绕过系统差异等设计则体现了对竞赛场景的深度理解。
如果你是一名 OI/ACM 选手,或者正在准备 CSP/NOIP 等国内信奥比赛,OICPP IDE 值得一试。官网:https://oicpp.mywwzh.top,GitHub:https://github.com/mywwzh/oicpp。