hio++.

ひおにっき(2007-05-22)
外部ポートっていう言い方があってるのかわかんないけれど^^; 別プロセスを起動してそっちで処理して結果を返す. 返さなくてもいいんだけど. Erlang-Port-0.04として CPAN にアップしてあります.

遊び方はしごく簡単で、Erlang::Portを入手したらmakeして、exampleディレクトリにcdして以下のようにするだけ。

% erl
Erlang (BEAM) emulator version 5.5.4 [source] [async-threads:0] [kernel-poll:false]
1> c("perleval").
{ok,perleval}
2> perleval:start("perl -Mblib perleval.pl").
#Port<0.124>
3> perleval:eval("$]").                      
"5.008008"
4> perleval:eval("sub{$_[0]**$_[1]}->(2,4)").
16
5> perleval:stop().                          
{<0.30.0>,close}

ソースコードもむっちゃ綺麗。Erlang::Portもpure perlなので、何をしているかはソースを読めばわかる。ソース読みたくない人のために解説すると、erlangとperlは標準入出力で通信。データのserialize/deserializeは主にperl側で行うといったところ。

みかログ: oregexp動いた
氷魚にゃさんにErlangからPerlを呼び出すモジュールを作ってもらい,

というわけで、私からもおねだり。今度は逆に、Perl側からErlangを呼び出すモジュールも欲しい。このあたりが参考になる。

もちろん、

でもいいのだし、似たようなことは私もよくやっているのだけど、これをErlang::Portのserializer/deserializerを使ってやってみるというか。

ただ、今のところは、RBridgeにせよErlang::Portにせよ、粗結合型のbridgeなので、作りやすく使いやすい一方、密結合--組み込み型もちょっと欲しくなってくる。

みかログ: oregexp動いた
Perlの方は,関数呼び出しを1回挟まないとダメで,それが大きなオーバーヘッドになってしまっている模様.

これはむしろErlang⇔Perlの通信に絡むoverheadの方が大きいと思う。粗結合型の一番の欠点がこれ。小さなタスクだと、サーバー側(RBridgeではerlang, Erlang::Port では perl)の処理よりも通信コストの方が高い。これを何とかしたいところなのだけど....

Dan the Man with too Many Languages to Speak