9.2. GHCをライブラリとして使う

ghcパッケージはGHCのフロントエンドの大部分をユーザに露出し、それを活用するプログラムを書けるようにする。実際、このライブラリはGHC内部のフロントエンドコンパイルドライバが使っているものと同じであるので、ソースコードをプログラム的にコンパイルしたり中身を読んだりするツールを書くことを可能にする。このような機能はIDEやリファクタリングツールの類を書くのに便利である。単純な例として、ここに示すのは、GHCがデフォルトで行うのとちょうど同じようにモジュールをコンパイルするプログラムである。

import GHC
import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
 
main = 
    defaultErrorHandler defaultDynFlags $ do
      runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "test_main.hs" Nothing
        setTargets [target]
        load LoadAllTargets

runGhcの引数はやや注意を要する。GHCは自分のライブラリ群を見付ける必要があるので、この引数はghc --print-libdirで出力されるディレクトリでなければならない。ただし、このプログラムをコンパイルするのに使っているのと同じバージョンのGHCを使う必要がある。したがって上では、これを供給するghc-pathsパッケージを使っている。

これをコンパイルすると次のようになる。

$ cat test_main.hs
main = putStrLn "hi"
$ ghc -package ghc simple_ghc_api.hs
[1 of 1] Compiling Main             ( simple_ghc_api.hs, simple_ghc_api.o )
Linking simple_ghc_api ...
$ ./simple_ghc_api
$ ./test_main 
hi
$ 

このAPIを使うことについてのさらなる情報および、サンプルとリファレンスについては、Haskell.org wikiのこのページを見てほしい。