Java Programming Language

Java言語の主要アーキテクトであるGilad Bracha氏、Neal Gafter氏、James Gosling氏、Peter von der Ahe氏らは3年3ヶ月ほど前となる2006年8月18日(米国時間)、Java言語にクロージャの導入を提案するホワイトペーパを公開した。クロージャは開発者にときに熱狂的に支持される機能のひとつであるだけに、当時の開発者から高い関心を集めた。

Javaのクロージャには少なくとも4つの提案があった。Java 7での導入を目指して議論が進められたクロージャだったが、1年前の段階では複数ある候補に対してコンセンサスが得られないという理由で、Java 7でのクロージャの導入は難しいと発表があった。

  • Clear, Consistent, and Concise Syntax (C3S) for Java - Howard Lovatt氏
  • First-class methods: Java-style closures - Stephen Colebourne氏、Stefan Schulz氏
  • Concise Instance Creation Expressions: Closures without Complexity - Bob Lee氏、Doug Lea氏、Josh Bloch氏
  • Closures for the Java Programming Language (v0.5) - Gilad Bracha、Neal Gafter氏、James Gosling氏、Peter von der Ahe氏

しかし2009年11月に開催されたDevoxxカンファレンスにおいて、Sun MicrosystemsのエンジニアMark Reinhold氏から同社はJava 7にクロージャを統合するべく作業を開始するだろうという旨の発表があったと複数のブログやフォーラムが伝えている。Mark Reinhold氏は細粒度の並列コンピューティングフレームワーク「ForkJoinTasks」の開発に従事。これはプラットフォームに依存しない並列コンピューティングを提供するためのフレームワークで、任意の処理を並列化するスレッドと比べると、計算に特化した処理をマルチコアプロセッサで効率よく並列処理することを目指している。スレッドを置き換えるようなフレームワークではなく、計算処理に特化したパラレルコンピューティングフレームワークだ。

このあたりの事情はクロージャの提案者のひとりであるStephen Colebourne氏のブログClosures in JDK 7がわかりやすい。説明によればMark Reinhold氏の取り組んでいるForkJoinTasksをJavaで実現するには、4つの基本型をサポートするだけで80のインタフェースが必要になるという。カバー範囲を広げようとすればさらに多くのインタフェースが必要になるようだ。ForkJoinTasksで計算処理の並列化をするために80を超えるインタフェースから実装すべきインタフェースを選ぶというのは、開発にとって煩雑であるのみならず、Javaの内部を複雑にするという点でも好ましくない。

このように複雑にせずにForkJoinTasksを実現するにはクロージャが有効であり、これがゆえにJava 7にはクロージャを導入することになる、というわけだ。Stephen Colebourne氏はFCMクロージャの共同提案者の一人だが、Mark Reinhold氏の発表にあったクロージャを見る限りでは文法はFCMに近いものになっているということだ。

Java Community News - Java To Get Closures in JDK 7に掲載されている内容によれば、Stephen Colebourne氏はSunの態度の変更について、1年前の段階では経験が不足しているため決定打にかけたものの、1年間の調査を経てどのクロージャを採用すればいいのかがわかったのではないか、と説明。クロージャの仕様としてはBGGAが理論をそのまま実装したモデルとなるが、Javaで導入するには余分な機能があると判断されたのだろう説明がある。最終的にはどの仕様もベースとして採用されることはないようだが、Javaでの用途に適したクロージャの仕様が見えてきている状況にあるようだ。

Java 7の登場までにはまだ時間がある。Java 7の機能のひとつとして計算処理の並列高速化を取り込むのであれば、クロージャの導入も必然として実施されることになるようだ。実際にどういった仕様のクロージャが取り込まれるのか、そもそもJava 7で本当にクロージャが導入されるのかも含めて今度の動向が注目される。