ソースコードの再コンパイルを強制する

 GHCでは無駄なソースコードの再コンパイルやプログラムの再ビルドを防ぐため,ソースコードをコンパイルしたりプログラムをビルドしたりするかどうかを,ファイルの更新日時やソースコードの中身などを検査して決めます。しかし,ときにはこの検査が邪魔になることがあります。

 例えば,この検査は第45回第46回で紹介したGHCのプロファイル機能の妨げになります。-auto-allオプションを追加してコスト集約点を設定したり,-caf-allオプションを追加してCAFの情報を表示したりするときに,ソースコードに変化がないことを理由にプログラムが再ビルドされなくなってしまうのです。

 同様の問題は,RTSオプションを使用するために第43回のコラムで説明した-rtsoptsオプションや-with-rtsopts=*オプションを使おうとした場合,プログラムを並列動作させるために-threadedオプションを使おうとした場合(参考リンク),最適化オプションを変更したり,-ddump-simplオプションや-ddump-prepオプションなどを使ってGHCコアを出力させたりする場合にも起こります。

 そこでGHCには,ソースコードの再コンパイル条件に対する検査を停止する「-fforce-recomp」というオプションが用意されています。(参考リンク)。


著者紹介 shelarcy

 今回の正格性解析器の説明では,正格性解析の結果の見方とGHCの正格性解析器の振る舞いについて説明しただけで,GHCがどのように正格性を判断しているのかについては触れませんでした。詳しく知りたい方は,GHCの正格性解析について説明した「Measuring the effectiveness of a simple strictness analyser」という論文やGHCのソースコードのコメントを見てください(参考リンク1参考リンク2)。また,GHCの正格性解析器とは若干異なりますが,2010年12月に開催された「Haskell Advent Calendar」というイベントの企画記事の一つとして酒井政裕氏が執筆した「正格性解析 (Strictness Analysis)」という記事にも説明があります。