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

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

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

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

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

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

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

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

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

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

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


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