快速开始
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 — 无需构建步骤。
运行下载页面上的一行命令。安装脚本自动检测你的平台,安装缺失的依赖(包括 clang/LLVM 22.x),下载并校验 tarball,解压到 ~/superj,并在你的 shell profile 中配置好 SJ_HOME 和 PATH。
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 装到别处。
查看版本,然后搭建并运行一个项目。
superj --version # 1.3 (community)
SuperJ 有一个内置在 superj 二进制中的、受 Cargo 启发的构建系统。一条命令搭建项目;再两条构建并运行。
superj new myapp
cd myapp
superj run # Hello from myapp
编辑 src/myapp/Main.sj。它看起来像 Java — 但 arena 是关键字,底层没有 GC。
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);
}
}
superj run # 重新构建 + 运行
superj build --release # 优化构建 → target/release/myapp
superj check # 全项目类型检查(无代码生成/链接)
superj test # 跑单元测试套件
支撑515K req/s基准的那同一套 SDK 协议栈,离你只有一个 handler 和一个 main。把它编译成单一原生二进制 — 没有框架,没有要随之一同安装的运行时。
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); }
}
}
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!
单线程不意味着单核。NioConfig 里的那个 true 就是 reusePort — 在同一端口跑几份,内核会在它们之间均衡进来的连接。无需改代码。
for i in 1 2 3 4; do ./webserver 8080 & done