| 開発者 | |
|---|---|
| リポジトリ | github.com/mozilla-spidermonkey |
| 書かれた | C、C++、Rust |
| オペレーティング·システム | クロスプラットフォーム |
| プラットフォーム | IA-32、x86-64、ARM、MIPS、SPARC、[1] RISC-V [2] |
| タイプ | JavaScriptとWebAssemblyエンジン |
| ライセンス | MPL2.0 [3] |
| Webサイト | スパイダーモンキー |
SpiderMonkeyは、 Mozilla Foundationによるオープンソースの JavaScriptおよびWebAssemblyエンジンです。[4]このエンジンはFirefoxウェブブラウザに搭載されており、TraceMonkey、JägerMonkey、IonMonkey、現在のWarpMonkeyなど、複数世代のJavaScriptジャストインタイム(JIT)コンパイラを使用しています。
これは、 Netscape CommunicationsのBrendan Eichによって書かれ、後にオープンソースとしてリリースされ、現在は Mozilla Foundation によって管理されている最初のJavaScript エンジンです。その設計により、Web ブラウザー以外のアプリケーションにも組み込むことができ、MongoDB データベース システム、Adobe Acrobat、GNOME デスクトップ環境などの実装があります。
歴史
1995年、アイヒは「10日間でJavaScriptを書いた」[5] 。 [6]「ブラウザでSchemeを 使う」という約束でネットスケープに採用された。 (Schemeを使うというアイデアは、「エンジニアリング管理部門が言語はJavaに似ていなければならない」と決定したため、断念された。)[6] 1996年後半、アイヒは「1年目に残った多額の技術的負債を返済する」必要に迫られ、「2週間家にこもってMochaをSpiderMonkeyとして知られるようになるコードベースに書き直した」[5](Mochaは言語の当初の作業名だった。)[6] [7] 2011年、アイヒはSpiderMonkeyコードの管理をデイブ・マンデリンに引き継いだ。[5]
バージョン
標準
SpiderMonkeyはECMA-262仕様(ECMAScript)を実装しています。ECMA-357(ECMAScript for XML(E4X))は2013年初頭に廃止されました。[10]
内部
SpiderMonkey はC / C++で書かれており、インタープリター、WarpMonkey JIT コンパイラー、ガベージ コレクターが含まれています。
トレースモンキー
TraceMonkey [11]は、JavaScript 言語用に書かれた最初の JIT コンパイラです。当初はベータ版のオプションとして導入され、2008 年 8 月 23 日に Brendan Eich のブログで紹介されましたが、[12]このコンパイラはFirefox 3.5の SpiderMonkey の一部としてメインラインリリースの一部となり、 Firefox 3のベースラインインタープリターよりも「20 倍から 40 倍のパフォーマンス向上」を実現しました。[13]
TraceMonkey は、関数全体をコンパイルするのではなく、インタープリタ実行中に制御フローとデータ型を記録することによって動作するトレース JITでした。このデータは、ネイティブ コードの高度に特殊化されたパスであるトレース ツリーの構築に役立ちました。
JägerMonkeyの改良により、特にSpiderMonkey型推論エンジンの開発により、TraceMonkeyは最終的に廃止されました。Firefox 11以降のSpiderMonkeyにはTraceMonkeyは搭載されていません。[14]
イェーガーモンキー
JägerMonkeyは、内部的にはMethodJITと呼ばれ、TraceMonkeyが安定したネイティブコードを生成できない場合にパフォーマンスを向上させるために設計された、メソッド全体のJITコンパイラでした。[15] [16]これはFirefox 4で最初にリリースされ、最終的にTraceMonkeyに完全に取って代わられました。それ自体はIonMonkeyに置き換えられました。
JägerMonkey は、同クラスの他のコンパイラとはまったく異なる動作をします。一般的なコンパイラは関数を表す制御フロー グラフを構築して最適化しますが、JägerMonkey は、関数の内部表現である SpiderMonkeyバイトコードを線形に反復処理します。これにより、命令の並べ替えを必要とする最適化ができなくなりますが、JägerMonkey のコンパイルは非常に高速であるという利点があり、変数の型の変更による再コンパイルが頻繁に発生する JavaScript には便利です。
MozillaはJägerMonkeyにいくつかの重要な最適化を実装しましたが、最も重要なのは多態的なインラインキャッシュと型推論です。[17]
TraceMonkey と JägerMonkey の JIT 技術の違いと、その両方が必要である理由については、hacks.mozilla.org の記事で説明されています。技術的な詳細については、SpiderMonkey の開発者の 1 人である Chris Leary が、archive.todayに 2012 年 12 月 9 日にアーカイブしたブログ記事で詳しく説明しています。その他の技術情報については、dvander、dmandelin などの開発者のブログをご覧ください。
イオンモンキー
IonMonkeyはMozillaのJavaScript JITコンパイラであり、以前のJägerMonkeyアーキテクチャでは不可能だった多くの新しい最適化を可能にすることを目的としていました。[18]
IonMonkeyはより伝統的なコンパイラであり、SpiderMonkeyバイトコードを制御フローグラフに変換し、中間表現に静的単一代入形式(SSA)を使用しました。このアーキテクチャにより、型の特殊化、関数のインライン化、線形スキャンレジスタ割り当て、デッドコードの削除、ループ不変コードの移動など、他のプログラミング言語でよく知られている最適化をJavaScriptで使用できるようになりました。[19]
このコンパイラは、 ARM、x86、x86-64プラットフォーム上のJavaScript関数のネイティブコード変換を高速に生成できます。Firefox 18以降、デフォルトのエンジンとなっています。[20]
オーディンモンキー
OdinMonkey は、Mozilla の新しいasm.js最適化モジュールの名前で、簡単にコンパイルできる JavaScript のサブセットです。OdinMonkey 自体は JIT コンパイラではなく、現在の JIT コンパイラを使用します。これは、リリース 22 以降の Firefox に含まれています。
ワープモンキー
WarpMonkey JIT は、バージョン 83 の以前の IonMonkey エンジンに代わるものです。[21] WarpMonkey JITは、他のスクリプトをインライン化し、処理されるデータと引数に基づいてコードを特殊化することができます。バイトコードとインライン キャッシュ データを中間レベル中間表現(Ion MIR) 表現に変換します。このグラフは、低レベル中間表現 (Ion LIR) に下げられる前に変換および最適化されます。この LIR はレジスタ割り当てを実行し、コード生成と呼ばれるプロセスでネイティブ マシン コードを生成します。ここでの最適化は、スクリプトが以前に見たものと同様のデータを引き続き見ることを前提としています。ベースライン JIT は、観測されたデータと一致する IC を生成するため、ここでの成功に不可欠です。スクリプトが Warp でコンパイルされた後、処理する準備ができていないデータに遭遇すると、スクリプトはベイルアウトを実行します。ベイルアウト メカニズムは、ネイティブ マシン スタック フレームを再構築して、ベースライン インタープリターが使用するレイアウトと一致させ、最初からそのインタープリターを実行していたかのようにそのインタープリターに分岐します。このスタックフレームを構築する際には、ワープによって保存された特別なサイドテーブルを使用して、他の方法では利用できない値を再構築する場合があります。[22]
使用
SpiderMonkey は、JavaScript のホスト環境を提供する他のアプリケーションに組み込むことを目的としています。不完全なリストを以下に示します。
- Mozilla Firefox、Thunderbird、SeaMonkey、およびMozillaアプリケーションフレームワークを使用するその他のアプリケーション
- データストレージアプリケーション:
- MongoDBはバージョン3.2でV8からSpiderMonkeyに移行しました[23]
- RiakはJavaScript MapReduce操作のランタイムとしてSpiderMonkeyを使用する[24]
- CouchDBデータベース システム ( Erlangで記述)。マップ、フィルター、削減関数の定義や、HTML 形式などでのデータの表示には JavaScript が使用されます。
- Adobe AcrobatとAdobe Reader、Adobe Flash Professional、Adobe Dreamweaver。Adobe Acrobat DCは、ECMA-357サポートが転送されたSpidermonkey 24.2を使用しています。[25]
- GNOMEデスクトップ環境、バージョン 3 以降
- Yahoo! ウィジェット(旧称 Konfabulator)
- オープンソースのテレフォニーエンジンであるFreeSWITCHは、SpiderMonkeyを使用して、ユーザーがJavaScriptで通話管理スクリプトを記述できるようにしています。
- PythonMonkeyはSpiderMonkeyを使用して、JavaScriptとPythonの関数、型、イベントが相互運用され、(可能な場合は)メモリストレージを共有するプログラムをユーザーが作成できるようにします。[26]
- テキストベースのウェブブラウザELinksは、 JavaScriptをサポートするためにSpiderMonkeyを使用しています[27]
- SpiderMonkeyの一部はWineプロジェクトのJScript(再)実装に使用されている[28]
- Synchronet は、SpiderMonkey エンジンを使用した BBS、電子メール、Web、およびアプリケーション サーバーです。
- JavaScript OSA 、 Macコンピュータ用のSpiderMonkeyプロセス間通信言語
- 0 AD、リアルタイム戦略ゲーム
- Wasmer は、JavaScript ランタイム環境である WinterJS オープンソース プロジェクトに SpiderMonkey を組み込みました。
- SpiderMonkeyは他の多くのオープンソースプロジェクトでも使用されており、Mozillaの開発者サイトで外部リストが管理されています。[29]
SpiderMonkeyには、インタラクティブなJavaScript開発とJavaScriptプログラムファイルのコマンドライン呼び出しのためのJavaScriptシェルが含まれています。[30]
参照
参考文献
- ^ “1.8.8 – SpiderMonkey | MDN”. Developer.mozilla.org. 2013年1月10日. 2013年5月2日時点のオリジナルよりアーカイブ。 2013年3月21日閲覧。
- ^ 「SpiderMonkey ニュースレター (Firefox 110-111)」。spidermonkey.dev。2023年2月16日。 2023年12月27日閲覧。
- ^ Mozilla ライセンスポリシー、mozilla.org、2013 年 4 月 2 日時点のオリジナルよりアーカイブ、2013 年3 月 26 日閲覧
- ^ “ホーム”. SpiderMonkey JavaScript/WebAssembly エンジン. 2023年4月24日閲覧。
- ^ abc Eich, Brendan (2011 年 6 月 21 日). 「新しい JavaScript エンジン モジュール オーナー」. BrendanEich.com. 2011 年 7 月 14 日時点のオリジナルよりアーカイブ。2011年7 月 1 日閲覧。
- ^ abc Eich, Brendan (2008年4月3日). 「Popularity」. BrendanEich.com. 2011年7月3日時点のオリジナルよりアーカイブ。2011年7月1日閲覧。
- ^ Eich, Brendan (2011年8月19日). 「Mapping the Monkeysphere」。2013年1月13日時点のオリジナルよりアーカイブ。 2011年8月19日閲覧。
- ^ “JavaScript 1.6 の新機能”. 2015年9月5日時点のオリジナルよりアーカイブ。2015年7月28日閲覧。
- ^ [1]
- ^ 「759422 – アカウント作成時の e4x の使用を削除」 。2013年2 月 5 日閲覧。
- ^ 「JavaScript:TraceMonkey、MozillaWiki」。2020年7月22日閲覧。
- ^ 「TraceMonkey: JavaScript Lightspeed、Brendan Eich のブログ」 。2020年7 月 22 日閲覧。
- ^ Paul, Ryan (2008年8月22日). 「Firefox、JavaScriptパフォーマンスを大幅に向上」 Ars Technica. 2012年5月6日時点のオリジナルよりアーカイブ。 2013年3月21日閲覧。
- ^ Nethercote, Nicholas (2011 年 11 月 1 日). 「SpiderMonkey はダイエット中 | Nicholas Nethercote」. Blog.mozilla.com. 2012 年 3 月 28 日時点のオリジナルよりアーカイブ。2013 年3 月 21 日閲覧。
- ^ 「JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater」 Bailopan.net、2010年2月26日。2013年3月24日時点のオリジナルよりアーカイブ。2013年3月21日閲覧。
- ^ Paul, Ryan (2010 年 3 月 9 日). 「Mozilla が WebKit から技術を借用して高速な新しい JS エンジンを構築」 Ars Technica. 2012 年 4 月 16 日時点のオリジナルよりアーカイブ。2013年3 月 21 日閲覧。
- ^ 「JaegerMonkey - MozillaWiki」。Wiki.mozilla.org。2013年8月23日時点のオリジナルよりアーカイブ。2013年3月21日閲覧。
- ^ 「Platform/Features/IonMonkey - MozillaWiki」。Wiki.mozilla.org。2013年2月11日。2013年3月8日時点のオリジナルよりアーカイブ。 2013年3月21日閲覧。
- ^ 「IonMonkey: Mozilla の新しい JavaScript JIT コンパイラ」。Infoq.com。2012 年 12 月 8 日時点のオリジナルよりアーカイブ。2013年3 月 21 日閲覧。
- ^ 「Firefox Notes - デスクトップ」。Mozilla.org。2013年1月8日。2014年9月2日時点のオリジナルよりアーカイブ。2013年3月21日閲覧。
- ^ 「Warp: Firefox 83 で JS パフォーマンスが向上 – Mozilla Hacks - Web 開発者ブログ」。Mozilla Hacks – Web 開発者ブログ。2020 年 11 月 13 日。2021年8 月 28 日閲覧。
- ^ 「SpiderMonkey — Firefox Source Docs ドキュメント」. firefox-source-docs.mozilla.org . 2021年8月28日閲覧。
- ^ 「MongoDB 3.2 での JavaScript の変更点 — MongoDB マニュアル 3.4」。2017 年 6 月 6 日時点のオリジナルよりアーカイブ。2016年11 月 23 日閲覧。
- ^ 「リリース Riak 0.8 および JavaScript Map/Reduce」。2011 年 11 月 3 日時点のオリジナルよりアーカイブ。2011 年4 月 24 日閲覧。
- ^ 「Acrobat DC SDK ドキュメント」。helpx.adobe.com。2021年11月 5 日閲覧。
- ^ 「Distributive-Network/PythonMonkey: Python VM に埋め込まれた Mozilla SpiderMonkey JavaScript エンジン。Python エンジンを使用して JS ホスト環境を提供します」。GitHub。2023年7 月 7 日。2023年7 月 10 日に閲覧。
- ^ Bolso, Erik Inge (2005 年 3 月 8 日). 「2005 テキスト モード ブラウザ ラウンドアップ」. Linux Journal . 2010 年 3 月 15 日時点のオリジナルよりアーカイブ。2010年8 月 5 日閲覧。
- ^ wine-cvs メーリング リスト Archived 7 February 2009 at the Wayback Machine、 16 September 2008: "jscript: Mozilla regexp 実装に基づく正規表現コンパイラを追加"
- ^ 「SpiderMonkey > FOSS」。MDN Web Docs 。 2019年4月2日閲覧。
- ^ 「JavaScript シェルの紹介」。MDN。Mozilla Developer Network。2010 年 9 月 29 日。2011 年 6 月 29 日のオリジナルからアーカイブ。2010年12 月 14 日に取得。JavaScript
シェルは、SpiderMonkey ソース配布に含まれるコマンド ライン プログラムです。[...] 対話型シェルとして使用できます [...] また、コマンド ラインで JavaScript プログラム ファイルを渡すことで、実行することもできます [...]
外部リンク
- 公式サイト 、SpiderMonkey (JavaScript-C) エンジン
- Firefox (および Spidermonkey) リリースカレンダー
