ひとつのコードベース。すべてのプラットフォーム。
ネイティブパフォーマンス。
PerryはTypeScriptをmacOS、iPadOS、iOS、Android、Linux、Windows、watchOS、tvOS、WebAssembly、Web向けのネイティブGUI・CLIアプリにコンパイルします。ランタイム不要。Electron不要。ネイティブバイナリのみ。
$ perry compile main.ts
main.tsをコンパイル中...
✓ コンパイル済み実行ファイル: main (2.3 MB)
$ ./main
Hello, World!
なぜPerryなのか?
TypeScriptをネイティブアプリケーションにコンパイルするために必要なすべてが揃っています
ランタイム不要
スタンドアロンのネイティブ実行ファイルを生成します。Node.js不要、V8不要、ランタイム依存なし。どこでも動作する単一バイナリです。
高速コンパイル
SWCによるパースとCraneliftによるコード生成で、TypeScriptからネイティブコードへ直接コンパイルします。中間JavaScriptは不要です。
コンパクトなバイナリ
出力バイナリは通常2〜5MB。JS npmパッケージ用のオプションV8ランタイムを含めても15〜20MB。少なく配布し、高速にデプロイ。
型安全
TypeScriptの型システムを最適化に活用。型によりMonomorphizationを通じたより効率的なコード生成が可能になります。
充実した標準ライブラリ
fs、path、crypto、os、Buffer、child_processなどのネイティブ実装を内蔵。おなじみのNode.js APIが使えます。
オプションV8ランタイム
純粋なJavaScript npmパッケージを使う必要がありますか? V8ランタイムフラグを有効にして、npmエコシステムとの完全な互換性を確保できます。
25以上のネイティブUIウィジェット
ボタン、テキストフィールド、テキストエリア、テーブル、Canvas、スクロールビュー、QRコード、セキュアフィールド、スプラッシュスクリーンなど——すべてAppKit、GTK4、Win32、UIKit、JNIを通じた実際のプラットフォームウィジェットにコンパイルされます。
コンパイル時プラグインシステム
モジュールはビルド時に合成されます——ランタイムでのプラグインオーバーヘッドなし、IPCの境界なし。依存関係は最終バイナリ内で直接的なネイティブ関数呼び出しになります。
真のマルチスレッド
parallelMap、parallelFilter、spawnによる本物のOSスレッド。コンパイル時の安全性がミュータブルキャプチャを拒否します——SharedArrayBufferなし、Workerなし、純粋なスレッドのみ。
コンパイル時i18n
自動文字列抽出、30以上のロケール向けCLDR複数形ルール、コンパイル時バリデーション。翻訳はバイナリに組み込まれ、ランタイムでのルックアップはほぼゼロです。
すべてのプラットフォームでネイティブ
PerryはTypeScriptをネイティブUIフレームワーク、WebAssembly、JavaScriptにコンパイルします——Webビューでもなく、Electronでもありません。すべてのプラットフォームで本物のネイティブウィジェットを、そしてWebも。
macOS
AppKit
iOS
UIKit
iPadOS
UIKit
Android
Views
Linux
GTK4
Windows
Win32
watchOS
SwiftUI
tvOS
SwiftUI
WASM
WebAssembly
Web
JavaScript
すべての要件を満たす唯一のフレームワーク
TypeScriptをネイティブコードにコンパイル。本物のプラットフォームウィジェット。ランタイムオーバーヘッドゼロ。
| フレームワーク | 言語 | ネイティブコード | ネイティブウィジェット | ランタイムオーバーヘッド |
|---|---|---|---|---|
Perry★AOT compiled to native binary | TypeScript | None | ||
React NativeJIT / interpreted at runtime | JS / TypeScript | Hermes / V8 + Bridge | ||
FlutterAOT compiled, custom renderer | Dart | Dart VM + Skia engine | ||
KMP + ComposeJVM on Android, native on iOS | Kotlin | 部分的 | Kotlin runtime + Skia | |
Swift for AndroidNative binary, no shared UI | Swift | 共通UIなし | Swift runtime on Android | |
.NET MAUIPartial AOT via Mono | C# | 部分的 | .NET / Mono runtime | |
NativeScriptJS runtime, native widget access | JS / TypeScript | V8 / JavaScriptCore | ||
IonicWeb app in native wrapper | JS / TypeScript | WebView + Capacitor |
TypeScriptを書いて、ネイティブで出荷
おなじみのTypeScript構文とAPIを使用。Perryが残りを処理します。
// hello.tsconst greeting = "Hello, World!";console.log(greeting); // Compiles to ~2MB native executable// No runtime needed!パフォーマンス比較
ネイティブコンパイルが圧倒的な効率性を実現
| 指標 | Perry | Node.js | Bun |
|---|---|---|---|
| バイナリサイズ | 2-5 MB | ~80 MB | ~90 MB |
| 起動時間 | ~1 ms | ~30 ms | ~10 ms |
| ランタイム依存 | なし | Node.js | Bun |
| メモリオーバーヘッド | 最小限 | V8 + GC | JSC + GC |
ベンチマーク結果: 2.2倍高速
Perry vs Node.js v24(macOS ARM64、低いほど良い)
はじめる
Perryをインストールして、TypeScriptをネイティブ実行ファイルにコンパイルしましょう
1インストール
$ brew tap PerryTS/perry$ brew install perryHomebrewが必要です。macOS arm64とx86_64に対応。
2使い方
perry build main.tsmain.tsをネイティブ実行ファイルにコンパイルします
perry build main.ts -o myapp出力実行ファイル名を指定します
perry build main.ts --enable-js-runtimeJavaScript npmパッケージの互換性のためにV8を有効化
perry check ./srcTypeScriptコードのネイティブコンパイル互換性を検証します
機能サポート
TypeScriptおよびNode.js APIの包括的なカバレッジ
Core Language
- Numbers64-bit floating point (f64)
- StringsUTF-8, all common methods
- Booleanstrue/false, logical operators
- ArraysTyped and mixed-type arrays
- ObjectsObject literals and field access
- BigInt256-bit integer support
- EnumsNumeric and string enums
Functions
- Function DeclarationNamed functions
- Arrow Functions() => {} syntax
- Default ParametersParameters with defaults
- Rest Parameters...args syntax
- ClosuresIncluding mutable captures
- Higher-Order FunctionsFunctions as arguments/returns
- Async/AwaitAsync function support
Classes
- Class DeclarationBasic class syntax
- ConstructorsWith parameters
- Private Fields (#)ES2022 #privateField syntax
- Static Methods/FieldsClass-level members
- Getters/Settersget/set accessors
- Inheritanceextends keyword
- Super Callssuper() constructor calls
Type System
- Type AnnotationsExplicit type declarations
- Type InferenceAutomatic type detection
- GenericsMonomorphization (like Rust)
- InterfacesInterface declarations
- Union Typesstring | number support
- Type Guardstypeof operator
- Type Aliasestype X = ... declarations
Standard Library
- fsreadFileSync, writeFileSync, existsSync, etc.
- pathjoin, dirname, basename, extname, resolve
- cryptorandomBytes, randomUUID, sha256, md5
- osplatform, arch, hostname, memory info
- Bufferfrom, alloc, toString, slice, copy
- child_processexecSync, spawnSync
- JSON/Math/DateFull implementations
30以上のネイティブnpmパッケージ
人気のnpmパッケージをネイティブRustで再実装。npm installもnode_modulesも不要、高速なネイティブコードだけ。
データベース
セキュリティ
HTTP
データ処理
日付と時刻
ユーティリティ
コードからApp Storeへ
Perryはアプリをコンパイルするだけでなく、ユーザーの手に届けます。
ビルドと署名
ひとつのコマンドでクロスプラットフォームビルド。macOS、iOS、Android、Windowsのコード署名を自動処理。XcodeプロビジョニングプロファイルやAndroidキーストアとの格闘は不要です。
配布
App Store、Play Storeへのプッシュ、または直接ダウンロードとして配布。Perry Publishがパッケージング、公証、提出を処理します。
検証
Geisterhandによる自動UIテスト。6つのプラットフォームすべてでテスト。ユーザーから指摘される前に、アプリがどこでも動作することを確認できます。
オープンソースプロジェクトは無料。 チーム向けプラン → /publish
仕組み
TypeScriptソースからネイティブ実行ファイルまで、わずか数秒
lift
コンパイラの内部の仕組みを知りたいですか? コンパイラ内部構造