出版社/著者からの内容紹介
Erlang(アーラン)とは、近年再評価されて注目を集めている関数型プログラミング言語です。
本書は、並行プログラミングに有効な言語として急速に一般にも認知され始めたErlangのバイブル的な解説書を翻訳するもの。
原著者はErlangの初期の頃からの開発者の一人。
著者からのコメント
我々が暮らすこの世界は並列に動いている。
実世界に存在する他のものと同じように振る舞うプログラムを書きたかったら、プログラムも並行構造になることだろう。
並行アプリケーションを書くために設計された言語を使えば開発はすごく簡単になる。
Erlang のプログラムがモデル化しているのは、我々が考えたりコミュニケーションする様なのだ。
Joe Armstrong
訳者序文
本書を手に取ったあなたがプログラミングをゼロから学ぼうという人ならば、非常に幸運だ。なぜなら、現在主流のC++ やJava といった言語の概念にとらわれることなく、シンプルでありながら強力なプログラミング言語を学べるからだ。あなたがプログラミングの経験者でも同様に幸運だ。なぜなら、これまでのプログラミングの経験に加えて、Erlang というすばらしい道具を活用できるようになるからだ。
さて、近年のWeb をベースとしたシステムの発展は、これまで通信機器など高可用性を重視する用途以外ではあまり知られていなかったErlang に新たな注目を浴びせることになった。Webは基本的に開かれたシステムであるため、比較的簡単にサービスを構築して公開することができる反面、大量のアクセスをさばかなければならない状況も起きやすい。いわゆるC10K 問題である。10K = 10000 個のクライアントからのアクセスをいかにして切り回すかはいまや多くのエンジニアの頭を悩ます問題となっている。C10K 問題は20 世紀の間に提起されていたのだから、それからさらにWeb が発展した現在ではどのような状況であるかは推して知るべしである。
前述のC10K のサイトを見てもわかるように、その解決策はマルチスレッドプログラミングを駆使した煩雑なものが多い。これでは本来提供したいサービスのことを考えるための余裕がなくなってしまう。また、オペレーティングシステムが提供するスレッド環境はコストが高いものが多く、クライアント1 つにスレッドを1 つ割り当てるような贅沢な使い方ではとても10000 個のクライアントをさばくことなどできない。
Erlang ならばそんな贅沢もまったく問題ない。余計なことを考えずにサービスを作ることに集中できるのだ。
また、処理能力を増やすためのハードウェア側からのアプローチとしては、従来は駆動クロックの高速化が一般的であった。しかし、主に熱の問題から現在の半導体の駆動クロックは数GHz で頭打ちになると考えられているため、その代わりに処理装置を増やす方向、つまりマルチプロセッサ化やマルチコア化に拍車がかかっている。ここ数年でマルチプロセッサやマルチコアのマシンは個人でも手に入れられるようになってきたが、その上で動作するソフトウェアの方はまだまだハードウェアを生かしきれていないのが実情だ。
では、どうすれば並列ハードウェアを生かしたソフトウェアを作ることができるのだろうか? 一般には、pthread などに代表されるいわゆるマルチスレッドプログラミングのためのライブラリやフレームワークを使うことが多いだろう。しかし、競合条件を正しく見極めて排他制御を正しく適用するのはなかなか難しく、熟練したプログラマでさえも間違いを犯しがちだ。実際、訳者もマルチコアマシン用のオペレーティングシステムを開発しているが、それでも自分自身がその手の同期バグを仕込んでしまうことがあるし、もっと注意深い人々でもミスは皆無ではない。
人間は誰でもちょっとした間違いをしてしまうものだから、ここはコンピュータの方でなんとかすべきところだ。残念ながら、C やC++、Java、それにPerl やRuby、Scheme などの言語には、そのような間違いをしないような仕組みは備わっていない。後付けの仕組みや実験的な取り組みはあるが、実用的ではなかったり、実績に乏しい。その点、Erlang はもともと並列処理を念頭に置いて設計されているから、変数の排他制御の問題などは本質的に存在しない。それはErlang が関数型プログラミング言語の特徴をうまく生かしているからだ。関数型プログラミングというと身構えてしまう人もいるかもしれないが、実はそんなに難しくない。それどころか、プログラムは命令型プログラミング言語で書かれたものよりもずっとわかりやすい。実のところ、Erlang は関数型プログラミング言語の中でも文法がとっつきやすく、関数型プログラミングの入門にも適している。
ところで、並列指向プログラミングはErlang の最も大きな特徴だが、実はErlang の強みはそれ以外にもある。「関数型」でしかも「並列指向」と来れば、研究室を出たことのない、実績に乏しいプログラミング言語であるかのような印象を抱く人もいるかもしれない。しかし、Erlang には20 年を超える歴史があり、高度な信頼性が要求される通信機器の分野でも実績がある。そのような実績はもちろんErlang の基本設計の見通しの良さによるところも大きいが、忘れてはならないのはOTP というフレームワークの存在である。詳しくは本書の後半の解説に譲るが、OTP は信頼性の高いシステムを作るためのノウハウがつまっている。大規模なシステムを構築し、長年にわたって更新しつつ運用していくためのいわばデザインパターンと言える。また、本書で取り上げているのはOTP のごく一部でしかなく、そのほかにも実際のシステム構築において培われた興味深い機能があるので、本書の次のステップとして覗いてみるのもよいのではないだろうか。
Erlang は歴史のある言語だが、今現在も進化を続けている。本書はErlang OTP R11B5 というリリースを元にしているが、本書発行の時点で既に次のR12B0 というリリースが出ている。今回のリリースは以前のリリースとの互換性を保っているので、本書で解説していることはそのまま通用するはずである。ただし、R12B0 ではエラーメッセージがわかりやすいように変更されているため、エラーメッセージについてはかなり異なる部分がある。
なお、本書の翻訳にあたって、誤解を生じない範囲であえて用語の統一を図らなかった部分がある。原著でも読みやすさを優先して1 つの概念をいくつかの言葉で言い換えており、翻訳でもその方針に従っている。特に、並列(parallel)と並行(concurrent)は厳密にはそれぞれ異なる概念を指す言葉であるが、原著同様統一していない点に注意されたい。
最後に、多忙な中で本書をレビューし、有益なコメントをくださった平岡和幸、檜山正幸、堀玄、向井淳の各氏にこの場を借りてお礼を述べさせていただきます。また、オーム社開発局の方々にも各面でのサポートをいただき、感謝しております。その他、ここで逐一お名前を挙げることはできませんが、さまざまな方からのご協力の下に本書を作ることができました。ありがとうございました。
2008年2月
榊原一矢
カバーの折り返し
昔々、あるプログラマが、不思議なプログラミング言語を説明している本に出会った。
そのプログラミング言語の構文は見慣れないもので、等号は等しいことを意味せず、変数の値は変えられなかった。著者が説き続けていたのは、並列処理、分散処理、耐障害性、それから、並行指向プログラミングと呼ばれる手法だった。
その夜、プログラマはチャットプログラムの例に目を通してみた。構文は少し変だったが、プログラムはとても小さくて理解しやすかった。
コードを何行か追加すればファイル共有や暗号化通信もできそうだった。プログラマはキーボードを叩き始めた......
(表1側)
----
「1台のコンピュータでできることは限られているが、コンピュータのネットワークで
できることには限りがない。Erlang はネットワークアプリケーションを実験したり、
実際の製品レベルの品質を備えたシステムを構築したりするための理想的な環境だ。」
第2章より
「Erlangプログラマにいい知らせがある:あなたのErlangプログラムはnコアプロセッサ
ではn倍速く動く可能性がある ---- しかもプログラムをまったく変えずに。」
第20章より
(表4側)
----
著者について
耐障害性を備えたアプリケーションをより良く作る方法を探る中で、1986 年にErlang の最初のバージョンを設計し、実装した。また、Erlang に関する一番最初の書籍を執筆し、Erlang に関する講座を初めて開催したのも筆者である。筆者が指導したプログラマの数は数百にものぼり、行った講義やキーノートは数え切れない。
筆者はスウェーデンのストックホルム王立工科大でコンピュータサイエンスの博士号を取得し、現在は耐障害システム設計の専門家として活躍している。以前にはErlang OTP を生み出したプロジェクトのチーフソフトウェアアーキテクトでもあった。また、最初のErlang スタートアップ企業の1 つであるBluetail には起業家として関わるなど、応用と研究の両面において30 年にわたる経験を持つ。
現在は、Erlang を使って耐障害性を高めた交換システムを構築しているEricsson AB に勤務している。
<訳者>榊原一矢(さかきはらかずや)
通信機器や画像処理機器のファームウェア、デバイスドライバなどの開発に携わった後、現在は家庭用ゲームコンソールのオペレーティングシステムを開発している。仕事を離れてもプログラムを書いたり物を作るのは好きだが、1 歳になる長男の面倒を見る合間にしかできないので、Erlang のような軽量プロセススイッチがあればなあと思う毎日。
著者略歴 (「BOOK著者紹介情報」より)
耐障害性を備えたアプリケーションをより良く作る方法を探る中で、1986年にErlangの最初のバージョンを設計し、実装した。また、Erlangに関する一番最初の書籍を執筆し、Erlangに関する講座を初めて開催した。指導したプログラマの数は数百にものぼり、行った講義やキーノートは数え切れない。スウェーデンのストックホルム王立工科大でコンピュータサイエンスの博士号を取得し、現在は耐障害システム設計の専門家として活躍している。以前にはErlang OTPを生み出したプロジェクトのチーフソフトウェアアーキテクトでも合った。また、最初のErlangスタートアップ企業の1つであるBluetailには起業家として関わるなど、応用と研究の両面において30年にわたる経験を持つ。現在は、Erlangを使って耐障害性を高めた交換システムを構築しているEricsson ABに勤務している
榊原 一矢
通信機器や画像処理機器のファームウェア、デバイスドライバなどの開発に携わった後、現在は家庭用ゲームコンソールのオペレーティングシステムを開発している(本データはこの書籍が刊行された当時に掲載されていたものです)