4つのプロジェクトの詳細解説(1)
続けてMark氏から説明されたのは、現在進行しているプロジェクトの詳細です。まず、Javaを進化させる目的は「開発者にとっての生産性」と「プログラムの性能」、その2点の向上であると説明。その上で、それらを実現するために現在アクティブな活動がなされている4つのプロジェクトの紹介に移りました。言及されたプロジェクトは昨年のキーノートと同じラインナップですが、今年はその内容について深掘りした解説が行われたことが大きな相違点です。順に見ていきます。
補足
各機能要望はJEP(JDK Enhancement Proposal)と呼ばれ、こちらに詳細が公開されています。対応するJEPがあるものは本記事内に番号を付記いたしますので、OpenJDKの活動を確認する際は参考にしてください。また、いずれのプロジェクトも進行中のため、仕様等は今後変更となる可能性があります。
(1)Project Amber
このプロジェクトは、ボイラープレートコード(本質でない定型的な実装)を減らし、実装しやすく可読性を高めるための小さな仕様変更を実現していく活動の集合体で、セッションではいくつか個別事例が紹介されました。まずはこのプロジェクトから既に導入された例として、Java 10で採用された「ローカル変数型推論」(JEP 286)について紹介。続けて、これまではエスケープシーケンスで表現していた文字列を、バッククォートでくくると通常の文字列表現として実装できるという仕様案が解説されました(JEP 326)。パターンマッチングやファイルパスの指定、そしてHTMLを記述する際などにも特殊文字や改行をそのまま表現でき、実装が容易になりそうです。
また、switch文についても新たな形式で記述する方法が紹介されました。この仕様が実現すれば、「int numLetters = switch(day)」のようにswitch文を式として記述したり、定型的に記載が必要だったbreakやdefaultの指定の省略、さらにアロー演算子で値の代入をシンプルに行うことなどができるようになります(JEP 325)。可読性の向上や欠陥混入の懸念減少につながるでしょう。
他には、データを保持するオブジェクトに対する実装もシンプル化が検討されています。データオブジェクトには、値を代入するコンストラクタの記述やアクセサ、equalsやtoStringなどのメソッドのオーバーライドといった定型的な実装を求められました。その解消に向け、データを保持するだけのクラス(Data Carrier Class)を表すrecordという特別なクラスを定義する仕様の検討が進んでいます(JEPはまだ無いようです。関連情報はこちら)。
Project Amberの最後の例として紹介されたのは、クラスインスタンスの型判定でパターンマッチングを使用する局面の実装です。オブジェクトに対しinstanceof演算子を列挙して型判定・処理していたような実装にて、これまでのようなif文による分岐ではなく、シンプルなswitch文による記述の検討がなされています(JEP 305)。
(2)Project Loom
こちらは「Fiber」と「Continuation」という仕様の追加に関するプロジェクトです。Fiberとは並列処理を行う「Thread」と同等のことができますが、OS(カーネルモード)ではなくJVM(ユーザーモード)によりスケジューリングされるという性質を持ち、しばしば軽量スレッドとも表現されます。Continuationとは、日本語では「継続」と表現され、プログラムを処理の途中で止めて別の処理に切り替えたりできる仕組みで、Fiberの処理の実現に用いられています。
セッションでは、その軽さに着目したデモが行われました。まずはFiberのメソッド数をThreadのそれと比較し、半分以下であるというシンプルさを説明。そのうえで、それぞれで同一処理を実行した際のレイテンシーを比較し、Threadで起こる大量の遅延がFiberでは発生していないという点がアピールされました。