earendil-works/djs
开发工具一个面向 wasm、用 no_std Rust 编写的小型 JS/TS 引擎,擅长运行模型生成的工具调用脚本并支持快照与挂起恢复。
项目定位
djs 是一个用 no_std Rust 编写的小型 JavaScript 与 TypeScript 引擎,主要目标平台是 wasm32。它要解决的是 pi codemode 中的一类问题:模型写出的脚本调用宿主工具、处理结果并返回或打印数据。因此它优先服务这种工作负载,而不是追求浏览器或 Node 的通用兼容性。
核心设计是把所有 VM 状态放在一个按 u32 偏移寻址的字节 arena 中,快照就是复制这些字节,恢复就是复制回来。解释器执行 JS 调用时不递归占用 Rust 栈,所以可以在任意两条指令之间暂停,包括 getter、内建函数回调、promise job、generator 和 async 函数内部,然后继续执行。入参经过紧凑的 wire 格式传入,返回值由宿主直接从堆中读取。编译器单遍生成栈式字节码、不建 AST,并在解析时擦除 TypeScript 类型。内建函数用严格 TypeScript 子集编写,编译为字节码和可恢复的 Rust 状态机。时钟、随机数和弱引用都由宿主提供,目标是相同输入在原生和 wasm 下产生逐字节一致的堆镜像。
快速使用
先构建 Rust workspace,再用 CLI 运行脚本。需要 stable Rust(edition 2024)和 wasm32-unknown-unknown target;JS 宿主包需要 Node 22.6 或更新版本;依赖对照的测试还要求 dquickts 的 qjs 位于 ~/Development/dquickts/qjs 或 $DJS_QJS。
cargo build
cargo run -p djs-cli -- run file.js
cargo run -p djs-cli -- run --ts file.ts
cargo run -p djs-cli -- repl
scripts/build-wasm.sh
run 会打印 console 输出,--body 用于运行 codemode 的 async 函数体,另有 --gc-stress、--suspend-every N、--backend bytecode|native 等参数。要在 JavaScript 中使用,可引入 @djs/host 并创建 Sandbox:
import { Sandbox } from "@djs/host";
const sb = await Sandbox.create({
asyncFunctions: { search: (q) => mySearch(q as string) },
memoryLimit: 64 << 20,
});
const result = await sb.runAsync("const hits = await search(q); return hits.length;", { q: "djs" });
const image = sb.bytes();
js/pi/vm.ts 把引擎接到 pi 的 codemode VM 约定上。宿主 API、wasm ABI 和 pi 适配说明在宿主文档里,可从指南站进入。
使用约束
它不是可直接替换的通用 JS 运行时。按设计跳过 Intl、Temporal、SharedArrayBuffer/Atomics、Annex B、sloppy mode、直接 eval 和模块,并且始终是严格模式;多数已知失败由此而来,另有部分测试期望的是 quickjs-wasi 的指纹。行为参考和测试对照对象是 QuickJS 分支 dquickts,错误消息也以它为准。wasm 模块为 1,471 KB(gzip 525 KB、brotli 423 KB),其中 218 KB 是基础快照;在 wasm 中创建一个 VM 约需复制这份快照,约 40 µs。README 报告 test262 活跃用例通过 38,069 / 38,109,差分语料 538 / 549 与 qjs 一致,测量日期为 2026-11-01。
性能上并非全面领先 quickjs-wasi 的 wasm 测量:例如紧循环 0.42 倍、属性访问 0.49 倍,而高阶 map/filter/reduce 为 2.92 倍;类 pi 脚本为 10.0G 对 7.3G,公开比率中越高越好。仓库未声明许可证,如果要嵌入或再分发需要先处理授权问题。
文档与测试
docs/guide/ 是面向人的指南,讲设计取舍并带可运行示例;此外还有架构、测试、编译器、对象模型、宿主、wire 格式和 CLI 的说明文档。源码按职责拆成核心引擎、内建函数编译器、prelude、wasm 构建、CLI、test262 runner、差分语料 runner、benchmark 和文档生成器。
测试包括 cargo test、按预期失败清单运行的 test262、与 qjs 对照的差分语料,以及宿主包的 Node 测试。所有运行引擎的流程应经过 scripts/timeout.sh,合入 main 前则走 scripts/gate.sh。
HotRepo 点评
站内目前只有 2026-11-03 的一条记录:项目出现在 Rust 新项目榜,109 Stars,约一小时内增加 6 Stars,同一窗口新增 1 Fork。没有记录到全语言日榜名次,也没有讨论帖。这个窗口太短,不足以判断持续采用情况;现有材料能支持的是,它有一个明确的设计命题,并且公开了相当详细的兼容性和性能数据,而不只是一个泛泛的“快速 JS 引擎”宣称。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。