#编译器 #wasm-build #wasm #wasm-oj

app compilet

将 Rust、C 和 C++ 编译成 WebAssembly 的服务器

7 个版本

0.1.6 2023 年 9 月 10 日
0.1.5 2023 年 9 月 9 日
0.1.4 2023 年 6 月 4 日
0.1.3 2023 年 5 月 17 日

#748 in 命令行工具

MIT 许可证

36KB
817

Compilet

RustCC++ 编译成 WebAssembly 的服务器。

使用方法

Docker

构建

我们在 Docker Hub 上有一个可用的镜像 Docker Hub (jacoblincool/compilet),最新的标签支持直接编译 Rust、C 和 C++。

您也可以使用 rs 标签 (~500MB 压缩) 仅编译 Rust,或使用 c 标签 (~150MB 压缩) 仅编译 C 和 C++。

此外,您可以使用以下命令构建自己的镜像

docker build -t compilet .

运行

您可以使用以下命令运行镜像

docker run -p 8000:8000 jacoblincool/compilet

或使用 docker compose 文件 来运行镜像

docker compose up

您可能需要一个 .env 文件来设置环境变量。有关更多信息,请查看 .env.example 文件

上述两个命令都会在端口 8000 上运行服务器,因此您可以通过 https://127.0.0.1:8000 访问服务器。您也可以通过设置 PORT 环境变量来更改端口。

Cargo

您也可以通过 Cargo 安装 Compilet

cargo install compilet

将其作为 CLI 工具运行更方便

compilet compile <file>
# compilet compile -h for more information

端点

验证

Compilet 使用 JWT 来验证请求。您可以通过设置 APP_SECRET 环境变量来设置 JWT 令牌的秘密密钥,默认为 APP_SECRET

您应将 JWT 令牌传递到带有 Bearer 方案的 Authorization 标头中。

  • GET /validate 端点来验证 JWT 令牌是否有效。状态码 200 表示令牌有效,否则令牌无效。

编译

Compilet 应该能够在未来排队编译请求。但当前,它只是直接编译源代码。

  • POST /compile 端点用于将源代码编译成 WebAssembly

POST 请求体

{
    "lang": "rs",
    "code": "fn main() { println!(\"Hello, world!\"); }"
}

响应

{
    "success": true,
    "message": "Compiled successfully",
    "hash": "bb343b0950832ccd077f1515e842196f2ae4bb9e9261b0935ac57916c3cf305d",
    "wasm": "<base64 encoded wasm binary>"
}
  • POST /submission 端点用于将源代码编译成 WebAssembly,但立即返回并在后台编译源代码。

POST 请求体

{
    "lang": "rs",
    "code": "fn main() { println!(\"Hello, world!\"); }"
}

响应

{
    "message": "Submitted",
    "hash": "bb343b0950832ccd077f1515e842196f2ae4bb9e9261b0935ac57916c3cf305d"
}
  • GET /submission/{hash} 端点用于获取提交状态,以及编译完成的 WebAssembly 二进制文件。

响应

{
    "status": "pending",
    "message": "Waiting for compilation",
    "wasm": null
}
{
    "status": "success",
    "message": "Compiled successfully",
    "wasm": "<base64 encoded wasm binary>"
}
{
    "status": "failed",
    "message": "Compilation failed (error message)",
    "wasm": null
}

系统

  • GET /system 端点用于获取系统信息(目前仅实现了 capabilities

响应

{
    "capabilities": {
        "rs": "rust 2021 edition + rand 0.8.5, release build",
        "c": "clang 16, level 3 optimizations",
        "cpp": "clang++ 16, level 3 optimizations"
    },
    "status": {
        "compiling": 0,
        "pending": 0
    }
}

开发

在克隆仓库后,您需要

  • 运行 ./scripts/stdlib.sh 下载 C 和 C++ 的 WASI 标准库。
  • libclang_rt.builtins-wasm32.a 复制到 Clang 可以找到的位置。(例如 /usr/lib/llvm16/lib/clang/16/lib/wasi)(您可以在稍后完成,错误信息将告诉您放置的位置。)

您可以使用以下命令以开发模式运行服务器

cargo run

使用以下命令构建服务器

cargo build --release

依赖

~25–58MB
~1M SLoC