Perry利用SWC和LLVM将TypeScript直接编译为可执行文件
速览
Perry 是一个新兴工具,它利用 SWC 编译器前端和 LLVM 后端,将 TypeScript 代码直接编译为高性能的原生可执行文件。这一技术突破旨在解决传统 TypeScript 运行时依赖问题,显著提升应用启动速度和执行效率。该方案为前端开发者提供了更接近原生语言的性能体验,同时保留了 TypeScript 的类型安全优势。
AI 深度解读
Perry:将 TypeScript 直接编译为原生可执行文件的编译器
背景
在当前的跨平台应用开发领域,开发者通常面临两种主要路径:一是使用基于 Web 技术栈的方案(如 Electron、Tauri 或 React Native),这类方案依赖运行时环境(如 V8 引擎或 Node.js),导致应用体积庞大且存在性能开销;二是使用各平台原生语言(如 Swift、Kotlin、Rust)分别开发,虽然性能极致但开发效率低且维护成本高。
Perry 的出现试图打破这一僵局。作为一个新兴的编译器工具,Perry 的核心愿景是“一个代码库,支持所有平台”。它允许开发者使用熟悉的 TypeScript 语法编写代码,并直接将其编译为 macOS、iOS、Android、Linux、Windows 等平台的原生二进制文件。与 Electron 不同,Perry 生成的应用不需要任何运行时依赖(No Runtime),旨在提供接近原生语言的性能,同时保持 TypeScript 的开发体验。
核心内容
Perry 不仅仅是一个 TypeScript 编译器,它是一个完整的原生应用构建生态系统。以下是其核心功能和技术实现的详细解读:
1. 编译架构与技术栈
Perry 采用了一种独特的编译流水线,直接跳过 JavaScript 中间层:
- 解析阶段:使用 SWC 进行高性能的 TypeScript 代码解析。
- 代码生成阶段:利用 LLVM 进行优化的原生代码生成。
- 结果:直接生成原生二进制文件(Native Binaries),无需 Node.js 或 V8 引擎支持。
2. 核心特性
- 零运行时依赖:生成的可执行文件是独立的,通常大小仅为 2-5 MB。如果需要使用纯 JavaScript 的 npm 包,可以选择启用 V8 运行时,此时体积约为 15-20 MB。
- 跨平台原生 UI:Perry 提供了 25 多种原生 UI 组件(如按钮、文本框、表格、Canvas 等),这些组件在编译时会映射到各平台的原生 UI 框架:
- macOS: AppKit
- iOS/iPadOS: UIKit
- Android: Views
- Linux: GTK4
- Windows: Win32
- watchOS/tvOS: SwiftUI
- WebAssembly: WebAssembly
- Web: JavaScript
- 标准库兼容:内置了对 Node.js 常用 API 的原生实现,包括
fs、path、crypto、os、Buffer和child_process等,开发者可以使用熟悉的 API 进行文件操作、加密和系统交互。 - 编译时插件系统:模块在构建时组合,没有运行时插件开销或 IPC(进程间通信)边界。依赖项在最终二进制文件中直接转化为原生函数调用。
- 真正的多线程支持:提供
parallelMap、parallelFilter和spawn等 API,基于操作系统真实线程。编译器在编译时检查并拒绝可变捕获(mutable captures),确保线程安全,无需使用SharedArrayBuffer或 Worker 线程。 - 编译时国际化 (i18n):自动提取字符串,支持 30 多种语言的 CLDR 复数规则,并在编译时进行验证。翻译内容直接嵌入二进制文件,运行时查找开销几乎为零。
3. 从代码到应用商店的全流程支持
Perry 不仅负责编译,还涵盖了应用的分发和验证:
- 构建与签名:一条命令完成跨平台构建,自动处理 macOS、iOS、Android 和 Windows 的代码签名,无需手动配置 Xcode 配置文件或 Android 密钥库。
- 分发:通过
Perry Publish处理打包、公证(Notarization)和提交,支持推送至 App Store、Play Store 或直接提供下载。 - 自动化测试:集成 Geisterhand 工具,在 6 个平台上进行自动化 UI 测试,确保应用在所有平台上的功能正常。
4. TypeScript 与 Node.js API 支持详情
Perry 对 TypeScript 语言特性和 Node.js 标准库提供了广泛的支持:
- 核心语言:支持 64 位浮点数、UTF-8 字符串、布尔值、数组、对象、BigInt(256 位整数)、枚举等。
- 函数与类:支持箭头函数、默认参数、剩余参数、闭包、高阶函数、Async/Await、类声明、构造函数、私有字段(
#语法)、静态成员、继承等。 - 类型系统:支持类型注解、类型推断、泛型(类似 Rust 的单态化)、接口、联合类型、类型守卫和类型别名。
- npm 包兼容:通过重新实现 30 多个流行的原生 Rust npm 包(涵盖数据库、安全、HTTP、数据处理等领域),实现了“无
npm install,无node_modules”的开发体验。
5. 性能表现
根据基准测试(Benchmark),在 Apple M1 Max 芯片上,Perry v0.5.279 相比 Node.js v25,在多项测试中速度提升了高达 18 倍。
关键要点
- 技术路径独特:Perry 使用 SWC 解析 TypeScript,并通过 LLVM 直接生成原生代码,彻底摒弃了 JavaScript 中间层和 V8 运行时,实现了真正的原生编译。
- 极小的二进制体积:默认生成的可执行文件仅 2-5 MB,即使包含 V8 运行时也仅为 15-20 MB,远低于 Electron 应用。
- 全平台原生 UI 映射:支持将 TypeScript UI 代码编译为 macOS (AppKit)、iOS/iPadOS (UIKit)、Android (Views)、Linux (GTK4)、Windows (Win32) 等平台的真实原生控件,而非 Web 视图。
- 开发体验与原生性能兼得:保留了 TypeScript 和 Node.js API(如
fs、crypto)的熟悉感,同时提供了真正的多线程支持和编译时优化的 i18n 功能。 - 端到端发布流程:内置了代码签名、应用商店提交(App Store/Play Store)和自动化 UI 测试(Geisterhand)功能,简化了从开发到发布的流程。
- 开源与商业化:对开源项目免费,团队版提供付费计划。
意义与影响
Perry 的推出对前端和跨平台开发领域具有潜在的重大影响:
- 挑战 Electron 的主导地位:Electron 长期以来凭借“Web 技术写桌面应用”的理念占据了市场,但其巨大的内存占用和二进制体积一直是痛点。Perry 提供了一种高性能、小体积的替代方案,使得使用 TypeScript 开发轻量级原生应用成为可能。
- 降低跨平台开发门槛:对于熟悉 TypeScript 和 Node.js 生态的开发者来说,Perry 消除了学习 Swift、Kotlin 或 Rust 的壁垒。开发者可以用一套代码库覆盖桌面、移动和 Web 平台,且获得接近原生语言的性能。
- 推动 TypeScript 在系统级编程中的应用:通过将 TypeScript 编译为 LLVM 代码,Perry 扩展了 TypeScript 的应用边界,使其不仅仅局限于 Web 前端,而是能够胜任系统级、高性能的应用开发。
- 简化 DevOps 流程:内置的代码签名和发布工具链解决了跨平台开发中最为繁琐的合规性和分发问题,特别是对于需要同时维护 macOS、iOS 和 Android 应用的团队而言,显著降低了运维复杂度。
总体而言,Perry 代表了“Web 技术栈原生化”的一种新趋势,它试图在开发效率、应用性能和分发便利性之间找到新的平衡点。
