Erlang プログラムのコンパイル・実行・リロード

再び Erlang について。cntt.tv のNgoc さんの記事。いつもお世話になります。

の翻訳である。

私は関数型言語は昔ちょっとだけ Haskell をかじっただけである。超強力なのは理解できたが、それ以上に頭の体力を消耗した。関数型言語は慣れるまでなかなか大変という印象。Erlang は、かつて、Ruby 作者のまつもとさんも絶賛していただけあり、Ruby コミュニティでは人気がある。私も重い腰をあげて、Erlang をちょっとやってみるかな。関数型言語だからパズル的な面白さはあるはず。

では Ngoc さんのすばらしい文章をお楽しみください。翻訳者には力はありませんが・・・。

==翻訳開始

Erlang プログラムのコンパイル・実行・リロード

手続き型言語である Pascal や C、そしてオブジェクト指向言語である C++, Java, Ruby などの経験のある人が、Erlang の書き方を学びはじめると、その他の言語ととても違うことに気がつくでしょう。 Erlang関数型言語だからです。Erlang は実行の仕方さえも、とても風変わりです。

この記事を通じて、Erlang の実行の奇妙さについて、みなさんの困惑を解消できれば、と希望しています。さらにこの記事の「ボーナス」として、プログラムのコンパイルおよびリロードについて書き加えています。この記事を読む前に、読者のみなさんは3時間ほど Erlang を学習する必要があります。

20090416222049

実行

Cのプログラムを走らせるとき、main() 関数がプロセスのなかで一番最初に実行されます。このプロセスは、子プロセスまたは子スレッドを生成(spawn)することができます。main() の処理が終わるときが、プログラムの終了するときです。main() 関数は、まさに C ブログラムのエントリポイントというわけです。

Erlang プログラムを書くと、main() のような関数がないことに気づくでしょう。それではプログラムが走るとき、どの関数が最初に実行されるのでしょうか?困りましたね!

技術用語の面からもう一度チェックすると、普通のErlang プログラムでは .erl ファイルの先頭で “module” と宣言されているのがわかると思います。(Pascal を学んだことのある人なら、.pas ファイルの先頭で “program” 宣言の行があることを思い出すでしょう) つまりErlang の設計者たちは、上のような困惑を実はわざと引き起こしたのです。

Erlang のモジュールとは、Windows 上の .dll 、または Linux 上の .so のようなライブラリにすぎない、と理解すればいいでしょう。モジュールは関数の集合にすぎず、プログラムはどの関数でもはじめに実行することができるのです。モジュールをプログラムと呼ぶのは正確ではありませんね。

プログラムは実際にはどこにあるのでしょうか?答えは、以下のようになります。

  • プログラムは erl コマンドである。
  • erl コマンドを実行するとき、主プロセスが実行される。この主プロセスが終了すると、プログラムも終了する。
  • 主プロセスの生成後に、他のプロセスが生成される。これらの各プロセスは、主プロセスに対して並行して走り、終了しても主プロセスを終了させることはない。

erl コマンドに関しては、

  • 引数なしでerl コマンドを実行すると、対話モードに入ります。このとき主プロセスの他に、追加的なプロセスがユーザのキーボード入力を対話的に処理します。このとき init:stop/0 または q/0 という関数を呼び出すと、主プロセスが終了し、プログラムもまた終了します。
  • キーボード入力を対話的に処理するプロセスが自動的に生成されないようにするには、erl コマンドを –noshell オプションとともに実行する必要があります。
  • プロセスが自動的に生成された後、あるモジュールの中の関数を実行するようにするためには、erl コマンドを -s オプションとともに実行します。例: erl --noshell -s my_module my_function -s init stop.
  • さらに深く理解するには、erl コマンドについてのドキュメントを読んでください。

ここまで来れば、おそらく困惑も解消したのではないでしょうか。さらに注意すべき点をいくつか指摘しておきます。

  • Erlang プログラムを書きたいと考えたら、実際には application と呼ばれるものを理解しなければなりません。
  • Erlang を学ぶときのアプローチは通常とは逆です。普通は、まずプログラムを書き、それからライブラリを書きます。Erlang について言えば、まずライブラリを書き、それからブログラムを書きます。
コンパイル

3つの方法があります。

[続く]

リロード

Erlang にはプログラムの実行中にモジュールをリロードする機能があります。プログラムが実行されているとき、あるモジュールのソースコードを修正・コンパイルした後、モジュールをリロードしてプログラムに組む込むことができるということです。このすばらしい機能のおかげで、プログラムの実行中にただちに更新することができ、再起動の必要もないというわけです。

==翻訳完了