私は楽しいためにコンパイルされた言語を書いています。最近、私の最適化コンパイラを非常に頑強にするための蹴りに乗りました。私はいくつかのものを最適化するためのいくつかの方法を考え出しました。たとえば、2 + 2は常に4なので、(偽){...}が完全に削除されてもコンパイル時に計算できます。私はループになった。いくつかの研究の後、私がしようとしていることは正確にアンローリングをループすることではないと思うが、それはまだ最適化技術である。私に説明させてください。"静的"ループの最適化
次のコードを使用してください。
String s = "";
for(int i = 0; i < 5; i++){
s += "x";
}
output(s);
人間として、私はここに座っていると、これは時間の100%だから
output("xxxxx");
に等価であることを行っていることを伝えることができ、他の言葉で、このループは「コンパイルすることができます完全に "出る"。ループアンローリングではありませんが、私が「完全に静的」と呼んでいるのは、セグメントの動作を変更する入力がないということです。私の考えは、完全に静的なものは単一の値に解決できるということです。入力に依存するものや、条件付き出力をさらに最適化することはできません。だから、マシンの観点から、私は何を考慮する必要がありますか?ループを「完全に静的にする」とは何ですか?
私は分類する方法を理解するために必要な3つのタイプのループを考え出しました。入力、ループが決して完了しないループ、および一方向または他の方法では理解できないループに関係なく、実行ごとに常に同じマシン状態になるループ。私はそれを理解できない場合(動的入力に基づいて何回実行するかを条件付きで変更する)、私は最適化が心配されていません。無制限のループは、プログラマーによって特に抑制されない限り、コンパイルエラー/警告になります。毎回同じループは、マシンをループせずに適切な状態に直接スキップするだけです。
もちろん、最適化する主なケースは、内部のすべての関数呼び出しも静的である静的ループ反復です。ループに動的コンポーネントがあるかどうかを判断するのは簡単ですが、動的でない場合は静的でなければなりません。私が理解できないことは、それが無限になるかどうかを検出する方法です。誰にもこれに関する考えはありますか?私はこれが停止問題のサブセットだと知っていますが、解決できると感じています。停止問題は、プログラムの一部のサブセットでは、それが永遠に実行されるかもしれないとは言えませんが、そうでないかもしれないという事実のために問題になります。しかし、私はそれらのケースを考慮したくありません。どこで停止するか、それは停止しませんが、まずは3つの状態を区別する必要があります。
現時点でこの行に実際に何がサポートされているかを知るには、新しいC++標準の 'constexpr'の制限についてお読みください。 –
ループ条件が常に真であると静的に判断でき、ループを終了する他の方法がない場合は、ループが終了しないことがわかります。 –
あなたの例では、Stringがexternを介して参照されている別のファイルによっても変更されていないことを必ずしも知っているとは限りません。 – TJD