ジャラカン

数ヶ月間、開発者とテスターの小さなチームがOpera用の新しいECMAScript / JavaScriptエンジンの作成に取り組んでいます。 現在のECMAScriptエンジンであるFutharkが最初に公開されたとき、それは市場で最速でした。 Futharkは、主に迅速なコード実行のために設計されました。 従来、これはOperaが動作するさまざまなプラットフォーム間の正しい妥協案です。



Webは絶えず変化する環境であり、明日の高度なWebアプリケーションは高速なスクリプト実行を必要とするため、Operaは最速のスクリプトエンジンを開発するために再び競争に参加しています。



エンジンの以前の名前と同様に、ジャラカンの名前が与えられています-これは執筆の一形態です。 (Futark-スカンジナビア語のアルファベット; Jarakan、charakanとも呼ばれる-ジャワ語の音節表記)



3つの主要分野に焦点を当てた改善努力



レジスタのバイトコード





Operaの最新世代のスクリプトエンジンは、命令のスタックインストールを使用しています。 このタイプの命令のインストールは値スタックに基づいており、ほとんどの命令はスタック値から着信オペランドを取得し、それらを処理して、スタックに戻します。 一部の命令は、単に値をスタックにプッシュするか、スタック内の値をシャッフルします。 これにより、プログラムのコンパクトなバイトコードが得られ、それらのバイトコードを簡単に生成できます。 (一般的に、スタックは一種のカードデッキと比較することができ、その上にカードを置いてそこからカードを取り出すことができますが、中央から取り出してそこに置くことはできません)



新しいエンジンは、代わりにレジスタベースの命令設定を使用しました。 レジスタマシンでは、動的に変化する値のサイズスタックの代わりに、固定サイズのブロックが使用されます。値はレジスタと呼ばれます。 したがって、スタックの最上部でのみ動作する代わりに、各命令は任意のレジスタにアクセスできます。 動作するためには、スタックの最上部からコピーするデータが少なくて済むため、実行に必要な命令が少なくなり、コピーされるデータが少なくなります。



マシンコード生成





エンジンに命令をインストールする新しい方法は、バイトコードの実行を大幅に高速化できるという事実にもかかわらず、バイトコードの解釈に整数を含むループなど、単純なECMAScriptコードを使用した操作がまだオーバーロードされています。 これらの過負荷に対処するために、ECMAScriptプログラムと関数の全体または一部のマシンコードへのコンパイルを実装しました。



マシンコードのコンパイルは、データ型の静的分析(ECMAScriptで通常よりも優れたツールを使用)に基づいています。これは、不要な型チェック(可能な場合)、型指定の遅延(未定義の静的型を考慮)を取り除くために実行されます。また、レジスタアロケータでは、レジスタとメモリを使用した複数の操作を使用してコンパクトなマシンコードを生成できます。



実際にマシンコードへの変換に適しているECMAScriptコードを使用する場合、生成されるコードは、手作業で記述されたアセンブラコードにほぼ類似しており、すべてをレジスタに保持しようとします。



レジスタディストリビュータは、アーキテクチャ的に独立して実行されるように設計されているだけでなく、「最終的な」マシンコードを生成するため、作成する決定が複雑になります。 最初は、32ビットおよび64ビットのx86アーキテクチャで作業が行われましたが、ARMなどの他のプロセッサアーキテクト向けに、マシンコードを生成するための予備作業が既に開始されていました。



標準ECMAScriptのマシンコードを生成することに加えて、単純な正規表現に一致するものを探すマシンコードも生成します。 これにより、単純な正規表現の長い文字列で一致を検索するときのパフォーマンスが大幅に向上します。 本当に長い文字列の場合、これにより、String.prototype.indexOfを使用した同じ検索よりも、正規表現を使用した部分文字列の検索が高速になります。 短い行の場合、正規表現をコンパイルするオーバーロードによって速度が制限されます。



正規表現エンジンが十分に高速であるため、より複雑な正規表現のコード生成は遅くなり、パフォーマンスの向上は小さくなります。 正規表現エンジンの基礎は最近開発されましたが、すでにPresto 2.2でデビューしています。 (オペラ10a)。 これは通常の正規表現エンジンであると言えますが、不必要な戻り値を回避するためにいくつかのトリックを行い、パフォーマンスを向上させます。



オブジェクトの自動分類





現在のエンジンのパフォーマンスを大幅に向上させるもう1つの分野は、ECMAScriptオブジェクトの異なるビューです。 新しいエンジンでは、各オブジェクトがクラスに割り当てられ、そのクラスが、プロトタイプ、そのプロパティの一部またはすべての順序や名前など、オブジェクトに関するさまざまな情報を収集します。 ECMAScriptは動的言語であるため、オブジェクトへのクラスの割り当てはそれ自体非常に動的なものですが、1つのプロトタイプと同じプロパティを持つオブジェクトが1つのクラスに割り当てられるように編成されています。



ほとんどの複雑な構造は同じクラスの他のオブジェクトと一緒に配置されるクラスに格納されたオブジェクトのプロパティの表現であるため、表現のこのような変更により、カスタムオブジェクトのコンパクトな格納が可能になります。 実際に動作するプログラムでは、1つのクラスに多くのオブジェクトを保存すると、メモリ消費を大幅に削減できます。 多くのオブジェクトを作成するほとんどのプログラムには、いくつかの異なるクラスしかないことが予想されます。



プロパティの構造の共通テーブルは、異なるオブジェクト間のプロパティの検索も改善します。 同じクラスの2つのオブジェクトの場合、最初のオブジェクトの「X」プロパティを検索するときに結果「Y」が得られ、2番目のオブジェクトの同じ検索でも「Y」が得られるのは事実です。 これは、ECMAScriptプログラムで個々のプロパティを検索するための出力をキャッシュするために使用され、複数の読み取りまたは書き込みプロパティを含むコードのパフォーマンスを大幅に向上させます。



性能





それでは、ジャラカンはどれくらい速いのでしょうか? Jarakanは、標準のクロスプラットフォームメカニズムを使用して(生成されたマシンコードなしで)迅速にデバッグできるため、Presto 2.2(Opera 10a)の現在のECMAScriptエンジンよりも2.5倍高速になりました。 この場合、Operaは異なるアーキテクチャ向けに特別なバージョンをリリースすることを覚えておく必要があります。これはパフォーマンスにとって重要です。



Jarakanでのマシンコード生成はまだ本格的なテストの準備ができていませんが、いくつかの個別の互換性テストでは5倍と50倍のギャップがあり、すでに非常に有望です。



この翻訳はzerobrainによって編集され、ロシア語( 拍手 )で書かれています。 この機会に、ニックネームenilightを持つ善良な人にカルマを訂正するようにお願いします



All Articles