先週の新しいScala企業Typesafeの発表とともに、最新バージョン2.9.0のScalaがリリースされた。去年の2.8.0のリリースに比べると、2.9.0に含まれる新機能の数はずっと少なく、改善と既存機能のバグフィックスに集中したものとなっている。
Scala 2.9の主要な新機能は並列コレクションであり、これは、既存のコレクション実装と同じ抽象の上に構築され、同じインターフェースを提供する。リリースノートによれば:
すべてのコレクションは新しい`par`メソッドによって対応する並列コレクションに変換されます。並列コレクションは`foreach`、`map`、`filter`といったバルク操作を並列に実装することによりマルチコアプロセッサを有効活用します。
例を挙げると、フィルター(filter)に続いて処理(process)が必要な文字列の大きな配列が与えられたとき、シーケンシャルなコードは次のようになる:
val result = data.filter(line => line.contains("keyword")).map(line => process(line))
大量のデータセットと計算量の大きな処理(process)関数に対して、Scala 2.9ではコードを容易に複数のCPU上で走るように調整することができる:
val result = data.par.filter(line => line.contains("keyword")).map(line => process(line))
Scala Day 2010のAleksandar Prokopec氏のプレゼンテーションでは、どのように並列コレクションが機能するかについて紹介し、説明している。さらにテクニカルレポートも存在する。
Scala 2.9のそれ以外の新機能としては、Scala REPL(対話型Scalaインタプリタ)への有用な追加機能がある:
より頑健なカーソルハンドリング、bashスタイルのctrl-R履歴検索、:imports、implicits、:keybindingsのような新コマンド
ScalaのSimple Build System、SBTから、scala.sysとscala.sys.processパッケージがネイティブプロセスとより容易にやりとりするためにインポートされた。リリースノートには言及されていないもう一つの非常に有用な改善が、改良されたScalaDocである。例として、2.9.0と2.8.1のScalaのListのドキュメントを比較して欲しい。
去年Scala 2.8がリリースされたとき、それによって導入されたバイナリレベルおよびソースレベルの非互換性について多くのユーザは懸念していた。Martin Odersky氏は最近メーリングリストでこの話題を取り上げた:
[..] 2.8.1は2.8とバイナリ互換でした。今や2.9が間近に控えていますが、問いかけは現在そして未来におけるバイナリ互換性に対して私たちができることは何かということです。
[..]私たちはまだそこまで到達してはいませんが、進歩し続けています。特に、私たちは将来のリリースのバイナリ互換性を維持するための基礎となる技術を開発しました。[..]
バイナリ非互換性は、偶然ではなくライブラリの意図的な一般化や強化の結果であることもあります。私たちはこれらの可能性のある改善をバイナリ互換性の犠牲にしたいとは考えていません。その代わりに私たちがすることは技術的な解決策の模索です。
このような技術的解決策の1つが、コンパイラ生成フォワーダ、いわゆるブリッジメソッドであり、それにより古いメソッドから新しいメソッドに呼び出しを委譲する。この技術はすでにScala 2.9.0において利用されている。もう1つの解決策がTypesafeで開発されている移行マネージャであり、これはまだ利用可能ではない。Martin氏は次のように結論づけている:
2.9にとって、ブリッジメソッドは2.8に対してコンパイルされたかなり多くのコードが動き続けることを保証してくれるものですが、決してすべてのコードではありません。そのため、プロジェクトを2.9用に再コンパイルすることは強く忠告されるべきことです。2.9は概して2.8とソース互換なので、多くの場合再コンパイルは苦痛の少ないものであるはずです。例外が1つあります:もしアプリケーションが2.8ですでに非推奨だった機能を利用しているのなら、これらの機能は2.9で削除されていることに気づくかもしれません。そのため、アップグレードの前に非推奨警告を取り除くことはよい考えです。
Scala 2.8.0のリリースとは対照的に、2.9.0はずっと小さな、漸進的なリリースであり、多くのライブラリがすでにScala 2.9で利用可能になっている。