Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Project Valhalla 2023 中間報告 - JJUG 2023/03/30

nagise
April 17, 2023
160

Project Valhalla 2023 中間報告 - JJUG 2023/03/30

2023/03/30 JJUG Java仕様勉強会のセッション資料です。
Project Valhalla について 2023年時点の情報をまとめています。
セッションの内容はYoutubeを参照してください
https://www.youtube.com/watch?v=fud2bShXOW4

nagise

April 17, 2023
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

  3. 今日の参考文献 (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

    View full-size slide

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

    View full-size slide

  5. 今日の参考文献 (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/

    View full-size slide

  6. 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/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. Valhallaに行きたいかー!

    View full-size slide

  10. 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

    View full-size slide

  11. 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

    View full-size slide

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

    View full-size slide

  13. 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

    View full-size slide

  14. 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();

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. 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 より
    分からん!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide