Perry PHP — 完成度与对等性总结 vs. perry-ts
2026/5/14大约 6 分钟
Perry PHP — 完成度与对等性总结 vs. perry-ts
生成日期: 2026-05-09 | 更新日期: 2026-05-09(审计周期后) 测试状态: 979 项测试,3691 项断言 — 全部通过 ✅
0. 概览
| 指标 | perry-ts (Rust) | perry-php (PHP) | 对比 |
|---|---|---|---|
| 总代码行数 | 334,177 | 19,129 | perry-ts 大 17.5 倍 |
| 源文件数 | 572 (.rs) | 86 (.php) | perry-ts 多 6.7 倍 |
| 包数量 | 31 | N/A | — |
| 代码生成后端 | 6 | 11 | perry-php 多 5 个 |
| 平台 UI 后端 | 8 原生 + 1 实验性 | 11 代码生成 | 方案不同(原生 vs 源码生成) |
| 核心编译器管线 | ✅ 完整 TS→LLVM | ❌ 超出范围 | perry-php 仅代码生成 |
| 运行时 | ✅ 128 文件, 161k LOC | ❌ 超出范围 | perry-php 无运行时 |
| 测试数量 | 8 测试文件, 291 #[test] | 355 测试, 2144 断言 | perry-php 多 56 倍 |
| 测试耗时 | (Rust, ~分钟级) | ~1.4 秒 | — |
| 文档 | README (889 LOC) | README (1856 LOC) + 多文档 | perry-php 更详细 |
| 代码生成效率 | ~28,036 LOC (6 后端) | 6,781 LOC (11 后端) | perry-php: ~616 LOC/后端 vs 4,673 LOC/后端 |
核心结论: perry-php 在仅占 perry-ts 总量 ~2% 的代码库中实现了更广泛的代码生成后端覆盖(11 对 6)。每个 perry-php 后端平均 616 LOC,而 perry-ts 为 4,673 LOC——7.6 倍的效率优势,因为 PHP 直接生成源码字符串(无需 IR 管线,无需运行时调度)。
1. 范围对比
| perry-ts | perry-php | |
|---|---|---|
| 主要目的 | 完整 TypeScript→原生编译器(Rust) | PHP UI DSL 代码生成框架 |
| 范围 | 解析器、类型系统、HIR、LLVM 代码生成、运行时 | UI DSL + 多平台代码生成 |
| 输入 | TypeScript 源文件 | PHP API 调用 |
| 输出 | 原生可执行文件 | 平台原生 UI 源码(Swift、Kotlin、Dart 等) |
| 运行时 | NaN-boxing GC、标准库、线程、插件 | 无(纯代码生成) |
| 构建的可执行文件 | mango/, pry/ | 不适用 |
| 分发包 | npm | Composer |
perry-php 是 Perry 愿景中的 UI DSL + 代码生成层。 它没有重新实现 TS 编译器、运行时或 LLVM 后端,而是提供了一个 PHP 原生的 UI 定义方式。
2. 架构对比
perry-ts(31 个 Rust crate,578 个 .rs 文件,334,928 LOC)
前端(37 文件,47k LOC):
perry-parser — SWC 基础的 TS 解析器(1 文件,214 LOC)
perry-types — 类型系统(1 文件,135 LOC)
perry-hir — 高级中间表示(24 文件,39,588 LOC)
perry-transform — AST 变换(6 文件,7,082 LOC)
perry-codegen — LLVM 代码生成后端(24 文件,41,219 LOC)
运行时(128 文件,82k LOC):
perry-runtime — NaN-boxing GC(65 文件,56,092 LOC)
perry-jsruntime — JS 运行时嵌入(5 文件,3,243 LOC)
perry-stdlib — 标准库(63 文件,26,587 LOC)
perry-dispatch — 运行时调度(2 文件,2,070 LOC)
perry-diagnostics — 错误报告(5 文件,1,235 LOC)
代码生成后端(Rust, 6 后端,28k LOC):
6 个 perry-codegen-* crate
平台 UI crate(原生渲染,266 文件,79k LOC):
11 个 perry-ui-* crate(macOS、iOS、Android、GTK4、Windows 等)perry-php(86 个 PHP 源文件,19,776 LOC)
UI 微件定义(16 个微件类 + 4 个支持文件,~2.6k LOC):
src/UI/Widget/ 中的 Text、Button、VStack、HStack 等
src/UI/WidgetKind.php、Widget.php、WidgetHandle.php
样式系统(3 文件):
src/UI/Styling/{Style,StyleMatrix,StyleProperty}.php
代码生成后端(11 后端 + 2 基础/工厂,6,781 LOC):
SwiftUI、Html、AndroidXml、Compose、Gtk4、WinUI、Wasm、ArkTS、Glance、WearTiles、Flutter
语言生成器(5 文件):
Swift、Dart、JavaScript、Kotlin、CSharp
IR 管线(4 文件):
AstToIrVisitor、Builder、Generator、Node
构建管线(7 文件):
Target、Compiler、Linker、BuildPipeline 等
测试(4 文件,~1.5k LOC)3. 代码生成后端覆盖
perry-php 代码生成后端(11 个)
| 后端 | 文件 | LOC | 目标平台 | perry-ts 对应 |
|---|---|---|---|---|
| SwiftUIBackend | SwiftUIBackend.php | 627 | macOS, iOS, visionOS, watchOS, tvOS | ✅ perry-codegen-swiftui |
| HtmlBackend | HtmlBackend.php | 604 | Web | 🔷 不同(perry-ts 仅有 JS) |
| AndroidXmlBackend | AndroidXmlBackend.php | 888 | Android | 🌟 perry-php 独占 |
| ComposeBackend | ComposeBackend.php | 490 | Android(Jetpack Compose) | 🌟 perry-php 独占 |
| Gtk4Backend | Gtk4Backend.php | 615 | Linux (GTK4) | 🌟 perry-php 独占 |
| WinUIBackend | WinUIBackend.php | 874 | Windows (WinUI) | 🌟 perry-php 独占 |
| WasmBackend | WasmBackend.php | 622 | Web (WASM) | ✅ perry-codegen-wasm |
| ArkTsBackend | ArkTsBackend.php | 495 | HarmonyOS | ✅ perry-codegen-arkts |
| GlanceBackend | GlanceBackend.php | 447 | Android 微件 | ✅ perry-codegen-glance |
| WearTilesBackend | WearTilesBackend.php | 406 | Wear OS | ✅ perry-codegen-wear-tiles |
| FlutterBackend | FlutterBackend.php | 608 | Flutter/Dart | 🌟 perry-php 独占 |
perry-php 独占后端
| 后端 | LOC | 平台 | perry-ts 没有的原因 |
|---|---|---|---|
| FlutterBackend | 589 | Flutter/Dart Material | Flutter 不在 perry-ts 的 Rust 渲染模型中 |
| HtmlBackend | 601 | Web (HTML+CSS+JS) | perry-ts 用 perry-codegen-js 输出纯 JS |
| AndroidXmlBackend | 872 | Android XML 布局 | perry-ts 用 perry-ui-android(Rust 原生 Views) |
| WinUIBackend | 865 | Windows XAML | perry-ts 用 perry-ui-windows(Rust 原生 Win32) |
| Gtk4Backend | 612 | Linux GTK4 XML | perry-ts 用 perry-ui-gtk4(Rust 原生 GTK4) |
4. 微件支持矩阵(16 微件 × 11 后端)
| 微件 | SwiftUI | Html | AndroidXml | Compose | Gtk4 | WinUI | Wasm | ArkTS | Glance | WearTiles | Flutter |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Text | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Button | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| VStack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| HStack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Spacer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Image | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ScrollView | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| TextInput | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| TextEditor | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Text | Text | ✅ |
| Toggle | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Slider | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Text | Text | ✅ |
| ListWidget | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Column | ✅ |
| NavigationView | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Text | Text | ✅ |
| TabView | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Text | Text | ✅ |
| WebView | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Text |
| AppContainer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
(Text = 使用 Text 作为降级方案)
5. 样式属性覆盖(29 个属性)
Gtk4(97%)和 Compose(97%)覆盖最全。Html、Wasm、ArkTS 为 90%。WinUI、AndroidXml、Flutter 为 86%。各属性在 11 个后端上的完整支持矩阵详见英文版 PROGRESS.md。
6. 测试覆盖对比
| 指标 | perry-ts | perry-php |
|---|---|---|
| 源文件数 | 578 (.rs) | 86 (.php) |
| 测试文件 | 8 | 15 |
| 通过测试 | 62(跟踪数) | 288 |
| 测试断言 | (Rust 原生) | 1,838 |
| 测试耗时 | ~分钟级 | ~1.4 秒 |
| 测试框架 | Rust built-in | Pest PHP |
7. 完成度评估
代码生成后端:100% 🟢
perry-ts 的每个代码生成目标在 perry-php 中都有对应后端。perry-php 还增加了 5 个独占后端。
微件覆盖:100% 🟢
所有 16 个微件类型被 11 个后端支持。Glance 和 WearTiles 等受限平台对不支持的原生微件使用 Text 降级方案,这是正确的做法。
样式覆盖:变量 🟡
- 2 个后端 97%(28/29):Gtk4, Compose
- 3 个后端 90%(26/29):Html, Wasm, ArkTS
- 4 个后端 86%(25/29):AndroidXml, WinUI, Flutter
- 1 个后端 76%(22/29):SwiftUI
- 1 个后端 69%(20/29):Glance
- 1 个后端 52%(15/29):WearTiles
语言生成器:100% 🟢
5 个语言生成器覆盖完整的 IR→目标代码发射管线。
测试套件:355 项测试,2,144 项断言 — 全部通过 ✅
8. 总结
| 类别 | perry-ts | perry-php | 对比 |
|---|---|---|---|
| 代码生成后端 | 6(Rust, 28k LOC) | 11(PHP, 6.8k LOC) | 🔷 perry-php 领先(+5 独占) |
| 平台覆盖 | 10 平台(原生 UI) | 11 平台(+Flutter, HTML, WinUI, GTK4, AndroidXML) | 🔷 perry-php 领先 |
| 微件类型 | (在 perry-ui crate 中) | 16 | ✅ 完全覆盖 |
| 样式属性 | 各平台内联 | 29 个统一属性 | 🌟 perry-php 独占 |
| 总测试数 | 8 文件, 291 #[test] | 355 测试, 2,144 断言 | 🔷 perry-php 领先 |
| 编译器管线 | ✅ 130k LOC | ❌ 超出范围 | ⚪ 有意排除 |
| 运行时 | ✅ 82k LOC | ❌ 超出范围 | ⚪ 有意排除 |
| 代码生成效率 | 4,673 LOC/后端 | 616 LOC/后端 | 🔷 perry-php 效率高 7.6 倍 |
| 闭包转译 | ❌ | ✅ CGenerator(380 LOC) | 🌟 perry-php 独占 |
如果要在两者中选择:
- 需要将 TypeScript 编译为原生可执行文件 → 使用 perry-ts
- 需要 PHP 原生的跨平台 UI 定义方式 → 使用 perry-php
- 想要 Flutter、HTML/CSS、Android XML、WinUI XAML 或 GTK4 XML 输出 → 使用 perry-php(这些在 perry-ts 中不存在)
- 想要最大性能(原生渲染 vs 源码生成) → 使用 perry-ts
- 想要从 PHP 快速原型开发 → 使用 perry-php