4

私はカスタム言語を自動的にJavaに変換するプロジェクトに取り組んでおり、変換処理中にコードの基本的な最適化を行うよう求められています。たとえば、カスタムコードのようなものがあり:このインスタンスで自動コード最適化テクニック

if someFunction(a, b) > x: 
    do something 
else: 
    return someFunction(a, b) + y 

を、someFunctionは、同じ入力で複数回呼び出されるので、追加のパフォーマンスはsomeFunction(の値をキャッシュすることにより得られる)とのみ、それを呼び出すことができます一度。

var1 = someFunction(a, b) 

if var1 > x: 
    do something 
else: 
    return var1 + y 

現在、これは変換処理中に手作業で行われます。したがって、上記のコードの「最適化」バージョンは次のように見えるかもしれません。私は、カスタム言語のコードをJavaに変換し、変換されたコードを手動で調べて最適化できるものを確認するプログラムを実行します。私はこれらの問題が何度も繰り返されるので、最適化プロセスを自動化したい。カスタム言語でコードを書いている人々は、そのようなことを心配したくないので、私に与えるコードが既に最適化されていることを確認するように彼らに頼むことはできません。

現代のコンパイラでどのように行われているかを詳しく説明するチュートリアルや論文などは何ですか?私はホイールをあまりにも再発明する必要はありません。前もって感謝します。

編集1:

この関数は純粋であると見なすことができます。

+5

この最適化は、 'someFunction'が常に同じ入力に対して同じ値を返すことが保証されている場合にのみ機能します。あなたはそれについてどんな種類の保証をしていますか? – fge

+0

あなたの関数が純粋である(副作用がない)という事実を推測する必要があります。あなたの言語によって、それがどれほど簡単かどうかが決まります。 *主に*関数型言語の場合、純粋推論は簡単です。そうでなければ、あなたは非常に控えめな推論ルールしか持てません。詳細は、中間表現にも依存します。それがSSA/ArraySSA(すなわち、すべてのローカルオンリーメモリ転送を除去した)の場合、ロードおよびストアを行わず純粋な他の関数を呼び出すだけで、関数を純粋なものとしてマークすることができる。 –

+0

関数が純粋であると仮定することができます。 –

答えて

1

これは、Common subexpression eliminationとして知られています。

通常、データフロー分析を行うには、完全にコンパイラを実装する必要があります。アルゴリズムはDragon Book、「6.1.2 DAGを構築するためのバリューナンバーメソッド」(少なくともローカルCSEの場合)に示されています。

+0

これは、関数呼び出しに副作用があり、それを排除することができない可能性があるため、かなり一般的な部分式の削除ではありません。 – templatetypedef

+3

彼は評価したい機能が純粋であると述べています – Cine