0

私はJavaバイトコードのオプティマイザーに取り組んでおり、SSAを使用することにしました。ただし、ほとんどの最適化ではすべての操作が純粋に機能する必要があるため、副作用を処理するために、副作用を引き起こす可能性のあるすべての操作に不透明な状態パラメーターと戻り値を追加することにしました。これにより、副作用のある操作の最適化や並べ替えを防ぐことができます。たとえば、例外処理を無視すると、この擬似コードのようなものが得られます。

function arguments: x1, e1
if x1 != 0
    x2 = add(x1, 3)
    x3, e2 = invoke(foo, x2, e1)
x4 = phi(x1, x3)
e3 = phi(e1, e2)
return x4, e3

私がしていることの名前はありますか?それは良いアプローチですか?関数型言語にはモナドと呼ばれる概念があると聞きました。これは似ているように聞こえますが、同じではありません。モナドを使用する方が良いアプローチですか?もしそうなら、どうすればモナドを使用するようにこれを変更できますか?

4

1 に答える 1

0

これは長すぎてコメントに収まりませんでしたが、実際には答えを意味するものではありません。

会社はそれを「メモリエッジ」と呼んでいます、もっと多くの名前があるかもしれません。「明示的な状態通過」と呼ばれていると聞きましたが、グーグルは同意していないようです。

しかし、私はあなたの前提に同意しません-ほとんどのSSA最適化は、副作用が存在する場合でも問題なく機能します(場合によっては少し厄介です)。うまくいかないのは、副作用を明示せずにグラフ表現を使用することです(明らかに順序が消えます)。ただし、その順序を明示的にするために必要なものだけが必要です。SSAは「操作のリスト」としても機能し、順序は単純に修正されます(明示的な並べ替えフェーズを除く)が、その場合でも、サイドを作成する方が簡単です。明示的な効果(最適化などの特殊なケースが少なくなります)。

それは素晴らしいアプローチです。それがモナドとどのように関係しているかはわかりませんが、私はそれらを理解しておらず、おそらく決してそうはなりません。

于 2012-07-08T15:55:15.583 に答える