質問

私は、コンパイラを書いている、と私は最適化の上のリソースを探しています。私はマシンコードにコンパイルしていますので、実行時に何が問題外です。

私は最近探していることは少ないコードの最適化および/もっとセマンティックハイレベルの最適化です。たとえばます:

free(malloc(400)); // should be completely optimized away

これらの機能は完全にインライン化された場合でも、彼らは最終的にインライン化することはできませんOSのメモリ関数を呼び出すことができます。私は、コンパイラに特殊なケースのルールを構築することなく、完全にその文を排除することができるのが大好きです(結局、mallocはちょうど別の関数である)。

もう一つの例:

string Parenthesize(string str) {
    StringBuilder b; // similar to C#'s class of the same name
    foreach(str : ["(", str, ")"])
        b.Append(str);
    return b.Render();
}

このような状況で、私は(メモリを無駄にすることなく、正確に結果を保持するのに十分)bするstr.Length + 2の能力を初期化することができるのが大好きです。

完全に正直に言うと、私はどこにこの問題に取り組んで始めるには考えているので、私は始めるためにどこかを期待していました。すべての作業は、類似した地域で、そこで行われていますか?一般的な意味で、このようなものを実装している任意のコンパイラはありますか?

役に立ちましたか?

解決

2つの以上の事業全体での最適化を行うには、理解する必要があります これら二つの動作の代数的関係。あなたは、操作を表示した場合 その問題領域に、彼らはしばしばそのような関係を持っています。

自由とはmallocが逆であるため、

あなたの自由(のmalloc(400))が可能です ストレージの割り当てドメインインチ 操作の多くは、逆数を持っており、彼らは逆でコンパイラを教え、 そしてその1つのデータフローの結果が無条件他に実証し、 必要とされるものです。あなたの逆数が本当に逆であることを確認する必要があります そしてどこかに驚きはありません。 /は、x * xが値だけのように見え、 xが0である場合がありますが、トラップを取得します。あなたがトラップ気にしないのであれば、それは逆です。 あなたがトラップに気をすれば、その後の最適化は、より複雑です。       (もしそうでなければ(のx == 0)、その後トラップ()) これはあなたが除算が高価であると思えばまだ良い最適化されます。

他の「代数」の関係が可能です。例えば、あります 操作をべき等があります。同じに何も設定(変数をゼロに など値繰り返し)、1つのオペランドが作用操作があります。 アイデンティティ要素等。任意の0のX + 0 ==> X Xと0が行列である場合には、 これはまだ本当と大きな時間の節約です。

あなたはどのようなコードについて抽象的に推論することができたときに

その他の最適化が発生する可能性があります やっています。 「抽象解釈は」についての推論のための技術の集合であり、 様々な興味深いビンに結果を分類して、値(例えば、この整数 )、未知のゼロ、負、または正です。これを行うには、あなたは何を決定する必要があります ビンが役に立ちますし、各時点での抽象値を計算します。これは便利です 例えば、「場合(X <0){...」とあなたが知っているカテゴリのテストは(存在する場合に 抽象そのxがゼロ未満です。あなたはそれらを離れて最適化することができ、条件付きます。

もう一つの方法は、計算が象徴何をしているかを定義し、結果を確認するために計算をシミュレートすることです。それはあなたが必要なバッファの有効サイズを計算する方法です。ループが始まる前に、あなたは、象徴的バッファサイズを計算し、 そしてすべての反復のためのループを実行する効果をシミュレートしました。 このためには、シンボリック式を構築できるようにする必要があります プログラムのプロパティを表現する、そのような式を構成し、頻繁に簡素化 彼らは抽象的にフェードのunusablyコンプレックス(種類を取得し、そのような式 解釈スキーム)。あなたはまたに取るために、このような記号計算をしたいです 私は上記の代数的性質を占めています。これをよく行うツールは、以下の式を構築するのが得意であり、プログラム変換システムは、多くの場合、このための良い基盤です。これを行うために使用することができる1つのソース - ソースプログラム変換システム DMSソフトウェアリエンジニアリングツールキットである。

どのような難しいことは、あなたが終了することができますので、やって価値があるどの最適化を決定することです 報われないことがありものの膨大な量の記録を、維持します。コンピュータサイクル 安くなって、そしてそれは、コンパイラのコードの複数のプロパティを追跡することは理にかなっている。

他のヒント

ブロードウェイのフレームワークは、静脈の中にあるかもしれませんあなたが探しているもの。 「ソース・ソース間の変換」に関する論文は、おそらくまた、啓発になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top