【12-B-5】 ブラウザJavaScript高速化JITバトル最終決戦 | 森田創 氏

今日一番面白かったセッション。

昔はうざったいポップアップとかバンバン出せればよかったのに、
最近では、gmailとかバリバリなのが出てきて、JavaScriptの高層化が急務になってきて。

JavaScriptのエンジンのChangeLogとかみてても、それ系のが非常に多くなってる。
また、クライアントPC的にも、1~2割のリソースが使われてるっぽい。

・Google Chrome の V8
・Safari の SquirrelFish Extreme
・FireFox の TraceMonkey
 (IEは論外w)
上記3つの実装に着目したセッション。
OSS同士だとコードが見れてしまうので、壮絶なるパクリ合いが起こったりしているそう。

・JS固有の面倒なところ→クラスがない
 クラスがあると構造がわかるので、コンパイラがどこになにがあるか理解できる。
 でも、JSはプロパティが動的に変わっちゃったりするか。
 静的なら配列でイケるとこを、ハッシュで処理しないといけなくなってしまう。
 →C++でやると7倍くらい違う。
 んじゃ配列でやるために、とりあえず、仮のクラスを持ってあげればいいんじゃね?的な。
 で、同じ構造なら同じクラスを適用する。
 もし、プロパティが変わったら、新しいクラスを動的にその場でつくればいい。
 V8ではHiddenClassと呼んでて、TraceMonkeyではShape Interfaceと呼んでるらしい。

・他(JavaとかLispとか)のVMの技法を取り込み
 メソッド呼び出しを高速化するには。
 動的片づけの言語だから、プロパティの取り出しが遅い。
 上記のようにクラスができても、引き数の型がわからない。。
 →よく使うクラスなら、配列アクセス
  そうじゃないなら、ハッシュアクセス
  ⇒ JustInTimeなのでそんなことが出来る
    →もしよく使うのが逆だったら?
    JustInTimeに判定条件を書き換えてやればいい。

 昔からよくあるテクニックなんだそうです。なるほどね、と。
 # しかし、文書だけで書こうとすると難しいですね。。

・正規表現早くする(ウェブアプリでは特に多用されるから)
 正規表現のコードもJITでバイト変換する
 TraceMonkeyは元々のインタプリタが早かったけど、
 やっぱりJITにはかなわなかったそうです。

他にもいろんな要素があるけれども、今回は極一部だけ。

エンジン同士の対決は、ソースは見れるので。プロジェクトのブログもあるし。
ソース読んでわからないのは、大抵トリッキーなことやってるので、論文が出てるので、
それを読むとわかりやすい。これからも盛り上がっていきそう。


それにしても、JavaScriptってすごい柔らかい言語だって思い込んでたので、
裏でコンパイルされてるなんて全然思ってなかった。。
内容が非常に噛み砕いてわかりやすかったので、すんなり理解できましたが、
処理系っていうのも奥が思いっきり深そうですね。。。

コメント

タイトルとURLをコピーしました