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