Erlang は、主に並行システムの開発と分散システムの開発に使用される、多目的のプログラミング言語です。Erlang の始まりは、Ericsson 社が自社の電気通信アプリケーション開発用に設計した専用のプログラミング言語でしたが、1998年以降はオープンソースとして公開されています。Erlang は Facebook チャット・システムなどの注目度の高いプロジェクトや、CouchDB ドキュメント指向データベース管理システムなどの革新的オープンソース・プロジェクトに採用されていることから、ここ数年の間、広範に使用されるようになってきました。この記事では、Erlang の概要、そして Erlang の関数型プログラミング・スタイルと他のプログラミング・パラダイム (命令型、手続き型、そしてオブジェクト指向のプログラミングなど) との違いを説明した後、初めての Erlang プログラム、フィボナッチ再帰関数を作成します。次に、C や C++、そして Java や Python を使い慣れている開発者にとって最初は難関となりがちな、Erlang 言語の基本をひと通り説明します。

Martin Brown, Professional Writer, Freelance Developer

author photoMartin Brown は過去 8 年以上プロのライターとして活躍してきました。彼はさまざまな話題に関して数多くの本や記事を執筆しています。専門領域は広く、無数の開発言語やプラットフォーム (Perl、Python、Java、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、Shellscript、Windows、Solaris、Linux、BeOS、Mac OS X その他) から、Web プログラミング、システム管理やシステム統合にまでわたります。彼は ServerWatch.com と LinuxToday.com、そして IBM developerWorks に頻繁に寄稿しており、また Computerworld や The Apple Blog などのサイトの他、Microsoft の SME (Subject Matter Expert) にもブロガーとして頻繁に寄稿しています。彼の連絡先は、彼の Web サイト http://www.mcslp.com/ です。



2011年 6月 10日

Erlang の概要

Erlang は、Ericsson 社が多種多様な電気通信プロジェクトの管理用ソフトウェアの開発を支援するために開発した言語です。この言語の最初のバージョンは 1986年にリリースされ、その後、1998年になって初めてオープンソースとしてリリースされました。このことは、Erlang 用のアプリケーション開発プラットフォームである OTP (Open Telecom Platform) がメインの Erlang 開発環境として提供されていることを記載した、Erlang の拡張リリース情報を見ればわかります。

Erlang は、他の言語にはない機能や、管理しにくい機能を標準として数多く提供しています。このような機能の多くが Erlang に存在する理由は、Erlang は電気通信から生まれた言語であるためです。

例えば、Erlang には非常に単純な並行性モデルが組み込まれており、個々のコード・ブロックを比較的簡単に同じホストで何度も実行できるようになっています。この並行性に加え、Erlang が使用するエラー・モデルでは、並行プロセス内で発生した障害を (それが新しいプロセスの場合でさえも) 特定して処理できるため、フォルト・トレラント性が高いアプリケーションをとても簡単に構築することができます。さらに、Erlang には分散処理が組み込まれており、あるマシンで実行されているコンポーネントを別のマシンから要求できるようになっています。

要するに、最近のネットワークや Web ベースのアプリケーションをサポートするために多用されているような、分散型のスケーラブルかつハイパフォーマンスのアプリケーションを構築するには、Erlang が絶好の環境となります。


関数型プログラミングと他のプログラミング・パラダイムとの違い

Erlang と、これよりも広く使用されている他の言語との大きな違いは、Erlang は第一に、関数型プログラミング言語であることです。関数型プログラミング言語であることは、関数をサポートするかどうかとはまったく関係ありません。関数型プログラミング言語であることが関係してくるのは、プログラムとコンポーネントがどのように実行されるかにおいてです。

関数型プログラミングでは、入力を取って結果を生成する関数に基づいて言語が実行されるという点において、数値計算と同じような方法で関数および動作は設計されます。関数型プログラミングのパラダイムは、個々のコード・ブロックが同じ入力値に対して一貫した出力値を生成することを意味します。つまり、関数やプログラムの出力を簡単に予測できるため、デバッグおよび分析が容易になるということです。

関数型プログラミング・パラダイムと対照的なのは、Perl や Java などの命令型プログラミング言語です。命令型プログラミング言語は、実行中のアプリケーションの状態を変化させることによって成り立ちます。命令型プログラミング言語で意味する状態の変化とは、プログラムのその時点での状態によって、プログラムの個々のコンポーネントが同じ入力値に対して異なる結果を生成する可能性があるということです。

関数型プログラミングの手法は理解しやすいものの、手続き型言語や状態に重点を置いた命令型言語に慣れているとしたら、この手法を適用するのに苦労することになりかねません。


Erlang を入手する

Erlang は Erlang Web サイト (「参考文献」を参照) から直接入手することができます。また、多くの Linux ディストリビューションには、そのリポジトリーに Erlang が含まれています。例えば Gentoo では、$ emerge dev-lang/erlang によって Erlang をインストールすることができます。また、Ubuntu または Debian ディストリビューションにインストールする場合には、$ apt-get install erlang を使用します。

上記以外の UNIX および Linux プラットフォームでも、ソース・コードをダウンロードして手動でビルドすることができます。ソースからビルドする場合には、C コンパイラーと make ツールが必要になります (「参考文献」を参照)。基本的な手順は、以下のとおりです。

  1. ソースを解凍する: $ tar zxf otp_src_R14B01.tar.gz
  2. ディレクトリーを変更する: $ cd otp_src_R14B
  3. 構成スクリプトを実行する: $ ./configure
  4. 最後に make を実行してビルドする: $ make

Windows インストーラーも、Erlang Web サイトから入手することができます (「参考文献」を参照)。


初めての Erlang プログラム、再帰的フィボナッチ関数

関数型プログラミング・スタイルの利点を理解するとともに、Erlang では関数型プログラミングがどのように機能するかを知るための絶好の方法は、フィボナッチ関数を調べることです。フィボナッチ数列とは整数の数列のことで、この数列に含まれるフィボナッチ数はどれでも常に、F(n) = F(n-1) + F(n-2) という式を使って計算することができます。

最初の値 F(0) の結果が 0 で、F(1) の結果が 1 だとすると、この後の値 F(n) は、前の 2 つの値を計算してその結果を加算することによって決定することができます。一例として、リスト 1F(2) の場合の計算を記載します。

リスト 1. F(2) の場合の計算
F(2) = F(2-1) + F(2-2)
F(2) = F(1) + F(0)
F(2) = 1 + 0
F(2) = 1

フィボナッチ数列は、財務データの分析を行うシステムをはじめとする多くのシステムにとって、重要な計算を手っ取り早く行う手段であり、木の幹や枝に葉を配置するための基礎となっています。例えば 3 次元の木を使用したテレビ・ゲームで遊ぶ場合、枝と葉の配置はおそらくフィボナッチ数列で計算されて、その位置が決定されるはずです。

プログラミング言語で計算をプログラミングするときには、関数がその関数自体を呼び出して、ルートである F(0)F(1) から数値を計算するという、再帰を使用することによって計算を確立できます。

Erlang で作成する関数には、変数だけでなく、固定値を持たせることもできます。この場合、フィボナッチ数列での状況は単純化されて、F(0)F(1) は計算された値ではなく、明示的な値を返します。

したがって、基本的な関数には 3 つの状況があるということになります。つまり、0 が提供された場合、1 が提供された場合、そして 1 よりも大きい値が提供された場合の 3 つです。Erlang では、これらの文を区切るにはセミコロンを使用するので、基本的なフィボナッチ関数はリスト 2 のように定義することができます。

リスト 2. 基本的なフィボナッチ関数
fibo(0) -> 0 ; 
fibo(1) -> 1 ; 
fibo(N) when N > 0 -> fibo(N-1) + fibo(N-2) .

最初の行で fibo(0) を呼び出したときの結果を定義し (「->」によって、関数の定義と本体が区切られます)、2 番目の行で fibo(1) を呼び出したときの結果を定義しています。3 番目の行で定義しているのは、正の値の N を指定した場合に実行する計算です。このプログラムは、パターン・マッチングと呼ばれる Erlang のシステムによって機能します (パターン・マッチングについては、後で詳しく検討します)。最後の文 (Erlang でのすべての文に該当します) はピリオドで終わっていることに注目してください。実際の計算は、このように至って単純です。

ここからは、Erlang 言語の構造について詳しく見ていきましょう。


基本

Perl や Python、あるいは PHP などの言語を使い慣れているとしたら、Erlang の構造とレイアウトは少し奇異に思えることでしょう。けれどもそこには、コードの多くの側面をそれほど心配しなくても済むように、あらゆるアプリケーションの作成プロセス全体を大幅に単純化するいくつかの側面があります。具体的に言うと、Erlang は他の言語に比べると、かなり簡潔に見えるはずです。特定の処理、式、構成体が 1 行に収まっていることも珍しくありません。

Erlang を知るには、Erlang シェルを使用するのが最も手っ取り早い方法です。Erland をインストールした後にコマンドラインで erl を実行すれば、Erlang シェルを実行することができます。この操作は、リスト 3 のとおりです。

リスト 3. Erlang シェルを使用する
$ erl
Erlang R13B04 (erts-5.7.5) [source] [rq:1] [async-threads:0]

Eshell V5.7.5  (abort with ^G)
1>

このプロンプトを使用して文を入力することができます。文は必ずピリオドで終了してください。文を完了すると、シェルがその文を評価します。したがってリスト 4 に示すような、単純な和を入力した場合には、その評価結果が返されます。

リスト 4. 単純な和を入力する
1> 3+4.
7

このシェルを使用して、これから各種の型と構成体を調べていきます。


数値の型

Erlang は、整数や浮動小数点数などの基本的なデータ型から、タプルやリストといった複雑な構造体までサポートします。

整数、そしてほとんどの整数演算は、他の言語の場合と変わりません。リスト 5 のようにして、2 つの数値を加算することができます。

リスト 5. 2 つの数値を加算する
1> 3+4.
7

括弧を使用すると、計算をグループにまとめることができます (リスト 6 を参照)。

リスト 6. 括弧を使用して計算をグループ化する
2> (4+5)*9
2> .
81

リスト 6 の文を終了するピリオドは別の行に入力されています。このピリオドによって、前の行に入力された計算が評価されることに注意してください。

Erlang での浮動小数点数は、実数を表すために使用され、リスト 7 のように自然な形で表現することができます。

リスト 7. 自然に表現された浮動小数点数
3> 4.5 + 6.2 . 
10.7

浮動小数点数は、指数を使って表現することもできます (リスト 8 を参照)。

リスト 8. 指数を使用して表現された浮動小数点数
4> 10.9E-2 +4.5
4> .
4.609

標準的な数学演算子 (+、-、/、*) は、整数と浮動小数点数の両方でサポートされるため、計算のなかに浮動小数点数と整数を上手く組み合わせることができます。ただし、モジュロに相当する演算子や上記以外の演算子は整数値でしかサポートされないので、これらの演算子を浮動小数点数に使用するとエラーが発生します。


アトム

アトムは、静的 (あるいは定数) リテラルです。リスト 9 に一例を記載します。

リスト 9. アトム
8> abc.
abc
9> 'Quoted literal'.
'Quoted literal'

アトムの使い方は、C で #define 値を使用する場合と同じです。つまり、値の指定または識別を簡潔にするための方法として使用します。したがって、アトムで有効な演算は比較だけです。このようにアトムはブール論理にも使えるようになり、true または false のアトムを使用して文に対するブール演算の結果を明らかにできるようになります。アトムの先頭文字は小文字にする必要がありますが、小文字を使用する代わりに、単一引用符で囲んでアトムを区別するという方法も使えます。

例えばリスト 10 のように、整数同士を比較して、その結果としてブール値のアトムを取得することができます。

リスト 10. 整数を比較してブール値のアトムを取得する
10> 1 == 1.
true

アトム同士を比較することもできます (リスト 11 を参照)。

リスト 11. アトムを比較する
11> abc == def.
false

アトム自体は、辞書方式で順序付けされるので、例えば z は、a よりも大きな値を持ちます (リスト 12 を参照)。

リスト 12. 辞書方式で順序付けされるアトム
13> a < z.
true

標準的なブール演算子 (andorxor、および not) を使用できる他、is_boolean() 関数を使用して、指定の値が true または false のどちらであるかを確認することもできます。


タプル

タプルは、項目の集合を保管するために使用する複合データ型です。タプルを区切るには、波括弧を使用します (リスト 13 を参照)。

リスト 13. タプル
14> {abc, def, {0, 1}, ghi}.
{abc,def,{0,1},ghi}

タプルに含まれる値がすべて同じ型である必要はありません。ただし、最初の値がアトムとなっているタプルは特殊な構成体です。この場合、最初のアトムはタグと呼ばれ、タプルに含まれる値を識別または分類するために使用することができます (リスト 14 を参照)。

リスト 14. 最初の値がアトムのタプル
16> { email, 'example@example.org'}.
{email,'example@example.org'}

上記のタプルでは、email がタグとなっています。このタグを利用して、タプルの残りの値を識別することができます。

タプルは、定義された要素を格納して、異なる複合データ構造を記述するのに大いに役立ちます。しかも Erlang では、タプル内の値を明示的に設定および取得することができます (リスト 15 を参照)。

リスト 15. タプル内の値を明示的に設定および取得する
17> element(3,{abc,def,ghi,jkl}).
ghi
18> setelement(3,{abc,def,ghi,jkl},mno).
{abc,def,mno,jkl}

タプルを構成する要素のインデックスは、1 から始まることに注意してください (ほとんどの言語では、0 から始まるのが一般的となっています)。最後に付け加えておく点として、タプル全体を比較することもできます (リスト 16 を参照)。

リスト 16. タプル全体を比較する
19> {abc,def} == {abc,def}.
true
20> {abc,def} == {abc,mno}.
false

リスト

最後に取り上げるデータ型は、角括弧で示されるリストです。リストとタプルは似ていますが、タプルは比較する場合にしか使用できないのに対し、リストには多種多様な操作を行うことができます。

基本的なリストは、リスト 17 のようになります。

リスト 17. 基本的なリスト
22> [1,2,3,abc,def,ghi,[4,56,789]].
[1,2,3,abc,def,ghi,[4,56,789]]

ストリングは実のところ、特殊な型のリストです。Erlang はストリングの概念を直接サポートしませんが、二重引用符で囲んだ値を使用することで、ストリング値を作成することができます (リスト 18 を参照)。

リスト 18. 値を二重引用符で囲んでストリング値を作成する
23> "Hello".
"Hello"

ただし実際には、ストリングは ASCII 整数値のリストにすぎません。そのため、上記のストリングは ASCII 文字の値のリストとして保管されます (リスト 19 を参照)。

リスト 19. ASCII 文字の値のリストとして保管されたストリング
24> [72,101,108,108,111].
"Hello"

手っ取り早い方法として、$Character 表記を使って文字を指定することもできます (リスト 20 を参照)。

リスト 20. $Character 表記を使用して文字を指定する
25> [$H,$e,$l,$l,$o].
"Hello"

ストリング (文字のリスト) が含まれるリストは、さまざまな操作方法をサポートします。これは、ストリングとアトムの大きな違いを際立たせている点です。アトムは静的な識別子ですが、ストリングはその構成要素 (それぞれの文字) を調べることによって操作することができます。アトムは単一のエンティティーであるため、例えばアトムに含まれる単語 ('Quick brown fox' など) を個別に識別することはできません。その一方、リストでは ["Quick","brown","fox"] というように、ストリングを単語別に分割することができます。

リストを操作するための関数の多くは、lists モジュールに提供されています。例えば、リスト内の項目をソートするための sort 関数などです。これらの関数は組み込み関数ではないので、使用するには、モジュールおよび関数の名前を指定する必要があります (リスト 21 を参照)。

リスト 21. モジュールおよび関数の名前を指定する
34> lists:sort([4,5,3,2,6,1]).
[1,2,3,4,5,6]

リストの操作

複数の要素が含まれるリストを作成するには、コンストラクターを使用します。コンストラクターは、1 つの要素と別のリストからリストを作成します。他の言語では、このようなコンストラクターは関数または push() の演算子で処理されますが、Erlang では | (パイプ) 演算子を使って head (リストの先頭) と tail を区別します。つまり、[head | tail] という表記になります。head は単一の要素であり、tail はリスト内の残りの要素です。

リスト 22 に、リストの先頭に新しい値を追加する方法を示します。

リスト 22. リストの先頭に新しい値を追加する
29> [1|[2,3]].
[1,2,3]

この操作は、リスト全体で繰り返すことができます (リスト 23 を参照)。

リスト 23. リスト全体で値の追加を繰り返す
31> [1|[2|[3|[]]]].
[1,2,3]

上記の例で最後にある空のリストは、適格な (正しい) リストが完成したことを意味します。また、もう 1 つ注意する点として、最初の項目はリストの一部ではなく、要素です。一方、逆方向でマージする場合には、ネストされたリストを作成します (リスト 24 を参照)。

リスト 24. ネストされたリストを作成する
30> [[1,2]|[2,3]].
[[1,2],2,3]

リストをマージするもう 1 つの方法として、++ 演算子を使うこともできます (リスト 25 を参照)。

リスト 25. ++ 演算子を使用してリストをマージする
35> [1,2] ++ [3,4].
[1,2,3,4]

演算子の左側にあるリストから、右側にあるリストに含まれる要素を個別に除去することもできます (リスト 26 を参照)

リスト 26. リストから要素を個別に除去する
36> [1,2,3,4] -- [2,4].
[1,3]

ストリングはリストであるため、ストリングにもリストと同じ操作が適用されます (リスト 27 を参照)。

リスト 27. ストリングにも同じ操作が適用されます
37> "hello" ++ "world".
"helloworld"
40> ("hello" -- "ello") ++ "i".
"hi"

以上の説明は、データ型の表面をかじっただけに過ぎませんが、基本的な型と操作について理解していただけたことを願います。


式とパターン・マッチング

さまざまなデータ型を見てきたなかで、これまで式と構成体をすでにいくつも目にしました。式を構成する重要な要素の 1 つは、変数です。Erlang での変数は、先頭文字が大文字でなければなりません。その後に、大文字と小文字、そしてアンダーバーを任意に組み合わせて続けます (リスト 28 を参照)。

リスト 28. Erlang での変数
41> Value = 99.
99

Erlang での変数の代入は、その変数に値を 1 度束縛するだけです。変数をいったん束縛すると、後はその値を変更できなくなります (リスト 29 を参照)。

リスト 29. 変数に値を束縛する
42> Value = 100.
** exception error: no match of right hand side value 100

変数を定義するということは、他の言語では値が可変であることを意味するのが一般的ですが、Erlang での変数はそれとは異なります。このような 1 回限りの代入は、値の結果を計算する場合、その結果を新しい変数に代入しなければならないことを意味します (リスト 30 を参照)。

リスト 30. Erlang での変数の制約
43> Sum = Value + 100
199

このように 1 回しか代入が許可されないことには、計算中に変数の値が意図的に、もしくは誤って変更される可能性が低くなるという利点があります。それはつまり、プログラミングの段階で値を特定してデバッグするのが至って簡単にできるということです。さらに、構造を単純化できることから、コードが簡潔になり、場合によっては遥かに短縮されることにもなります。

この演算は、値が計算されてから変数に束縛されることを意味することに注意してください。一方、他の言語の場合には、関数や演算に対する参照を利用して値を設定することができます。つまり、アクセスした時点での参照の値によって、値が異なる場合があるということです。Erlang では、変数の値は常に、その変数の作成時に既知となります。

変数の束縛を明示的に解除するには、f(Varname) を使用して特定の変数の束縛を解除することや、f() を使用してすべての変数の束縛を解除することができます。

変数に値を代入するということは、実際には特殊なタイプのパターン・マッチングということになります。Erlang でのパターン・マッチングは、個々の文の実行フローも処理し、複合データ型 (タプル、配列) から値を個別に抽出します。したがって、基本的なパターン・マッチングは、Pattern = Expression となります。

式を構成するのは、データ構造体、束縛された変数 (つまり、値が割り当てられた変数)、数学演算、そして関数呼び出しです。演算の左側と右側が一致する必要があります (つまり、2 つの要素からなるタプルをパターンとして使用する場合、式は 2 つの要素からなるタプルに解決されなければならないということです)。式が実行されると、式が評価され、その結果がパターンに割り当てられます。

例えば、1 つのパターン・マッチングによって、2 つの変数に同時に値を割り当てることができます (リスト 31 を参照)。

リスト 31. 2 つの変数に同時に値を割り当てる
48> {A,B} = {(9+45),abc}.
{54,abc}

評価の際には、パターンまたはパターンの要素が束縛された変数である場合、パターン・マッチングの結果は比較になることに注意してください。このことは、さらに強力な選択割り当てを可能にします。例えば、タプルから名前と E メールを取得するには、{contact, Name, Email} = {contact, "Me", "me@example.com"} というパターン・マッチングを使用することができます。

パターン・マッチングによって、前述の構成体表記を使用したリストあるいはタプルから要素を取得することもできます。リスト 32 に一例として、リストから最初の 2 つの要素を取得し、残りを維持する方法を示します。

リスト 32. リストから最初の 2 つの要素を取得して残りを維持する
53> [A,B|C] = [1,2,3,4,5,6].
[1,2,3,4,5,6]

A には値 1B には値 2 が割り当てられていて、C にはリストの残りの要素が割り当てられています。


関数

Erlang での関数は、他のあらゆる言語と同様に、すべてのプログラムの基本構成要素です。関数は sum(N,M) -> N+M というように、関数名 (アトムによって定義) と、括弧で囲まれた関数への引数 (引数がない場合も、複数ある場合もあります) からなります。

関数は、ファイル内でモジュール内部に定義しなければなりません (シェルから関数を定義することはできません)。引数には、さらに複雑な型を含めることができます。例えば、タプル内のタグを使用して異なる演算を選択することができます (リスト 33 を参照)。

リスト 33. タプル内のタグを使用して異なる演算を選択する
mathexp({sum, N,M}) -> N+M ;
mathexp({sub, N,M}) -> N-M ;
mathexp({square, N}) -> N*N.

セミコロンは、各関数定義の間に置かれる OR 演算子です。関数への引数を評価するにはパターン・マッチングが使用されるため、3 つの要素を持つタプルを mathexp() 関数に渡すと、パターン・マッチングは失敗します。

Erlang の関数は、異なる個数の引数を受け入れることもできます。その場合、有効な関数定義が見つかるまでパターン・マッチングが評価されて、正しい関数定義が選択されます。関数への引数の個数はアリティーと呼ばれ、関数を識別するために使用することができます。

これで、前に説明したフィボナッチの例で fibo(0) が呼び出されると、このパターンが最初の関数定義と一致して値を返し、fibo(1) が 2 番目の関数定義と一致して値を返す一方、その他すべての値は最後の定義と一致することになる仕組みが理解できたはずです。これはまた、関数の再帰的実行がどのような動作をするのかも明らかにします。例えば fibo(9) を呼び出すと、fibo(0) 関数とfibo(1) 関数に到達して固定値が返されるまで、該当する値を持つ fibo(N) 関数が呼び出されるというわけです。

すべての関数の戻り値は、該当する節 (記事の例には、1 つの行しかありませんが) に含まれる最後の式の結果です。変数が割り当てられるのは、一致が見つかった場合で、しかもその変数が関数のローカル変数となっている場合のみです。


モジュール

モジュールは、他の言語におけるモジュールと同じく、同様の関数をまとめて 1 つに整理するために使用されます。

他のプログラムに関数をエクスポートしたい場合には、その関数が含まれるモジュール名をファイル内で指定してから (ファイル名とモジュール名は一致していなければなりません)、該当する関数を指定し、プログラムにそのモジュールをロードさせます。一例として、リスト 34 に fib.erl ファイルを記載します。このファイルには、fib モジュールが定義されています。

リスト 34. fib.erl ファイル
-module(fib).
-export([fibo/1, printfibo/1]).

%% print fibo arg. and result, with function as parameter

printfibo(N) -> 
   Res = fib:fibo(N),
   io:fwrite("~w ~w~n", [N, Res]).

fibo(0) -> 0 ; 
fibo(1) -> 1 ; 
fibo(N) when N > 0 -> fibo(N-1) + fibo(N-2) .

このモジュールが指定されているのは、-module() の行です。-export() にはエクスポートする関数のリストが含められます。各関数の指定には、関数名と併せて関数のアリティーが示されています。これにより、指定の関数定義そのものをエクスポートすることが可能になります。

モジュールを使用するには、モジュールをコンパイルしてからロードしなければなりません。それには、シェル内で c() 文を使用します (リスト 35 を参照)。

リスト 35. c() 文を使用してモジュールをコンパイルおよびロードする
1> c(fib).
{ok,fib}
2> fib:printfibo(9).
9 34
ok

fib モジュールに含まれる printfibo() 関数を確実に呼び出すために、関数呼び出しにはこのモジュールの名前が含められている点に注目してください。


まとめ

Erlang プログラムの構造と形式は、他のほとんどの言語とは大きくかけ離れています。データ型と基本的な式の多くは他の言語と共通していますが、それらの使い方および応用する方法は多少異なります。単一代入変数、そしてパターン・マッチング・システムによって実証されている異なる式の評価の重要性が、標準的な言語環境に強力な拡張機能をもたらします。例えば、同じ関数に対して複数の使用方法を定義し、再帰関数の呼び出しにパターン・マッチングを使用できるということは、一部の関数を単純化できることを意味します。

次回は、Erlang のプロセス、メッセージ構文解析、およびネットワーク機能について取り上げ、この言語の能力と柔軟性を理解する手段として、MochiWeb HTTP サーバーを取り上げます。

参考文献

学ぶために

  • Erlang Web サイト: このプログラミング言語についての詳細を調べてください。
  • ウィキペディアの Erlang に関する記事: Erlang の歴史をより深く学んでください。
  • Erlang and OTP in Action』(Martin Logan、Eric Merritt、Richard Carlsson 共著、Manning Publications) は、OTP フレームワークを使用して、Erlang で実用的なアプリケーションを作成することに興味を持つ開発者のための一冊です。
  • Erlang プログラミング』(Francesco Cesarini、Simon Thompson 共著、オライリー・ジャパン) では、並行性、耐障害性、そして素早い応答が必要不可欠な場合に理想的なプログラミング言語、Erlang について詳しく説明しています。
  • プログラミング Erlang』(Joe Armstrong 著、オーム社) では、ネットワークやハードウェア故障にも耐える、信頼性に優れたアプリケーションを Erlang プログラミング言語で作成する方法を説明しています。
  • developerWorks podcasts: ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
  • Technical events and webcasts: developerWorks Live! briefings で時代の流れに乗ってください。
  • Twitter での developerWorks: developerWorks をフォローして最新ニュースを入手してください。
  • 興味深いイベント: 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブ放送をチェックしてください。
  • developerWorks Open source ゾーン: オープンソース技術による開発、そして IBM 製品でオープンソース技術を使用するときに役立つ広範囲のハウツー情報、ツール、プロジェクト・アップデート、そして人気の高い記事とチュートリアルを調べてください。
  • developerWorks Web architecture ゾーン: さまざまな Web ベースのソリューションを話題にした記事を調べてください。
  • developerWorks オンデマンド・デモ: 無料のオンライン・デモで、IBM およびオープンソースの技術と製品機能を試してみてください。

製品や技術を入手するために

  • Erlang: Erland プログラミング言語をダウンロードしてください。
  • The Apache CouchDB Project: Erlang で作成され、MochiWeb HTTP サーバーを利用する CouchDB は、Apache から入手できます。
  • IBM ソフトウェアの試用版: 試用版ソフトウェアを使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

議論するために

  • developerWorks コミュニティー: ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, XML
ArticleID=678246
ArticleTitle=Erlang プログラミング入門: 第 1 回 基本
publish-date=06102011