mapの並列処理化 (まだ出来ていない)

先日実装したmapについて、各要素に対してマルチスレッドで処理させると、素敵かもしれない。


君のプログラミング言語で、これ、できる? - The Joel on Software Translation Project に書かれているGoogleMapReduceみたいなイメージですね。
Schemeの場合、mapの場合、リストの各要素の処理順序は規定されていないため、各要素に対してどんな順序で処理しても構わない。上記リンクの通り、リストを半分にして、それぞれを並列処理させることだって可能だし、各要素に対してワーカスレッドに処理させる、なんてことも可能。


さてJavaに戻ってきた場合、ExecutorフレームワークのThreadPoolExecutor(ExecutorServiceインタフェースを実装)が、ワーカスレッドのスレッドプールとして非常に使いやすい。特に、invokeAll()メソッドを使えば、上記の処理をあっさりやってもらうことができる。
(参考URL: http://ja.doukaku.org/comment/5012/)


問題は、ExecutorService.invokeAll()メソッドはCallableインタフェースの実装クラスを要素に持つCollectionしか受け付けないところ。一方、前のFunctionインタフェースは上記を満たしていない…さてさて、どうしようかなぁ。考え中。


更に話は脱線するのですが、Javaのように強い型付けの言語の場合、IDEによる補完なんぞが非常に強力なので、実装する側は初歩的なエラーを事前に取る事が出来て便利ですね。
一方、フレームワークやライブラリなど、仕組みを作る側としては…難しい。どんなインタフェースを受け付けるのか、返り値はどんな型が望ましいのか。インタフェースは自作で定義すべきか、他のを借りるべきか云々。仕組みを作る側は、考えなければならないことは多いですね。

当然型付けの弱い言語だってその辺を考える必要がありますが、型付けが弱い、柔軟な言語なので、産みの苦しみは少し軽いんじゃないかなぁと考えています。実際どうでしょう??


…というわけでTODO。うまいことMapReduceのようなmapの実装を考える。