« 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

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/33589/15008191

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 at 02:05 AM

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