首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

Vercel 的 Scriptc:TypeScript 到 Native 编译器,二进制中没有 JavaScript 引擎

2026-07-27 1 阅读 约1分钟阅读 maxloh
分享:
字号:
scriptc 零运行时 TypeScript。 scriptc 将普通 TypeScript 编译成小而快速的本机可执行文件 - 二进制文件中没有 Node、没有 V8、没有 JavaScript 引擎。 $ cat fib.ts 函数 fib(n: number): number { return n < 2 ? n : fib(n - 1) + fib(n - 2); } console.log(fib(30)); $ scriptc run fib.ts 832040 $ scriptc build fib.ts && ls -la fib -rwxr-xr-x 178K fib # 一个独立的本机二进制文件,大约 2ms​​ 启动 代码没有变化。没有注释,没有方言——与在 Node 上运行的 TypeScript 相同,由真正的 TypeScript 编译器进行类型检查并编译为原生。编译的行为就像 Node.js 一样逐字节进行。安装 $ npm install -g scriptc 需要 clang (预装了 Xcode 命令行工具)。 macOS arm64 是主要平台; Linux 和 Windows 二进制文件通过交叉编译构建,每个二进制文件都通过自己的差异测试通道进行验证。想法:你可以看到的静态性 大多数 TypeScript 比生态系统假设的静态得多。 scriptc 逐个构造地决定什么可以编译为本机代码 - 并告诉您: $ scriptc 覆盖范围 app.ts 语句已分析 4481 静态编译 4451 (99%) 拦截器: ×2 个带有可选参数作为值的函数 SC1090 ×1 Promise.reject SC2020 三层,始终显式:静态编译 - 本机代码,无引擎。默认的,也是唯一的模式,除非您选择退出。动态运行(--dynamic)——嵌入式 JavaScript 引擎(quickjs-ng,约 620KB)执行不能静态的内容:npm 依赖项附带的 JS、任何类型的代码。每个返回静态代码的值都会在运行时进行验证 - 一个说谎的类型会抛出一个可捕获的 TypeError,而不是破坏内存。被拒绝 — 其他一切都会失败,并显示特定的错误代码、代码框架,通常还有重写提示。没有什么会默默地被错误编译。编译内容静态表面涵盖了实际程序使用的语言和标准库:语言 - 具有单一继承和真正动态分派的类(在可证明安全时进行去虚拟化),具有 JS 捕获语义的闭包,泛型(单态),由 TypeScript 自己的缩小驱动的标记值的可区分联合,具有 JS 精确调度的堆栈光纤上的 async / wait,finally 的异常,解构,扩展,可选/默认/剩余参数, getter/setter、字符串/数组/映射/集合上的迭代器、模板文字、正则表达式(引擎与 QuickJS 使用的 ECMAScript 精确字节码解释器相同,仅链接到使用正则表达式的二进制文件)。标准库 — 具有 UTF-16 精确语义的字符串、具有 JS 精确排序和标识的数组/映射/集、具有运行时验证的强制转换的 JSON、Math、类型化数组和 Buffer 、具有类型化 catch 的错误层次结构。 Node 的 API 表面 — fs (同步和 Promise)、路径(字节精确端口)、 process 、带有管道流的 child_process 、 os 、 crypto 、 url / URL 、 zlib 、计时器和无依赖事件循环上的信号处理程序 — 以及服务器堆栈: net 、 http 、 https 、 tls (供应商 mbedTLS)、 dgram 、 dns 、 fs.watch 、 readline 。真正的代理服务器编译。 fetch 和 WHATWG Web 子集(流、 headers 、 AbortSignal )通过相同的本机 net/TLS 堆栈 — 重定向、gzip、AbortSignal.timeout 、节点形错误原因;没有 libcurl,没有系统 HTTP 依赖。 npm 依赖项(使用 --dynamic )——包使用 Node 自己的算法进行解析,针对其附带的 .d.ts 进行类型检查,并且它们的 JS 在构建时嵌入到二进制文件中。二进制文件在运行时从不读取node_modules。针对 TypeScript 的真实 es2025 库(加上 @types/node,当您的项目有它时)进行程序类型检查,并且您的 tsconfig.json 控制检查器的严格性。任何没有降低的结果都是精确的诊断,绝不是令人惊讶的。正确性 每次更改都会运行两种执行机制: 差异测试 - 每个语料库程序(800 多个测试)在 Node 下运行并作为本机二进制文件; stdout、stderr 和退出代码必须逐字节匹配。数字格式是 JS 精确的(最短往返,针对 Node 进行了一百万双打的模糊验证)。服务器使用实时客户端驱动程序针对这两种实现进行了测试。内存安全通道——整个语料库在 AddressSanitizer 下重新运行,并进行引用计数审核;泄漏和释放后使用是构建失败。与 Node 的故意分歧(有几十个,主要围绕计时内部结构和错误对象属性)被记录并编号;没有什么会悄然发生分歧。在 Apple M 系列上针对 Node、Go、Rust 和 Zig 中的相同工作负载测量的性能(所有字节相同的输出,已验证):维度 scriptc 上下文启动 ~2.4ms Node:~47ms;与 Zig 相当,领先于 Go/Rust 二进制大小 170–200KB 静态,约 3MB,带有 --dynamic + 嵌入式 deps Go:约 2MB;节点 SEA:60–100MB 内存 (RSS) 1–4MB 典型节点:67–116MB 运行时 JS 忠实的 f64 语义;在大多数工作负载上与系统语言竞争 整数推理和所有权分析已在路线图上 逃逸舱口 comptime(() => ...) 在构建时运行 TypeScript(在隔离的 VM 中)
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱