在线运行代码怎么用?六种语言的沙箱执行与限制说明
手边没有编译器、又不想为几行代码装一整套环境时,在线运行是最快的验证方式。但它跑在一次性沙箱里,没有外网、不能持久化文件,先弄清边界再动手会更省时间。
- 在线运行适合 20 行以内的语法验证、小算法试算和可复现片段演示,不适合长任务、联网、装依赖、持久化文件
- 代码跑在一次性隔离容器里,有自己的文件系统和资源上限,运行结束即销毁,写入的文件不会留给下一次运行
- Python 和 JavaScript 在浏览器本地执行、代码不上传;Java、Go、C++、Shell 会发送到自建执行网关
- 隔离沙箱解决的是不污染你的机器,不等于内容保密,不要粘贴公司代码、密钥、token 和真实业务数据
- 报错先分五类:编译错误看行号、超时看死循环与等待输入、资源超限看数据规模、依赖缺失说明沙箱禁网、乱码看编码
- 六种语言的入口约定不同:Java 的类名要与入口文件配合、Go 必须有 package main、C++ 要包含头文件
#先看结论:三类任务适合在线运行
在线运行适合验证语法、试算小算法、演示可复现片段这三类任务;超过 20 行、需要外部依赖或需要联网的代码,本地环境更合适。
这几类场景收益最明显:
- 学新语言时验证一个写法:列表推导、切片、指针、闭包
- 算法题先跑几组边界值,确认思路没问题再抄回本地
- 在别人的电脑或临时机器上,只想跑几行看结果
- 把 bug 复现片段发给同事,对方点运行就能看到同样的输出
Python 在线运行 基于 Pyodide 在浏览器本地执行,首次运行要加载运行时(约 10-30 秒),之后秒开,按 Ctrl+Enter 直接运行。JavaScript 在线运行 同样在浏览器本地执行,支持 console.log 与 async/await。
#容器级隔离是什么意思
隔离的含义是:代码不在你的电脑上跑,也不在某台共享机器上跑,而是每次请求临时拉起一个沙箱容器,跑完即销毁。 它有自己的文件系统、进程空间和资源上限。
由此推出四条硬边界:
- 写入的文件只在本次运行内存在,下一次运行看不到
- 每次都是干净环境,上一次装的东西、改的环境变量都不会留下来
- 运行时间、内存和进程数都有上限,超限的进程会被直接结束
- 执行容器默认禁网,pip install、go get、npm install 都不会成功
沙箱解决的是「不污染你的机器」,不是「内容保密」。不要把公司源码、密钥、token 和真实业务数据粘贴进任何在线执行环境。
Java、Go、C++、Shell 四种语言由本站自建的执行网关承担:网关只监听本机端口,只接受本站页面的跨域请求,每次执行都在新的隔离容器里完成。网关不可用时前端会自动回退到第三方公共执行服务,此时代码会离开本站。
想判断一段代码会不会离开你的电脑,看语言就够了:Python 和 JavaScript 在浏览器里执行,代码不经过服务器;其余四种会发送到执行网关。
#六种语言的入口约定不一样
编译型语言的报错大多不在逻辑,而在入口约定:Java 要找类名、Go 要找 main 包、C++ 要包含头文件。 先把这几条对齐,能省掉一半报错。
| 语言 | 执行方式 | 最容易卡住的地方 |
|---|---|---|
| Java 在线运行 | 先编译再运行,支持标准输入 | 入口类不要声明 public,或者直接命名为 Main |
| Go 在线运行 | 先编译再运行 | 必须有 package main 与 func main,导入的包必须被使用 |
| C++ 在线运行 | 后端按固定标准编译 | 忘记 #include 头文件;界面上没有编译参数输入框 |
| Shell 在线运行 | 直接执行 Bash 脚本 | 没有交互式终端,sudo、apt 不可用,后台进程会随容器结束 |
#Java 的类名要和入口文件配合
Java 的规则是:声明为 public 的类,文件名必须与类名一致。沙箱里的入口文件名是固定的,所以更省事的写法是不加 public,或者把类命名为 Main。
// 不行:public 类名与入口文件名不一致时无法运行
public class Test {
public static void main(String[] args) {
System.out.println("hello");
}
}// 可以:不加 public,入口类名与入口方法同时满足
class Main {
public static void main(String[] args) {
System.out.println("hello");
}
}#Go 的 main 包与未使用的导入
Go 要求可执行程序的入口是 package main 且带 func main;另外导入的包必须全部被使用,否则直接编译失败。
// 不行:缺少 package main 声明
import "fmt"
func main() {
fmt.Println("hello")
}// 可以:完整入口声明
package main
import "fmt"
func main() {
fmt.Println("hello")
}#C++ 与 Shell 的差异
C++ 必须显式包含用到的头文件,而且编译参数由后端固定,界面不提供 -std 或 -O 之类的开关,依赖新标准的写法可能编译不过。
Shell 侧没有交互式终端,脚本必须能非交互地跑完;需要系统服务、需要管理员权限的操作在沙箱里一律不可用。
#在线运行不适合做什么
四类任务不要交给在线运行:长时间计算、需要外网、需要持久化文件、需要安装第三方依赖。 这不是配置问题,而是沙箱设计上就不提供。
| 你想做的事 | 为什么在线运行做不到 | 替代做法 |
|---|---|---|
| 跑几分钟的训练或批处理 | 运行时限到点会终止进程 | 本地环境或服务器 |
| 调用外部接口、下载数据 | 执行容器禁网 | 本地运行,或用已有数据验证逻辑 |
| 把结果文件留到下次用 | 一次性容器,运行结束即销毁 | 在本地写文件 |
| 用 pandas、requests 等第三方库 | 沙箱不能联网安装 | 只写标准库版本;确需第三方库就本地跑 |
| 处理真实业务数据 | 代码会发送到执行服务 | 先脱敏成假数据再验证逻辑 |
#报错很长,先分类再看
在线运行的报错基本落在五类里:编译错误、超时、资源超限、依赖缺失、编码问题;分类之后改法完全不同。
| 现象 | 原因 | 改法 |
|---|---|---|
| 提示超时、程序被中止 | 死循环、递归没有出口,或程序在等待键盘输入 | 检查循环出口;交互式程序先把输入填进标准输入框 |
| 进程被结束、内存相关报错 | 一次申请过大数组,或容器内进程无限增长 | 把数据规模降到几千条,先验证逻辑再放大 |
| 'xxx' was not declared / cannot find symbol | 缺头文件、缺导入,或类名与入口不匹配 | 对照上面的语言约定补齐声明 |
| ModuleNotFoundError、cannot find package | 沙箱没有这个库,也不能联网安装 | 换成标准库实现,或改到本地运行 |
| 编译错误指向第 1 行、内容看不懂 | 粘贴时带了不可见字符,或者语言选错了 | 清空编辑器重新粘贴,先确认语言下拉框选对 |
| 输出是问号或方块 | 输出不是 UTF-8 编码 | 明确按 UTF-8 输出,不要依赖本地默认编码 |
| 运行成功但没有输出 | 程序正常结束但没打印,或结果只写进了错误流 | 先打印一行确认执行到,再检查输出语句 |
程序迟迟不结束,最常见的原因不是死循环,而是它在等键盘输入。在线运行没有交互式终端,标准输入必须在点运行之前一次性填好。
#什么时候该用哪个工具
| 你想做的事 | 用哪个 | 说明 |
|---|---|---|
| 从程序输出或日志里提取字段 | 正则表达式测试 | 解析输出、核对格式常用 |
| 对比两次运行的输出差异 | 文本差异对比 | 比肉眼逐行找快得多 |
| 确认定时任务的表达式写法 | Cron 表达式生成 | 写 shell 定时脚本前先校验一遍 |
| 校验要粘进标准输入框的 JSON | JSON 格式化校验 | 先确认结构合法,能少一轮排查 |
| 还原从日志里复制的编码内容 | Base64 编码解码 | 粘贴前先转成可读文本 |
#常见问题
#在线运行安全吗?可以把公司代码贴进去吗?
不要贴。沙箱隔离保护的是你的电脑不被代码影响,不保证内容保密:Java、Go、C++、Shell 的代码会发送到执行服务,网关不可用时还会回退到第三方公共执行服务。Python 和 JavaScript 在浏览器里执行、代码不经过服务器,但同样不建议粘贴密钥与真实数据。需要验证真实逻辑时,把关键部分替换成假数据。
#为什么 Python 代码第一次运行特别慢?
因为运行时要在浏览器里加载。Pyodide 首次运行需要下载并初始化运行时,通常 10-30 秒,之后的运行是秒级返回。这段等待只在首次出现;如果每次都很慢,检查浏览器是否禁用了缓存。
#在线运行能装 pip 库、npm 包吗?
不能。执行容器默认禁网,安装类和下载类的操作都不会成功。写到第三方库的代码要么改成标准库实现,要么在本地环境里跑;真需要联网拉取数据的任务,在线运行这条路本身就不通。
#Java 报错说类名与文件名不一致怎么办?
把入口类的 public 去掉,或者把类命名为 Main。公共类的类名必须与文件名相同,而沙箱的入口文件名是固定的,所以「不加 public」是最省事的写法。
#程序运行了很久没有反应,是哪里卡住了?
先看是不是在等输入:在线运行没有交互式终端,程序读到标准输入时不会弹窗提示,只会在有数据时继续。其次是循环出口与递归终止条件。这两类问题都在运行时限内表现为「没有输出」,之后被强制结束。
本文提到的工具
Python 在线运行工具,基于 Pyodide 在浏览器本地运行 Python 3 代码,无需安装环…
立即使用 →JavaScript 在线运行浏览器本地执行 JavaScript 代码,支持 console 输出与 async/await
立即使用 →Java 在线运行JDK 21 在线编译执行,支持标准输入与类方法示例
立即使用 →Go 在线运行Go 1.22 在线编译执行,支持标准输入与切片/结构体示例,浏览器直接查看编译与运行输出
立即使用 →C++ 在线运行GCC 13 在线编译执行,支持标准输入与多组示例代码,浏览器直接查看编译错误与运行结果
立即使用 →Shell 在线运行Bash 脚本在线执行,支持变量、循环、函数与管道,可填写标准输入,浏览器直接查看命令输出
立即使用 →