Perry vs Deno
Deno は V8 上に構築されたモダンな JavaScript / TypeScript ランタイムで、TypeScript のファーストクラス対応、パーミッションベースのセキュリティモデル、そして V8 をアプリと一緒にバンドルして単一の実行ファイルを生成する `deno compile` コマンドを備えています。Perry は TypeScript を直接ネイティブマシンコードへコンパイルします――出力に V8 はなく、ランタイム層もなく、小さなネイティブバイナリだけです。
Deno とは?
Deno は Rust で書かれ、V8 と Tokio の上に構築された TypeScript / JavaScript ランタイムです。`.ts` ソースを直接実行し、フォーマッタ・リンタ・テストランナー・言語サーバなどのツールを内蔵し、ネットワーク・ファイル・環境変数アクセスに明示的な許可を求めるパーミッションモデルを採用しています。`deno compile` は Deno ランタイム(V8 を含む)をコードと一緒にバンドルし、自己完結型の実行ファイルを生成します。Deno は x64 と arm64 上の Linux、macOS、Windows をターゲットにしています。
Perry とは?
Perry は Rust で書かれたネイティブ TypeScript コンパイラです。TypeScript を LLVM 経由で直接ネイティブマシンコードへコンパイルします――V8 も、JIT も、ランタイムもありません。出力は単一のバイナリで、ネイティブコードであれば通常数百 KB から数 MB 程度、JS エンジンを必要とする npm パッケージのために組み込み V8 ランタイムをオプトインすればより大きくなります。
並べて比較
| 機能 | Perry | Deno |
|---|---|---|
| 出力 | ネイティブマシンコード(LLVM) | あなたのコード + Deno ランタイム(V8)をバンドル |
| バイナリ内の JavaScript エンジン | デフォルトではなし。オプションの V8 | V8(常時) |
| hello-world バイナリサイズ | ~330 KB | ~80–100 MB(V8 を含む) |
| JIT | なし(AOT コンパイル) | あり(V8 TurboFan) |
| モバイルターゲット | iOS、iPadOS、Android | なし |
| ウォッチ / TV / WASM / Web | watchOS、tvOS、Wear OS、WASM、Web/JS | なし |
| ネイティブ UI | ネイティブプラットフォーム API 経由で 25+ ウィジェット | なし |
| パーミッションモデル | 標準的な OS プロセスのパーミッション | 粒度の細かいランタイムパーミッション(--allow-net、--allow-read など) |
| 安定性 | 1.0 未満 | 安定版(1.x / 2.x) |
| 実装言語 | Rust | Rust(V8 上) |
Perry が優れている点
- +バイナリが圧倒的に小さい。Perry の hello world は ~330 KB。`deno compile` の出力は V8 を含み 80–100 MB の範囲になります。
- +バイナリ内に JavaScript エンジンがありません。TypeScript はネイティブマシンコードにコンパイルされ、ランタイムで V8 によって解釈されることはありません。
- +モバイル、ウォッチ、TV、WASM、Web ターゲット。Deno はサーバ / デスクトップ専用です。
- +AppKit、UIKit、GTK4、Win32、JNI にマップされるネイティブ UI ウィジェット――Deno に同等のものはありません。
- +コールドスタートが高速。AOT コンパイル済みのネイティブバイナリは V8 の起動コストを払いません。
- +M1 Max 上で条件を揃えた計算系マイクロベンチでは、Perry の `reassoc contract` fast-math デフォルトにより LLVM が自動ベクトル化と自明な畳み込み可能な累算器の畳み込みを行えるため、Perry がリードしています(例:loop_overhead 12 ms、math_intensive 14 ms。perry/benchmarks 参照)。
Deno が優れている点
- +長い実績と活発な 2.x ラインを持つ成熟した安定ランタイム。
- +粒度の細かいパーミッションモデル。Deno は `--allow-net`、`--allow-read` などを明示的に要求します――サンドボックス化したスクリプトや信頼できないコードに有用です。
- +ツール内蔵:フォーマッタ、リンタ、テストランナー、ドキュメントジェネレータ、LSP がすべてランタイムに含まれています。
- +ランタイムでフルの V8 エコシステム――V8 上で動くものは Deno でも動き、長時間稼働のホットパスでは JIT 最適化が効きます。
- +開発時に別途コンパイラステップが不要なファーストクラスの TypeScript と、フルマネージドな型チェックパイプライン。
- +ランタイム内にネイティブ実装された標準化された Web プラットフォーム API(fetch、Web Streams、Web Crypto)。
Perry を選ぶべきとき
小さく起動の速いネイティブバイナリが欲しいとき、モバイルやその他の非サーバ向けに出荷するとき、ネイティブ UI が欲しいとき、または JS エンジンを含まないバイナリに TypeScript をコンパイルしたいときは Perry を選んでください。
Deno を選ぶべきとき
安定していてバッテリー同梱の TypeScript ランタイムが欲しいとき、パーミッションサンドボックスを評価するとき、サーバサイドやスクリプティングのワークロードを構築しているとき、またはランタイムでフル V8 エコシステム互換性が必要なときは Deno を選んでください。
結論
どちらも TypeScript プログラムを単一バイナリとして出荷できますが、違いはそのバイナリの中身です。Deno は V8 + 厳選されたランタイム + パーミッションサンドボックスを提供します。Perry はエンジンなしのネイティブマシンコードを提供します。エコシステムとパーミッションモデルが効くサーバサイド / スクリプティング作業には Deno のほうが適しています。小さく起動の速いバイナリ、モバイルターゲット、またはネイティブ UI が必要な場合は Perry のほうが適しています。