従来のTypeScript開発パラダイムでは、高水準の抽象化であるTSコードをJavaScriptへトランスパイルした後、V8やJavaScriptCoreのような重いJITランタイムエンジン(Node.js、Bun、Denoなど)の上で動かす方式が当然視されてきました。
最近オープンソース界隈に登場したPerryは、このような従来のランタイムモデルを完全に取り払い、TypeScriptコードをstandaloneなネイティブバイナリへ直接コンパイルすることを目指す、RustベースのNative-Firstコンパイラです。
💡 コアアーキテクチャと特徴
-
No Runtime(ランタイムゼロ): V8エンジンやElectron、JVMのような重い中間層なしに、SWCでTSコードをパースし、LLVMインフラを通じてターゲットプラットフォームの機械語へ直接ビルドします。
-
クロスプラットフォーム単一ソースビルド: 1つのTypeScriptコードベースから、macOS、iOS、Android、Linux、Windowsをすべてサポートするバイナリを生成します。
-
True TypeScript Support: AssemblyScriptのような「TSに似た別言語」ではなく、Strict Modeを基盤とする完全なTypeScriptエコシステム対応を目指しています。
-
超軽量UIフレームワーク互換: わずか数MB級のバイナリサイズと、0msに近いsub-secondなコールドスタートをうたいます。SwiftUI、GTK4、WinUIといったプラットフォームネイティブGUIとの統合はもちろん、独自のReactレンダラーを通じたJSX記述も可能です。
🛠️ 開発状況と制約(Hacker Newsのフィードバック反映)
最近HNなどで大きな注目を集めているプロジェクトだけに、プロダクションレベルへ進むための課題も明確に議論されています。
-
動的なJS特性の制限: オブジェクトへ実行時に任意のフィールドやメソッドを注入したり、プロトタイプを改変したりするような動的JavaScriptスタイルは、静的コンパイルの性質上サポートされず、厳格で決定論的(Deterministic)なTSサブセットをベースに動作します。
-
Node.js組み込みモジュールのエミュレーション: 現在はhyper、rustls、tokioなどRustエコシステムを基盤に、Node.jsのHTTP標準ライブラリをほぼそのままエミュレーションしています。Fastifyなど一部モジュールのコンパイルに成功しつつ急速に進化していますが、Expressのように動的インポートが絡む複雑なエコシステムのライブラリとの100%互換性は、まだアルファ段階での課題です。
# 使い方は極めてシンプルです
$ perry compile src/main.ts -o myapp
$ ./myapp # 依存性のない純粋なネイティブバイナリを実行
Webエコシステムに閉じ込められていたTypeScriptを、システムプログラミングや超軽量ネイティブアプリの領域へ拡張しようとする試みとして、高性能システムアーキテクチャやLLVMコンパイラパイプラインに強い関心がある人にとって興味深く見守る価値のあるプロジェクトです。
GitHub: https://github.com/PerryTS/perry
7件のコメント
応援しています
面白いアプローチですね。ランタイムを取り除くだけでも大きな成果ではありますね!
なんだかありそうな話ですね。でも正直、メモリ安全性は深刻なことになりそうな気がします。
それに、動的ルックアップが必要ないなら、そもそもあえてスクリプトで開発する理由はあるのでしょうか?
perry、語感がいいですね。
面白いですね
アイデアやアプローチが本当に良いですね。
React構文にも対応しているようですし、デコレーターなどに対応していないところを見ると、まだ既存プログラムの移行よりは新規プロジェクトで挑戦してみるのに向いていそうですが、
ロードマップどおり、特別なコストなしで移行できるレベルまで到達すれば、ひとつの言語でのマルチプラットフォームビルドが今よりもっとすっきりできるようになるのと、これまでJavaScriptでやっていたマルチプラットフォームビルドによる性能上のボトルネックもかなり解消されそうです。
ただ、互換性や、マルチプラットフォームで同一の結果を保証するのはものすごく難しいだろうと思いますし、私の浅い見立てでは、メンテナンスも、いくらAI時代とはいえ簡単ではなさそうなので、開発者がとても大変そうだという点を除けば、本当に期待できますね。
興味深いですね。