TypeScript 编译成原生程序:赢的是启动,输的是计算

两个数字先摆出来。scriptc 编译出的命令行工具,启动中位数 1.78 毫秒;同样一个 CLI,Node 跑要 61.78 毫秒,Bun 要 21.29 毫秒。启动快了三十多倍,这是官方基准。另一个数字来自 Hacker News 上一位开发者的实测:字节数组计算——对 scriptc 最理想的场景——它比 No…

TypeScript 编译成原生程序:赢的是启动,输的是计算

两个数字先摆出来。scriptc 编译出的命令行工具,启动中位数 1.78 毫秒;同样一个 CLI,Node 跑要 61.78 毫秒,Bun 要 21.29 毫秒。启动快了三十多倍,这是官方基准。另一个数字来自 Hacker News 上一位开发者的实测:字节数组计算——对 scriptc 最理想的场景——它比 Node 24 慢约 7.5 倍。两个数字都是真的,它们属于同一个项目。

项目叫 scriptc,Vercel Labs 出品,Apache 2.0 协议,2026 年 7 月 22 日创建。它把普通 TypeScript 编译成原生可执行文件:二进制里没有 Node、没有 V8、没有任何 JavaScript 引擎。管线是真编译器的做法——用 TypeScript 官方编译器解析和类型检查,转成带类型的中间表示,然后可以出到可读的 C 代码、LLVM IR、汇编、目标文件、原生可执行文件,或经 WASI 出 WebAssembly。npm install -g scriptc 就能装。

它最聪明的设计是把每段语法划进三层之一。第一层,类型干净的代码直接静态编译成机器码。第二层,npm 依赖和 any 类型的代码,加 --dynamic 参数后塞进一个约 620KB 的内嵌 quickjs-ng 引擎动态执行——作者管它叫动态岛,岛内代码兼容但慢。第三层,既编不动又不该进岛的,编译时直接拒绝,返回一个 SC 错误码附改写建议。还有个 coverage 命令,能逐条告诉你项目里哪些操作落在哪一层。这个分层的诚实之处在于边界明码标价:不装、不静默降级,代价写在文档里。

代价有多大?看 Hono 的账。拿 Hono 框架写个服务器,必须开 --dynamic,结果是 62% 的代码进了 QuickJS 岛,吞吐量掉到每秒 1.84 万个请求——Bun 是 7.05 万。而进不进岛不是这个框架的运气问题,是整个生态的地板。JavaScriptCore 的缔造者之一 Filip Pizlo 在 HN 线程里算过:他让 Claude 统计了 TS 仓库,79.5% 显式使用 any,三分之一的推断类型落在 any 上。也就是说,五分之四的 TypeScript 代码天生就该掉进那个慢岛。静态岛能收留的,只有五分之一。

Pizlo 的批评不止这一条。他说 scriptc 的数字全用浮点数表示,整数优化推迟到以后——「推断整数是让 JS 变快这个问题的一半」;他说 QuickJS「慢得可笑,平庸的人用它只是因为名字里有个 quick」;他断定引用计数内存管理「保证慢到没用」。Simon Willison 亲手把官方的 fibonacci 示例编译成 C,看到的第一行是 static double sc_f_fib(double n)——入参出参全是 double,Pizlo 的指控变成了眼见为实。Pizlo 还补了一句被整个社区疯转的判词:「这个项目散发着武器级的 AI 精神病。」他不是骂性能,是骂架构:这个方向「我们这行里的人基本都想过、深挖之后都放弃了,不是新点子」。

「AI 精神病」这四个字有出处。Willison 在同一线程指出:这个仓库一周落了 91.8 万行代码,其中一个 commit 就有 80.2 万行——coding agents 干的。今早刚写过 Matt Pocock 的判断,agent 极大加速写代码的同时前所未有地加速软件熵增;scriptc 是这句话的极限案例:用一个 agent 团队三周堆出一个编译器,速度是真的,架构审查是缺席的。Pizlo 的骂声,本质是一位人类专家用自己的带宽给 91.8 万行 AI 产出做审计。

还有一笔信任的账。Vercel Labs 是实验室,实验室有前科:5 月高调发布的 zerolang,6 月落了一千多个 commit,7 月之后近乎停摆(近三个月各只有一次提交)。scriptc 目前的存活曲线完全不同——10 月还满速推进,最近一百个 commit 全落在这个月,star 从文章写作时的四千九涨到了六千——但实验项目的免责声明仍然挂着。它做对的另一件事值得记录:差分测试,逐字节比对 scriptc 与 Node 的标准输出、标准错误和退出码,行为一致性不是宣称出来的,是测出来的。

所以账要分开算。CLI 工具、边缘函数、容器冷启动这类看启动速度和内存的场景,它是真的赢:Remo Jansen 实测冷启动 3.6 毫秒对 Node 的 48.9 毫秒,空闲内存 1.9MiB,单文件 370KB 无任何运行时依赖。计算密集的场景,目前是 7.5 倍的差距,而且根子在没有整数推理,不是调参能救的。想亲自看这条分界线,不用装任何东西——把一段带 any 的 TS 喂给官方 playground,看它怎么把代码推进 620KB 的岛里,那一行输出比整篇基准报告都说得清楚。

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens