かなり久々の更新。
最近何かと話題のプログラミング言語 Erlang の入門書がようやく日本語で読めるように。ということでさっそく読んでみました。
Erlang はスウェーデンの通信機器メーカー、エリクソン社が開発した関数型言語です。他の関数型言語にはない大きな特徴として並行処理と分散処理のサポートが上げられます。 Erlang 自体は結構枯れた言語ということですが、この並行処理と分散処理のサポートのおかげで、最近は(ごく一部で?)注目を集めているようです。
なぜ並行処理と分散処理がサポートされていることで注目を集めているのか?という疑問に答えるためには、最近になって CPU 開発の方向性が変わってきていることに触れる必要があります。
CPU の性能の指標として一番わかりやすいものに“クロックスピード”があります。CPU は、クロックと呼ばれる定期的に発生する時間刻みにしたがいながら命令を実行していきます。一秒間あたりにクロックを何回発生させるかがクロックスピードです。当然、クロックスピードを早くすればその分一秒間あたりに実行できる命令数は多くなるので CPU の性能が上がることになります。つい最近まではこの方法で CPU は性能を向上させてきました。
もちろん、いまでもクロックスピードを上げることで性能を向上させよう(させたい?)という基本的な動きに変わりはないのですが、ここにきて様々な技術的制約によりクロックスピードを上げにくいような状況になってしまっているのです。そこで最近の Intel や AMD は、クロックスピードを上げるよりもコア数を増やし並行処理で CPU の性能を強化しようという方針にシフトしているわけです。
ところが、たとえば CPU の数を二倍にしたからといって性能も単純に二倍になるかというとそうはいかないわけです。OS や実行するプログラム側で同時に複数の CPU を利用するような工夫がされていなければせっかく二つある CPU も片方しか利用されません。しかしプログラム側でマルチコアを有効活用できるような工夫をするのは結構面倒で…
ということで、並行処理と分散処理を言語の特徴として謳う Erlang ってどうなんだろう、と、実は結構まえから気になっていたのです。
そして… ちょっと魔法のようなモノを期待しちゃってたかもしれません…
読んでみての率直な感想を言うと、“やっぱりお手軽に並行実行可能なプログラムを書くことはできないんだな”と、すこしがっかりしてしまいました。“逐次実行っぽくない”、“状態を持たない”といった聞きかじりの知識による偏見たっぷりの関数型言語への無理解も手伝い、プログラマがまったく意識しなくても並行処理してくれるような凄いモノを想像しちゃっていたので…
並行処理について触れるのは一番最後の章で、フィボナッチ級数を求める関数を並行実行させているんですけど、なんか pthread で実装させるのとたいして変わんないんじゃない?ってくらい並行処理を意識しなきゃならない実装になっているような気がしました。メモリを共有しない(できない?)ことで同期処理について意識する必要がなくなるという特徴についてもうすこし説明が欲しいように感じましたが、それは普通の thread プログラミングの知識を前提しなければ難しいのかもしれません。
ただ Erlang という言語を学ぶ本としては割とよくできているように思います。例文もしっかりしていて、はじめて関数型言語に触れるというひとでも読みやすいんじゃないでしょうか。ただ関数型言語の勉強がしたい、というのであれば、個人的には“ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門”の方が極端でおすすめですが…
はたしてプログラマがなにも意識せずともマルチコアの恩恵をうけるプログラムが書けるようになる時代は来るのでしょうか。
以下は参考です。
- Erlang – Wikipedia
- http://ja.wikipedia.org/wiki/Erlang
※ Erlang が具体的なコードを用いながら説明されています。 - マルチコア – Wikipedia
- http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3%E3%82%A2
※ クロックスピードを上げにくくなっている技術的背景が詳しく説明されている。
