- PrimJSベースの軽量JavaScriptエンジンで、WebAssemblyにコンパイルされているため、安全性と高い移植性を備える
- メモリ安全性とJavaScript機能の制限を提供する強力なサンドボックス構造と「fail-fast」の哲学により、セキュリティと拡張性を確保
- 単一マシン上でも数百個のVMを並列実行でき、スクリプトのメモリおよび演算量(gas)制限も設定可能
- 複雑なビルドやFFIなしで単一の
.wasmファイルとしてほぼすべてのプラットフォームに埋め込み可能で、サイズも約800KBと非常に小さい
- QuickJSより最大28%向上した性能を示し、JIT環境ではネイティブ級の実行速度を提供
Hako: 小さく、速く、安全なJavaScriptエンジン
Hakoとは?
- PrimJSをベースに開発された、ポータブルでセキュリティ重視、高性能なJavaScriptエンジン
- Hakoという名前は、「箱」を意味する日本語に由来
- 誰でもどの環境でも簡単に組み込めるよう設計されたWebAssemblyベースのエンジン
セキュリティ: メモリ安全性と機能制限
- C/C++で書かれているがWebAssemblyにコンパイルされる → メモリ安全性と実行サンドボックスを保証
- JavaScript機能自体も制限可能:
- 特定の関数を削除
- メモリ割り当て不可に制限
- 実行時間、メモリ使用量、gasなどを制限
VMContextを通じて悪意あるユーザーを識別し、リソース制御が可能
- fail-fast戦略により、不安定または過剰なリソースを消費するコードを早期に停止
組み込みやすさ: .wasmひとつで十分
- Emscriptenを使用しない → モダンなWebAssemblyランタイムさえあれば埋め込み可能
- 各種言語向けのFFIラッパーが不要 → 複雑なビルド工程なしでも利用可能
- 例: GoでHakoを埋め込むサンプルを提供
- リリースビルドはわずか800KBの
.wasmファイルで構成
性能: QuickJSより高速
- PrimJSがQuickJSより高速であるのと同様に、HakoもQuickJS比で平均28%の性能向上
- SIMD最適化および一部ホットパス経路の改善により性能を最大化
- WebAssemblyによる性能低下はなく、V8、Wasmtime、JavaScriptCoreではJIT最適化によりほぼネイティブ級
- 性能計測およびプロファイリングAPIも内蔵
制限事項と今後の計画
- PrimJSで使われていた一部機能(テンプレートインタープリタ、GCスナップショット)はまだ完全にはサポートされていない
- ByteDanceのスナップショットツールがまだオープンソース化されておらず、開発者が独自ツールを実装中
- 現在は初期ベータ段階で、API/ABI安定化のためフィードバックが非常に重要
- GitHub - hako
2件のコメント
https://github.com/fernvenue/hako-go-example
は存在しないリンクのようですね。Go の埋め込み例は
https://gist.github.com/andrewmd5/197efb527ef40131c34ca12fd6d0a61e
のようです。
あ、変わったみたいですね。修正しておきました。ありがとうございます。