一部のプログラミング言語 ( haskellなど) では、モジュール間の循環依存が許可されています。コンパイラは、1 つのモジュールのコンパイル中にインポートされたすべてのモジュールのすべての定義を知る必要があるため、一部のモジュールが相互にインポートしたり、他の種類のサイクルが発生したりする場合、通常、追加の作業を行う必要があります。その場合、コンパイラは、インポートされた関数がまだ分析されていない可能性があるため、インポートサイクルのないモジュールほどコードを最適化できない場合があります。バイナリオブジェクトには依存関係がないため、通常、サイクルの 1 つのモジュールのみをそのようにコンパイルする必要があります。そのようなモジュールをループブレーカーと呼びましょう
特に、インポート サイクルがインターリーブされている場合、何百ものモジュールで構成される大きなプロジェクトをコンパイルするときに、ループ ブレーカーの数を最小限に抑える方法を知ることは興味深いことです。
プログラムを正常にコンパイルするためにループブレーカーとしてコンパイルする必要がある依存関係のセットが出力されるモジュールの最小数を指定するアルゴリズムはありますか?
例
この例で私が何を意味するのかを明確にしようとしています。
A
、B
、C
およびの 4 つのモジュールを含むプロジェクトを考えてみましょうD
。これは、これらのモジュール間の依存関係のリストです。エントリのX y
手段は以下y
に依存しx
ます:
交流 広告 学士 CB DB
アスキー図として視覚化された同じ関係:
D ---> B ^ / ^ | | / | | | / | | | 中 | A ---> C
この依存関係グラフには と の 2 つのサイクルがありADB
ますACB
。これらのサイクルを断ち切るには、たとえばモジュールC
をコンパイルしD
、ループ ブレーカーとして使用できます。明らかに、これは最良のアプローチではありません。ループ ブレーカーとしてコンパイルA
するだけで両方のループを完全に解除でき、ループ ブレーカーとしてコンパイルする必要があるモジュールが 1 つ少なくなります。