mapの並列処理化 (まだ出来ていない)
先日実装したmapについて、各要素に対してマルチスレッドで処理させると、素敵かもしれない。
君のプログラミング言語で、これ、できる? - The Joel on Software Translation Project に書かれているGoogleのMapReduceみたいなイメージですね。
Schemeの場合、mapの場合、リストの各要素の処理順序は規定されていないため、各要素に対してどんな順序で処理しても構わない。上記リンクの通り、リストを半分にして、それぞれを並列処理させることだって可能だし、各要素に対してワーカスレッドに処理させる、なんてことも可能。
さてJavaに戻ってきた場合、ExecutorフレームワークのThreadPoolExecutor(ExecutorServiceインタフェースを実装)が、ワーカスレッドのスレッドプールとして非常に使いやすい。特に、invokeAll()メソッドを使えば、上記の処理をあっさりやってもらうことができる。
(参考URL: http://ja.doukaku.org/comment/5012/)
問題は、ExecutorService.invokeAll()メソッドはCallableインタフェースの実装クラスを要素に持つCollectionしか受け付けないところ。一方、前のFunctionインタフェースは上記を満たしていない…さてさて、どうしようかなぁ。考え中。
更に話は脱線するのですが、Javaのように強い型付けの言語の場合、IDEによる補完なんぞが非常に強力なので、実装する側は初歩的なエラーを事前に取る事が出来て便利ですね。
一方、フレームワークやライブラリなど、仕組みを作る側としては…難しい。どんなインタフェースを受け付けるのか、返り値はどんな型が望ましいのか。インタフェースは自作で定義すべきか、他のを借りるべきか云々。仕組みを作る側は、考えなければならないことは多いですね。
当然型付けの弱い言語だってその辺を考える必要がありますが、型付けが弱い、柔軟な言語なので、産みの苦しみは少し軽いんじゃないかなぁと考えています。実際どうでしょう??
…というわけでTODO。うまいことMapReduceのようなmapの実装を考える。