いものやま。

雑多な知識の寄せ集め

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

最近、Haskellを勉強中。

概念的なところは分かってきたと思うのだけど、まだ実際にプログラムを書いたりとかはほとんど出来ていなくて、使えるようになるのはまだまだ先な感じ。

とりあえず、実際にコードを書いていくことが出来るようにするために、ツールの基本的な使い方について調べてみた。

GHC

GHCというのはGlasgow Haskell Compilerの略で、Haskellの事実上の標準の処理系になっている。

GHCにはGHCiという対話環境(コマンドはghci)とコンパイラ(コマンドはghc)が用意されている。
あと、Haskellソースコードスクリプトとして走らせるrunghcというコマンドもある。

なお、ghcighcは実際には同じプログラムで、ghc--interactiveというオプションを渡すと、対話モードで起動する。

インストール

GHCをインストールするには、Haskell Platformをインストールするといい。

Haskell Platformをインストールすると、GHCの他に、HaskellのパッケージングシステムであるCabalや、基本的なパッケージもインストールされる。

各コマンドの基本的な使い方

とりあえず、各コマンドの基本的な使い方を確認してみる。

まず、次のようなHaskellソースコードを用意してみた。

-- Hello.hs

import System.Environment
import Data.List

main = do
    putStrLn "Hello, Haskell!"
    putStrLn "What's your name?"
    name <- getLine
    putStrLn $ "Hi, " ++ name ++ "!"
    progName <- System.Environment.getProgName
    args <- System.Environment.getArgs
    putStrLn $ "program: " ++ progName
    putStrLn $ "args: " ++ intercalate ", " args

コードの詳細は説明しないけど、これは、

  1. "Hello, Haskell!"を表示。
  2. "What's your name?"を表示して、入力待ちになる。
  3. 文字列が入力されて改行が押されると、"Hi, 入力された文字列 !"を表示。
  4. プログラム名と起動引数を表示。

という動作をするコード。

これを

の3通りの方法で実行してみる。

対話環境からロードして実行

まずは、対話環境からロードして実行してみる。

GHCiを起動するには、ghciコマンドを使う。

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> 

対話環境が立ち上がると、デフォルトでは上のようなプロンプトが表示される。

さっそく、ソースコードをロードしてみる。
ロードに使うコマンドは:load(省略形は:l)で、引数にソースファイルの名前(拡張子は省略)を指定する。

Prelude> :load Hello
[1 of 1] Compiling Main             ( Hello.hs, interpreted )
Ok, modules loaded: Main.
*Main> 

そうすると、ソースコードバイトコードコンパイルされて、ロードされる。
なお、名前のついていないモジュールは、Mainという名前のモジュールになるみたい。

ロードが出来たので、プログラムを実行してみる。

プログラムにに引数を与えて実行するには、:mainコマンドを使う。
適当な引数を与えて実行すると、以下のようになる。

*Main> :main hoge huga
Hello, Haskell!
What's your name?
Yamaimo  -- ここは文字列を入力した
Hi, Yamaimo!
program: <interactive>
args: hoge, huga
*Main> 

ロードされたプログラムが実行されたのが分かると思う。

GHCiを終了するには、:quitコマンド(省略形は:q)を使う。
(あるいは、Ctrl-DでもOK)

*Main> :quit
Leaving GHCi.

スクリプトとして実行

次に、スクリプトとして実行してみる。

スクリプトとして実行するには、runghcコマンドの引数にソースコードと起動引数を指定すればいい。

$ runghc Hello.hs hoge huga
Hello, Haskell!
What's your name?
Yamaimo  -- ここは文字列を入力した
Hi, Yamaimo!
program: Hello.hs
args: hoge, huga

ソースコードスクリプトとして実行されたのが分かると思う。

なお、コンパイルしているわけではないので、ファイル(オブジェクトファイルや実行ファイル)が増えたりはしない。

コンパイルして実行

最後に、コンパイルして実行ファイルを作り、実行してみる。

コンパイルするには、ghcコマンドを使う。

$ ls
Hello.hs
$ ghc Hello.hs 
[1 of 1] Compiling Main             ( Hello.hs, Hello.o )
Linking Hello ...
$ ls
Hello*          Hello.hi        Hello.hs        Hello.o

引数にソースコードを指定して実行すると、コンパイルとリンクが行われ、実行ファイルが作られる。

ちなみに、拡張子が.hiのファイルはインタフェースファイルというもので、C言語のヘッダファイルみたいなものと考えておけばいいっぽい。(バイナリだけど)
このファイルは、このモジュールに依存するモジュールをコンパイルするときに使われる。

出来上がった実行ファイルを実行すると、以下のようになる。

$ ./Hello hoge huga
Hello, Haskell!
What's your name?
Yamaimo  -- ここは文字列を入力した
Hi, Yamaimo!
program: Hello
args: hoge, huga

ちゃんと実行されているのが分かると思う。

今日はここまで!