関数型言語と並列処理

最近関数型言語が微妙に流行っていて驚く。僕が学生だったころは「関数型言語が何の役に立つかって?そりゃ、博士号をとるのにさ! Hahaha-」みたいな感じだったのに、隔世の感がある。
で、関数型言語が何の役に立つか。関数型言語といってもHaskellのようなPureな(破壊代入を許さない)ものと、MLのようなそうでもないものがあるが、Pureな関数型言語のご利益は、やはり数学的取扱いが可能なところなんだろうか。大学時代、近所の研究室では、機械的なプログラムの変換で、アルゴリズム的により効率のよいプログラムに変換するというような研究をやっていたが、こういうのは関数型言語でないと難しそうではある。
まぁ、今微妙に流行している理由は、型推論などの機能的な部分もあるのだろうが。

それはともかく、もう一つのPureな関数型言語のご利益というと、並列処理への可能性がある。僕は並列論理型言語の研究を昔やっていたので、こちらの方がなじみがある。変数に破壊代入を許さないので、どんな順番に実行しても結果は変わらない、という寸法である。

この辺の研究はデータフローマシンのためのプログラミング言語、のような形で幾つか行われていた。MITのIdとかが有名だろう。日本でもV言語や電総研(当時)のデータフローマシン用の言語などがあった(
例えばhttp://info.ipsj.or.jp/katsudou/museum/paper/magazine/IPSJ-MGN430211.pdf)。
# V言語、オンラインでリファレンスがないなぁ…

しかし、安直な並列実行は性能的にあまりうまくいかない。1 + 2 + 3 とかを、それぞれの"+"に対して並列処理していては、オーバヘッドがかかって仕方ない。アセンブラで書けばadd2回なのに、待ち合わせ処理してみたりとかやっても意味は無い。並列処理は、性能向上が目的なのである。これでは本末転倒*1

というわけで、並列に動作しない部分を逐次化してみたり、並列に動作するのであっても効果が小さそうな部分は一つにまとめてみたり、という処理をコンパイラが最適化する、という研究が必要になる。僕は学生の頃、こういう研究を並列論理型言語を対象にやっていた(http://medius.iisec.ac.jp/labs/tanaka/publications/pdf/journal/journal-99-01.pdfhttp://medius.iisec.ac.jp/labs/tanaka/publications/pdf/journal/journal-97-02.pdf)。関数型言語でも行われていた(例えばhttp://citeseer.ist.psu.edu/9460.html)。この問題に対しては(僕の研究も含め)、まだ完全な解は無いようにも思える。まぁ、最近この分野はご無沙汰だから、もしかすると画期的な解決法が開発されたのかも知れないが。

PARDSはこの辺の経験を踏まえ、並列に動作する部分はプログラマが粒度を意識してプログラムしてね、というスタンスになっている。もちろん、プログラマが並列に動作する部分を意識してプログラムする必要があるので、性能的にはずいぶん楽である。

最近は普通にPCを買うとプロセッサが複数載ってきたりする時代である。当時の研究が見直されて、実用的な用途に応用されればいいんだがと思う(PARDSもそれを目指してはいる)。基本的なアイデアが出てから、実用的なものとして普及するまでには時間がかかるものなので。オブジェクト指向だって、普及するまで20〜30年かかっているんだし。

*1:スーパスカラCPU内部ではこういうことをやっているわけではあるが。