今日一番面白かったセッション。
昔はうざったいポップアップとかバンバン出せればよかったのに、 最近では、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ってすごい柔らかい言語だって思い込んでたので、 裏でコンパイルされてるなんて全然思ってなかった。。 内容が非常に噛み砕いてわかりやすかったので、すんなり理解できましたが、 処理系っていうのも奥が思いっきり深そうですね。。。