JavaScriptではvalueOfというプロパティを定義することで、通常は副作用のない値の参照そのものに副作用を持たせることができるので、安易にDCEをしてはいけないのだが、IE9ではそのポカをやってしまっている。 > Object.prototype.valueOf = function() { alert("IE9 is fast!"); }
こうすると、 a + b; という文はDCEされちゃいそうだが、実際はalertが二回呼ばれる(のでDCEしてはいけない)
> That said, I don't think it's possible to consider IE9's implementation of Dead Code Elimination to be a serious general purpose optimization. It seems
ieblog (スコア:3, 参考になる)
http://blogs.msdn.com/b/ie/archive/2010/11/17/html5-and-real-world-sit... [msdn.com]
Dead Code Elimination in JavaScript のところにMSの言い分あり。
Re: (スコア:0)
Re: (スコア:2, 参考になる)
> Object.prototype.valueOf = function() { alert("IE9 is fast!"); }
こうすると、
a + b;
という文はDCEされちゃいそうだが、実際はalertが二回呼ばれる(のでDCEしてはいけない)
> That said, I don't think it's possible to consider IE9's implementation of Dead Code Elimination to be a serious general purpose optimization. It seems
Re: (スコア:3, 興味深い)
Dead Code Elimination for Beginners [mozilla.com] (Rob Sayre's Mozilla Blog) の話ですね。
速度向上のために「最適化」と称して仕様違反を犯すのを擁護する気はないのですけれど、一方で「a+b;」という式文をデッドコードとして除去できない言語が広く使われているのは不幸だなあとも思います。本題と関係ありませんけど。
Re: (スコア:0)
古典的コンパイラでもデッドコードは静的なインライン展開などの結果として出てくることがほとんどだし、
どうしてもというのならJITコンパイラがDCEするのが筋でしょう。
Re: (スコア:0)
function func(a, b) {
var x;
var i = 300;
while (i--) {
x = a + b; // dead store
}
}
静的な解析で x = a + b; がデッドコードの候補になることがわかるから、明示的にチェックするようなコードに変換すると
while (i--) {
if (!(a has valueOf) && !(b has value
Re:ieblog (スコア:0)
Objectにセッターやゲッターが設定されていて、それがaやbを更新するような関数である可能性が捨てきれないから、DCEできる条件はより厳しくなるね。