はじめに
こんにちは、梅雨です。
今回は、Hermes という JavaScript エンジンについて調査を行ったので、それらの内容をまとめてみました。
Hermes とは?
Hermes は、Meta(旧 Facebook)が開発した軽量で高速な JavaScript エンジンです。
特に React Native 向けに最適化されており、モバイルアプリケーションのパフォーマンス向上を目的としています。
Hermes の特徴
まずは Hermes の主な特徴から見ていきましょう。
Ahead-of-Time Compilation
Hermes は、JavaScript のソースコードを実行時ではなく、事前にバイトコードへコンパイルする Ahead-of-Time Compilation(AOT)コンパイラの仕組みを採用しています。
これにより、アプリ起動時間の短縮やメモリ使用量の削減が実現されています。
反対に、実行時にコンパイルを行うコンパイラのことを Just-in-Time Compilation (JIT)コンパイラと呼び、Google 製のエンジンである V8 や Apple 製の JavaScriptCore(JSC) ではこの JIT コンパイラの仕組みが採用されています。
V8 エンジンは JavaScript だけではなく WebAssembly のエンジンでもあり、こちらは AOT コンパイラの技術が採用されています。
React Native の利用はモバイルアプリケーション開発という目的が明確であるため、最終的な実行環境も Android と iOS に限られています。そのため、ソースコードを事前にコンパイルするような仕組みが可能となっています。
ガベージコレクション機能
また、Hermesは効率的なガベージコレクション機能を備えており、低リソース環境でも動作可能です。
ガベージコレクションとは、プログラムが使用しなくなったメモリ領域を自動的に解放する仕組みです。使用されなくなったメモリを解放せずに放置すると、メモリリークが発生し、最終的にはシステムのパフォーマンスを低下させてしまう恐れがあります。
Hermes には Hades というガベージコレクション機能が備わっており、JavaScript コードを実行しているインタプリタのバックグラウンドスレッドでガベージコレクション作業を行うことでより短い休止時間を達成する仕組みが取られています。
Hermes の欠点
続いて、現状考えられる Hermes の欠点について触れていきます。
ECMAScript 2015 の不完全なサポート
2024年12月25日現在、Hermes は ES6(ECMAScript 2015)のほとんどの機能に対応していますが、完全な準拠には至っていません。
これはエンジンの軽量化とパフォーマンス最適化を優先するための設計上の選択であり、with 文や動的な eval() 関数などの一部の機能は意図的にサポートされていません。
ですので、完全な欠点とは言えないですが、他のエンジンに劣る部分となっています。
React Native のプロジェクトでこれらのコードを使用する場合は、残念ながら Hermes ではなく JSC を用いたコンパイルをする必要があります。
QuickJS との比較
Hermes と比較可能な新興の JavaScript として、QuickJS が挙げられます。
QuickJS は最新の ECMAScript の仕様に完全にキャッチアップしており、特に国際化 API(Intl)の使用を必要とするプロジェクトでは採用の候補になり得ます。
また、QuickJS は数百 KB という非常に小さいサイズのエンジンであるため、IoTやリソース制約の厳しい環境で JavaScript エンジンを必要とする場合には重宝されます。
現状想定されている用途が Hermes と QuickJS では異なるためそもそも性能の比較をすることに意味がないという意見もあると思いますが、今後 Hermes が JS エンジンとして活躍する領域を広げていくためには、このような問題を解消していく必要があるのではないかと考えました。
(参考)QuickJS やその他エンジンの性能比較ベンチマーク
今後の可能性
Hermes は、現在 React Native に特化したモバイルアプリケーション向けの JavaScript エンジンとして、その軽量性とパフォーマンスを武器に成長を続けています。しかし、競合の JavaScript エンジンやそれらのエコシステムとの比較においては、今後さらに進化する余地があると思います。
まず、Hermes が React Native 以外の領域、例えばIoTやエッジコンピューティングへの展開を目指す場合、現行の仕様に加えて新たな対応が求められます。
特に、国際化 API や eval() 関数などの動的コードの実行といった機能がサポートされれば、モバイルアプリ以外の分野でも利用可能性が広がると考えられます。
さらに、React Native 自体がネイティブモジュールや新しいUIフレームワークとの統合を通じた進化を遂げることで、Hermes がモバイルアプリケーション開発のデファクトスタンダードとしての地位を固める可能性があります。
おわりに
今回の記事では、Meta 製の JavaScript エンジンである Hermes を調査し、今後どのような発展が見込まれるかを考えました。
この先、Hermes が持つ軽量性や効率性の強みを活かしながら、新たな領域やエコシステムでどのような成長を遂げるかは非常に興味深いです。
最後までお読みいただきありがとうございました。