Ant: 从零构建的轻量级 JavaScript 运行时
JavaScript 运行时的领域通常由 Node.js、Bun 和 Deno 等巨头主导,它们都依赖于 V8 或 JavaScriptCore 等庞大的引擎。虽然这些引擎提供了强大的功能,但它们在二进制文件大小和内存开销方面也付出了巨大的代价。Ant 应运而生,这是一个从零开始构建的 JavaScript 运行时,专门设计用于消除困扰现代 CLI 工具和容器化应用的“运行时臃肿”问题。
极简运行时设计的哲学
大多数现代运行时都是现有浏览器引擎的封装。虽然这种方法允许快速开发并实现高性能,但导致生成的二进制文件通常在 50MB 到 100MB 之间。对于交付 CLI 工具或轻量级 Docker 容器的开发者来说,这种开销是一个显著的瓶颈。
Ant 采取了不同的方法,通过从头开始实现自己的引擎,被称为 "Ant Silver"。通过避免对 V8、JSC 或 SpiderMonkey 的依赖,作者成功地将二进制文件大小保持在极小的水平:标准构建版本约为 9MB,在使用 -Os 优化编译时甚至低至 6.5MB。
性能与冷启动
较小运行时的主要优势之一是减少冷启动延迟。这在 Serverless 环境或 CLI 应用中尤为关键,因为在这些场景下,首次执行的时间是最直观的性能指标。
根据在 M4 Pro 芯片上使用 Hono 冷启动测试 (examples/npm/hono/bench-coldstart.js) 进行的基准测试,Ant 展示了令人印象深刻的速度:
- 冷启动时间: ~5ms
- 对比: 比 Bun 快约 2.4 倍,比 Node.js 快 5.8 倍。
虽然作者指出 Ant 的性能足以在特定形状和场景下与 V8 竞争,但必须认识到这是一个专用工具。其重点在于效率和敏捷性,而非在所有可能的 JavaScript 工作负载中追求原始的通用吞吐量。
技术架构与兼容性
从零构建运行时需要对语言规范和 API 兼容性采取严谨的方法。Ant 专注于以下技术里程碑:
引擎与 JIT
Ant Silver 是驱动运行时的核心引擎。为了确保未来的性能提升,该项目正在实现一个即时编译 (JIT) 编译器,目前使用 MIR (Mid-level Intermediate Representation) 的一个分支作为其后端。
标准合规性
为了确保在现实世界中的实用性,Ant 目标是实现 WinterCG Minimum Common API,旨在实现一套可在不同运行时之间通用的标准化 API 集。其目前的兼容性状态如下:
- javascript-zoo compat-table: 100% 通过率。
- test262: 完成度约为 64%。
Ant 的使用场景
Ant 并不打算取代 Node.js 用于大规模企业级后端,但它填补了特定架构需求的空白:
- 嵌入式 CLI 工具: 在无需用户安装沉重运行时环境的情况下,交付由 JavaScript 驱动的 CLI。
- 微型容器: 减少 Docker 镜像的占用空间,以加快云原生环境中的部署和扩展。
- 边缘计算: 利用超快的冷启动时间,用于对毫秒级延迟敏感的事件驱动型函数。
通过优先考虑二进制文件大小和启动速度,Ant 为需要 JavaScript 的灵活性但又不想承受传统引擎负担的开发者提供了一个可行的替代方案。