BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java20、Project Amber、Loom、Panama向けの機能をリリース

Java20、Project Amber、Loom、Panama向けの機能をリリース

Oracleは、Javaプログラミング言語と仮想マシンのバージョン20リリースした。この最終機能セットに含まれる7つのJEPは以下の通りだ。

Java 20の機能リリース計画は、JDK19の7つの新機能、JDK18の9つの新機能と同様である。しかし、これはJDK18以前の最近のリリースに比べると少ない。JDK17では14機能、JDK16では17機能、JDK15では14機能、JDK14では16機能だ。

このリリースでは、Project AmberProject LoomProject Panamaへの継続的な貢献と、新しいプレビューとインキュベーションのラウンドを提供するJEPsを特徴としている。ここでは、これらの新機能のいくつかを検証する。なお、JDK20にはProject Valhallaを代表するJEPが存在しないが、これは注目に値する。

プロジェクトPanama

JEP434とJEP438は、プロジェクトPanamaの後援を受け、JVMと明確に定義された「foregin」、つまりJava以外のAPIとの相互運用性を改善し、充実させることを目的としたプロジェクトで、Cライブラリで一般的に使用されているインターフェイスを含む可能性がもっとも高いと考えられている。

JEP434Foreign Function & Memory API (Second Preview)は、JDK19で配布されたJEP424Foreign Function & Memory API (Preview)、JDK18で配布された関連インキュベートのJEP419Foreign Function & Memory API (Second Incubator) 、JDK17で配布されたJEP412Foreign Function & Memory API (Incubator) をベースにフィードバックとセカンドプレビュー提供する改良を盛り込んだ。この機能は、Javaアプリケーションが外部関数を効率的に呼び出し、JVMによって管理されていない外部メモリに安全にアクセスすることによって、Javaランタイム外のコードやデータと相互運用するためのAPIを提供する。JEP424からの更新点は、MemorySegmentMemoryAddressインターフェースが統一されたこと、すなわち、メモリアドレスがゼロ長のメモリセグメントによってモデル化されたこと、JDK19で提供されるJEP427Pattern Matching for switch (Third Preview)との使用を容易にするために、シールされたMemoryLayoutインターフェースが改良されたことだ。

JEP438, Vector API (Fifth Incubator) は、過去4回のインキュベーションからのフィードバックに対応した機能拡張を組み込んでいる。JEP426, Vector API (Fourth Incubator), JDK19, JEP417, Vector API (Third Incubator), JDK18, JEP414, Vector API (Second Incubator), JDK17, そして JEP338, Vector API (Incubator), JDK16 で提供されていたインキュベーターモジュールだ。この機能は、JEP424Foreign Function & Memory API (Preview)で定義されているように、MemorySegmentとの間でベクターをロードおよびストアするためにVector APIを強化することを提案している。

Foreign Function & Memory APIを実装したアプリケーションは、AzulのシニアデベロッパーアドボケイトであるCarl Dea氏によるGitHubリポジトリに掲載されている。

Project Loom

JEP429、JEP436、JEP437は、Project Loomの後援を受け、使いやすく高スループットの軽量並行処理と新しいプログラミングモデルをサポートする目的で作られたJava VM機能とAPIの探求、インキュベーション、提供を目的とするプロジェクトだ。これは、仮想スレッド、 delimited continuationsとtail callsを介して達成されるであろう。

JEP429, Scoped Values (Incubator) は、以前は Extent-Local Variables (Incubator) として知られていたインキュベート JEPで、スレッド内およびスレッド間で不変データを共有できるように提案している。これは、特に多数の仮想スレッドを使用する場合に、スレッドローカル変数よりも好ましい。

JEP436Virtual Threads (Second Preview)は、JDK19で配信されたJEP425Virtual Threads (Preview)から、この機能が進展するための追加のフィードバックと経験のための時間を確保するために、セカンドプレビューを提案する。この機能は、高スループットの並行アプリケーションの作成、維持、観測の労力を劇的に軽減する軽量スレッドである仮想スレッドをJavaプラットフォームに提供する。JEP425からの少数のAPIがJDK19で恒久化されたため、この2回目のプレビューでは提案されない以外は、このプレビュー内で変更はないことに注意することが重要である。JEP425の詳細は、このInfoQのニュース記事と、OracleのJava Platform GroupのJava開発者支援者であるJosé Paumard氏によるJEPCaféのスクリーンキャストに掲載されている。

JEP437Structured Concurrency (Second Incubator)は、JDK19で提供されたJEP428 Structured Concurrency (Incubator)からこの機能を再インキュベートし、さらなるフィードバックと経験の時間を確保することを提案する。この機能の意図は、異なるスレッドで実行される複数のタスクを1つの作業単位として扱うためのライブラリを導入することで、マルチスレッドプログラミングを短縮することだ。これにより、エラー処理とキャンセルの効率化、信頼性の向上、観測性の向上が期待できる。唯一の変更点は、タスクスコープ内で作成されたスレッドによるスコープ値の継承をサポートするために、StructuredTaskScopeクラスが更新されたことだ。これにより、スレッド間で不変のデータを共有が効率化される。JEP428の詳細は、InfoQのニュース記事で参照できる。

Virtual ThreadsとStructured Concurrency APIの実装方法については、Oracle社のJava開発者支援者であるNicolai Parlog氏GitHubリポジトリと、Contrast Security社のシニアソフトウェアエンジニアであるBazlur Rahman氏GitHubリポジトリで紹介されている。

Project Amber

JEP432とJEP433は、生産性を向上させるための小さなJava言語機能を探求し、インキュベートすることを目的としたProject Amberの支援を受けている。

JEP432Record Patterns (Second Preview)は、前回のプレビューであるJEP405Record Patterns (Preview)からのフィードバックに対応した機能拡張を盛り込んでいる。これは、レコード値を分解するためのレコードパターンで言語を強化することを提案するものである。レコードパターンは、タイプパターンと併用することで、"強力で宣言的、かつ構成可能なデータナビゲーションと処理の形式を可能にする "。型パターンは、最近、スイッチケースラベルで使用するために拡張された。JEP427 Pattern Matching for switch (Third Preview)(JDK19で提供)、JEP420 Pattern Matching for switch (Second Preview)(JDK18で提供)、JEP406Pattern Matching for switch (Preview)(JDK17で提供)。JEP405からの変更点は、汎用レコードパターンの型引数の推論のサポート追加、enhanced for文のヘッダーに表示するレコードパターンのサポート追加、名前付きレコードパターンのサポート削除だ。

同様に、JEP433 Pattern Matching for switch (Fourth Preview)は、過去3回のプレビューからのフィードバックに対応した機能強化が盛り込まれている。 JEP427、Pattern Matching for switch (Third Preview)はJDK19で、JEP420、Pattern Matching for switch (Second Preview)はJDK18で、JEP406、Pattern Matching for switch (Preview)はJDK17で提供された。JEP427からの変更点としては、スイッチラベルの文法が簡略化されたこと、汎用型パターンやレコードパターンの型引数の推論が、パターンをサポートする他の構成要素と同様に、スイッチ式やステートメントでサポートされたことが挙げられる。

Record PatternsとPattern Matching for switch APIsの実装方法については、Global PointsのJavaテクニカル・リードであるWesley EgbertoによるこのGitHub(https://github.com/wesleyegberto/java-new-features)リポジトリ、java-19フォルダーにあるワーキング・アプリケーションが見れる。

JDK21

現在、JDK21への搭載が決定しているJEPは1つだけだ。JEP431, Sequenced Collectionsは、JDK21のためにProposedからTargeted昇格した。このJEPは、"要素が明確に定義された順序またはシーケンスで配置されているコレクションの概念を、コレクションの構造的特性として表現する新しいインターフェースのファミリー "を導入することを提案している。その動機は、コレクションフレームワークの中に、明確に定義された順序と統一された操作のセットがないためである。JEP431の詳細は、InfoQのニュース記事で参照できる。

しかし、最近提出されたJEPドラフトや、最終的な機能を提案するJEP候補をもとに、どのJEPがJDK21に含まれる可能性があるかを推測している。

JEP440レコードパターンは、この1週間でJEPドラフト8300541から候補昇格した。このJEPは、この機能を最終化し、過去2回のプレビューからのフィードバックに対応した拡張機能を組み込んでいる。 JEP432Record Patterns (Second Preview)(JDK20で提供)、JEP405Record Patterns (Preview)(JDK19で提供)だ。この機能は、レコード値を分解するためのレコードパターンで言語を強化する。レコードパターンは、タイプパターンと併用することで、"強力で宣言的、かつ複合的なデータナビゲーションと処理の形式を可能にする"。型パターンは、最近、スイッチケースラベルで使用するために拡張された。JEP420, Pattern Matching for switch (Second Preview), in JDK18, and JEP406, Pattern Matching for switch (Preview), in JDK17.JEP432からのもっとも大きな変更点は、enhanced for statementのヘッダーに表示されるレコードパターンをサポートしなくなったことだ。

同様に、JEP441: Pattern Matching for switch は、JEPDraft 8300542 から Candidate ステータスに昇格している。このJEPは、この機能を最終化し、過去4回のプレビューからのフィードバックに対応した機能拡張を組み込んでいる。JEP433Pattern Matching for switch (Fourth Preview)(JDK20で提供)、JEP427 Pattern Matching for switch (Third Preview)(JDK19で提供)、JEP420Pattern Matching for switch (Second Preview)(JDK18で提供)、JEP406Pattern Matching for switch (Preview)(JDK17で提供)がある。この機能は、switch式やステートメントに対するパターン・マッチングで言語を強化するものだ。

JEP442 Foreign Function & Memory API (Third Preview)は、JEPDraft 8301625からCandidateステータスに昇格した。本JEPは、JDK20で提供されたJEP434 Foreign Function & Memory API (Second Preview)、JDK19で提供されたJEP424 Foreign Function & Memory API (Preview)、JDK18で提供された関連インキュベータJEP419Foreign Function & Memory API (Second Incubator)、JDK17で配信したJEP412 Foreign Function & Memory API (Incubator)のうちフィードバックに基づいて改良し、3番目のプレビューとして提供した。この機能は、Javaアプリケーションが外来関数を効率的に呼び出し、JVMが管理していない外来メモリに安全にアクセスすることで、Javaランタイム外のコードやデータと相互運用するためのAPIを提供する。JEP434からの更新点としては、ネイティブセグメントの寿命管理をArenaインターフェイスに一元化したこと、アドレスレイアウトを非参照にする新しい要素でレイアウトパスを強化したこと、VaListクラスを削除したことなどがある。

JEPDraft 8303683Virtual Threadsは、先週、OracleのProject Loomのアーキテクト兼テクニカルリードであるRon Presslerと、Java Platform GroupのアーキテクトであるAlan Batemanによって提出された。このJEPは、過去2回のプレビューからのフィードバックに基づき、この機能を最終化することを提案した。JEP436 Virtual Threads (Second Preview)(JDK20で提供)、JEP425Virtual Threads (Preview)(JDK19で提供)だ。この機能は、高スループットの並行アプリケーションの作成、維持、観測の労力を劇的に軽減する軽量スレッドである仮想スレッドをJavaプラットフォームに提供する。JEP436からのもっとも大きな変更点は、仮想スレッドがスレッドローカル変数を完全にサポートするようになったことで、これらの変数の使用をオプトアウトするオプションを排除している。JEP425の詳細については、このInfoQのニュース記事と、OracleのJava Platform Group、Java開発者アドボケイト、José Paumard氏によるJEPCaféのスクリーンキャストから参照できる。

JDK21の正式なリリース日はまだ発表 されていないが、6ヶ月のリリース計画に従って、2023年9月中旬に配信されると予想されている。開発者は、2023年6月中旬の機能凍結を予想できる。その他のJEPドラフトと候補の詳細については、より詳細なInfoQニュースストーリーから参照できる。

JDK20は現在、Oracle社からダウンロードができ、他のベンダーのバイナリも今後入手可能になる予定だ。

作者について

この記事に星をつける

おすすめ度
スタイル

BT