AI INSIGHT

TypeScript 终于能编译成原生程序了?启动快 12 倍,运行却慢 7.5 倍

行业活动 InfoQ 2026-10-08 21:22
AI 摘要

点击查看原文>

Vercel Labs 发布了 scriptc。这是一款采用 Apache 2.0 许可证的实验性编译器,可以将普通 TypeScript 转换为小型原生可执行文件,生成的二进制文件中不包含 Node、V8 或任何 JavaScript 引擎。

该代码仓库创建于 2026 年 7 月 22 日,目前已获得约 4900 个 Star。scriptc 使用真正的 TypeScript 编译器进行解析和类型检查,将程序转换为类型化中间表示,随后可以生成可读的 C 代码、LLVM IR、汇编代码、目标文件、原生可执行文件,或者通过 WASI Preview 1 生成 WebAssembly。

每一种语法结构都会被划入三个层级之一:默认进行静态编译;对于 npm 软件包和 any 类型代码,在传入 --dynamic 参数时,由一个约 620KB 的内嵌 quickjs-ng 引擎动态执行;或者在编译时被拒绝,同时返回一个 SC 错误码和改写建议。

一项将 scriptc 0.0.16 与 Bun 1.3.12、Node 24.18.0 进行对比的基准测试显示,scriptc 命令行工具的启动时间中位数为 1.78 毫秒,而 Bun 和 Node 分别为 21.29 毫秒和 61.78 毫秒。一个不使用任何框架的 node:http 服务器在空闲时仅占用 1.9MiB 内存。同一组测试发现,Hono 必须启用 --dynamic,导致服务器中 62% 的代码进入 QuickJS,吞吐量也降至每秒 1.84 万个请求,而 Bun 可以达到每秒 7.05 万个请求。

在 Hacker News 上,一名开发者报告称,其测试结果显示 scriptc 的运行速度约比 Node 24 慢 7.5 倍:

从字节数组的结果来看,也就是最理想的情况,scriptc 仍然比 Node 24 慢约 7.5 倍,即使 Claude 已经尝试进行一些针对 scriptc 的优化。不过,它的可执行文件启动速度快了 12 倍(1.5 毫秒对 18.6 毫秒),内存占用低了 72 倍(2.5MiB 对 181MiB),而且最终得到的是一个没有任何运行时依赖、大小仅为 370KB 的单一可执行文件。

Filip Pizlo 认为,将所有数字都表示为浮点数,并暂缓实现整数类型推断,相当于跳过了“让 JavaScript 跑得快这一问题的一半”。他还指出,对于一个以性能为目标的项目来说,依赖 QuickJS 并不合适,因为 any 足够常见,实际程序中的代码会不断落入这个动态执行孤岛。

Simon Willison 指出,编码智能体在短短一周内就提交了 91.8 万行代码。他还补充道,无需编写 C 或 Rust 就能构建小巧、快速的二进制文件,“似乎是一项很有价值的能力”。

一名开发者发现,在其本地的每个项目上进行兼容性覆盖检查时,都会产生数百个错误:

尽管它受到了很多批评,我还是觉得至少应该测试一下,于是用本地所有项目都试了一遍。每一个项目的覆盖检查都会产生数百个错误,所以它基本毫无用处。我明白,我可以从头编写一个项目,不使用任何第三方库,然后把它编译成二进制文件;但既然如此,我为什么不用 Rust、Go、Zig、D、C、V、Ada、C++、Nim、Swift、Kotlin Native、Haskell……或者任何一种本来就是为编译而设计,并且能很好完成编译的语言?

另一个反复出现的担忧是项目能否长期维护。评论者提到了 Vercel 的 zerolang,该项目发布数周后便不再有新的代码提交。Remo Jansen 曾尝试编译 TypeScript 6 编译器本身,但最终因编译器内部错误而失败。不过,他测得 scriptc 的冷启动时间为 3.6 毫秒,而 Node 为 48.9 毫秒;但在计算任务中,scriptc 的耗时则慢得多,达到 2.33 秒。

该编译器需要 Node.js 24 或更高版本,可以通过 npm install -g scriptc 安装。限制说明页面记录了一些有意为之的行为差异,使用前值得仔细阅读:字符串以 UTF-8 格式存储;内存使用引用计数而非垃圾回收;Object.keys 按声明顺序返回键;process.argv[0] 的值为 "scriptc"。npm 依赖指南介绍了依赖项的处理方式,其中包括实验性的 --npm-static 参数,可以将指定软件包从动态执行孤岛中移出并进行静态编译。

scriptc 支持 macOS、Linux、Windows 和 WASI Preview 1,并通过差分测试保证行为一致:测试会逐字节比较其与 Node 的标准输出、标准错误和退出码。该项目目前仍被明确标记为实验性项目,相关文档可在 scriptc.dev 查看。

原文链接:https://www.infoq.com/news/2026/09/vercel-scriptc-node/

来源:InfoQ
阅读原文