Java 9はここにあります:あなたが知る必要があるすべて

Java 9(正式にはJava Platform Standard Editionバージョン9)がついに登場し、開発者はそのJava Development Kit(JDK)をダウンロードできるようになりました。

物議を醸す新機能がいくつかありますが、古いスタイルのJava配信の最後の行でもあります。

Java 9JDKをダウンロードする場所

Oracleは、開発者がダウンロードできるようにJava SE 9JDKとドキュメントを投稿しています。

Java9の主な新機能

Java SE 8のほぼ3年後にデビューした、Java SE 9には、いくつかの重要なアーキテクチャの変更と、多くの改善があります。

Java9のモジュール性はゲームチェンジャーです

Project Jigsawに基づく新しい、物議を醸すモジュール性機能は、より保守的なショップがモジュール性が成熟するのを待つことを決定したとしても、JDK9が今提供しなければならないものを見たい最先端のJavaショップの興味をそそるに違いありません。

モジュール性(Java Platform Module Systemの形式)は、JDKをモジュールのセットに分割して、実行時、コンパイル時、またはビルド時に結合します。モジュール性は「推移的な」変更と呼ばれ、モジュール間の依存関係を理解できるようにします。

Java 9のモジュール性により、開発者は高度なアプリケーションをより簡単にアセンブルおよび保守できるようになります。また、セキュリティとパフォーマンスを向上させながら、Javaをより小さなデバイスにスケールダウンできるようにする必要があります。

Java 9のモジュール性の側面には、アプリケーションのパッケージ化、JDK自体のモジュール化、およびソースコードのモジュールへの再編成が含まれます。ビルドシステムは、モジュールをコンパイルし、ビルド時にモジュール境界を適用するように拡張されています。JDKおよびJavaランタイム環境(JRE)イメージは、モジュールを処理するように再構築されています。また、JavaFXUIコントロールとCSSAPIにモジュール化のためにアクセスできるようになりました。

多数の構成がサポートされています。その結果、スケーラビリティ、セキュリティ、およびアプリケーションのパフォーマンスを改善する必要があります。Javaを小さなデバイスに簡単にスケールダウンすることは、モジュール式の取り組みの重要な推進力です。

モジュール性により、開発者はJava SE(Standard Edition)とJava EE(Enterprise Edition)の両方のライブラリと大規模なアプリケーションをより適切に構築および保守できるようになります。しかし、Java 9の開発中、Oracle、IBM、Red Hatなどは、プラットフォームにこのような根本的な変更を加える方法について大きな意見の相違がありました。モジュールシステム自体は5月に却下されましたが、進展が見られた後、6月の2回目の投票で承認されました。

主要なJavaベンダー間で合意があったとしても、モジュール性がJava開発者に大いに役立つかどうかについては論争が続いており、一部の専門家は「はい」と言い、他の専門家は「いいえ」と言っています。とにかく、Java9はモジュール化されました。

モジュール化されたJava9への移行を容易にするために、Java 9では、JREがクラスとリソースファイルを検索するために使用するクラスパス上のコードへの不正なリフレクティブアクセスが許可されています。この機能は、Java9以降は使用できなくなります。

Java9コードのコンパイラーの改善

Java 9アップグレードは、コードをコンパイルするためのいくつかの新機能を備えています。その主なものは、事前(AoT)コンパイルです。まだ実験段階にありますが、この機能により、仮想マシンで起動する前にJavaクラスをネイティブコードにコンパイルできます。この機能は、ピークパフォーマンスへの影響を制限しながら、小規模アプリケーションと大規模アプリケーションの両方の起動時間を改善することを目的としています。

ジャストインタイム(JIT)コンパイラは高速ですが、Javaプログラムが非常に大きくなり、JITが完全にウォームアップするのに長い時間がかかり、一部のJavaメソッドがコンパイルされずにパフォーマンスが低下します。事前コンパイルは、これらの問題に対処することを目的としています。

しかし、JavaテクノロジーベンダーのExcelsiorのマーケティングディレクターであるDmitry Leskovは、事前コンパイルテクノロジーが十分に成熟していないことを懸念し、OracleがJava10までより堅実なバージョンを待っていたことを望んでいます。

Java 9は、Oracleのスマートコンパイルデプロイメントのフェーズ2も提供します。この機能には、s javac ツールの安定性と移植性の向上が含ま れるため、デフォルトでJVM(Java仮想マシン)で使用できます。このツールは一般化されるため、JDK以外の大規模なプロジェクトにも使用できます。JDK 9はjavac コンパイラーも更新したため、Java9プログラムをコンパイルして古いバージョンのJavaで実行できるようになりました 。

もう1つの新しい、しかし実験的なコンパイル機能は、JavaレベルのJVMコンパイラインターフェイス(JVMCI)です。このインターフェースにより、Javaで記述されたコンパイラーをJVMによる動的コンパイラーとして使用できます。JVMCIのAPIは、VM構造にアクセスし、コンパイルされたコードをインストールし、JVMコンパイルシステムにプラグインするためのメカニズムを提供します。

JavaでJVMコンパイラを作成すると、CまたはC ++で作成された既存のコンパイラよりも保守と改善が容易な高品質のコンパイラが可能になります。その結果、Java自体で記述されたコンパイラーは、保守と改善が容易になるはずです。Java内コンパイラを有効にするためのその他の既存の取り組みには、GraalProjectとProjectMetropolisが含まれます。

新しいコンパイラ制御機能は、JVMコンパイラのきめ細かい、メソッドコンテキスト依存の制御を提供することを目的としており、開発者はパフォーマンスを低下させることなく、実行時にコンパイラ制御オプションを変更できます。このツールは、JVMコンパイラのバグの回避策も有効にします。

REPLがついにJava9に登場

Java 9は、read-eval-print loop(REPL)ツールを備えています。これは、Project Kuliaでの長年の開発の後、このバージョンで実現しつつあるJavaのもう1つの長期目標です。

jShellと呼ばれるJava9のREPLは、宣言型のステートメントと式をインタラクティブに評価します。開発者は、コードを数行入力するだけで、コンパイル前にプログラムに関するフィードバックを得ることができます。

コマンドラインツールの機能には、タブ補完と必要なターミナルセミコロンの自動追加が含まれます。jShell APIを使用すると、IDEやその他のツールでjShell機能を使用できますが、ツール自体はIDEではありません。

学校がJavaから離れる理由として、REPLの欠如が挙げられています。(PythonやScalaなどの言語には長い間REPLがありました。)しかし、Scala言語の創設者であるMartin Oderskyは、Javaはステートメント指向であるのに対し、REPLは式指向であると述べ、JavaでのREPLの有用性に疑問を投げかけています。

Java9でのStreamsAPIの機能強化

Javaのストリームを使用すると、開発者は計算を表現できるため、データの並列処理を効率的に活用できます。Java 8のストリーム機能は、マルチコアアーキテクチャを活用しながらデータを宣言的に処理するためのものです。

Java 9では、Streams APIは、Streamからアイテムを条件付きで取得および削除し、Stream要素を反復処理し、Streamsソースとして機能できるJava SE APIのセットを拡張しながら、null許容値からストリームを作成するメソッドを追加します。

コードキャッシュはJava9で分割できます

JDK 9では、コードキャッシュをセグメントに分割してパフォーマンスを向上させ、きめ細かいロックなどの拡張を可能にします。特殊なイテレータがメソッド以外のコードをスキップするため、結果のスイープ時間が改善されるはずです。非メソッド、プロファイル、および非プロファイルのコードを分離する。一部のベンチマークの実行時間を改善します。 

ProjectNashornを介したJava9でのJavaScriptバッキングの改善

Java用の軽量JavaScriptランタイムを提供するProjectNashornは、JDK 9で改善されています。ProjectNashornは、Netscapeで開始されたRhinoプロジェクトに続いて、Javaで高性能で軽量のJavaScriptランタイムを実装するための取り組みでした。Project Nashornは、JavaアプリケーションへのJavaScriptの埋め込みを可能にする責任を負っていました。JDK8でJavaにJavaScriptエンジンを提供しました。

JDK 9には、NashornのECMAScript構文ツリー用のパーサーAPIが含まれています。APIにより、Project Nashornの内部実装クラスに依存することなく、IDEおよびサーバー側フレームワークによるECMAScriptコード分析が可能になります。

HTTP / 2クライアントAPIがJava9に登場

ベータHTTP / 2クライアントAPIがJDK9に導入され、JavaでWebのコアHTTPプロトコルへのアップグレードが実装されました。WebSocketはAPIでもサポートされています。

HTTP / 2 APIは、現在は廃止されたプロトコルで設計されている、HTTP / 1よりも古い、抽象的すぎる、使いにくいなどの問題があったHttpURLConnectionAPIを置き換えることができます。

Java9でのHTML5とUnicodeのサポートの改善

JDK 9では、Javadocドキュメントツールが拡張され、HTML5マークアップが生成されます。8,000文字、10ブロック、および6つのスクリプトを追加するUnicode8.0エンコーディング標準もサポートされています。

DTLSセキュリティAPIがJava9に追加されました

セキュリティのために、Java 9はDTLS(Datagram Transport Layer Security)用のAPIを追加します。このプロトコルは、クライアント/サーバー通信での盗聴、改ざん、およびメッセージの偽造を防ぐように設計されています。クライアントモードとサーバーモードの両方に実装が提供されます。

Java9が非推奨にして削除するもの

Java 9は、流行しなくなったいくつかの機能を非推奨または削除します。その中で最も重要なのは、非推奨のアプレットAPIです。セキュリティに敏感なブラウザメーカーがJavaブラウザプラグインのサポートを削除している今、それは時代遅れになっています。HTML5の出現は、彼らの終焉をもたらすのにも役立ちました。開発者は、ブラウザからアプリケーションを起動するためのJava WebStartやインストール可能なアプリケーションなどの代替手段を利用できるようになりました。 

appletviewerツールも非推奨になりました。

Java 9は、Concurrent Mark Sweep(CMS)ガベージコレクターも非推奨にし、将来のリリースで終了するようにサポートしています。その目的は、HotSpot仮想マシンでの他のガベージコレクターの開発をスピードアップすることです。低ポーズのG1ガベージコレクターは、CMSの長期的な代替となることを目的としています。

一方、JDK8で以前に非推奨になったガベージコレクションの組み合わせはJDK9で削除されます。これには、インクリメンタルCMS、ParNew + SerialOld、DefNew + CMSなどのめったに使用されない組み合わせが含まれ、ガベージコレクタのコードベースがさらに複雑になります。

Java 9は、インポートステートメントでのJava警告も排除し、大きなコードベースでlint警告を排除します。これらのコードベースでは、非推奨の機能をしばらくの間サポートする必要がありますが、非推奨の構成をインポートしても、その構成の使用が意図的で抑制されている場合、警告メッセージは表示されません。

また、Java 9では、複数JRE(mJRE)機能を介して起動時にJREを選択する機能が削除されています。この機能はめったに使用されず、Javaランチャーの実装が複雑になり、JDK5でデビューしたときに完全に文書化されることはありませんでした。

Oracleは、JVMで置き換えられたJVM TI(ツールインターフェイス)hprof(ヒーププロファイリング)エージェントを削除しました。jhatツールも削除され、優れたヒープビジュアライザーとアナライザーによって廃止されました。

新しいJava9の行が始まると、Java9はその行の終わりです。

Java 9は、すべての新機能を備えて、大成功を収めていると言えます。オラクルは最近、Java 9がその指定とメジャーリリース間の経過時間の点で、この種の最後のものであることを明らかにしました。

今後、Javaは6か月のリリース期間を持ち、次のメジャーバージョンは2018年3月にJava 18.3と呼ばれ、6か月後にJava18.9と呼ばれる予定です。

Javaの新しいリリースリズムは、JDK9が長期サポートリリースとして指定されないことも意味します。代わりに、次の長期リリースはJava18.9になります。

Javaのリリースのリズムが速いということは、開発者がメジャーリリースを待つ必要がないことを意味します。また、開発者がJava 9とその「未熟な」モジュール機能をスキップし、新しいバージョンを6か月待つことを意味する場合もあります。 JavaツールベンダーのZeroTurnaroundのJavaアドボカシーディレクターであるSimonMaple氏は、ねじれについて述べています。