1. イントロダクション

1.1. このチュートリアルについて

この章は”Learn You Some Erlang for Great Good!”(訳:役に立つErlangを教えてやるよ!)のはじまりです。 このチュートリアルを読むことは、Erlangを学ぶ最初のステップかもしれないので、ちょっとErlangについてお話ししましょう。

../_images/erlang1.png

まず始めに、私はMiran Lipovačaさんが書いた “Learn You a Haskell for great Good!” (LYAH)のチュートリアルを読んでから、このドキュメントを書くというアイデアをふくらませてきました。 MiranさんはHaskellの魅力を伝え、丁寧に学び方を教えたという点で素晴らしい仕事をしたと思います。 彼は知人だったので、私が彼の本のErlang版を書くのはどうか?と聞いてみました。 彼はそのことをとても気に入ってくれて、Erlangにも興味を持ってくれました。

というわけで、いまこの文章をタイプしているわけです。もちろん上に書いただけではなくて、他のモチベーションあります: 一番の理由は、このErlangという言語がとても取っ付きにくい言語で(ウェブにはあまりドキュメントがなく、本を買う必要があるということ)、開発者コミュニティにとってLYAHのようなガイドを書くことは有益だと思ったからです。 重要度は下がりますが、他の理由としては、人々がErlangの利点を語るときの説明が、極端な一般化に基づいているため、過剰だったり不足していたりするのを見かけたからです。これによって、Erlangは誇大広告にすぎないと確信してしまっている人がいます。 彼らにErlangの実際はそうではないことを納得させたいとした場合、彼らはそもそもこの文章を読まないと分かっています。

したがって、この本は、基本的な手続き型プログラミング(C/C++, Java, Python, Rubyなど)の基本的な知識を持っていて、関数型プログラミング(Haskell, Scala, Erlang, Clojure, OCaml...)をあんまり知らない人がErlangを学びたいと思ったときの参考になればいいなと思って書かれました。 私はこの本を正直に書きたいと思ったので、Erlangのありのままを、短所も長所も含めて書こうと思います。

1.2. で、Erlangって何?

なによりもまず、Erlangは関数型プログラミング言語です。もし手続き型言語で仕事をしたことがあるなら、 i++ のような命令は普通に感じられると思います。関数型プログラミングではそういったことは許されません。 実際、どんな変数でも値を変更することは厳しく禁止されています!最初のうちは奇妙に思えるかもしれませんが、数学の授業を思い出せば、同じようなことを習ったとおもうはずです:

y = 2
x = y + 3
x = 2 + 3
x = 5

次を追加してみます:

x = 5 + 1
x = x
∴ 5 = 6

とても混乱したことと思います。関数型プログラミングではこのように解釈します:もしxが5なら、論理的に それを6でもあるとは言えません!そんなのはいい加減です。 このような性質は同じパラメータを与えられた関数は常に同じ結果を返すべきという、関数型プログラミングの性質も説明しています:

x = add_two_to(3) = 5
∴ x = 5

常に同じパラメータに対して常に同じ結果を返すような関数は参照透過であると言われます。この性質のおかげで、 add_two_to(3) を5と置き換えることができるわけです。なぜなら 3+2 の結果は常に5になるからです。 これはつまり、より複雑な問題を解決するために、何も壊すことなく何十もの関数をくっつけることができるということを意味しています。 論理的で綺麗だと思いませんか?しかし問題もあります:

x = today() = 2009/10/22
-- wait a day --
x = today() = 2009/10/23
x = x
∴ 2009/10/22 = 2009/10/23

なんてこったい!美しい等式が!(ノд`) 瞬く間に間違った式になってしまった!どうして私の関数は毎日異なった結果を返すようになってしまったんでしょう?

明らかに、いくつかのケースでは参照透過性を破ることが有効なこともあります。Erlangではとても実用主義的なアプローチで関数型プログラミングを行っています:純粋主義(参照透過性、破壊的データを避けるなど)に従いつつ、実世界で問題が発生した場合はそれを取り払います。

../_images/envelope1.png

いま、Erlangを関数型プログラミング言語だと定義しましたが、同時並行性と高い信頼性も強く強調したい点です。同時に何十ものタスクを処理できるようにするために、Erlangではアクターモデルを使っています。さらに個々のアクターは仮想マシン内で別のプロセスとなっています。 簡単にいえば、もしあなたがErlangの世界のアクターだった場合、あなたは孤独な人間で、窓もない暗い部屋に座っていて、メールボックスにメッセージが届くのを待っている状態です。そしてメッセージを受け取ると、それに対して特定の方法で反応します:メッセージを受け取るときにお金を払い、誕生日カードには「ありがとう(“Thank you”)」という文字で返事をし、理解出来ない文字は無視するという具合です。

Erlangのアクターモデルはすべての人が自分の部屋に座っていて、いくつかの異なったタスクをこなしている世界と思うことが出来ます。人々は文字を書くことで厳格にコミュニケーションをとっていて、それが全てです。 退屈な人生(そして郵便業務の夜明け)のように聞こえるかもしれませんが、多くの人に非常に限られた用途のタスクを頼むことができて、誰もおかしなことや他の人の仕事に影響をあたえるような間違いをしません。さらにいうと彼らはあなた以外の存在を知らないのです。(それはいいことですね)

このアナロジーから抜けるために、Erlangはアクター(プロセス)を書くことに集中させてくれます。アクターはお互いにメッセージを飛ばさない限り1ビットも共有しません。すべてのコミュニケーションは明示的で、追跡可能で安全です。

先ほどErlangを定義したときは言語レベルで定義しました。しかし広い意味で見ると、Erlangは言語だけに収まりません。Erlangは全体で開発環境でもあるのです。コードはバイトコードにコンパイルされて、仮想マシン内で動作します。 したがってErlangはJava(や多動症候群の子供のように)どこでも動作することができます。標準ディストリビューションでは開発ツール(コンパイラ、デバッガ、プロファイラ、テストフレームワーク)とOpen Telecom Platform (OTP)フレームワーク、Webサーバ、パーサジェネレータ、Mnesiaデータベース(多数のサーバにレプリケートできるKey-Valueストレージで、ネストされたトランザクションをサポートし、どんな種類のErlangデータでも保存できます)などを含んでいます。

VMとライブラリは、稼動しているシステムのコードを他の稼働中のプログラムを止めることなく更新したり、たくさんのコンピュータに簡単にコードを配布したり、エラーやフォルトをシンプルにかつ強力に管理することも可能にしてくれます。

../_images/letitcrash1.png

これらのツールをどのように使って、どのように安全に運用するかは後ほど触れるとして、今はそれに関係するErlangの一般的なポリシーをお教えします:「クラッシュするならさせておけ」です。 これはたくさんの死にかけた乗客を乗せた飛行機というよりは、下にネットが敷いてある綱渡りのようなものです。間違いを避けるべきとは言いましたが、たいていの場合は型やエラーになる条件をすべて確認する必要はありません。

Erlangがエラーから回復したり、アクターでコードを管理したり、配布することでスケールしたり、信じられないほど並行処理ができたりする機能は、次の章でご紹介いたしましょう...

1.3. Don’t drink too much Kool-Aid

この本の中には”Don’t drink too much Kool-Aid”と名前がついた小さい囲みがたくさん出てくると思います。(出てくればわかるでしょう)Erlangはいま実際の機能以上のことを語られた過大な宣伝のせいで人気を得ているところもあります。 この小さな囲みでは、こういった話を聞いてうわっつきやすい方のために、しっかりと地面に足をつけられるようなことを書くつもりです。

最初の例はErlangの軽量プロセスによって強力にスケールできる能力に関連したお話です。 たしかにErlangのプロセスがとても軽量だというのは真実です:何百、何千もの軽量プロセスを同時に起動させることができます。しかしそれが出来るからと言って、同時にそんな数の軽量プロセスをたてる必要はありません。 たとえば、すべての弾丸がそれぞれアクターになっているようなシューティングゲームを作るなんていうのは狂気の沙汰です。そんなシューティングゲームを作る前に自分の足を撃ったほうがいいです。アクター間でメッセージのやりとりをするときに小さなキャストがあります。タスクを細かく分けすぎると、動作が遅くなってしまいます!

これに関してはこういったことを心配するくらいにErlangについて理解が深まったときにもっと詳しく解説するとして、とりあえず今のところは、むやみに並行処理にさせると速度を速くするときに問題があるということだけ覚えておいてください。 悲しくならなくて大丈夫です:何百ものプロセスを使える機会もありますし、またそれが役に立つ時が来ます! ただそれは常にそうではないというだけです。

../_images/scaling1.png

Erlangはコンピュータのコア数に直接比例してスケールすることができるとも言われています。しかしこれは通常は真ではありません:そうなりえますが、一番の問題は全てを同時に稼動させることが出来ないということです。

他にも心にとどめておいてほしいことがあります:Erlangはいくつかの点で非常に利点がありますが、それは技術的に他の言語でも同じことができるものです。また逆も言えます。個々の問題をどうなって欲しいかというところで評価して、問題となっている箇所に応じて正しいツールを選択してください。 Erlangは銀の弾丸ではないのです。例えば画像処理や信号処理、OSのデバイスドライバなどには向いていません。逆に巨大なサーバソフトウェア(キューやMapReduce)や他の言語との接続、さらには高レベルプロトコルの実装などでは光るものがあります。ミドルウェアに何を使うかはあなたの自由です。 Erlangをサーバソフトウェアを書くことだけ使おうと可能性を閉じ込めるべきではありません。予期しないそして驚くべき用途にErlangを使っている事例もあるのです。 ひとつの例としてIANOというUNICTチームが作成したロボットが挙げられます。このプロジェクトではErlangを人工知能に使っていて、2009 Eurobot Competitionで銀メダルを獲得しました。他の例としてはWings 3Dがあります。これはオープンソースの3Dモデラー(レンダラーではない)で、Erlangで書かれているクロスプラットフォーム対応になっています。

1.4. 何に飛び込んだらいいのか?

Erlangを始めるにはテキストエディタとErlang環境だけ整えればよいだけです。ソースコードとWinodwsバイナリはErlangの 公式ウェブサイト から取得できます。ここではインストールの詳細については触れませんが、Windowsではバイナリをダウンロードして実行するだけです。 コマンドラインからErlang環境にアクセスできるように、Erlangディレクトリをシステム環境変数PATHに追加することを忘れないようにしてください。

DebianベースのLinuxディストリビューションでは、パッケージを $ apt-get install erlang としてインストールすることができます。Fedoraでは(もし ‘yum’ がインストールされていれば)同様に # yum install erlang としてインストールすることが出来ます。 しかしながら、これらのレポジトリでのErlangパッケージはしばしば古いバージョンだったりします。古いバージョンを使っているとこのチュートリアルで書かれていることと違う結果になる可能性があります。また特定のアプリケーションでパフォーマンスが頭打ちになる可能性があります。 だから、私はソースからコンパイルすることをおすすめします。パッケージ内のREADMEファイルを参照したり、インストールに必要な情報をGoogleで調べたりしてみてください。私よりもいい方法でインストールしているかもしれません。

OS Xの場合は、私は手助けできません。僕はMacを持ってないので。でも、 MacPorts の助けを借りてErlangをインストールすることができます。

Note

このドキュメントを書くに当たっては、ErlangはR13Bを使いました。 したがって良い結果を得るにはR13Bかそれより新しいバージョンを使いましょう。

1.5. どこで助けを得たらいいのか?

助けを得られる場所はいくつかあります。Linuxを使っているなら、manページにアクセスして品質のよい技術文書を見ることが出来ます。Erlangにはlistsモジュール(すぐに見ると思います)があります:listsモジュールに関するドキュメントを見たい場合は、 $ erl -man lists とタイプすればよいだけです。

Windowsでは、インストールの時にHTMLドキュメントが含まれています。これはいつでも Erlangの公式サイト <http://erlang.org/doc/>他のミラーサイト からダウンロード可能です。

すべてを綺麗にしたいと思っているなら、きれいなコードの実例が ここ にたくさん出てきます。この本のコードもそのガイドラインに沿っています。

技術的な詳細を知りたいなと思ったときにはこれではまだ不十分です。そういうときは私は2つのソースを漁ることにしています。1つは 公式メーリングリスト (多くのことを学ぶために購読すべきです)でもう1つはIRCサーバ irc.freenode.net 上のチャンネル #erlang#erlang-otp です。

ああ、あとあなたがクックブックとか既存のレシピが好きな人だったら、 trapexit がおすすめです。メーリングリストのコピーをフォーラムや一般的なWikiの形で公開しているので、役に立つと思います。