最近、Haskellを勉強中。
概念的なところは分かってきたと思うのだけど、まだ実際にプログラムを書いたりとかはほとんど出来ていなくて、使えるようになるのはまだまだ先な感じ。
とりあえず、実際にコードを書いていくことが出来るようにするために、ツールの基本的な使い方について調べてみた。
GHC?
GHCというのはGlasgow Haskell Compilerの略で、Haskellの事実上の標準の処理系になっている。
GHCにはGHCiという対話環境(コマンドはghci
)とコンパイラ(コマンドはghc
)が用意されている。
あと、Haskellのソースコードをスクリプトとして走らせるrunghc
というコマンドもある。
なお、ghci
とghc
は実際には同じプログラムで、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
コードの詳細は説明しないけど、これは、
- "Hello, Haskell!"を表示。
- "What's your name?"を表示して、入力待ちになる。
- 文字列が入力されて改行が押されると、"Hi, 入力された文字列 !"を表示。
- プログラム名と起動引数を表示。
という動作をするコード。
これを
の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
ちゃんと実行されているのが分かると思う。
今日はここまで!