Java 8は,長年に渡って最も待望されていた,プログラム言語のアップデートのひとつだ。今回のリリースでは日付APIやストリームAPI,ラムダ式といった新機能が導入される一方で,PermGenが廃止されるなど,総合的に見て望ましい方向の改良が行われている。我々はリリースの詳細を知るため,Java Platformグループでソフトウェア開発を担当する,Oracle VPのGeorges Saab氏に話を聞いた。
InfoQ: ラムダプロジェクトの経緯に詳しくない読者のために,今回導入される実装がどのようなものか,簡単に説明して頂けますか? 言語とVMとライブラリがすべて協調して関与するような改良は,今回が初めてではないかと思うのですが。
過去のリリースで実現された言語機能のほとんどは,その3つの領域のいずれかひとつだけに影響するものでした。あるいはメジャーリリースを機会として,それぞれの領域に更新が導入されたこともありました。
Java 8のラムダ式では,言語とライブラリ,そしてJVMにも同時に手を加えています。そのために開発全体を通じて,各領域が他の領域の設計や実装に影響したり,強化したりすることが可能だったのです。
例えばVMでは,ラムダ式を実装するためにさまざまな方法を実験しました。そこからInvokeDynamicを使用する方法を見つけ出すことや,InvokeDynamicで何が改善されるかを理解することができたのです。ラムダ式をコレクションで自然に使用したいという要望から,ストリームAPIの設計が生まれました。拡張メソッドの導入においては,言語面でのサポートも必要になりました。
これらは数年間に及ぶ発展のプロセスです。その過程ではコミュニティから,たくさんの素晴らしいフィードバックもありました。
InfoQ: ラムダ式を追加したことで,GroovyやScalaを使っている開発者たちがJava言語に戻ってくるでしょうか?
今あげたふたつの言語が,いずれもJVM上で動作する(他にもホスト環境はありますが)というのは意味深いですね。私たちはむしろ,JVM上でJava以外の言語をサポートするための開発を,これまでたくさん行ってきました。言語の実装者たちはその経験を通じて,どのような言語がJVMに適しているか,あるいは適していないかという点で,多くのことを学んできたと思います。言語開発で実験を行う場合,何百万という開発者が使っている言語よりも,数千人規模の言語の方がずっと簡単なのは当然のことです。私たちが本当に目指しているのは,数百万人というJava開発者たちの開発作業の支援 - 思慮と責任を持って進化させていく,そのための取り組みなのです。
InfoQ: ラムダ式とストリームAPIを組み合わせることで,明快かつ簡潔なコードが記述できるようになりますが,関数プログラム的な方法でフィルタが次々と適用されることから,潜在的なパフォーマンスオーバーヘッドに対する懸念の声も聞かれます。このような心配は合理的なものでしょうか? オーバーヘッドを軽減するために,どのような最適化が導入されていますか?
ストリームは中間(intermediate)と末端(terminal)での処理をサポートします。フィルタのような中間処理は,それ自身ではフィルタ処理を実行せず,新たなストリームを生成します。そのストリームを通過するときに,指定された述語にマッチするフィルタの処理要素が提供されるのです。ですからフィルタを追加することで,結果としてランタイムで実行される処理が増加する可能性はあります。
その一方で,ストリーム上のすべての中間処理がそうなのですが,ストリームの遅延処理によって複数の処理をデータのワンパス内に融合することで,非常に大きな効率化が実現できます。ラムダ式の周到な設計で実現されたJVM内部の大幅な最適化とも相まって,フィルタ追加による影響の可能性は著しく低減されているのです。
もうひとつ考慮してほしいのが,ストリームとラムダ式によって並列処理の利用が極めて容易になることです。さらに並列ストリーム上の操作には,順序による制約を緩和するメリットもあります。ベースとなるストリームの実施順序について,ユーザが気にする必要はありません。
InfoQ: Java 8の大きな特長としてもうひとつ,プラグイン可能なタイプチェッカの開発を可能にする"Annotations on Java Types"があります。これについてもう少し詳しく説明して頂けますか – 例えばこの機能を使って,開発者にどのようなことをして欲しいと思いますか?
この機能は,型名称に対するアノテーションを可能にするもので,型を使用できるほとんどの場所で使用できます。変更の結果,プラグイン可能なタイプチェッカを使って,コンパイル時にエラー状態を検出するアノテーションが記述できるようになりました。このようなチェッカとアノテーションのスキームは,nullポインタエラーやロック,あるいは国際化といった問題に対処するため,コミュニティで開発されたものです。
実装例や情報ソースとしては,Michael Ernst教授の"checker-framework.org"がよいでしょう。nullチェックなど,たくさんのツールを提供しています。教授はこの言語仕様を定めた,JSR 308の仕様リーダのひとりでもあります。
将来的にはJDKのコードベースにも,この種のアノテーションスキームがひとつくらいは採用されるとよいと思っています。そしてもちろん,さらに広いJavaコミュニティの開発者たちが,自身のコードベースでこのテクノロジを使ってくれて,ソフトウェア品質の問題に対処する新たなチェッカが開発されれば素晴らしいですね。
特に安全性が重視される組み込みシステムでは,このようなデータ型に重要な属性と制約を設定する手法によって,それらをコンパイル時に検証したり,静的に解析したりすることが可能になります。Java以外の,そのドメイン特有のプログラム言語を使用しているユーザに対しても,将来的にJavaプラットフォームに移行する手段を提供することになるでしょう。
InfoQ: Java 8の動的言語用の機能として,最も大きな拡張は何だと思いますか?
それは間違いなくHotSpot VM関連のパフォーマンス向上,特にinvokedynamicに関連する部分ですね。新機能として重要なのはNashorn JavaScript Engineでしょう。人気の高いスクリプト言語の,軽量でパフォーマンスに優れた実装です。Nashornのパフォーマンスが向上したことは,VM上で最適化された動的言語実装の選択肢がひとつ増えた,という意味にもなります。
さらにNashornではJavaクラスのアクセスも簡単ですので,JavaScriptからJavaを使用する非常に便利な手段も提供しています。JavaFXアプリケーションをすべてJavaScriptで記述して,JVM上で動作させるようなことも可能になりました。JavaとJVM上で動作する動的言語との透過的な相互運用性が,このようなアプリケーションを開発するパワフルな方法を実現しているのです。
InfoQ: 昨年は,Javaのセキュリティに関する話題をニュースで見ない日がないほどでした。Java 8ではJavaブラウザプラグインやその他の面で,特別な改良が行われているのでしょうか?
デプロイメントルールセットや例外サイトリストなどの重要なセキュリティ改善や新機能が,OracleのJava SE 7アップデートを通じて数多く提供されてきました。Javaの適切なセキュリティを維持することは,私たちにとって最重要課題なのです。
さらにJava SE 8では,新たなセキュリティ機能もいくつか追加されています。もっとも目を引くのは,TLS(Transport Layer Security)の実装としてTLS 1.2がプラットフォーム標準になったことでしょう。セキュリティAPIの全面的な改良に加えて,証明書失効チェックの改善から新しい暗号アルゴリズムに至るまで,さまざまな拡張機能があります。
InfoQ: Java5, 6, 7を使用しているJava開発者の割合についてご存じですか? Java 8の適用を促進するための計画は何かあるのでしょうか?
私は過去6~ 9ヶ月間,世界中のカンファレンスで話をしてきたのですが,その度,皆が使用しているバージョンについて尋ねました。非公式かつ非科学的なサーベイではありますが,その結果からは現在,ほとんどの開発者がJava SE 7を使っているようです。6を使い続けている数はそれより少なく(ただし無視し難い数です),それより古いバージョンを使っているのはごく少数でした。開発者の視点からは,Java SE 8には新しい言語機能やAPIなど,早期に採用せずにはいられないような理由が備わっています。NetBeansやEclipse,IntelliJ IDEAといったIDEも,次期リリースでこれらの機能用に優れたツーリングを提供する努力をしていますから,開発者からの支持もすぐに得られるものと期待しています。
InfoQ: 昨年のJavaOneでの大きなテーマのひとつが,Java ME, SE, EEというプラットフォームの統一に関するものでした。Java 8では,この方向はどうなっているのでしょうか?
Java SE 8には多くの新機能がありますが,コンパクトプロファイルのサポートもそのひとつです。これはJava SEプラットフォーム仕様のサブセットプロファイルをいくつか定義して,プラットフォームの全機能を必要としないアプリケーションのデプロイと,小規模デバイス上での実行を可能にするものです。HotSpotの他の改良点,例えばクラスのメタデータのメモリ使用量削減や,さらにはVM自体のメモリ削減などとも相まって,小規模デバイス用のアプリケーション開発とデプロイ用に,JDK 8のスケールダウンを実現しています。この作業を簡単にするためJDK 8には,開発者のコードが依存するプロファイルを見つけ出すjdepsという新しいツールがあります。
別の方向からは,Java ME 8の言語とVM, ライブラリの配置を,Java SE 8に近いものに拡張する作業も行っています。ラムダ式はまだ使用できませんが,アサーションやジェネリクス,列挙型,文字列によるswitch,try-with-resources,ダイアモンドオペレータなど,Java SE 1.5, 6, 7で導入された言語構造がJava MEのコードでサポートされるようになりました。それと同時にコアクラスライブラリも,新しいwebプロトコルをサポートするようにアップデートされました。IPv6や,TLS 1.2のサポートのような最新のセキュリティ機能がサポートされて,Java SEとJava MEプラットフォームはこれまでより近いものになっています。
InfoQ: Stripped ImplementationsがJavaに追加されるのは,いつ頃になるのでしょうか?
Java SE 8のリリースが完了したら,Java SE 9のリリースに先行してプラットフォームに追加する方法を再検討する予定です。技術的な問題はないのですが,Javaプラットフォームの断片化を回避しながら適切なユースケースを可能にするため,仕様書類の整備や法律関連の枠組みを確立する,という課題が残っています。
我々の質問に答えてくれたGeorges Saab氏に感謝したい。Oracleは今日この後,Webinarを通じてJavaの提供を正式に発表する。InfoQでもその様子を報告する予定である。