TypeScript 周刊 #4:Bun 开启 AOT 机器码编译,Vercel 推出 tsc-ts 原生自举,官方重构内存锐减 30%

TypeScript · 周刊 #4

TypeScript 周刊 #4:Bun 开启 AOT 机器码编译,Vercel 推出 tsc-ts 原生自举,官方重构内存锐减 30%

typescriptTypeScript语言周刊编译器AOT

数据源:GitHub Releases + 官方博客 + HN

📦 版本动态

官方稳定版演进与主干内存治理

当前官方最新稳定版本为 TypeScript 7.0.2(发布于 2026 年 8 月 20 日,tag v7.0.2),配套的 VS Code 插件 vscode-typescript/v1.0.1 于 9 月 30 日全量分发。官方开发主干处于 7.1.0-dev 迭代期(npm 镜像为 7.1.0-dev.20261018.1)。7.0 系列历史发布架构演进详见:TypeScript 7.0 新特性详解。

最近 7 天内,官方在 7.1 开发分支合入了涉及内存模型与进程通信的重大底层重构。核心变化与工程影响归纳如下:

变更项规则变化工程实际影响
Typed-Arena 分配边界重塑固定 256 对象分块改为按 512 字节定额,可选类型字段进入冷存储(PR #64734)。官方全量基准测试中堆内存占用下降 22.15% 至 29.66%,消除多核并发检查时的内存剧烈抖动与 GC 停顿。
进程间 Programmatic API采用命名管道与 Unix 域套接字通信,新增 TS_API_TIMING_DIR 基准收集(PR #64818、#64846)。为 typescript-eslint、前端打包器对接 Go 核心提供标准化协议,摆脱老旧双轨别名依赖。
封禁网络路径解析编译器在路径解析阶段全面拦截非本地网络路径(UNC 与跨网络挂载目录,PR #64832)。防范网络共享投毒,约束解析器仅在受信任的本地文件系统拓扑中定位模块。

7.0 剥离 Node.js API 带来的生态割裂正由原生 IPC 方案弥合,而内存重构则有效拓宽了 CI 容器的并发检查上限。

📝 深度条目

Bun PR #45631 引入 AOT 机器码编译 bun build --compile --aot

发生了什么: 10 月 17 日,Jarred Sumner 提交 Bun PR #45631,发布 bun build --compile --aot。该特性跳过 JIT 与字节码,利用 JavaScriptCore B3 后端将 TypeScript 严格类型代码编译为平台原生机器码。基准测试应用 test/aot/backend/tracker(2,000 行纯 TypeScript)实测显示:单核吞吐达 4,420 req/s(比 Bun 1.4.3 的 2,987 req/s 提升 48%),常驻内存由 99 MB 降至 63 MB(降幅 36%),启动响应缩短至 24 ms,性能达到 Go 原生实现(5,300 req/s)的 83%。

为什么重要: 以往轻量运行时在面对 TypeScript 时局限于类型擦除与单进程打包。Bun 将静态语义检查与 SSA 形式的中间表示串联,运行期无需申请可执行内存(W^X 沙箱友好)。这为后端微服务提供了接近编译型语言的原生交付形态,显著降低容器常驻内存开销。

对谁有影响: 对冷启动延时与内存计费敏感的 Serverless / 容器全栈团队,以及追求极限吞吐的平台架构师。

链接:Bun PR #45631: Compile TypeScript to machine code ahead of time

笔者点评: AOT 原生编译大幅削减了运行时内存驻留。然而遇 eval 或反射时必须退化为解释执行;WebAssembly 解释耗时增加数倍,且针对未标注类型的通用 npm 包仍需依赖静态内联缓存修复性能衰减。

Vercel Labs 开源 tsc-ts 与 scriptc:探索 TypeScript 编译期自举

发生了什么: Vercel Labs 正式公开实验项目 tsc-ts 与 AOT 编译器 scriptc。tsc-ts 采用标准 TypeScript 语法,全量复刻了官方 TypeScript 7.0.2 的 Go 语言核心(TypeScript-Go),并通过 scriptc 经由 LLVM/C 编译为独立原生程序。在官方测试集 12,500 个文件(17,000 个单元)验证中,语法解析、符号绑定与类型检查全阶段均与官方 Go 版本 100% 匹配。

为什么重要: 微软官方将 TS 编译器重写为 Go 语言虽换取了 10 倍提速,但前端开发者难以直接参与编译器源码维护。Vercel 证明了借助规范的严格静态子集与 AOT 基础设施,使用 TypeScript 自身编写的编译器同样能够生成无需虚拟机托管的高性能二进制文件,恢复了语言工具链自举的路径。

对谁有影响: 前端基建工程师、编译器与打包工具维护者,以及希望脱离 Node.js 与 Go 依赖分发原生工具的前端架构师。

链接:Vercel Labs tsc-ts,scriptc 官网

笔者点评: JavaScriptCore 前架构师 Filip Pizlo 实测确认其执行效率略胜官方 Go 版本。但该项目重度依赖 scriptc 的静态推导假设,规避了部分隐式动态类型,未来持续同步官方 7.1 新增复杂特性时将面临不小的维护压力。

Jake Bailey 主导 Go 编译器内存重构:全场景堆内存削减近 30%

发生了什么: 微软核心维护者 Jake Bailey 合入了编号 #64734 的系列内存重构 PR 栈。该改动将固定容纳 256 个对象的 Typed-Arena 内存池重构为以 512 字节为边界的定额管理机制,并将可选结构类型形状移出热点路径存入冷存储。官方 perf-bot 在 9 大真实场景基准压测中显示,全量场景内存消耗下降 22.15% 至 29.66%。

为什么重要: Go 语言虽然带来并发检查优势,但在面对庞大 AST 产生的碎片化短生命周期对象时,GC 容易频繁触发扫描抖动。重构后,MUI 文档工程检查阶段内存缩减 29.66%(检查耗时减少 10.86%),VS Code 源码堆内存削减 27.19%(GC 扫描量下降 10.44%,指令数减少 9.43%)。这大幅化解了大型单体仓库多线程检查下的内存溢出隐患。

对谁有影响: 在 4GB 或 8GB 规格 CI 容器中频繁遭遇 OOM 报错的流水线维护者,以及大工程 LSP 守护进程用户。

链接:TypeScript PR #64734: Various memory optimizations

笔者点评: 按字节定额划分 Arena 虽微幅增加了约 13.9% 的分配事件,但有效阻断了死对象引用拖垮整个内存块的链式反应。对于内存受限的容器环境,单机即可安全调高 --checkers 线程并发数。

tsc-rs 0.7.0 发布:攻坚 WASM 浏览器端类型检查内存瓶颈

发生了什么: Theo Browne 团队开源的 Rust 版 TS 编译器 tsc-rs 发布 v0.7.0。新版本合入 PR #82,针对 wasm32-unknown-unknown 目标优化了类型检查器的内存布局,精简了线性内存段的分配开销,并在基准文档中补齐了 --fast 模式下的单核测试数据。

为什么重要: 微软官方 Go 编译器构建 WebAssembly 时体积膨胀且内存控制较粗,导致浏览器内运行完整类型检查器的设想难以落地。tsc-rs 依托 Rust 静态生命周期与零运行时特性,消除了 GC 干扰,为在浏览器端轻量运行 18 万量级官方测试用例提供了可行的 WASM 方案。

对谁有影响: 在线代码交互平台研发团队、Web IDE(如 StackBlitz)架构师,以及探索边缘计算端轻量类型校验的工程师。

链接:tsc-rs v0.7.0 发布页

笔者点评: Rust 针对 WASM 目标的指令压缩比具备结构性优势。然而在 32 位地址空间中解析百万行级 AST 仍逼近 4GB 虚拟内存极限,后续仍需引入增量 AST 分块释放策略。

🔥 社区热议

Vercel tsc-ts 引发编译器复刻与语言“套娃”大讨论

10 月 17 日,Vercel Labs 开源的 tsc-ts 登上 Hacker News(49 Points,51 条评论),在编译系统与前端生态圈引发深度论战。

  • 原生子集探索派:以资深虚拟机开发者 Filip Pizlo 为代表的工程师认为,实测单核速度超越 Go 版证明了受限类型子集结合 AOT 优化的实用性。TypeScript 具备清晰的类型边界,通过剔除不确定的动态特性直接生成机器码,证明了在保留 TS 语法编写体验的同时,能够达到系统级语言的工业级运行效率。
  • 语义分裂与工程怀疑派:持保守观点的工程师指出,从最初的 JS/TS,到微软重构为 Go,再到社区复刻为 Rust、C#,最后又用 TS 重新包装通过自研编译器生成二进制,这种“多层套娃”消耗了社区巨大的注意力和算力。更关键的是,scriptc 支持的只是经过剪裁的 TypeScript 方言,语义上的细微偏差若未经过大规模生产环境检验,极易在企业级代码库中产生难以排查的边界诊断缺陷。

链接:HN: Tsc-ts: TypeScript written in TypeScript

Deslop 规则集上线:防御性 Lint 应对 AI 生成代码滑坡

10 月 13 日,针对 AI 辅助生成代码质量防范的 Oxlint 规则集 deslop 在社区引发关注(Hacker News 32 Points,8 条评论)。

  • 强规则防御派:支持方工程师指出,AI 编程助手在追求单次提示词通过构建时,具有高频滥用 any 强转、复制细微差异的冗余数据结构、以及编写断言虚假的无效单测的系统性倾向。在团队全面拥抱 AI 研发工具后,借助 Rust 驱动的极速 linter(如 Oxlint 与 ast-grep)在预提交阶段强力拦截低质类型生成,是维持代码库类型拓扑健康的必需手段。
  • 集成测试优先派:反对方与部分敏捷团队认为,过度苛刻的静态规则会使 AI 编程代理在微小类型定义上反复消耗 Token 进行无效纠缠,反而拖慢了功能原型的交付效率。代码质量的核心应当由高覆盖率的端到端集成测试与运行时断言来保障,在编译期施加过于僵化的类型教条只会本末倒置。

链接:HN: Show HN: Deslop – Oxlint rules for AI-generated TypeScript,GitHub deslop

🔭 下周关注

  • TypeScript 7.1 IPC 性能开销实测:持续观察 Andrew Branch 推进的 UDS/命名管道 Programmatic API(PR #64818 与 #64846)在大型前端工程全量语法树跨进程传递时的吞吐损耗与内存序列化压力;
  • Bun PR #45631 内联缓存优化落地:跟踪 Jarred Sumner 团队针对无类型三方 npm 依赖属性访问慢问题的内联缓存补丁合入进展,核实 AOT 机器码在真实全栈框架(Express、Fastify)下的峰值吞吐改善情况。