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:ieblog (スコア:2)
> 一方で「a+b;」という式文をデッドコードとして除去できない言語が
コンパイラならこういうコードを警告の対象にできるけど
インタープリタの場合、どうすべきなんだろう?
Re:ieblog (スコア:1, 参考になる)
> > 一方で「a+b;」という式文をデッドコードとして除去できない言語が
> コンパイラならこういうコードを警告の対象にできるけど
> インタープリタの場合、どうすべきなんだろう?
最初のparse時にvalueOfプロパティが定義されていなくても動的に追加されるかもしれませんし、evalとかECMAScriptの言語仕様上は結びついてないけどsetTimeoutやDOMイベント経由で結びついてるコードパスとか考えると、要するに不可能ってことです。
C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが、ある程度は静的解析で何とかなります。
Re:ieblog (スコア:1, 参考になる)
C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが
重箱の隅をつつくようですがC++のoperatorは差し替えどころかvirtualが許されていません。
「operator+()が定義されていればどんなフリーダムなことでも」というような特別なものではなく、ただの関数です。
なので、my_add()だろうがoperator+()だろうが、最適化の可能性は平等です。
Re: (スコア:0)
敢えてやるとすれば、初回コンパイル時にvalueofが無ければ最適化されたコードを出しておいて、関係する値のvalueofが更新されたらon-the-flyで再コンパイルするとか。