Changes between Initial Version and Version 1 of Introducing SquirrelFish Extreme.ja


Ignore:
Timestamp:
Sep 19, 2008 7:13:38 AM (16 years ago)
Author:
omo@dodgson.org
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Introducing SquirrelFish Extreme.ja

    v1 v1  
     1This page is a Japanese translation of the post on Surfin' Safari blog
     2"Introducing SquirrelFish Extreme".
     3
     4----
     5
     6= この文書について =
     7
     8 * "Introducing SquirrelFish Extreme" の日本語訳です
     9   * http://webkit.org/blog/214/introducing-squirrelfish-extreme/
     10 * 推敲歓迎: 誤訳, タイポ, 訳語の不統一, そのほか...
     11
     12= SquirrelFish Extreme の紹介 =
     13
     14ちょうど三ヶ月前、私達は SquirrelFish を発表しました。
     15これは私達の JavaScript エンジンを大改造するもので、
     16高性能なバイトコードインタプリタを導入しました。
     17今日は次世代の JavaScript エンジンを公開します。
     18SquirrelFish Extreme (略して SFX)です。
     19SquirrelFish Extreme は、高速なネイティブコード生成といったより高度な技術を用い、
     20JavaScript に更なる性能をもたらします。
     21
     22WebKit の開発をおいかけており、貢献したいと思っている方々のために、
     23我々の成果と、いかにそれを達成したのかについて紹介したいと思います。
     24
     25== どれくらい速いのか? ==
     26
     27以下のグラフは異なるバージョンの WebKit 間で Javaの性能を示したものです。
     28棒が長いほど高速です。
     29
     30[[Image(http://webkit.org/blog-files/sfx-perf.png)]]
     31
     32SunSupier を一分間に何度実行できるかが指標です。
     33この指標を使ってグラフを書いたのは、広範な指標で性能を調べる際に
     34「大きいほど速い」がわかりやすいからです。見てのとおり、
     35現在の SquirrelFish Extreme はオリジナルの SquirrelFish のおよそ二倍、
     36出て一年も経たない Safari 3.0 の 10 倍も高速です。
     37私達はこうした改善を大変嬉しく思います。
     38しかしこの先の更なる改善も確信しています。
     39
     40かなりの数の人々がこの成果に貢献してくれました。
     41以下では重要な仕事をした何人かに言及しますが、
     42JavaScript や性能の面で協力してくれた WebKit のコントリビュータ皆に
     43感謝したいと思います。
     44
     45SquirrelFish Extreme は 4 つの異なる技術を使い、
     46オリジナルの SquirrelFish の性能を改善しました:
     47バイトコードの最適化、多態インラインキャッシュ、
     48軽量な「コンテクストスレッド」式 JIT コンパイラ、
     49JIT インフラに基いた新しい正規表現といった技術です。
     50
     51== 1. バイトコードの最適化 ==
     52
     53最初に SquirrelFish を発表したとき、
     54その基本設計にバイトコードレベルで大いに最適化の余地があると
     55私達は指摘していました。Oliver Hunt、Geoff Garen、Cameron Zwarich、
     56そして私やその他の人々の奮闘により、
     57私達はそのバイトコードレベルで多くの効率よい最適化を実装しました。
     58
     59私たちがやったことの一つは、オプコード内での最適化です。
     60JavaScript の操作にその多くに高い多態性があります。
     61様々な場合にによって様々に振舞いを変えるのです。
     62単に一番よくある、最速の場合を先にチェックするだけで、
     63JavaScript のプログラムはかなり高速化できるのです。
     64
     65加えて、私達はバイトコードの命令セットも改善しました。
     66そうした改善の利点を生かした高速化をしたのです。
     67コンボ命令や、ピープホール最適化、定数の高速処理、
     68そして一般的な操作の標準ケース用にいくつか特別なオプコードを追加することもしました。
     69
     70== 2. 多態インラインキャッシュ ==
     71
     72SquirrelFish Extreme に施された新しい最適化の中で最も心踊るものの一つが、
     73多態インラインキャッシュです。これはもともと Self 言語で開発された古い技術で、
     74他の JavaScript エンジンで採用され良い効き目を出しています。
     75
     76基本的な考え型はこうです: 言語設計の上では、JavaScript は極めて動的あ言語です。
     77しかし大半のプログラムでは、実際のところ多くのオブジェクトが
     78オブジェクト指向のクラスのようにもう少し構造のある使われ型をしています。
     79たとえば、多くの JavaScript ライブラリは 「x]と「y」というプロパティのある
     80オブジェクトを使う作りになっています。このオブジェクト他のプロパティを持たず、
     81点を表現するのに使われます。多くのオブジェクトが同じ構造に基いているなら、
     82こうした知識を最適化に使うことができます。
     83動的言語コミュニティの人はこんな風に言っています。「捕まらないインチキはしてもいいんだぜ?」
     84
     85では、どうやってインチキをすればいいのでしょうか?
     86私達はオブジェクトが同じ構造を持つこと...順序の同じプロパティがあること...を検出します。
     87そしてオブジェクトに構造の識別子 StrucureID を割り付けます。
     88プロパティアクセスがおこると、初回はまず普通に(超高速のハッシュテーブルを使い)ハッシュ検索をします。
     89そしてプロパティをみつけた場所に StructureID とオフセット値を記録しておきます。
     90それ以降のアクセスでは StructureID の一致をチェックします - 
     91ふつう同じコード片は同じ構造を持つオブジェクト相手に使われるものなのです。
     92チェックに成功したらキャッシュしておいたオフセットを使い、わずか数命令で検索を行うことができます。
     93これはハッシュ検索よりずっと高速です。
     94
     95[http://research.sun.com/self/papers/pics.html 元になったテクニックを説明した Self の論文はこれ]
     96です。
     97Subversion に入っている Geoff の
     98[http://trac.webkit.org/browser/trunk/JavaScriptCore/kjs/StructureID.h StrucureID クラス]
     99の実装をみれば、より詳しいことがわかるでしょう。
     100
     101私達の施したインラインキャッシュは、まだはじめの一歩です。
     102更なる高速のためにこのテクニックを改善するアイデアが沢山あります。
     103とはいえ、プロパティアクセスがボトルネックであるような性能テストでは、
     104現状でお劇的な改善を見ることができるでしょう。
     105
     106== 3. コンテクトスレッド JIT ==
     107
     108SFX に行ったもう一つの大変更はネイティブコードの生成です。
     109手始めに使ったのは "コンテクストスレッドインタプリタ (context threaded interpreter)"
     110という技術です。これは少しズレた名前です。
     111というのは、これは単純ながら効率的な JIT コンパイラだからです。
     112もともとの SquirrelFish の発表で、
     113私達はダイレクトスレッド(direct threading)を使っていると説明しました。
     114これはネイティブコード生成を使わずバイトコード解釈をする形態のうち、最速のものです。
     115コンテクストスレッドでは次の一歩を踏み出し、いくらかのネイティブコード生成を使います。
     116
     117コンテクストスレッドの基本的なアイデアは、
     118バイトコードを 1 オプコード毎にネイティブコードに変換するというものです。
     119複雑なオプコードは言語のランタイムに対する関数呼びだしになります。
     120単純なオプコードや、複雑なオプコードのうち高速に実行できるパスは
     121ネイティブコード列へ直接差し込まれます。まず、オプコード間の制御フローは
     122直線的なコードとなって CPU に差し出されます。したがってディスパッチのオーバーヘッドはなくなります。
     123次にもともとオプコードの間にあった多くの分岐はインライン化されます。
     124これは CPU の分岐予測器にとって大変予測しやすいコードになるのです。
     125
     126[http://www.cs.toronto.edu/syslab/pubs/demkea_context.ps コンテクストスレッドの基本的なアイデアを示した論文はこれ]です。
     127コンテクストスレッドの最初のプロトタイプは Gavin Barraclough が作りました。
     128ここ数週間でそれをチューニングし性能を磨きあげるのには、何人もが手を貸しています。
     129
     130私達の計量 JIT がもつ優れた点の一つは、ネイティブコードの生成に
     131わずか 4000 行のコードしか使っていないところです。
     132コードの他の部分はクロスプラットフォームのままです。
     133また、これは驚くほどハックしやすいコードです。
     134ネイティブコードの生成がロケットサイエンスだと思っている人は考えを改めてください。
     135Gavin だけでなく、私達の大半はネイティブコード生成の経験がほとんどありませんでした。
     136しかし、えいやと書いてしまえたのです。
     137
     138今のところコードは 32 ビットの x86 に限定されています。
     139しかしリファクタリングを行い、もっと多くの CPU アーキテクチャをサポートしていく予定です。
     140また 型の特殊化や、より良いレジスタ割り当てや生存区間分析(liveness analysis)を使い、
     141JIT の高速化をしていこうとも考えています。SquirrelFish のバイトコードは
     142こうした変換を多く行うのに都合の良い表現となっています。
     143
     144== 4. 正規表現 JIT ==
     145
     146私達が JavaScript 言語本体のために最低限の JIT 基盤を作ってみたところ、
     147この基盤を正規表現にも適用し、正規表現のマッチングを 5 倍高速化できることがわかりました。
     148そこで作業を進め、実装を行いました。
     149全てのコードが正規表現に多くの時間を費すわけではありません。
     150しかし我々の新しい正規表現エンジンン WREC (the Webkit Regualr Expression Compiler)
     151を使うと、これまで Perl や Python や Ruby で書いていたようなテキスト処理のコードを
     152JavaScript で書けるようになります。
     153実際、私達の正規表現エンジンは多くのケースで他の言語で
     154用いているチューニング済みの正規表現に勝ると確信しています。
     155
     156SunSupider ベンチマークは結構な量の正規表現を使っているため、
     157正規表現 JIT を開発するのは「フェアじゃない」と考える向きもあるようです。
     158一年前、テストに占める正規表現の割合はとても小さなものでした。
     159そして各 JS エンジンは正規表現以外の改善を大いに進めました。
     160たとえば個々の SunSpider のテストひとつのの結果は JavaScriptCore より 5 から 10 倍高速で、
     161Safari 3.0 版の WebKit より 70 倍速いなんてものもありました。
     162しかし今日まで、正規表現の性能はほとんど改善されてこなかったのです。
     163
     164私達は、正規表現を高速化する方がベンチマークを変更するより良いことだと考えました。
     165ウェブでの実作業は沢山の正規表現を使います。
     166結局、JSON の検証やパースのような Web の本質的な作業は正規表現に依存しているのです。
     167そして
     168[http://ejohn.org/blog/processingjs/ John Resig の processing.js] といった発展途上のテクノロジーは、
     169この依存を更に強めています。
     170
     171== ベンチマークにひとこと ==
     172
     173ベンチマークの結果をいくつか示します。しかし能書きはありません。
     174WebKit の
     175[http://nightly.webkit.org/builds/trunk/mac/1 Mac 版]と
     176[http://nightly.webkit.org/builds/trunk/win/1 Windows 版]の
     177ナイトリービルドを手に入れて、
     178みなさん自身の手で確かめてください。
     179
     180私達の使った一番目のベンチマークはは
     181[http://www2.webkit.org/perf/sunspider-0.9/sunspider.html SunSupider] です。
     182しかしどんなベンチマークもそうであるように、 SunSpider にも欠点はあります。
     183しかしこれは JavaScript 言語を多元的に扱い、多くの種類のコードをカバーする
     184バランスのよいテストだと思います。テストの結果をひとつひとつ見ていけば、
     185異なる JavaScript 実装が異なる長所や短所を持つことがわかるでしょう。
     186ブラウザベンダや個人のテスト実施者がこのベンチマークを追いかけています。
     187
     188== 次のステップと、あなたが貢献する方法 ==
     189
     190SquirrelFish Extreme のアーキテクチャには改善の余地が多く残されています。
     191そして私達は手助けをしてくれる開発者やテスタを歓迎します。
     192現状私達が調べているのは、どうやってバイトコードのインフラを使って実行時の情報を集め、
     193それをより良いコード生成にあてるかの方法です。
     194JS の関数呼び出しを高速化する方法も模索しています。
     195SFX のアーキテクチャの筋の良さを生かす基本的なチューニングも色々残っています。
     196更に他の CPU アーキテクチャ用 JIT バックエンドにも興味があります。
     197
     198WebKit の JavaScript エンジンをもっと近くで見守りたい人のために
     199squirrelfish-dev@lists.webkit.org メーリングリストを作りました。
     200([http://lists.webkit.org/mailman/listinfo.cgi/squirrelfish-dev ここから購読できます]。)
     201FreeeNode の IRC ネットワークに
     202#squirrelfish チャンネルもあります。
     203立ち寄っていただければ、更に詳しい計画や参加の方法がわかることでしょう。
     204
     205== 試してみよう ==
     206
     207試して、テストして、ブラウジングをしてみてください。
     208[http://nightly.webkit.org/ ナイトリービルドが入手可能]です。
     209私達の改善があなたの Web 体験をよりよいものにできればと思います。
     210
     211追記: [http://summerofjsc.blogspot.com/2008/09/squirrelfish-extreme-has-landed.html ここ] に
     212SFX と他の先行 JavaScript エンジンの比較があります。
     213Charles Ying が
     214[http://www.satine.org/archives/2008/09/19/squirrelfish-extreme-fastest-javascript-engine-yet/ いくつか追加でベンチマークをしてくれました]。
     215
     216追記2:
     217私達のちいさなマスコットに不満の型は、下の SquirrelFish をクリックすると
     218WebKit ナイトリーの SVG アニメーションサポートを見ることができます。
     219
     220[[Image(http://webkit.org/blog-files/squirrelfish.png)]]
     221http://webkit.org/blog-files/animation-demo.svg