第10章 何かがうまくいかないとき

目次

10.1. コンパイラが「正しくないこと」をしたとき
10.2. あなたのプログラムが「正しくないこと」をしたとき

この節を読んでも問題が解決しない場合、あなたはバグを発見した可能性がある。どうか報告してほしい。1.3. GHCのバグを報告するには、どのようにバグを報告するか、と、バグについて我々が知りたいと思うことの一覧がある。疑わしいなら、報告してほしい。我々は激怒した利用者からのメールを愛している:-!

(13.1. Haskell 標準とGlasgow Haskell、言語上の不準拠点 には、Haskellの言語定義と比較してのGlasgow Haskellの欠点が載っている。これも読みたいと思うかもしれない。)

10.1. コンパイラが「正しくないこと」をしたとき

“助けて! コンパイラがクラッシュした(あるいは「panic」した)!”

これらが起きたときは常にGHCシステムのバグである。報告してほしい。

“これはひどいエラーメッセージ”

より良いエラーメッセージを出力できたと思うなら、バグとして報告してほしい。

“Cコンパイラからの警告は?”

例えば、“…warning: `Foo' declared `static' but never defined.”のようなもの。見苦しいが、問題はないはずである。

.hiインタフェースファイルに関する鋭敏性

GHCはインタフェースファイルについてとても敏感である。例えば、非標準のPrelude.hiを掴まされると、実に酷いことが起こるだろう。-XNoImplicitPreludeを、自分で何をしているか分からずに有効にすると、コンパイラはほとんど間違いなく死ぬ。

さらに、下にあるように、不安定なインタフェースを使ってコンパイルされたプログラムは、走らせる時に大いに困難を招く。

“GHCが間違ったコードを生成していると思うのだが”:

本当に? :-) -dcore-lintという「偏執的になれ」オプションが便利である。これによって、CoreからCoreへの変換毎に「lint」過程が誤り(とくに型エラー)を検査する。我々は常に-dcore-lint付きで実行している。これには大体コンパイル時間の5%ほど掛かる。

“リンクエラーが発生した。なぜ?”

リンカが_<なにか>_fastが見付からないと文句をいうなら、なにかが整合していない。おそらく、モジュールを正しい依存性順にコンパイルしなかったのだろう。

“この行番号は正しい?”

これに関しては、GHCはかなり良くやる。特に、一行か二行のずれを見逃してくれるなら。インスタンス宣言やクラス宣言の場合は、行番号は宣言を示すのであって、特定のメソッドではない。

行番号の誤りで特に困ることがあれば、報告してほしい。