Cruller: Zig 0.16 に移植された本番志向の Bun ランタイム
Cruller: Zig 0.16 に移植された本番志向の Bun ランタイム
Cruller は、Bun の開発ツールを剥ぎ取ることで最小限の本番対応 JavaScript ランタイムを提供します
Cruller は、Bun の最後の Zig ベース リリースの専用フォークです。フル Bun ランタイムにはパッケージマネージャ、バンドラ、テストランナーが含まれますが、Cruller はプリビルドされた本番 JavaScript サーバーを実行するために必要不可欠なコンポーネントにまで削減されています。また、素の Zig 0.16 に移植されており、ビルドプロセスがより合理化され、バイナリサイズが小さくなっています。
コア機能と保持コンポーネント
Cruller は Bun ランタイムの高性能コアを保持しつつ、開発志向のサブシステムを削除しています。保持されるコンポーネントは次のとおりです:
- JavaScriptCore: JavaScript を実行する基盤エンジン。
- Web APIs:
Bun.serve,fetch, ストリーム,Blob,Request,Responseのサポート。 - Networking: HTTP/1、HTTP/2、HTTP/3 のサポート(WebSockets も含む)。
- Infrastructure: ビルド済み JavaScript 用の静的ファイル配信とモジュールリゾルバ。
最小限のフットプリントを達成するために、Cruller はパッケージマネージャ、バンドラ/トランスパイラ、シェル、テストランナー、N-API、SQL クライアント、アーカイブサポートを削除します。
技術的実装と Zig 0.16 への移植
Zig 0.16 への移植では、ランタイムを Bun の元のパッチ適用済み Zig ビルド統合から分離しました。主な技術的改善点は以下の通りです:
- Vanilla Zig Build Graph: プロジェクトは現在、標準の Zig 0.16 ビルドシステムを使用しています。
- Compatibility Shims: メンテナーは Zig 0.15 と 0.16 の間で変更された API 用のシムを実装しました。
- Portable Release Builds: リリースビルドが実行時にビルドディレクトリから生成された JavaScript をロードする必要がないように、生成コード埋め込みモジュールが追加されました。
パフォーマンスとバイナリサイズ
Linux x64 での測定結果によると、Cruller は公式の Bun 1.3.14 バイナリよりも大幅に小さいことが示されています:
| 指標 | Cruller (ReleaseFast stripped) | 公式 Bun | 削減率 |
|---|---|---|---|
| バイナリサイズ | 73.0 MiB | 88.5 MiB | ~18% |
パフォーマンスについては、V8 Crypto pure-JS ベンチマークが公式の Bun ランタイムとパフォーマンスがほぼ等しいことを示し、Cruller の中央値は約 2% 高く、著者はこれを通常のラン間変動によるものだと説明しています。
今後のロードマップ
メンテナーは Cruller を本番ランタイムとして使用し、フル Bun ランタイムを開発用に使用することを意図しています。計画されている拡張機能には以下が含まれます:
- Enhanced Networking: HTTP/2 と HTTP/3 のサポートを強化。
- Native Extensions: ネイティブ ZMQ プラグインの追加。
- Memory Management: 複雑なメモリポリシーのために、別の QuickJS ベースのコントロールプレーンを介した動的メモリコントローラを実装。
- Embeddability: エンジンをクリーンな
.zigインターフェースを持つ動的ライブラリとしてパッケージ化し、他の Zig アプリケーションに組み込めるようにする。
コミュニティのディスカッションと批判
このプロジェクトは、ストリップダウンされたランタイムの実現可能性について、開発者コミュニティ内でさまざまな視点を引き起こしています:
"私は開発ランタイムと本番ランタイムをそこまで大きく乖離させたくないと思います。本番でのみ顕在化する動作の可能性は、私の好みとしては高すぎます。"
他の批判者は、一部の者が「悪い Zig プラクティス」を含んでいると主張するコードベースをフォークする価値を疑問視しており、また一部のユーザーは、フォークによって元の git 歴史が剪定され、元のコミット作者の帰属が削除されたことを懸念しています。