BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JavaのValue Typesの現状

JavaのValue Typesの現状

原文(投稿日:2018/06/21)へのリンク

オラクルはJavaにValue Typesを導入すべく作業を続けている。この取り組みはProject Valhallaで行われている。プロジェクトのミッションステートメントは"進化したJava VMと言語機能の候補を研究し生み出す場所"だ。InfoQは以前このプロジェクトを取り上げており、JavaにValue Typesを導入する進行中の作業を紹介した。

Value TypesはJavaのいくらか先のバージョンで利用できるようになる第3のデータ型を意味する。これは現在ある2つの型: プリミティブ型とオブジェクト参照を補完する。もっともよく使われるフレーズは、JavaのValue Typesは"コードはクラスのように、動作はintのように"なるというものだ。これが意味することは、Value Typesは複合データ型であるべき (コードはクラスのように) で、そのため識別はできず、オブジェクトヘッダのコストを払わない (動作はintのように)。

現在のプラットフォームでは、環境としてこのような形でのメモリレイアウトに対する低レベルな制御は意図的に提供していない。Cのstructに似ていて、これはJVMがサポートしていないものである。代わりに、現在のバージョンでは複合データ型はすべて参照を使ってアクセスしなければならない。

JavaプラットフォームがValue Typesを含むよう拡張されると、型パラメータの値としてValue Typesが使えるのかという疑問が自然と沸き起こる。もしできないなら、これは利用を大いに制限するように思える。ゆえに、Value Typesの設計にはジェネリクスを拡張した形で型パラメータの値として有効となるという仮定がつねにあった。

これはJavaの型システムが頂点の型を持っていないという事実に関連する。Objectintの両方の親となる型がない。これを違う表現にすると、Javaの型システムはルートが1つではないということだ。これにより、Javaのジェネリック型への型パラメータは参照型のみに制限され、完全な意味でList<int>を作る方法はなかった。Value Typesの到来で可能ならこの問題に取り組まなければならない (ジェネリクスの型消去にも)。

別の設計の制限で、Java 8以降JDKにある特定の参照型 (可能ならそれ以上のものも) が後のリリースでValue Typesになれる、そのような進化の可能性を広げることが設計目標となった。これに対する候補の実例が2つ、OptionalLocalDateTime がある。両方ともValue Typesとなってほしいプロパティを持っている。たとえば、両方ともイミュータブルであり値のセマンティクスを提示してほしいと思われている。2つのオブジェクトのフィールドがすべて等しいときに限りその2つは等しい、というものだ。

JDKの型が進化してValue Typesになるというのが可能なら、型に対する表現がクラスファイルでどのように見えるのかという疑問をうまくかわす。JVMの現行バージョンでは、参照型はL<適格な型>;として書かれており、そのためOptionalは型指定子Ljava/util/Optional;により表現されている。ここ数年にわたり、異なる提案と設計アプローチがValue Typesの表現を求めて研究されてきた。

オラクルのJVMアーキテクトであるJohn Rose氏が最近簡潔に歴史を説明している。さまざまなアプローチが試みられ、問題に遭遇したのだ。

現在の方向性としてはValue Typesは継続して参照型と同じ指定子のシンタックスを使って記述するというものである (たとえば一時議論されたような Qjava/util/Optional; ではなく)。このアプローチは後方互換性維持に役立つよい特徴を持っている。これはプラットフォームの最も初期からある最上のJavaの設計原則である。

しかし、設計には型指定子が不十分な指定子であるところに問題がある。特定の型が実際にValue Typesであるという事実をエンコードしないのだ。解決に向け現在の提案では新しいセクション (ValueTypes) を加えてJVMクラスファイルフォーマットを拡張する予定だ。これはファイル内のどの型が実際にValue Typesなのかを列挙する。詳細がJohn Rose氏により記述されている。詳細のいくつかについてはvalhalla-devメーリングリストで活発に議論が続いている。Stephen Colebourne氏他の直近のコントリビュートではJavaのValue Typesにnullを許容するか (もしくは許容しないか) といったトピックを議論している。

同時に、実装作業の進捗はよく、JVMハッカーやフレームワーク作者、バイトコード好き向けのプロトタイプはもうすぐ出てくると思われる。活発に開発中の重要な機能にはよくあることだが、オラクルはこの有望な機能がどのJavaバージョンで、あるいは特定の日付でリリースされるのかに関して約束はしていない。

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT