跳到正文
cajulang
v0.5.0 · x86-64 · WebAssembly

代码简洁,
原生可执行。

Caju 是一门简洁的静态类型编程语言,直接编译为 x86-64 机器码,生成 Linux 与 Windows 原生可执行文件,也可编译为 WebAssembly。编译器用 Caju 编写并能自举,还自带测试工具和包管理器。

curl -fsSL https://raw.githubusercontent.com/cajulang/cajulang/main/install.sh | sh
hello.caju
fn greet(name: str) -> str {
return "Hello, " + name + "!"
}
print(greet("world"))
$ caju run hello.caju
Hello, world!
x86-64
原生机器码
ELF、PE、wasm
Linux、Windows 与 WebAssembly
52 KB
静态链接的 hello world
第 2 阶段 = 第 3 阶段
编译器自举

写起来简单,跑起来原生

语法精炼,类型可选。编译器生成小巧的静态二进制文件,无需安装运行时。

原生编译

Caju 直接编译为 x86-64 机器码,不依赖虚拟机。一个 hello world 编译后是 52 KB 的静态可执行文件。

Linux、Windows 与 WebAssembly

为 Linux 生成 ELF,为 Windows 生成 PE:在 Linux 上执行 caju build --target windows 即可产出 .exe。使用 --target wasm 则生成可在 Node 或浏览器中运行的 WebAssembly 模块,演练场正是如此。

用 Caju 编写

编译器和运行时都用这门语言本身编写。编译器能编译自己,产物逐字节一致。

功能完整

结构体、方法、接口、指针、切片、映射、闭包、defer、panic 与 recover,以及错误即值。

可选类型

需要时再标注类型:有了类型,编译器能在程序运行前发现错误;不标注时,类型由编译器推断。

标准库

strings、strconv、math、bytes、os、fs、path、net、http、json、toml、crypto、hash、hex、base64、cli 与 testing。

内置测试

caju test 以 describe、it 和 expect 运行 _test.caju 文件,无需额外安装。

包管理器

包就是 GitHub 仓库。caju pkg 负责选定版本,并把一切连同哈希锁定在 caju.lock 中。

看看代码

两个简短的程序,以及它们的输出。更多内容见示例页面。

错误即值

函数同时返回结果和错误,没有隐藏的异常。

divide.caju
fn divide(a: int, b: int) -> (int, error) {
if b == 0 { return 0, errors.New("division by zero") }
return a / b, nil
}
for _, d := range []int{5, 0} {
q, err := divide(10, d)
if err != nil {
print("error:", err)
continue
}
print("10 /", d, "=", q)
}
$ caju run divide.caju
10 / 5 = 2
error: division by zero

结构体、方法与接口

一个类型只要拥有接口的方法就实现了该接口,无需任何声明。

shapes.caju
interface Shape { area() -> num }
struct Rect { w: num, h: num }
struct Circle { r: num }
fn (r: Rect) area() -> num { return r.w * r.h }
fn (c: Circle) area() -> num { return 3.14159 * c.r * c.r }
shapes := []Shape{Rect{2, 3}, Circle{1}}
for _, s := range shapes { print(s.area()) }
$ caju run shapes.caju
6
3.14159
查看全部示例

与 Go、Rust 和 Python 同台比较

每种语言实现相同的算法,操作顺序也相同。在所有测试中,Caju 都胜过或持平 Go,接近 Rust,并远远领先 Python。

运行时间(越短越好)
测试项CajuGoRustPython
fib n=3525 ms38 ms21 ms1.21 s
sieve n=10M22 ms21 ms24 ms2.17 s
nbody n=1M66 ms173 ms66 ms9.10 s
mandelbrot n=1k39 ms38 ms37 ms6.40 s
matmul n=30010 ms32 ms11 ms5.86 s
sort n=2M142 ms142 ms135 ms7.24 s
maps n=3M513 ms612 ms358 ms1.94 s

可执行文件大小

同一个程序(fib)用各语言编译后的结果。
Caju85 KB
Go2,298 KB
Rust4,436 KB

2026 年 11 月测于 AMD Ryzen 7 5700G:取最多 3 次运行中的最佳成绩,包含进程启动时间。Caju 0.3.0、Go 1.27.3、Rust 1.99.1(opt-level=3)、Python 3.12.3。 完整程序与结果见 bench/compare.

HTTP 服务器:Caju + web 对比 Go

同一个 JSON API,分别用 Caju 的 Web 框架 web、Gin 和 Go 标准库 net/http 编写。在相同的 CPU 上,Caju 每秒处理的请求是对手的 1.5 到 2.2 倍。

1 个 CPU,50 个连接

请求/秒
GET /users/:id2.2×
Caju + web72,468
Gin33,424
Go net/http32,687
GET /users2×
Caju + web41,463
Gin18,824
Go net/http21,054
POST /users2.1×
Caju + web65,638
Gin29,354
Go net/http31,434

4 个核心,1,000 个连接

请求/秒
GET /users/:id1.9×
Caju + web134,502
Gin70,738
Go net/http71,297
GET /users1.5×
Caju + web64,907
Gin43,028
Go net/http38,256
POST /users1.8×
Caju + web122,580
Gin60,591
Go net/http66,844

启用 keep-alive 时的每秒请求数(越高越好)。服务器固定在自己的 CPU 上,负载生成器运行在其他 CPU 上;Ryzen 7 5700G,WSL2。GET /users 返回 50 个结构体的列表;POST /users 将 JSON 读入结构体。 框架:github.com/cajulang/web · 方法与各轮结果见 bench/http

直接从 GitHub 获取包

caju pkg 随语言一起提供。没有中央服务器:一个包就是带有 caju.toml 的 GitHub 仓库,它的名字就是你导入时写的路径。

  1. 声明
    依赖写在 caju.toml 中,每项注明项目所需的最低版本。
  2. 解析
    当两个包要求不同版本时,取各最低版本中最高的那个。只有当有人要求更高版本时,选择才会改变。
  3. 锁定
    caju.lock 记录每个包的版本、提交以及文件的 SHA-256 哈希。
  4. 校验
    编译前,caju build 和 caju run 会校验哈希。任何文件被改动都会导致编译中止。
terminal
$ caju pkg init github.com/acme/app
created caju.toml for github.com/acme/app
$ caju pkg add github.com/acme/strutil
downloading github.com/acme/strutil@1.1.0
added github.com/acme/strutil@1.1.0; 1 packages ok
$ caju run app.caju
CAJU!
$ caju pkg tree
github.com/acme/app@0.1.0
└── github.com/acme/strutil@1.1.0

从代码到可执行文件

  1. 安装
    curl -fsSL https://raw.githubusercontent.com/cajulang/cajulang/main/install.sh | sh
    Linux x86-64。Windows 上请使用 WSL。
  2. 运行
    caju run hello.caju
    在内存中编译并执行。
  3. 生成可执行文件
    caju build -o hello hello.caju caju build --target windows hello.caju
    一个 Linux 二进制文件和一个 Windows .exe。

编译你的第一个 Caju 程序

原生编译器正在开发中的功能:goroutine、通道与 select,以及 Windows 上尚缺的原生特性。