Haskellとそれ以外の言語の大きな違い
Haskellで利用されている「関数」は、プログラミング言語でいうところの関数ではなく、数学的な意味合いでの関数に相当する。つまり「ある変数に依存して決まる値あるいはその対応を表す式」ということだ。例えばCのように「返り値がない関数」がある言語とは「関数」の意味が異なる。
Haskellをはじめとした関数型の言語では、プログラムを「目的は何か(What)」という点に着目して記述する。その目的に沿った関数を定義していくことがプログラミングになる。これに対してCやJavaなどの手続き型/命令型言語では「目的をどのように達成するか(how)」を記述する。
この違いによって、Haskellは非常にシンプルで理解しやすいコードを記述でき、生産性が高くなる。しかし最初に述べたように、手続き型言語の思考法に慣れたプログラマにとっては、移行が難しいと感じるケースが多いようだ。
さらにHaskellを特徴づけているのが「遅延評価」だ。前述のようにHaskellの関数は、ある値を関数に与えると常に同じ値を返す。つまり、定義されている関数の返り値が必要なときまで、その評価を遅延してもプログラムの実行上、問題がないということになる。また必要な評価だけを必要なときにのみ行うため、実行にかかる時間を短縮できる可能性が高くなる。
なおHaskellではこの評価を明示的に順序立てて行う機能もあるが、通常はどの関数が評価されているかを調べる方法がない。つまりJavaやC言語のようなスタックトレースは行えないということだ。
まとめ〜Haskellとは
- 純粋な関数型言語である
- 現在主流の処理系はGHC
- 「目的は何か(What)」という点に着目して記述する宣言型の言語である
- コードを短く記述できるため、生産性が高い
- 遅延評価をサポートし、遅延関数言語として研究対象になっている
- 手続き型/命令型の言語からの移行は難しいと感じるユーザが多い
非常に駆け足でHaskellの概要と処理系、多言語との違いについて解説してきた。
現在、メジャーではない言語の中では比較的注目を集めているHaskellだが、一方でそれ自体が研究対象となるなど「研究段階/研究目的の言語」という意見もある。しかし、window manager「xmonad(http://xmonad.org/)」や、シューティングゲーム「monadius(http://www.geocities.jp/takascience/haskell/monadius_ja.html)」など、Haskellによる実装のチャレンジが進められている。
さらに今後訪れるであろう多CPU/多コア時代に、関数型言語は並行・並列プログラム(現在GHCでサポート済み)や分散プログラム時に、わざわざそれを意識したコードを記述しなくても効率的なリソース配分が行える可能性が高いと考えられている。
もちろんこれらの理想は、大いに活用されはじめてこそ実現されるものだ。いざそのときになって「学んでおけばよかった」と後悔する前に、ぜひチャレンジしておきたい。
次回は
次回の公開は11月12日で、ブラジル生まれのスクリプト言語「Lua」を取り上げる。 タイトルへ戻る