Perry 对比 Deno
Deno 是一个建立在 V8 之上的现代 JavaScript 与 TypeScript 运行时,原生支持 TypeScript,采用基于权限的安全模型,并提供 `deno compile` 命令——通过把 V8 与应用一起打包来生成单个可执行文件。Perry 则把 TypeScript 直接编译为原生机器码——产物里没有 V8、没有运行时层,只有一个小型的原生二进制。
什么是 Deno?
Deno 是一个用 Rust 编写、构建于 V8 与 Tokio 之上的 TypeScript/JavaScript 运行时。它直接执行 `.ts` 源码,内置工具(格式化器、linter、测试运行器、语言服务器),并采用权限模型——网络、文件和环境访问都需要显式授权。`deno compile` 通过把 Deno 运行时(其中包含 V8)与你的代码一起打包,生成自包含的可执行文件。Deno 面向 Linux、macOS 和 Windows 上的 x64 与 arm64。
什么是 Perry?
Perry 是一个用 Rust 编写的原生 TypeScript 编译器。它通过 LLVM 把 TypeScript 直接编译为原生机器码——没有 V8、没有 JIT、没有运行时。产物是单个二进制,原生代码通常为几百 KB 到几 MB;如果选择启用嵌入式 V8 运行时以兼容需要 JS 引擎的 npm 包,体积会更大。
并排对比
| 特性 | Perry | Deno |
|---|---|---|
| 产物 | 原生机器码(LLVM) | 你的代码 + Deno 运行时(V8)打包在一起 |
| 二进制中的 JavaScript 引擎 | 默认无;可选 V8 | 始终内置 V8 |
| hello world 二进制大小 | 约 330 KB | 约 80–100 MB(包含 V8) |
| JIT | 无(AOT 编译) | 有(V8 TurboFan) |
| 移动平台目标 | iOS、iPadOS、Android | 不支持 |
| Watch / TV / WASM / Web | watchOS、tvOS、Wear OS、WASM、Web/JS | 不支持 |
| 原生 UI | 通过原生平台 API 提供 25+ 个组件 | 不支持 |
| 权限模型 | 标准操作系统进程权限 | 细粒度运行时权限(--allow-net、--allow-read 等) |
| 稳定性 | Pre-1.0 | 稳定(1.x / 2.x) |
| 实现语言 | Rust | Rust(基于 V8) |
Perry 胜出之处
- +二进制显著更小。Perry 的 hello world 约 330 KB。`deno compile` 的产物包含 V8,落在 80–100 MB 区间。
- +二进制中没有 JavaScript 引擎。你的 TypeScript 被编译为原生机器码,而不是在运行时由 V8 解释执行。
- +支持移动、手表、TV、WASM 和 Web 目标。Deno 仅限服务端/桌面。
- +可映射到 AppKit、UIKit、GTK4、Win32 和 JNI 的原生 UI 组件——这是 Deno 没有的。
- +更快的冷启动。AOT 编译的原生二进制不需要支付 V8 的启动开销。
- +在 M1 Max 上以匹配条件运行时,由于 Perry 的 `reassoc contract` 快速数学默认值允许 LLVM 进行自动向量化并折叠可平凡折叠的累加器,因此在计算微基准上处于领先(例如 loop_overhead 12 ms、math_intensive 14 ms;见 perry/benchmarks)。
Deno 胜出之处
- +成熟、稳定、长期运营的运行时,2.x 线积极活跃。
- +细粒度权限模型。Deno 要求显式 `--allow-net`、`--allow-read` 等——对沙箱脚本和不受信任代码很有用。
- +内置工具:格式化器、linter、测试运行器、文档生成器、LSP 全部集成在运行时中。
- +运行时上的完整 V8 生态——能在 V8 上跑的都能跑在 Deno 上,包括长时间运行热路径上的 JIT 优化。
- +开发期对 TypeScript 的一等支持,无需独立的编译步骤,并提供完全托管的类型检查管道。
- +在运行时原生实现的标准化 Web 平台 API(fetch、Web Streams、Web Crypto)。
何时选择 Perry
如果你想要一个体积小、启动快的原生二进制,要交付到移动或其他非服务端目标,要原生 UI,或希望编译出来的 TypeScript 二进制里没有 JS 引擎,就选 Perry。
何时选择 Deno
如果你想要一个稳定、自带电池的 TypeScript 运行时,看重权限沙箱,正在构建服务端或脚本类负载,或需要运行时层面的完整 V8 生态兼容,就选 Deno。
结论
两者都让你把 TypeScript 程序作为单个二进制交付;区别在于这个二进制里装的是什么。Deno 给你的是 V8 + 一套精心打磨的运行时 + 权限沙箱。Perry 给你的是不带任何引擎的原生机器码。在生态和权限模型重要的服务端与脚本类工作上,Deno 更合适;当你需要小体积、快冷启动的二进制、移动端目标或原生 UI 时,Perry 更合适。