> 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 clear that it hasn't been tested on anything other than SunSpider.
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:ieblog (スコア: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 clear that it hasn't been tested on anything other than SunSpider.
つまり、IE9の開発者は上記の事実に気がついていなくて、SunSpiderだけでチェックして安心しているという状態のようだ。升しているわけではなさそうだよ。
Re:ieblog (スコア: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で再コンパイルするとか。
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: (スコア:0)
Objectにセッターやゲッターが設定されていて、それがaやbを更新するような関数である可能性が捨てきれないから、DCEできる条件はより厳しくなるね。