
TypeScript 终于能编译成原生程序了?启动快 12 倍,运行却慢 7.5 倍
Vercel Labs 发布了 scriptc。这是一款采用 Apache 2.0 许可证的实验性编译器,可以将普通 TypeScript 转换为小型原生可执行文件,生成的二进制文件中不包含 Node、V8 或任何 JavaScript 引擎。
以下正文同步自 InfoQ 中国,版权归原站所有,已转换为易读排版。
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/
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。