いものやま。

雑多な知識の寄せ集め

GHCの使い方を調べてみた。(その10)

昨日はGHCでのビルドについて説明した。

今日はGHCで使えるオプションについて。
もちろん、全部は書けないので、基本的なものだけ。

オプションの種類と指定方法

まず、GHCのオプションは、次のように分類できる。

  • モード選択オプション
  • その他のオプション
    • 静的オプション
    • 動的オプション

モード選択オプションはGHCのモード(対話的に使うかや、ビルドを行うかなど)を指定するもので、いずれか1つだけをコマンドラインから選択できる。

モード選択を行った上で、他にもオプションをつけることが出来て、これらは静的オプションと動的オプションに分類される。

静的オプションはコマンドラインからのみ指定できるオプションで、GHC(もしくはGHCi)の実行中、ずっと有効になる。

一方、動的オプションは、コマンドラインから指定する他に、各ソースファイルにも指定することが出来る。
ソースファイルで動的オプションを指定した場合、そのソースファイルに対してのみ、そのオプションが有効になる。

動的オプションをソースファイルで指定するには、module宣言よりも前に、以下のプラグマを挿入する。

{-# OPTIONS_GHC ここにオプション #-}

例えば、特定のファイルについて、すべての警告を有効(-Wall)にして、最適化を無効化(-O0)させたかったら、次のようにすればいい。

{-# OPTIONS_GHC -Wall -O0 #-}

-- 以下、moduleの宣言

なお、ほとんどオプションは動的オプション。

モード選択オプション

モード選択オプションとして、次のようなものがある:

オプション 説明
--interactive GHCiを起動する。
--make 依存関係を解析してビルドを行う。
-e expr 式exprをGHCiと同様に評価して終了する。
-E プリプロセスだけ行う。(.hsppというファイルを出力する)
-C (可能なら)Cの中間コード(拡張子は.hc)を出力する。
-S アセンブラの中間コードを出力する。
-c オブジェクトファイルを出力する。
-M 依存関係の情報を出力する。
--mk-dll DLLを作成する。(Windowsのみ)
--help-? ヘルプを出力して終了。
--show-iface file インタフェースファイルfileを読んで、その情報を表示する。
--supported-extensions--supported-languages 対応している言語拡張を表示する。
--show-options 対応しているコマンドラインオプションを表示する。
--info コンパイラに関する情報を表示する。
--version-V バージョン情報を表示する。
--numeric-version バージョン番号(x.y.zという形式)のみを表示する。
--print-libdir ライブラリディレクトリのパスを表示する。

なお、デフォルトの指定は--makeなので、ビルドを行いたい場合は、モードを明示的に選択する必要はない。

ワンライナー

-eオプションは、PerlRuby-eオプションと同じで、ワンライナーを書くことが出来る。

$ ghc -e 'putStrLn "Hello, Haskell!"'
Hello, Haskell!
$ 

なお、引数にHaskellのソースファイルを指定した場合、それをロードした上で実行してくれる。

例えば、以下の通り:
(Fibo.hsはこれまでの記事で使ってたファイルと同じ)

$ ghc -e 'fibo 10' Fibo.hs 
55
$

Fibo.hsがロードされ、fibo関数を使えているのが分かると思う。
(GHCiと同様に評価するので、評価した結果が出力されることに注意)

インタフェースファイルの表示

--show-ifaceオプションを使うと、インタフェースファイルの中身を表示することが出来る。
(インタフェースファイル自体はバイナリなので、そのまま見ようと思っても見れないことに注意)

例えば、以下のとおり:

$ ghc --show-iface Fibo.hi 
Magic: Wanted 33214052,
       got    33214052
Version: Wanted [7, 1, 0, 2],
         got    [7, 1, 0, 2]
Way: Wanted [],
     got    []
interface Fibo 7102
  interface hash: 064153e95d1fe67be5eb34bc5bf283f7
  ABI hash: bd540c1e6f5e1eb55ce7369c86f38a04
  export-list hash: d1ca8dc7dc8f9d3138f7698ddb7e25dd
  orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e
  flag hash: b72619b91173ba000f4578573acc809f
  sig of: Nothing
  used TH splices: False
  where
exports:
  fibo
module dependencies:
package dependencies: base-4.8.1.0* ghc-prim-0.4.0.0
                      integer-gmp-1.0.0.0
orphans: GHC.Base GHC.Float
family instance modules: Control.Applicative Data.Either
                         Data.Monoid Data.Type.Equality GHC.Generics
import  -/  GHC.Num 9f42750c866f5832ca565146bd660c60
import  -/  Prelude 518f762991bc287d78f21a73c974da1f
import  -/  GHC.Integer.Type bf9b4d13b1dbe96a83786d2e47d2e8ca
ab66b1e48e3d51c592e95c69a3b8c08a
  fibo :: Integer -> Integer
vectorised variables:
vectorised tycons:
vectorised reused tycons:
parallel variables:
parallel tycons:
trusted: safe
require own pkg trusted: False

$

冗長出力に関するオプション

-vオプションを指定すると、冗長出力がされるようになる。

また、-v0-v1-v2-v3-v4オプションで、冗長出力のレベルをコントロールすることが出来る。

  • レベル0は冗長出力をしない。(デフォルトの動作)
  • レベル1はコンパイルやリンクの情報を1行を表示。(--make--interactiveのデフォルトの動作)
  • レベル2はコンパイルやリンクの情報を細かく表示。
  • レベル3はレベル2に加えて、他のツールに渡した引数も表示。(単に-vを指定した場合、この動作をする)
  • レベル4はレベル3に加えて、中間の出力も表示。

最適化に関するオプション

-Oオプションを指定すると、最適化が行われるようになる。

また、-O0-O1-O2オプションで、最適化をコントロールすることが出来る。

  • -O0は最適化をしない。(デフォルトの動作)
  • -O1コンパイル時間を犠牲にしない程度の最適化を行う。(単に-Oを指定した場合、この動作をする)
  • -O2は可能な限り最適化を行う。(コンパイルに時間がかかる)

警告に関するオプション

-Wオプションを指定すると、標準的な警告に加えて、いくつかの有用な警告が有効になる。
また、-Wallオプションを指定すると、(一部を除いた)ほぼすべての警告が有効になる。

基本的には-Wallを指定した方がいいと思う。

また、-Werrorを指定すると、警告がエラー扱いになる。(そこでビルドが止まる)
逆に、-Wwarnを指定すると、警告は警告として扱われる。(これは、コマンドラインから-Werrorを指定しているときなどに使える)

今日はここまで!