「Scala 2.12」が公開、Java 8以降が必須に
Java上で動作するプログラミング言語Scala開発チームは11月3日、最新版となる「Scala 2.12.0」を発表した。Java 8に移行し、これに合わせてコンパイラとオプティマイザが新しくなっている。
Scalaはスイス連邦工科大学(EPFL)で開発された言語で、オブジェクト指向と関数型の二つの要素をもつ。Scala 2.12.0は2006年に初めて公開された2系の最新版で、2014年に公開された2.11に続くものとなる。
Scala 2.12ではJava 8の最新のJava仮想マシン(VM)機能を利用できるようにコンパイラを書き直した。traitはデフォルトのメソッドを持つインターフェイスに直接コンパイルされるようになり、バイナリ互換性とJavaとの相互運用性を強化した。関数コードレベルでもJava 8との相互運用性が強化され、ラムダのシンタックスで関数を受け取るメソッドを双方向から容易に呼び出せるようになった。コンパイラはtrait実装クラス(T$class.class)と匿名関数クラス(C$$anonfun$1.class)を生成しなくなった。
最適化機構も更新され、finalメソッドのインライン化、デッドコードの削除とクリーンナップの最適化などが行われるほか、クロージャが割り当てられて同一メソッド内で呼び出された場合は、クロージャ呼び出しが対応するラムダ本文のメソッドへの呼び出しに置き換えられる。また、GenBCodeバックエンドに新しいインライナーとバイトコードオプティマイザが導入された。オプティマイザは「-opt」コンパイラオプションを使って設定でき、デフォルトではメソッド内で到達できないコードのみを削除する。
Scala標準ライブラリのFunctionNクラスはSingle Abstract Method(SAM)型となり、SAM型とScalaに組み込まれている関数型を、バックエンドまで型チェックからバックエンドまで同一に扱うようになった。関数コンパイルに加えて他の言語機能のエンコードでもinvokedynamicを用いるようになった。GenBCodeバックエンドでの標準化のほか、フラットなクラスパス実装がデフォルトとなった。
このほかにも多数の機能強化が加わっている。なおScala 2.12は2.11とソースレベルでの互換性がほぼあるが、バイナリレベルの互換性はない。