
HermesはFacebook(現Meta)が2019年7月に発表したReact Native向けのオープンソースJavaScriptエンジンで、モバイル端末上でのアプリ起動速度、メモリ使用量、APKサイズを最適化することを主目的に開発されました。従来React NativeのAndroid版はJavaScriptCoreをエンジンとして利用していましたが、Hermesはあらかじめバイトコードに事前コンパイルする方式や、ガベージコレクタの設計を見直すことで、低スペック端末でも体感的に滑らかな動作を実現します。2022年からはAndroid/iOS両プラットフォームで既定エンジンとなり、React Nativeアプリのパフォーマンスを底上げしてきました。
この記事の目次
- モバイル特有の制約とHermesの動機
- JITを持たない設計判断
- デバッグとプロファイリング体験
- React Native新アーキテクチャとの関係
- まとめ
モバイル特有の制約とHermesの動機

デスクトップやサーバとは異なり、モバイルアプリは限られたメモリと電力、変動するネットワーク条件のもとで動作します。React NativeのようにJavaScriptで業務ロジックを書くアーキテクチャでは、JSエンジンの起動時間がアプリ起動時間に直結し、ユーザーが最初に感じる体験を大きく左右します。Metaのチームはこの「起動の遅さ」を真剣に問題視し、モバイル特化のエンジンを書き起こす決断をしました。
Hermesの最大の特徴は、JavaScriptをビルド時にあらかじめバイトコードへコンパイルする点です。実行時に毎回パースとコンパイルを行うV8やJavaScriptCoreと異なり、アプリ起動時にはバイトコードを読み込んでそのまま実行できるため、TTI(Time To Interactive)が短縮されます。ストレージから直接mmapしてロードする最適化も施されており、起動時メモリ使用量も抑えられる設計です。
JITを持たない設計判断

Hermesは興味深いことに、長らくJITコンパイラを持たないインタープリタ専業のエンジンとして開発されてきました。JavaScriptエンジンといえばJIT最適化が花形ですが、モバイル文脈では起動時間とメモリ使用量を犠牲にしてまで純粋なスループットを稼ぐ意味は薄いという判断です。実際、React Nativeアプリの大半はUIスレッドとブリッジ処理が支配的で、JS側の長時間ホットループはむしろ少数派でした。
近年のHermesでは将来的にJITやAOTを段階的に取り入れる構想が出てきており、新アーキテクチャ(Fabric/TurboModules)との組み合わせで重い計算もJS側で扱う場面が増えてきたためです。ただし、現時点でも「JITなしでも体感速度はむしろ向上した」という事実は、エンジン設計におけるユースケース志向の重要性を示す好例だと言えるでしょう。
デバッグとプロファイリング体験

Hermesは開発者体験のために、Chrome DevTools互換のインスペクタプロトコルやサンプリングプロファイラ、ヒープスナップショット機能を備えています。React Native開発者はFlipperやReact Native DevToolsからHermesに接続し、実機上のJSコードをブレークポイントで止めたり、CPUプロファイルを取得したりできます。これらはJavaScriptCore時代には統一的に行いにくかった部分で、Hermes導入の地味ながら大きな利点です。
また、Hermesはソースマップを介してminify済みのバイトコードを元のコードへ復元する仕組みも整っており、スタックトレースの可読性も損なわれません。Sentryなどのエラー監視サービスとの連携もスムーズで、本番リリース後の不具合解析を実用的なレベルで行えます。性能だけでなく、こうした運用面の整備が広く採用される後押しになりました。
React Native新アーキテクチャとの関係

React Nativeはこの数年、Fabricレンダラ、TurboModules、JSI(JavaScript Interface)からなる新アーキテクチャへの移行を進めてきました。JSIはJSエンジンとネイティブ側を直接結ぶ低レイヤーAPIで、Hermesはこれにファーストクラスで対応するように設計されています。従来のJSON経由のブリッジを介さずに、ネイティブ関数を同期的に呼び出せるため、ジェスチャーやアニメーションのような遅延が厳しい処理でも実用性が高まりました。
結果として、Hermesは単に「速いJSエンジン」というよりも、React Native新世代の前提となる基盤に位置づけられています。新規アプリでは特に理由がない限りHermesを有効化するのが定石となり、JavaScriptCore切り替えに伴うアプリサイズや起動時間の改善は数値としても明確に出るケースが多いです。モバイルJSエンジン市場における選択肢として、確固たる地位を築いたと言えるでしょう。
まとめ
HermesはMetaがReact Nativeのために生んだモバイル特化型JSエンジンで、バイトコード事前コンパイルやJIT非搭載という割り切った設計により起動時間とメモリ消費を改善しました。JSIや新アーキテクチャと密に連携し、開発者ツールも揃ったことで、現代のReact Native開発の標準基盤となっています。モバイル文脈でのエンジン設計を学ぶ題材としても示唆に富む存在です。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント