Slide 1

Slide 1 text

Project Valhalla 2023年 中間状況報告 JJUG 2023/03/30 @nagise なぎせゆうき

Slide 2

Slide 2 text

今日の参考文献 (1) OpenJDK Project Valhalla のメインサイト • https://openjdk.org/projects/valhalla/ Background Documents • 1. The Road to Valhalla • 2. The Language Model • 3. The JVM Model

Slide 3

Slide 3 text

今日の参考文献 (2) Specification Changes (Valhalla の言語仕様の変更案) • https://cr.openjdk.org/~dlsmith/jep8277163/jep8277163- 20220830/specs/value-objects-jls.html Nullness markers to enable flattening (Valhalla の ML) • https://mail.openjdk.org/pipermail/valhalla-spec- experts/2023-February/002223.html

Slide 4

Slide 4 text

今日の参考文献 (3) 関連JEP 主要なJEPは以下の4つ • Draft 8277163 - Value Objects • Preview 401 - Implicitly-Initialized Value Object Storage • Preview 402 - Enhanced Primitive Boxing • Draft 8261529 Universal Generics

Slide 5

Slide 5 text

今日の参考文献 (4) LWorld JVM Language Summit 2018 のセッション LWorld: the next steps on the journey to Valhalla with David Simms & Tobi Ajila • https://www.youtube.com/watch?v=_26KZAegYRM&t=1s Project Valhalla Early-Access Builds (試作版のJava) • https://jdk.java.net/valhalla/

Slide 6

Slide 6 text

Project Valhalla • 2014年 9月のJavaOne で発表された • 時代背景としては 2014年 3月 に Java8 がリリースされていた Value Objects の導入を目指す。 ジェネリクスも改良するよ! 2014年当時を伝えるレポート : JavaOne 2014 San Franciscoレポート • https://xtech.nikkei.com/it/atcl/column/14/224071/102700009/ • https://xtech.nikkei.com/it/atcl/column/14/224071/102700010/

Slide 7

Slide 7 text

Value Objects ←このメモリレイアウトにしたい ←今

Slide 8

Slide 8 text

それだけ? Project Valhalla では総合的にJavaのオブジェクトモデルを再構成を試みる

Slide 9

Slide 9 text

Valhallaに行きたいかー!

Slide 10

Slide 10 text

Valhalla ヴァルハラ(ドイツ語: Walhalla)は、北欧神話における主神オーディンの 宮殿。古ノルド語ではヴァルホル(Valhöll、戦死者の館)という。 ヴァルハラはグラズヘイムにあり、ワルキューレによって選別された戦士 の魂(エインヘリャル)が集められる。レーラズ(英語版)(ユグドラシ ルの1本)の影が落ちるこの宮殿には、540の扉、槍の壁、楯の屋根、鎧に 覆われた長椅子があり[1]、狼と鷲がうろついているという。これは、戦場 の暗喩である。館の中では戦と饗宴が行われ、ラグナロクに備える。また、 この館には雄鶏のグリンカムビ(黄金の鶏冠)が住んでいるとされている。 https://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A1%E3%83%AB%E3 %83%8F%E3%83%A9

Slide 11

Slide 11 text

L-World 検証用の試作版JavaVM • https://jdk.java.net/valhalla/ オブジェクトモデルの検証用なのでいろいろと不完全 2023/03/30時点では LW4 というバージョンになっている JVM Language Summit 2018 のセッション LWorld: the next steps on the journey to Valhalla with David Simms & Tobi Ajila • https://www.youtube.com/watch?v=_26KZAegYRM&t=1s

Slide 12

Slide 12 text

もしもValhalla世界でJava入門したら Java ではデータを扱う際に、どういう種類のデータかを表す 「型」を指定します。 いろいろな型を扱うことができますが、大きく分類すると2つ に分けることができます。

Slide 13

Slide 13 text

Value Objects と Identity Objects nullの使用 不変性 同値判定 Identity Objects Record 可 不変 equals Class 可 可変 equals Interface 可 可変 equals Array 可 可変 Arrays.deepEquals Enum * 可 不変 == Value Objects Record 可 不変 == Class 可 不変 == Primitive 不可 不変 == Enum は理論的には Value Object 足りうるが、java.lang.Enum が要件を満たさないため、現 時点ではIdentity Object になれない https://openjdk.org/projects/valhalla/design-notes/state-of-valhalla/02-object- model#value-records

Slide 14

Slide 14 text

Value Objects と Identity Objects Value Objects も Identity Objects も一見同じように見えます IdentityClass id = new IdentityClass(); double d = id.doubleValue(); ValueClass v = new ValueClass(); double d = v.doubleValue(); int i = 12; double d = i.doubleValue();

Slide 15

Slide 15 text

Valhalla のスローガン Codes like a class, works like an int. クラスのように書き、intのように動く。

Slide 16

Slide 16 text

Value クラス identity class Id1 { int counter = 0; void increment() { counter++; } } value class ValueClass { int counter = 0; void increment() { counter++; } // コンパイルエラー! } Value Objects は不変(Immutable)です。 暗黙にfinal

Slide 17

Slide 17 text

Value Objects の同値判定 Value Objects では == で同値判定することができます ValueClass v1 = new ValueClass(); ValueClass v2 = new ValueClass(); System.out.println(v1 == v2); // true IdentityClass id1 = new IdentityClass(); IdentityClass id2 = new IdentityClass(); System.out.println(id1 == id2); // false

Slide 18

Slide 18 text

プリミティブ型 boolean, char, byte, short, int, long, float, double の8種 • リテラルが使える • 演算子が使える • == で同値判定できる • メソッドの呼び出しができる • null を使えない • ジェネリクスでも利用可能 new ArrayList(); new ArrayList(); new ArrayList();

Slide 19

Slide 19 text

Record Record を用いるとデータを保持する不変クラスを 簡単に定義できます Record は identity / value いずれでも宣言することができます public identity record IdentityRecord (int id, String name) {} public value record ValueRecord (int id, String name) {}

Slide 20

Slide 20 text

Valhalla はやさしい世界 俺たちは雰囲気でValhallaで戦える!

Slide 21

Slide 21 text

Valhalla の裏方は地獄 互換性キープで! 既存のは Value と Identity に再整理な!

Slide 22

Slide 22 text

プリミティブ型のメソッド呼び出し プリミティブ型変数に “.” や “::” を付けた場合にラッパークラ スを探してメソッドを呼び出す仕組み int i = 12; int iSize = i.SIZE; double iAsDouble = i.doubleValue(); Supplier iSupp = i::toString; JEP 402 の Member accesses の項参照 左辺がリテラルの時、”.”をどう解釈するか問題とかがある

Slide 23

Slide 23 text

Value でも Identity でもない class 以下のいずれかのプロパティを持つ場合、暗黙的にIdentity • abstract ではなく、classではないクラスがabstractであり、Objectクラスでもない • クラスがabstractで、インスタンスフィールドを宣言している(8.3.1.1)か、または包含 インスタンスを持っている(8.1.3) • クラスがabstractで、同期されたインスタンスメソッドを宣言している(8.4.3.6) • クラスがabstractで、非自明なコンストラクタ(8.8)またはインスタンスイニシャライ ザ(8.6)を宣言している。このルールの目的で、コンストラクタは、アクセスレベルが クラスよりも厳格である(8.8.3)、フォーマルパラメータ(8.8.1)または型パラメータ (8.8.4)を宣言する、throws句(8.8.5)を持つ、またはsuper();という形式の明示的な コンストラクタ呼び出し以外の何かを含む場合に、"非自明"と見なされます(8.8.7) 言語仕様 8.1.1.5 identity and value Classes より 分からん!

Slide 24

Slide 24 text

How We Got the Generics We Have 互換性を維持しつつ機能追加? それ20年前にジェネリクスでやったわ https://openjdk.org/projects/valhalla/design-notes/in-defense-of-erasure 互換性は大事。徐々に移行できるように

Slide 25

Slide 25 text

ジェネリクスのプリミティブ 型変数 List は List にマッピングする。 境界チェックの前にこの変換をやるよ。 ここで T! T? T* というnullを許容するかどうかの型変 数を導入してうまいこと辻褄合わせるよ。 T! Nullness T? Nullable T* T! or T? '!' <: '*' <: '?' JEP 208 JEP 402 ML : Nullness markers

Slide 26

Slide 26 text

目先はイレイジャでListとして動くよ そこまで漕ぎつけておけば、 将来パフォーマンス向上させられると思うよ 南無JavaVM ! 南無JavaVM !