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はそうではないので,なかなか趣味でやる人はあまりいない気がする.
業務で使う・・・となると,やっぱり実際にやろうとする人は減ってしまうのかなぁ.
ともかく,もう少し広まるとうれしいけど...
The comments to this entry are closed.
Comments