Erlang (アーラン)が流行っているみたいなので、
はじめてみることにしました。
作業履歴のまとめは以下のリンクに掲載しました。
[O] これから15分でErlangを始めるための資料
さて、まずはErlangの意味を調べてみようと思います。
Erlangとは - totowa トトワ
エリクソン社により次の条件のシステムを構築できるよう設計された。
並列処理に適したプログラミング言語で、1987年に登場し、1998年に
はオープンソース化されているので新しく登場した言語というわけではな
いが、時流に乗る形で、現在にわかに注目を集め始めている。
1987 年頃、スウェーデンの電話会社である Ericsson で開発された
関数型言語です。
並列処理が得意なので,それに関しては他の言語より圧倒的に速いのは
確認したけれど, わたしがよく使う通常の処理に関してもどの程度違うの
か測定してみた。
以下に、ぐだぐだと記録することにします。
はじめに、コンパイラをなんとかしないといけないので、
ともかくerlang.orgにいくことにした。
Erlang
erlang.orgで、最初に教科書っぽいpdfを見つけた。やったね。
Concurrent Programming in Erlang, Part I (pdf 884 KB)
The first part of the Erlang Reference book (by permission of Prentice Hall).
いろいろ調べると、Debianはapt-getでerlangをインストールできるみたい。
apt-get install erlang
インストール完了。
Erlang Land
Rubyist Magazine - Rubyist のための他言語探訪 【第 10 回】 Erlang
を眺めながら、とりあえずsample.erlを書いてみることにする。
Emacsを起動したらErlang modeになった。嬉しい。
Hello world - Wikipedia "Erlangでの例
-module(sample).
-export([hello_world/0]).
hello_world() -> io:fwrite("Hello, World!\n").
上記のようなsample.erlを書いたあと、erlを立ち上げてコンパイル。
%erl
Eshell V5.5.2 (abort with ^G)
1> c(sample).
{ok,sample}
2> sample:hello_world().
Hello, World!
ok
3>
おお、できたできた。なんか半分満足。
次はフィボナッチ変数でもやってみようかな。
Rubyist Magazine - Rubyist のための他言語探訪 【第 10 回】 Erlang
を読んで、ついでにいろいろなことを理解することにした。
- Erlang の変数はすべて大文字またはアンダースコア (_) で始まる
- Erlang の変数は一度だけ代入可能。複数回ダメ。ループは再帰か高階関数
- 型の解決は動的。
- Erlang は関数型言語。状態がない (副作用がない)とか。
- module名は小文字始まり。よってファイル名は小文字。
- あ、型がないからオーバーロードできない。
- exportは関数名/引数の数を、関数の数だけ配列に突っ込む。
- module,export,recordは先頭に-が付く。
- elseがない。そのため、if文は式の連続、else代わりのtrue、
引数などの条件をしぼるwhenを使う。
- if文は実行された式があったら終了
fact.erl
-module(fact).
-export([fac/1]).
fac(0) -> 1;
fac(N) when N > 0 -> N * fac(N-1).
実行してみた。
%erl
[/home/satou/.../Erlang/bin#]
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0]
[kernel-poll:false]
Eshell V5.5.2 (abort with ^G)
1> c(fact).
{ok,fact}
2> fact:fac(5).
120
3> fact:fac(4).
24
4> fact:fac(3).
6
5> fact:fac(2).
2
6> fact:fac(1).
1
- trueとfalseがある。勝手に型を推定してくれるっぽ。
- ifは
if
式1;
式2;
式3
end.
- caseは
case X of
1 -> "hoge";
2 -> "fuga";
3 -> "foobar";
_ -> "piyo"
end.
- Erlangのスレッドは共有される状態がないので、プロセスといえる。
- よってErlangではスレッドをプロセスと呼ぶ。
- Erlangのプロセスは超軽量。
- Erlangのプロセスがプロセス間で共有するものを持たないということは、
Erlangのプロセスは単一OSプロセスにしばられず、存在できる。
- Erlangのプロセスはプロセス間通信をメッセージで行う
- メッセージの送出は「!」、メッセージの受信は「receive」。
- mathモジュールってのがある
- 変数 = 値.、と書くと代入できる
[root@]#erl
[/home/satou/.../Erlang/bin#]
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0]
[kernel-poll:false]
Eshell V5.5.2 (abort with ^G)
1> X=10.
10
2> X=10.
10
3> X=20.
=ERROR REPORT== 9-May-2007::20:09:35 =
Error in process <0.30.0> with exit value:
{{badmatch,20},[{erl_eval,expr,3}]}
exited: {{badmatch,20},[{erl_eval,expr,3}]} **
4> X>10.
false
5> X==10.
true
ふむ、なるほど。
今日は眠くなったのでまた明日やろうかな。