はじめに

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

これは、「Learn You Some Erlang for Great Good!」の始まりです。このチュートリアルを読むことは、Erlang学習の最初のステップの一つとなるでしょう。そこで、少し詳しく説明しましょう。

Erlang logo

まず、私はMiran Lipovača氏のLearn You a Haskell for great Good! (LYAH) チュートリアルを読んだ後、この本の執筆というアイデアを温め始めました。彼は言語の魅力を高め、学習体験を優しくすることに成功しており、素晴らしい仕事だと感じました。既に彼と面識があったため、彼のErlang版書籍執筆に関する考えを尋ねました。彼はErlangにも多少の関心があったため、このアイデアを気に入ってくれました。

というわけで、今こうして私はこれを書いています。もちろん、私のモチベーションには他にも要因がありました。私は主に、この言語への入門が難しいと感じていました(ウェブ上にはドキュメントが乏しく、そうでなければ書籍を購入する必要があります)。そして、LYAHのようなガイドがコミュニティにとって有益であると考えました。それほど重要ではありませんが、私は人々がErlangのメリットを過大評価したり、過小評価したりしているのを目にしました。それは、安易な一般化に基づいたものです。そして、Erlangは単なる流行だと信じている人もいます。彼らを説得したいとしても、まずこのチュートリアルを読む可能性は低いでしょう。

したがって、この本は、命令型言語(C/C++、Java、Python、Rubyなど)の基本的なプログラミング知識を持ち、関数型プログラミング(Haskell、Scala、Erlang、Clojure、OCamlなど)を知っていてもいなくても良い人を対象とした、Erlang学習の方法として役立つことを目指しています。また、この本を正直な方法で書き、Erlangの長所と短所を認めつつ、ありのままのErlangを紹介したいと考えています。

では、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は関数型プログラミングに対して非常に実用的なアプローチを取っています。その最も純粋な原則(参照透過性、変更可能なデータの回避など)に従いますが、現実世界の問題が発生した場合は、それらから逸脱します。

An envelope

さて、Erlangを関数型プログラミング言語として定義しましたが、並行性と高い信頼性にも大きな重点が置かれています。同時に数十ものタスクを実行できるようにするために、Erlangはアクタモデルを使用し、各アクタは仮想マシン内の個別のプロセスです。簡単に言えば、Erlangの世界であなたがアクタだったとしたら、あなたは窓のない暗い部屋に座り、メッセージが届くのを待つ孤独な人でしょう。メッセージを受け取ると、特定の方法で反応します。請求書を受け取れば支払いをし、誕生日カードには「ありがとうございます」の手紙で返信し、理解できない手紙は無視します。

Erlangのアクタモデルは、誰もが自分の部屋に一人で座っており、いくつかの異なるタスクを実行できる世界として想像することができます。誰もが厳密に手紙でコミュニケーションを取り、それだけです。退屈な人生(そして郵便サービスの新時代)のように聞こえますが、これは多くの人に非常に具体的なタスクを実行するように依頼でき、彼らの誰もが間違ったことをしたり、他の人の仕事に影響を与えるようなミスを犯すことはありません。彼らはあなた以外の人の存在さえ知らないかもしれません(そしてそれは素晴らしいことです)。

このアナロジーから脱するために、Erlangは、メッセージを互いに渡さない限り、他のコード部分と情報を共有しないアクタ(プロセス)を作成するように強制します。すべての通信は明示的で、追跡可能で、安全です。

Erlangを定義する際には、言語レベルで行いましたが、より広い意味では、それだけではありません。Erlangは全体として開発環境でもあります。コードはバイトコードにコンパイルされ、仮想マシン内で実行されます。そのため、ErlangはJavaや多動性のある子供たちのように、どこでも実行できます。標準配布には(その他にも)開発ツール(コンパイラ、デバッガ、プロファイラ、テストフレームワーク)、Open Telecom Platform(OTP)フレームワーク、Webサーバー、パーサジェネレータ、そしてmnesiaデータベース(多くのサーバーで自己複製できるキーバリューストレージシステムで、ネストされたトランザクションをサポートし、あらゆる種類のErlangデータを保存できます)が含まれています。

VMとライブラリを使用すると、実行中のシステムのコードを中断することなく更新したり、多くのコンピュータにコードを簡単に分散したり、シンプルながらも強力な方法でエラーや障害を管理したりすることもできます。

A crashed plane

これらのツールの使用方法と、後で安全性をどのように達成するかについては、後で説明しますが、今のところ、Erlangにおける関連する一般的なポリシーについて説明しましょう。「クラッシュさせてしまえ」。乗客数十人が死亡する飛行機のようなものではなく、安全網の下にいる綱渡り師のようなものです。間違いを避けるべきですが、ほとんどの場合、すべての型やエラー条件をチェックする必要はありません。

Erlangのエラーからの回復能力、アクタによるコードの編成、分散と並行性によるスケーラビリティはすべて素晴らしいものですが、次のセクションに進みましょう…

過剰な期待は禁物

本書には、このように名付けられた小さな黄橙色のセクションが多数あります(見れば分かります)。Erlangは現在、熱狂的な講演によって人気を集めており、人々がErlangを実際よりも優れたものだと信じさせる可能性があります。これらの注意喚起は、熱狂的な学習者の1人である場合、地に足をつけたままに役立ちます。

その最初のケースは、軽量プロセスによるErlangの巨大なスケーリング能力に関連しています。Erlangのプロセスは非常に軽量であることは事実です。同時に数十万ものプロセスを同時に存在させることができますが、そのためだけにそれを使用する必要はありません。たとえば、弾丸を含むすべてが独自のActorであるシューティングゲームを作成することは、狂気です。そのようなゲームで撃つことができるのは、自分の足だけです。Actor間でメッセージを送信するコストは依然として小さく、タスクを細かく分割しすぎると、速度が低下します

学習が進んで実際に心配するようになるまで、これについては詳しく説明しますが、ランダムに並列処理を問題に適用するだけでは、高速化できるとは限りません。悲しまないでください。数百のプロセスを使用することが可能で、有用な場合もあります!常にそうなるわけではありません。

Erlangは、コンピュータのコア数に比例してスケールするとよく言われますが、これは通常当てはまりません。悪いグラフ:速度対コア数:単にスケールする!可能です、しかしほとんどの問題は、すべてを同時に実行できるような方法で動作しません。

心に留めておくべきことがもう一つあります。Erlangはいくつかのことを非常にうまく実行しますが、技術的には他の言語でも同じ結果を得ることが可能です。その逆もまた真です。各問題を必要に応じて評価し、対処する問題に応じて適切なツールを選択してください。Erlangは万能薬ではなく、画像処理や信号処理、オペレーティングシステムのデバイスドライバなどには特に不向きです。一方、サーバー用途の大規模ソフトウェア(つまり、キュー、マップリデュース)、他の言語と組み合わせて作業を行うこと、より高レベルのプロトコル実装などでは、その能力を発揮します。中間の領域はあなた次第です。Erlangでサーバーソフトウェアだけにこだわる必要はありません。予期せぬ驚くべきことをしている例もあります。1つの例として、UNICTチームが作成したロボットIANOがあり、これは人工知能にErlangを使用しており、2009年のeurobotコンペティションで銀メダルを獲得しました。もう1つの例として、Erlangで記述され、クロスプラットフォームであるオープンソースの3Dモデラー(ただしレンダラーではない)Wings 3Dがあります。

始めるために必要なもの

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

DebianベースのLinuxディストリビューションでは、$ apt-get install erlangを実行することでパッケージをインストールできます。Fedora('yum'がインストールされている場合)では、# yum install erlangと入力することで同じことができます。ただし、これらのリポジトリには、多くの場合、Erlangパッケージの古いバージョンが含まれています。古いバージョンを使用すると、このチュートリアルで得られるものとの違いや、特定のアプリケーションのパフォーマンス低下が発生する可能性があります。したがって、ソースからコンパイルすることをお勧めします。パッケージ内のREADMEファイルとGoogleを参照して、必要なインストールの詳細をすべて入手してください。彼らは私よりもはるかに良い仕事をするでしょう。

FreeBSDでは、多くのオプションを利用できます。portmasterを使用している場合は、portmaster lang/erlangを実行できます。標準ポートの場合、cd /usr/ports/lang/erlang; make install cleanとする必要があります。最後に、パッケージを使用する場合は、pkg_add -rv erlangを実行します。

OSXを使用している場合は、$ brew install erlangHomebrewを使用)または$ port install erlangMacPortsを好む場合)を使用してErlangをインストールできます。

あるいは、Erlang Solutions Ltd.は主要なすべてのOS用のパッケージを提供しており、一般的にうまく動作します(「Standard」ディストリビューションを選択してください)。

注記: 本稿執筆時点ではErlangバージョンR13B+を使用していますが、最適な結果を得るには、新しいバージョンを使用することをお勧めします。

ヘルプの入手方法

ヘルプを入手できる場所はいくつかあります。Linuxを使用している場合は、優れた技術文書であるmanページにアクセスできます。Erlangにはlistsモジュールがあります(すぐに説明します)。listsのドキュメントを参照するには、$ erl -man listsと入力します。

Windowsでは、インストール時にHTMLドキュメントが含まれています。いつでも公式Erlangサイトからダウンロードするか、より整理された代替サイトを参照できます。

よりクリーンなコードを目指すようになったら、優れたコーディングプラクティスはこちらで確認できます。本書のコードもこれらのガイドラインに従うように努めています。

技術的な詳細だけでは不十分な場合もあります。そのような場合は、主に2つの情報源を利用します。公式メーリングリスト(多くのことを学ぶために購読することをお勧めします)と#erlangチャンネル(irc.freenode.net上)です。

また、料理本や既製のレシピを利用するタイプの方には、trapexitがお勧めです。彼らはメーリングリストをフォーラムと一般的なwikiとしてミラーリングしており、常に役立ちます。