Firefox web browser - Faster, more secure & customizable

a quick note on JavaScript engine components ★ Mozilla Hacks - the Web developer blogにおいて、最近追加された技術も含めてFirefoxで利用されているJavaScript技術が簡単にまとめられている。FirefoxはJavaScriptの処理性能を改善する目的で新しくJaegerMonkey / Nitroを導入したが、従来の技術も含めて若干の誤解が見られるという。簡単に関係を説明することで、こうした誤解を払拭する狙いがある。

紹介されている技術をまとめると次のとおり。

JavaScriptエンジンコンポーネント 内容 備考
SpiderMonkey FirefoxのコアJavaScriptインタプリタ
TraceMonkey JavaScriptをNanojitを使ってネイティブコードに変換して高速化する。JavaScript実行をモニタリングしてブースト可能な部分を見つけてピンポイントに実施する
JaegerMonkey JavaScriptをNitroを使ってネイティブコードに変換して高速化する。より多くのJavaScriptコードを変換する
Nanojit JavaScriptからネイティブコードを生成する。いくつもの最適化を実施し高速に動作するコードを生成する AdobeがActionScript VMで採用している技術
Nitro JavaScriptからネイティブコードを生成する。それほど最適化しないが、変換処理自体が高速 Apple WebKitに導入された技術
SpiderMonkey
FirefoxのメインとなるコアJavaScriptインタプリタ。JavaScriptコードを読み取り、中間形式バイトコードに変換しながら逐次実行する。Firefox 3.0およびそれ以前のバージョンではJavaScript処理のすべてをSpiderMonkeyが実施していた。以降で導入された高速化技術TraceMonkey (Nanojit)およびJaegerMonkey (Nitro)が動作しやすいように改善が取り組まれている。インタプリタ自身の改善も継続されており、これまでも、そしてFirefox 3.5および3.6、またこれ以降のバージョンにおいてもJavaScriptエンジンの基盤でありつづける。
TraceMonkey
Firefox 3.5で導入された高速化技術。JavaScriptの実行をモニタリングして繰り返し実行されるコードパスを見つけ、該当部分をネイティブコードへ変換する。変換時には最適化が実施され、高速に動作するネイティブコードが生成される。このためTraceMonkeyによる高速化が成功するケースでは大幅な高速化が実現される。逆に、高速化できるコードが限られており、高速化されるケースとそうでないケースに大きな開きがある。高速に動作するネイティブコードを生成する処理にはNanojitが利用されている。
JaegerMonkey
Firefox 3.7へ向けて新しく追加された最適化技術。JavaScriptをNitroを使ってネイティブコードに変換して高速化する。モニタリングを実施して最適化するコードパスを探すTraceMonkeyと異なり、より広範囲に渡ってネイティブコードを生成するという特徴がある。TraceMonkeyが機能した場合ほどの高速化は実施できないが、全体に渡ってネイティブコード生成することが可能で、性能の全体的な底上げが可能。
Nanojit
高速に動作するネイティブコードを生成する。高レベルな記述のJavaScriptを処理することができ、優れた最適化も実施する。もともとはTamarinプロジェクトで開発されたコードの一部を取り出したもの。TamarinはECMAScript 4に対応した実装だが、FirefoxはECMAScript 4そのものはサポートしていないためすべてを採用するのは適切とはいえない。また、Tamarinのインタプリタ実装はSpiderMonkeyよりも遅かったため、その部分の利用価値も低かった。このため、高速に動作するネイティブコードを生成することができるNanojitの部分のみを取り出して利用している。AdobeがActionScript VMで採用しており、現在も開発が継続されている。
Nitro
Apple WebKitに導入されたネイティブコード生成機能。JaegerMonkeyでネイティブコードを生成するために利用される。Nanojitが最適化された高速なネイティブコードを生成するのと比べ、それほど高速なコードは生成しないが、より広範囲に適用できる。

Firefox JavaScriptエンジンはSpiderMonkeyということになる。これはこれまでも、そしてこれからも変わらない。SpiderMonkeyで利用される2つの主な高速化技術がTraceMonkeyとJaegerMonkeyということになり、JaegerMonkeyは全体をネイティブコードに変換して性能の引き上げを、TraceMonkeyは繰り返し実施されるコードパスを最適化されたネイティブコードに変換して性能にブーストをかけるために利用される。そしてTraceMonkeyで利用されるネイティブコード生成技術がNanojit、JaegerMonkeyで利用されるのがNitroということになる。