快速开始

Hello, SuperJ

SuperJ 是一门系统级编程语言,用 Java 的语法,通过 LLVM 提前编译为原生代码。你写看起来像普通 Java 的代码,得到一个自包含的原生二进制 — 没有 JVM,没有 JIT,没有垃圾回收器。这篇 walkthrough 让你在几分钟内从安装到一个能跑的 Web 服务器。

开始之前

  • 安装脚本会通过你的平台包管理器自动安装 clang/LLVM 22.x 和其他依赖。如果你想自己管理,传 --no-deps。不需要 JVM、JIT 或任何运行时随之一同安装。

目标平台。 macOS arm64(kqueue),Linux x86_64 与 aarch64(epoll)。community 发行版是预构建的 tarball — 无需构建步骤。

1

安装

运行下载页面上的一行命令。安装脚本自动检测你的平台,安装缺失的依赖(包括 clang/LLVM 22.x),下载并校验 tarball,解压到 ~/superj,并在你的 shell profile 中配置好 SJ_HOMEPATH

terminal
curl -fsSL https://superj.dev/releases/v1.3/install.sh | sh -s -- https://superj.dev/releases/v1.3

开一个新的 shell(或 source 你的 profile)让新的 SJ_HOME/PATH 生效。传 --no-deps 跳过依赖自动安装,或 --prefix=/opt/superj 装到别处。

2

验证

查看版本,然后搭建并运行一个项目。

terminal
superj --version        # 1.3 (community)
3

搭建一个项目

SuperJ 有一个内置在 superj 二进制中的、受 Cargo 启发的构建系统。一条命令搭建项目;再两条构建并运行。

terminal
superj new myapp
cd myapp
superj run          # Hello from myapp
myapp/
  Build.sj ← 清单(名称、版本、入口、依赖)
  .gitignore ← 忽略 target/
  src/myapp/Main.sj ← package myapp; class Main { … }
4

写一些 SuperJ

编辑 src/myapp/Main.sj。它看起来像 Java — 但 arena 是关键字,底层没有 GC。

src/myapp/Main.sj
package myapp;

public class Main {
    public static void main(String[] args) {
        int total = 0;
        arena scratch {
            int[] rows = new int[1 << 16];
            for (int i = 0; i < rows.length; i++)
                total += (rows[i] = i * 3);
        }   // scratch 在这里释放 — O(1),无停顿
        System.out.println("total = " + total);
    }
}
terminal
superj run              # 重新构建 + 运行
superj build --release  # 优化构建 → target/release/myapp
superj check            # 全项目类型检查(无代码生成/链接)
superj test             # 跑单元测试套件
5

写一个 Web 服务器

支撑515K req/s基准的那同一套 SDK 协议栈,离你只有一个 handler 和一个 main。把它编译成单一原生二进制 — 没有框架,没有要随之一同安装的运行时。

sj/demo/WebServer.sj
package sj.demo;
import sj.http.*; import sj.net.*; import sj.util.ByteArray;

class HelloHandler implements HttpRequestHandler {
    private final ByteArray response;
    HelloHandler() {
        String body = "Hello from SuperJ!\n";
        this.response = new ByteArray(
            "HTTP/1.1 200 OK\r\nContent-Length: "
            + body.length() + "\r\n\r\n" + body);
    }
    public void handle(HttpRequest r, SessionWriter w) {
        this.response.rewind();
        w.write(this.response);
    }
}

public class WebServer {
    public static void main(String[] args) {
        int port = 8080;
        if (args.length > 0) { port = Integer.parseInt(args[0]); }
        NioConfig cfg = new NioConfig(65536, 16384, 64, 262144, true, 1024);
        NioAdapter adapter = new NioAdapter(cfg);
        adapter.open("127.0.0.1", port, new HttpSessionProvider(new HelloHandler()));
        System.out.println("listening on http://127.0.0.1:" + port + "/");
        while (true) { adapter.poll(0); }
    }
}
terminal
superj compile sj/demo/WebServer.sj --sdk-path "$SJ_HOME/sdk" --link --output webserver
./webserver 8080
# 在另一个终端:
curl http://127.0.0.1:8080/    # → Hello from SuperJ!
6

跨核扩展

单线程不意味着单核。NioConfig 里的那个 true 就是 reusePort — 在同一端口跑几份,内核会在它们之间均衡进来的连接。无需改代码。

terminal
for i in 1 2 3 4; do ./webserver 8080 & done