関数型言語が人気の理由

このところ関数型言語の書籍の発行・話題で賑わっています。OCamlやHaskell、Erlang、Scalaといった名前を聞いたことがあるのではないでしょうか? また、Googleが発表したGo言語という名前も知っている方もいるでしょうし、マイクロソフトからはF#という関数型言語がリリースされたことをすでにご存じの方もいるでしょう。

なぜ今関数型に注目が集まっているのでしょうか? 最初にその理由の1つであるキーワードから見ていきましょう。

キーワードで見る関数型

皆さんがインターネットで何か調べる際、検索サービスを利用することでしょう。中にはGoogle社の検索サービスなども一度は利用したことがあるのではないでしょうか?

このGoogle社が提供している検索サービスは『クラウド』と呼ばれる大規模な分散コンピューティングシステムで実現されています。

またここ数年に発売されているパーソナル・コンピュータに搭載されているCPUが『マルチコア(複数CPU搭載⁠⁠』になっているのを目にすることでしょう。CPUが複数搭載される利点は、簡単に説明すると、今までのパーソナル・コンピュータに比べて、処理能力が倍増するということになります。このことにより、仮想現実、3D、音声入力などなど、様々な利用分野を考えることができます。

並列コンピューティング(分散コンピューティング)

先ほどマルチコア搭載のパーソナル・コンピュータで、仮想現実、3D、音声入力などなど様々な利用分野を考えられると説明しましたが、一般的なパーソナル・コンピュータでマルチプロセッサを有効に活用するには、どうしたら良いでしょうか?

マルチプロセッサを有効活用するには、並列化を意識したプログラムを行う必要があります。具体的には下記2点の内容です。詳しくは、関数型書籍を参照してください。

  • 同時に動作するタスクに分割する
  • 共有リソースに対するロックや競合、同期の課題(一貫性の課題)

上記2点を意識した、並列化が可能なアルゴリズムでプログラムを開発すれば、並列化(マルチプロセッサ)による性能向上が得られることになります。

このアルゴリズムを実現するには、言語レベルで「関数に同じ引数を与えれば、同じ値を返す」必要があります。これは、近年主流のオブジェクト指向言語であるC#やJavaでは難しい問題です。たとえば以下のC#で記述したプログラムを見てください。

int total = 0;                  // 変数の定義
int totalOfIntA(int a)          // 整数の合計を求めるメソッド
{    
     total += a;
     return total;
}
int sub = totalOfIntA(1);       // 1が返る
sub = totalOfIntA(2);           // 3が返る

このプログラムは「total」という変数に依存します。つまり、totalの値を変えてしまうと、結果がかわってしまいます。ところが、関数型で記述した下記例では、引数以外の要素に左右されていないことがわかります。

// 整数の合計を求めるメソッド
int totalOfIntB(int a, int subTotal)
{
     return a + subTotal;
}
int sub = totalOfIntB(2,        // 別々にも記述できます
            totalOfIntB(1, 0) );      // 3が返る

このように、複数のCPUを使ったプログラミングや分散コンピューティングが、昨今関数型言語に注目が集まっている理由となります。

皆さんもこれを機に、関数型言語を学んでみてはいかがでしょうか?