新刊ピックアップ

関数型言語が人気の理由

この記事を読むのに必要な時間:およそ 1 分

このところ関数型言語の書籍の発行・話題で賑わっています。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を使ったプログラミングや分散コンピューティングが,昨今関数型言語に注目が集まっている理由となります。

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