大家好,我是何三,独立开发者

说到 TypeScript,你脑子里蹦出来的第一件事是啥?

大概率是 Node.js、npm run dev、还有那个比黑洞还沉的 node_modules。

今天聊的这个项目,直接把这些全扔了。

Perry——一个用 Rust 写的 TypeScript 原生编译器。它把你的 TS 代码直接编译成原生二进制文件,不用 Node.js,不用 Electron,不用任何运行时。

就一个单文件,跑哪都行。

重点是——性能炸得很离谱

Perry 封面

根据官方 benchmark,Perry 比 Node.js 快 1.1x 到 31x。闭包调用快 31 倍,阶乘运算快 19 倍,数学运算快 3.7 倍。

更离谱的是,在某些场景下它跟 Rust、C++ 打得有来有回。

一个 TypeScript 编译器,性能逼近 C++?

这听着不太对劲,但它就是真的。

Perry Benchmark 对比

原理其实没那么玄乎

Perry 的技术栈就两样东西:SWC 解析 TypeScript, LLVM 生成机器码。

SWC 是 Vercel 家出的 Rust 版 JS/TS 解析器,跑得飞快。Perry 用它把你的 TS 代码解析成中间表示。

然后 LLVM 上场——就是 Clang 用的那个 LLVM,它把中间表示转成机器码。

说白了,你的 TypeScript 代码走了一条完全不同的路:不是交给 Node.js 去解释执行,而是像 C++ 一样被编译成本地机器码。

这就带来了 C++ 级别的优化:标量替换(对象字段变寄存器)、自动向量化(SIMD 指令)、循环展开、内联分配器……

哦对,它还做了个骚操作叫 NaN-boxing——所有值都塞进 64 位字里,数字不用装箱拆箱。

说到这个我想起来一个事。之前有个段子说,JS 开发者最怕听到的词就是"装箱",因为一听就觉得慢。Perry 直接把这个烦恼给抹掉了——你的数字在底层就是原生数字,根本不存在"箱"这回事。

原理大概是这样,细节我可能说得不精确——有懂 LLVM 的大佬欢迎评论区指正。

装一个试试,20 秒出活

安装方式多得离谱:

# npm 全局装
npm install -g @perryts/perry

# macOS 用户
brew install perryts/perry/perry

# Windows 用户
winget install PerryTS.Perry

装完写个 hello:

// main.ts
console.log("Hello, world!");

编译:

perry compile src/main.ts -o myapp
./myapp

输出一个 330KB 的单文件。没有 node_modules,没有运行时依赖。

330KB 是什么概念?一个空 Node.js 项目光 package.json + node_modules 就不止这个数。

一个装了 fastify 的全栈 API 项目,编译出来也就 48MB 左右。对比一下 Node.js 项目——同样的依赖,node_modules 随随便便 200MB+。

——等等,这个压缩率是不是算错了?应该没有,Perry 只链接你用到的代码。

不只是能跑 Hello World

Perry 能干的事儿比你想的多得多:

完整的 TypeScript 语法:类、泛型、async/await、generator —— 除了装饰器,基本都支持。

npm 包原生编译:fastify、mysql2、pg、ioredis、bcrypt、jsonwebtoken 这些热门包,都在 Rust 层面原生实现了,不走 V8 解释器。

原生 UI 系统perry/ui 模块,写一套代码编译出 macOS(AppKit)、Windows(Win32)、Linux(GTK4)、iOS、Android 的原生界面。没有 Electron,没有 WebView。

给你们看个例子——用 Perry 写原生 UI:

import { App, VStack, HStack, Text, Button, Spacer } from 'perry/ui';

const content = VStack(16, [
  Text("Welcome back!"),
  Spacer(),
  Button("Save", () => {})
]);

App({ title: 'My App', width: 800, height: 500, body: content });

然后 perry compile —— 出来一个原生 macOS 应用。没 Electron 那几百 MB 的屎山包袱。

跨平台编译:一套代码,macOS、Windows、Linux、iOS、Android、Web(通过 JS/WASM 代码生成),全平台覆盖。

多线程perry/thread 模块,真正的 OS 线程,编译时保证安全。

说实话,Perry 不只是个编译器。它是一个完整的"TypeScript 原生应用开发平台"。

跟 Bun 比,有什么区别?

Bun 我也写过——也是 Rust 写的,也很快。

但路线完全不一样:

  • Bun 是一个 JavaScript 运行时,解释执行 + JIT 编译
  • Perry 是一个原生编译器,AOT(提前编译),输出二进制

Bun 再快,你还是要装 runtime,还是要跑 bun run。Perry 编译出来的东西,直接 ./app 就能跑,不需要任何外部依赖。

打个不恰当的比方:

Bun 是"比 Node.js 快的 Node.js 替代品"。 Perry 是"让 TypeScript 像 C++ 一样编译执行"。

哪个更颠覆?你自己品。

Perry 目前还是 v0.5.x,Star 数 2,197(约 2200+),生态还在建设中。有些冷门 npm 包还不能原生编译,得走 V8 运行时兜底。文档怎么说呢……作者是 Rust 老哥写的那种,很硬核,但对新手不太友好。

但方向完全对。

让 TypeScript 拥有原生性能——这件事本身就足够让人兴奋。想想看:以后前端同学写个后端服务,不用碰 C++/Rust,就能拿到接近 C++ 的性能。

这比语言本身的速度重要得多。

以前你要写高性能服务,你得学 Rust、学 C++、跟 borrow checker 搏斗。现在你写 TypeScript 就能搞定——用你熟悉的语法,拿到你不敢想的性能。

至少我决定在自己的下一个项目上试试 Perry。

GitHub 地址:https://github.com/PerryTS/perry

本文使用 MGO 编辑并发布

关注"何三笔记",回复"mgo" 免费下载使用