GHCによるHaskellの3つの実行方法とHello World

昨日のエントリーHaskell処理系であるGHCをインストールしたので、実際にこれを使ってみましょう。

まずはオーソドックスに、ソースコードを作成してコンパイルしてみます。(Haskell本 P.17)

hello.hs

main = putStrLn "Hello, World!"

コンパイルして、実行します。

$ ghc -o hello hello.hs
$ ./hello
Hello, World!

おおおおお、表示出来ましたね!(某サイト風 笑)

さて、GHCには普通にコンパイルするだけではなく、ほかにインタプリタと対話式の実行方法があります。
例えば、インタプリタコンパイルせずにちょっとソースコードを試してみたいとき、対話式の実行方法(Rubyではirbと言うコマンドがありますね)は、ちょっとした実験をしてみるときに便利です。

では、インタプリタを実行してみましょう。コマンドは「runghc」です。

$ runghc hello.hs
Hello, World!

コンパイルせずに、ソースコードから直接実行できました。

最後に対話式です。コマンドは「ghci」です。

$ ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.6.1, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> putStrLn "Hello, World!"
Hello, World!

対話式環境から抜けるときは、:quitコマンド、もしくはCtrl-Dを押します。

Prelude> :quit
Leaving GHCi.

コンパイルインタプリタ>対話式 の順に、実行までの手順が多いですが、もちろんトレードオフになるのは「実行速度」です。

コンパイル済みの実行ファイルを実行

$ time ./hello
Hello, World!

real    0m0.004s
user    0m0.000s
sys     0m0.004s

インタプリタで実行

$ time runghc hello.hs
Hello, World!

real    0m0.259s
user    0m0.120s
sys     0m0.124s

やはり、大きな差がつきます。対話式では時間が測りにくいですが、実際一番遅いと思われます。

この3つのモードは、開発時に使い分けることで効果を発揮するんでしょうね。特に、対話式があるのは、RubyJRubyのときもそうですが、ちょっとした言語特性を見るときに大変便利です。