« jQueryでKeep-Aliveされない問題 | Main | Erlangのデータ保存方法の速度比較 »

Wednesday, May 09, 2007

Erlangは関数型だけど難しくない

Erlangで簡単なアプリまで書けるくらいになったので,感想を.

関数型言語というと,Lisp,Haskellなどがあって,どれも難しいイメージ.
Erlangもはじめは結構覚えるの大変かなぁという印象があった.

Lispは括弧だらけでまず見た目から拒否反応が起こる.
HaskellはふつうのHaskellとか読んでみたけど,遅延評価やモナドがやはり難しいイメージ.
今までのように,書いた順番に実行されるという点が違ったり,デバッグするときに好きなときにprint入れたり出来ないのは,やっぱりかなり影響が大きい.
※追記:unsafePerformIOって関数で無理矢理printさせたりできるらしい.危険らしいけど(^^;

その点,Erlangはそういう難しさが全くなかった.
書いた順番に普通に実行されるし,副作用がどうとか気にする必要も無し.
エラー時は(見にくいけど)スタックトレースが普通に出るし,デバッグにprint入れるのも普通に出来る.

言語仕様自体もシンプルで,覚えるのが思ったよりも簡単だった.
ただ,言語自体がシンプルなために,結構必須に近いような操作でも全部モジュールになっていて,どのモジュールにどの機能があるかを把握しておかないと,うまくコードを書けない.
ここが一番大変だったところかなぁ.

そのほか,グローバル変数が無いというものの,Erlangプロセス内でグローバルな process dictionaly があるのでグローバル変数代わりに使えたりとか,プロセス間のデータはメッセージパッシングで,というものの,ets・dets・mnesiaなどを使えばプロセス間でデータを共有できるし,プロセス間でmutexのような排他制御を行うこともできる.
言語自体はこういう方向で,というのはあるものの,それ以外の書き方も幅広く許容しているように感じた.
こういう色々なやり方が出来るところは,Perlとちょっとにているかも?


結構Erlangが密かなブームになっている気はするものの,期待しすぎているような話も結構あるように思う.

Erlangのプロセスはスレッドよりずっと軽量だけど,言語自体全体が軽量なわけではなくて,やっぱり動的な型を採用しているだけあって,静的な型の言語には速度で負ける.
マルチコア時代に適しているといっても,ベースの速度が違うので,単に高速に処理させたい目的で使うのには向かない.
ネットワーク系のアプリケーションとか,並列処理が必要な分野に限って,I/O多重化などの面倒な手法を使わずとも,十分高速な性能を確保できる,という程度のものだと思う.
(わたしとしてはここが一番うれしくて,非常に大きなメリットなわけだけども.(^^;)

SMPサポートはErlangの歴史の中ではつい最近サポートされたもので,まだspawnとかドライバ処理などが十分スケールしないようだし.ベンチを取ってみると,条件によってはSMPサポートを有効にすると,より遅くなってしまうケースも.

あとは,HiPEというネイティブコンパイラもついているけど,これもあまり期待できない.
速くなるものもあるけど,ものによっては逆に遅くなったり.

Erlangのメリットは,ネットワークアプリケーションなど並列処理が必要なものや,複数マシンでの分散処理が必要なものに限られそう.
Perlとかなら,それ以外の分野(文字列処理とか様々な雑用処理とか)でも便利に使えるけど,Erlangはそうではないので,なかなか趣味でやる人はあまりいない気がする.
業務で使う・・・となると,やっぱり実際にやろうとする人は減ってしまうのかなぁ.

ともかく,もう少し広まるとうれしいけど...

|

« jQueryでKeep-Aliveされない問題 | Main | Erlangのデータ保存方法の速度比較 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference Erlangは関数型だけど難しくない:

» [erlang] erlang で並列 HTTP request [酒日記 はてな支店]
まだ erlang の基礎もロクに勉強してないというのに、単に面白そうだから、という理由で並列プログラミングに手を出してみた。 HTTP get を複数の URL に対して並列で発行する。全体の構造は以下のようなもので。 main manager プロセスを作成 引数で受けた URL のリストか... [Read More]

Tracked on Thursday, May 10, 2007 02:05 AM

« jQueryでKeep-Aliveされない問題 | Main | Erlangのデータ保存方法の速度比較 »