v0.4.24 — tvOSターゲット、LinuxからのiOS/macOSクロスコンパイル、perry login

ひとつのコードベース。すべてのプラットフォーム。
ネイティブパフォーマンス。

PerryはTypeScriptをmacOS、iPadOS、iOS、Android、Linux、Windows、watchOS、tvOS、WebAssembly、Web向けのネイティブGUI・CLIアプリにコンパイルします。ランタイム不要。Electron不要。ネイティブバイナリのみ。

terminal

$ perry compile main.ts

main.tsをコンパイル中...

✓ コンパイル済み実行ファイル: main (2.3 MB)

$ ./main

Hello, World!

10
ターゲット
25+
ネイティブUIウィジェット
0 ms
起動時間
App Store
対応済み

なぜ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をネイティブコードにコンパイル。本物のプラットフォームウィジェット。ランタイムオーバーヘッドゼロ。

フレームワーク言語ネイティブコードネイティブウィジェットランタイムオーバーヘッド
PerryAOT 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.ts
// hello.ts
const greeting = "Hello, World!";
console.log(greeting);
 
// Compiles to ~2MB native executable
// No runtime needed!
$ perry build hello.ts
ネイティブバイナリ

パフォーマンス比較

ネイティブコンパイルが圧倒的な効率性を実現

指標PerryNode.jsBun
バイナリサイズ2-5 MB~80 MB~90 MB
起動時間~1 ms~30 ms~10 ms
ランタイム依存なしNode.jsBun
メモリオーバーヘッド最小限V8 + GCJSC + GC

ベンチマーク結果: 2.2倍高速

Perry vs Node.js v24(macOS ARM64、低いほど良い)

closure
4.5x
object create
3.5x
array read
3.0x
math intensive
3.0x
method calls
3.0x
binary trees
2.7x
string concat
2.5x
fibonacci
2.1x
mandelbrot
1.9x
factorial
1.7x
バイナリサイズ低いほど良い
Perry
5 MB
Node.js
80 MB
Bun
90 MB

はじめる

Perryをインストールして、TypeScriptをネイティブ実行ファイルにコンパイルしましょう

1インストール

terminal
$ brew tap PerryTS/perry
$ brew install perry

Homebrewが必要です。macOS arm64とx86_64に対応。

2使い方

ファイルをコンパイル
perry build main.ts

main.tsをネイティブ実行ファイルにコンパイルします

カスタム出力
perry build main.ts -o myapp

出力実行ファイル名を指定します

V8ランタイム付き
perry build main.ts --enable-js-runtime

JavaScript npmパッケージの互換性のためにV8を有効化

互換性チェック
perry check ./src

TypeScriptコードのネイティブコンパイル互換性を検証します

機能サポート

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も不要、高速なネイティブコードだけ。

データベース

mysql2pgmongodbbetter-sqlite3ioredis

セキュリティ

bcryptargon2jsonwebtokencrypto

HTTP

httphttpsaxiosnode-fetchwsnodemailer

データ処理

cheeriosharpzliblodash

日付と時刻

dayjsmomentdate-fnsnode-cron

ユーティリティ

uuidnanoidslugifyvalidatordotenvrate-limiter-flexible
インポートして使うだけ——Perryが自動的にネイティブ実装を使用します

コードからApp Store

Perryはアプリをコンパイルするだけでなく、ユーザーの手に届けます。

perry buildコンパイルと署名
perry publishパッケージと提出
ストアとダウンロードApp Store、Play Store、直接配布
perry verifyすべてのプラットフォームでテスト

ビルドと署名

ひとつのコマンドでクロスプラットフォームビルド。macOS、iOS、Android、Windowsのコード署名を自動処理。XcodeプロビジョニングプロファイルやAndroidキーストアとの格闘は不要です。

配布

App Store、Play Storeへのプッシュ、または直接ダウンロードとして配布。Perry Publishがパッケージング、公証、提出を処理します。

検証

Geisterhandによる自動UIテスト。6つのプラットフォームすべてでテスト。ユーザーから指摘される前に、アプリがどこでも動作することを確認できます。

オープンソースプロジェクトは無料。 チーム向けプラン → /publish

仕組み

TypeScriptソースからネイティブ実行ファイルまで、わずか数秒

TypeScript.tsファイル
SWC
パーサー高速パース
HIR
変換Monomorphization
Crane
lift
コード生成マシンコード
実行ファイル2〜5 MBバイナリ

コンパイラの内部の仕組みを知りたいですか? コンパイラ内部構造