お気楽 Erlang プログラミング入門と Yet Another Erlang Problems のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
Erlang (アーラン) は 1987 年ごろスウェーデンの電話会社 Ericsson (エリクソン) で開発された「関数型言語」です。Erlang は Prolog (論理型言語) の影響を強く受けているので、一般的な関数型言語とはちょっと毛色が異なっているところがあります。たとえば、リストのパターンマッチングは Prolog にそっくりで、このような関数型言語があったのかと M.Hiroi はとても驚きました。Prolog を知っていると、Erlang にもすぐに馴染めるのではないかと思っています。
M.Hiroi は Erlang でプログラミングするのは初めてです。Erlang の特徴である「プロセス」による並行プログラミングを目標に、簡単なプログラムを作りながら Erlang を勉強していきたいと思っております。たいしたことはできませんが、よろしければお付き合いくださいませ。
Erlang は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、簡単にインストールすることができます。
なお、M.Hiroi がダウンロードしたインストーラではパス (環境変数 Path) の設定が行われません。Windows 10 でパスを設定する場合、コントロールパネル > システムとセキュリティ > システム の左端にある「システムの詳細設定」をクリックしてください。「システムのプロパティ」が表示されるので、その下側にある「環境変数」をクリックすると環境変数を設定することができます。
コントロールパネルは スタートボタン > Windows システムツール > コントロールパネル で起動することができますが、シェルや「ファイル名を指定して実行」から control と打ち込んでも OK です。実はもうひとつ簡単な方法があって、[Windows] キーと [Pause] キーを同時に押すと、コントロールパネルのシステム画面を表示することができます。
ubuntu 系の OS の場合、次のコマンドで Erlang をインストールすることができます。
sudo apt install erlang
なお、これでインストールされる Erlang は最新バージョンではないことに注意してください。2024 年 10 月現在、Ubuntu 22.04 (WSL2) では Erlang/OTP 24 がインストールされます。
プログラムの実行は Eshell (Erlang shell) 上で行うと簡単です。Windows の場合、werl.exe を実行すると Eshell のウィンドウが開き、プログラムを入力して簡単に実行することができます。コマンドプロンプト (cmd.exe) や PowerShell で実行する場合は erl.exe を使います。Linux の場合はコマンド erl を実行してください。
終了する場合は halt(). または q(). を入力します。なお、Erlang では入力の終わりにピリオド ( . ) が必要になります。ご注意くださいませ。
$ erl Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit] Eshell V12.2.1 (abort with ^G) 1> halt(). $
ただし、Eshell 上で関数を定義することはできません。プログラムはファイルに記述して、それを読み込むことになります。ファイルの拡張子は .erl です。ファイルの読み込みは Eshell に用意されている関数 c() を使います。c(filename) はファイル名 filename のファイルを読み込み、バイトコードにコンパイルします。たとえば、階乗を求める関数 fact がファイル fact.erl に記述されている場合は次のようになります。
リスト : 階乗 -module(fact). -export([fact/1]). fact(0) -> 1; fact(N) -> N * fact(N - 1).
Eshell V12.2.1 (abort with ^G) 1> c(fact). {ok,fact} 2> fact:fact(9). 362880 3> fact:fact(10). 3628800 4> fact:fact(20). 2432902008176640000
fact.erl をコンパイルすると fact.beam というファイルが生成されます。関数 l() を使って beam ファイルをロードすることもできます。
Eshell V12.2.1 (abort with ^G) 1> l(fact). {module,fact} 2> fact:fact(10). 3628800
なお、 Erlang には HiPE (High Performance Erlang) というネイティブコードにコンパイルする仕組みが用意されていましたが、Erlang/OTP 23 で廃止されたようです。Erlang/OTP 24 で使用することはできません。ご注意くださいませ。
さて、気になる実行速度ですが、たらいまわし関数を使って調べてみました。
リスト : たらいまわし関数 (Erlang) -module(tak). -export([tak/3]). tak(X, Y, Z) when X =< Y -> Z; tak(X, Y, Z) -> tak(tak(X - 1, Y, Z), tak(Y - 1, Z, X), tak(Z - 1, X, Y)).
それでは実行結果を示します。tak(22, 11, 0) を計算しました。なお、Erlang の時間計測には timer モジュールの関数 tc を使いました。
Eshell V12.2.1 (abort with ^G) 1> c(tak). {ok,tak} 2> timer:tc(tak, tak, [22, 11, 0]). {2864749,11}
返り値はタプル (Tuple) で、先頭要素が時間 (μsec)、二番目の要素が関数の返り値です。
処理系 | 秒 |
---|---|
Python (ver 3.10.12) | 62.23 |
Ruby (ver 3.0.2p107) | 25.59 |
Lua (ver 5.4.4) | 22.41 |
Gauche (ver 0.9.15) | 21.29 |
ocamlc (ver 4.13.1) | 9.46 |
SBCL (ver 2.1.11) | 4.90 |
Erlang/OTP 24 | 2.86 |
Julia (ver 1.10.5) | 1.84 |
SBCL (最適化) | 1.50 |
GCC -O2 (ver 11.4.0) | 1.19 |
ocamlopt (ver 4.13.1) | 1.05 |
Erlang の実行速度は高速で、SBCL よりも速いとは驚きました。Erlang/OTP 24 から導入された JIT が効果を発揮しているようです。これだけ速いと HiPE を廃止しても問題ないですね。興味のある方はいろいろ試してみてください。
『お気楽 Erlang プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Erlang プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。