トップ回答者
式木で同じ式が使われるときの先行評価について

質問
-
式木を最適化してるんですがかなり色々いじって思ったように変換するためのいい方法とかテクニックは独学ですがみついてきました。
今詰まっているのはif,elseブロック内を含む共通部分式の先行評価ってどういう戦略でやればいいんでしょうか?
以下の例を単純にやるとa+a==1? b+b==1? a+a : b+b : a+a
を単純に先行評価すると
aa=a+a bb=b+b aa=1? bb==1? aa : bb : aa
問題点は
aaは2回参照されることが確実なら有効だと思いますがaa==1でbb!=1の条件では1度しか使われません。
bbも2回参照されることが確実なら有効だと思いますがaa==1でbb==1の条件では1度しか使われません。
評価にコストがかかるなら遅延評価として先行評価しないというのが正しいと思いますが静的に先行評価すべきしないべきといった指針はあるのでしょうか?こういう確実に2回以上使う割れることのない式というのは共通部分式しないというのが一般的ってなにかわかりませんがそういうものなのでしょうか?
- 編集済み 和和和 2013年10月8日 1:49
回答
-
わかっててやっているのかわかりませんでしたので指摘しておきますが、
比較式・true式・false式いずれにも該当する話として、変数・フィールドの参照は副作用なく実行できますが、プロパティは単なる参照であっても副作用が含まれていることがあります。評価順序を入れ替えてしまうと見えていない副作用によって比較式の評価結果が変わることもありますし、またtrue式・false式は一方しか評価されない仕様なので、本来実行されない側の副作用によって結果が変わることもあります。
a < b ? ++a : ++b
とかもどうするつもりでしょう?
# こんなの実行時間よりも解析時間やコンパイル時間の方がよっぽど長いと思う…
すべての返信
-
-
わかっててやっているのかわかりませんでしたので指摘しておきますが、
比較式・true式・false式いずれにも該当する話として、変数・フィールドの参照は副作用なく実行できますが、プロパティは単なる参照であっても副作用が含まれていることがあります。評価順序を入れ替えてしまうと見えていない副作用によって比較式の評価結果が変わることもありますし、またtrue式・false式は一方しか評価されない仕様なので、本来実行されない側の副作用によって結果が変わることもあります。
a < b ? ++a : ++b
とかもどうするつもりでしょう?
# こんなの実行時間よりも解析時間やコンパイル時間の方がよっぽど長いと思う…