TypeScript をネイティブへコンパイル。
ひとつのコードベースで、すべてのプラットフォームへ。
PerryはTypeScriptをmacOS、iPadOS、iOS、Android、Linux、Windows、watchOS、tvOS、HarmonyOS、WebAssembly、Web向けのネイティブGUI・CLIアプリにコンパイルします。ランタイム不要。Electron不要。ネイティブバイナリのみ。
$ perry compile main.ts
main.tsをコンパイル中...
✓ コンパイル済み実行ファイル: main (2.3 MB)
$ ./main
Hello, World!
なぜPerryなのか?
TypeScriptをネイティブアプリケーションにコンパイルするために必要なすべてが揃っています
ランタイム不要
スタンドアロンのネイティブ実行ファイルを生成します。Node.js不要、V8不要、ランタイム依存なし。どこでも動作する単一バイナリです。
高速コンパイル
SWCによるパースとLLVMによる最適化されたコード生成で、TypeScriptからネイティブコードへ直接コンパイルします。中間JavaScriptは不要です。
コンパクトなバイナリ
出力バイナリは通常2〜5MB。JS npmパッケージ用のオプションV8ランタイムを含めても15〜20MB。少なく配布し、高速にデプロイ。
決定的なビルド
同じ入力なら同じバイナリ。マシン、CI実行、チームをまたいで再現可能。原因不明の再ビルドはありません。
充実した標準ライブラリ
fs、path、crypto、os、Buffer、child_processなどのネイティブ実装を内蔵。おなじみのNode.js APIが使えます。
本物の npm パッケージ
axios、zod、express、fastify、hono がネイティブバイナリにコンパイルされます。純粋な JavaScript のパッケージは、オプションの埋め込みランタイム上で動きます — 自己完結型で、ランタイムに node_modules は不要です。
35以上のネイティブUIウィジェット
ボタン、テーブル、日付ピッカー、ドラッグ & ドロップ、チャート、マップ、コマンドパレット、QRコード、リッチテキストなど——すべて AppKit、UIKit、GTK4、Win32(Fluent/Mica)、JNI を通じて実際のプラットフォームウィジェットにコンパイルされます。
コンパイル時プラグインシステム
モジュールはビルド時に合成されます——ランタイムでのプラグインオーバーヘッドなし、IPCの境界なし。依存関係は最終バイナリ内で直接的なネイティブ関数呼び出しになります。
真のマルチスレッド
parallelMap、parallelFilter、spawnによる本物のOSスレッド。コンパイル時の安全性がミュータブルキャプチャを拒否します——SharedArrayBufferなし、Workerなし、純粋なスレッドのみ。
コンパイル時i18n
自動文字列抽出、30以上のロケール向けCLDR複数形ルール、コンパイル時バリデーション。翻訳はバイナリに組み込まれ、ランタイムでのルックアップはほぼゼロです。
さらに詳しく:Perry がTypeScript をバイナリにコンパイルする仕組み、Perry をTypeScript ネイティブコンパイラたらしめているもの、そしてElectron の代替と比べてどうなのか。
みんなが作っているもの
TypeScriptからコンパイルされた本物のネイティブアプリ。Electronなし、WebViewなし — すべてのプラットフォームでネイティブUI。
Mango
ネイティブMongoDB GUI — TypeScriptで完全構築


Hone
ネイティブAIコードエディタ — TypeScriptからネイティブバイナリへ

すべてのプラットフォームでネイティブ
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
コードからApp Storeへ
Perryはアプリをコンパイルするだけでなく、ユーザーの手に届けます。
ビルドと署名
ひとつのコマンドでクロスプラットフォームビルド。macOS、iOS、Android、Windowsのコード署名を自動処理。XcodeプロビジョニングプロファイルやAndroidキーストアとの格闘は不要です。
配布
App Store、Play Storeへのプッシュ、または直接ダウンロードとして配布。Perry Publishがパッケージング、公証、提出を処理します。
検証
Geisterhandによる自動UIテスト。6つのプラットフォームすべてでテスト。ユーザーから指摘される前に、アプリがどこでも動作することを確認できます。
オープンソースプロジェクトは無料。 チーム向けプラン → /publish
すべての要件を満たす唯一のフレームワーク
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 |
ベンチマーク結果: 最大18倍高速
Perry v0.5.279 vs Node.js v25 — RUNS=11 中央値、Apple M1 Max(低いほど良い)
はじめる
Perryをインストールして、TypeScriptをネイティブ実行ファイルにコンパイルしましょう
1インストール
$ brew tap PerryTS/perry$ brew install perryHomebrewが必要です。macOS arm64とx86_64に対応。
2使い方
perry compile main.tsmain.tsをネイティブ実行ファイルにコンパイルします
perry compile main.ts -o myapp出力実行ファイル名を指定します
perry compile 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
データ処理
日付と時刻
ユーティリティ
仕組み
TypeScriptソースからネイティブ実行ファイルまで、わずか数秒
コンパイラの内部の仕組みを知りたいですか? コンパイラ内部構造
深掘り:LLVM 上の TypeScript――単相化、NaN-boxing、そして Perry が Cranelift を離れた理由。
よくある質問
最初のバイナリをコンパイルする前に、誰もが疑問に思うこと
Perry には Node.js やランタイムが必要ですか?
いいえ。Perry は TypeScript を事前(AOT)にコンパイルし、スタンドアロンのネイティブ実行ファイルを生成します。このバイナリは、マシンに Node.js、Bun、Deno などの JavaScript ランタイムがインストールされていなくても実行できます。まだネイティブにコンパイルできない npm パッケージのために、--enable-js-runtime でオプションの組み込み V8 フォールバックを利用できます。
コンパイルされたバイナリのサイズはどれくらいですか?
hello world バイナリはおよそ 330 KB です。一般的な CLI ツールは 2–5 MB に収まります。大きなフレームワーク(Fastify、mysql2 など)を使うフルアプリケーションでも約 48 MB――Electron アプリやランタイム組み込みバイナリが最低でも ~80–150 MB から始まるのに比べれば、はるかに小さい数字です。
npm パッケージは使えますか?
使えます。純粋な TypeScript / JavaScript のパッケージは perry.compilePackages を通じてネイティブにコンパイルされます――axios、zod v4、express、fastify、hono は今日時点でコンパイルして実行できます。完全な JS エンジンのセマンティクスを必要とするパッケージは、--enable-js-runtime によるオプションの V8 フォールバック経由で動作させられます。
Perry はどのプラットフォームに対応していますか?
10 のコンパイルターゲットに対応しています:macOS、iOS、iPadOS、Android、Linux、Windows、watchOS、tvOS、WebAssembly、Web/JS。GUI アプリはネイティブなプラットフォームウィジェット――AppKit、UIKit、GTK4、Win32、そして JNI 経由の Android――を使用します。
Perry は無料でオープンソースですか?
はい。コンパイラは無料でオープンソースです。ローカルでのコンパイルと実行に費用はかからず、アカウントも不要です。Perry Publish――ホスト型のビルド・署名・ストア提出パイプライン――には無料枠(月 15 回の公開)と Pro プランがあります。
Perry は Bun や Deno compile とどう違いますか?
Bun と Deno は、JavaScript をそれぞれのランタイムと一緒に 1 つのファイルへバンドルします――hello world はプラットフォームによって約 60–100 MB になり、コードは依然として JIT 実行されます。Perry は TypeScript を LLVM 経由で事前にマシンコードへコンパイルします:組み込みエンジンなし、hello world は ~330 KB、起動は ~1 ms です。詳しい比較はPerry vs BunとPerry vs Denoを参照してください。
Perry は Electron や Tauri とどう違いますか?
Electron はすべてのアプリに Chromium と Node.js を同梱するため、インストーラは最低でも約 80–150 MB になります。Tauri ははるかに小さいものの、システムの webview 内で Web フロントエンドを描画し、アプリロジックは Rust で書きます。Perry は webview を一切使いません:TypeScript はマシンコードにコンパイルされ、単一のプロセス内で本物のプラットフォームウィジェット――AppKit、UIKit、GTK4、Win32――を直接動かします。詳しい比較はPerry vs ElectronとPerry vs Tauriを参照してください。
Perry の成熟度はどれくらいですか?
Perry は 1.0 未満で急速に進化していますが、Perry で作られた実際のアプリはすでに出荷されています――Bloom Engine、Mango、Hone、Pry、dB Meter などです。詳細はshowcaseを参照してください。
他に質問があれば、はじめにガイドを読むか、GitHub Discussionsで質問してください。