OpenJDK Sap Machine OracleJDK Oracle OpenJDK Azul Zulu Liberica JDK Microsoft Build of OpenJDK Amazon Corretto Mandrel GraalVM CE GraalVM EE Eclipse OpenJ9 IBM OpenJ9 OpenJDK OpenJ9 GraalVM
入 Project Panama Javaとその外部の間で、 データ共有と処理実行を安全に 行う仕組みを導入 Project Valhalla オブジェクト型の抽象化と プリミティブ型の性能特性を組 み合わる仕組みを導入 Project Babylon バイトコードを高級言語や 低水準言語に変換する仕組み を導入 var a = ArrayList(); x instanceof Integer i sealed class Shape permits Circle, Rectangle Job Scheduler OS Thread Java Thread Virtual Thread :スレッド x y x y x y 0 1 2 :アドレス 0 1 2 x y x y x y オブジェクトの配列 プリミティブの性能特性をもつ オブジェクトの配列 0 1 2 プリミティブの配列 CPU java Bytecode Class file Native code 別の環境 別の言語 変換 生成 読む java 読み書き Native API 呼び出し Native Memory
o; System.out.println(switch (o) { case String s && s.length() >= 5 -> s.toUpperCase(); case String s -> " %s ".formatted(s); case Integer i -> "%,d".formatted(i); default -> o.toString(); } Pattern Matching for switch (Second Preview) public abstract sealed class Shape permits Circle, Rectangle, Square {...} Sealed Classes record Foo(int x, int y) {} Records if (x instanceof Integer i) { // ここで i を使用できる } Pattern Matching for instanceof var str = """ You can write two line string. """; Text Blocks int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; Switch Expressions var a = "Foo"; Local-Variable Type Inference
ゴール ◦ Javaのオブジェクトモデルを、値オブジェクトと ユーザー定義プリミティブで補強 ◦ オブジェクト指向プログラミングの抽象化と 単純なプリミティブの性能特性を組み合わせること • スポンサー ◦ HotSpotグループ • 特徴 ◦ ジェネリクスAPIによる性能向上を維持するために、 Javaの ジェネリクスへの変更で補完 ◦ 以前は Value Types と言ってたものが、 inline-types に名 前を変えた x y x y 0 1 2 x y :アドレス 0 1 2 0 1 2 x y x y x y 0 1 2 オブジェクトの配列 プリミティブの性能特性をもつ オブジェクトの配列 プリミティブの配列
final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256; void vectorComputation(float[] a, float[] b, float[] c) { for (int i = 0; i < a.length; i += SPECIES.length()) { VectorMask<Float> m = SPECIES.indexInRange(i, a.length); FloatVector va = FloatVector.fromArray(SPECIES, a, i, m); FloatVector vb = FloatVector.fromArray(SPECIES, b, i, m); FloatVector vc = va.mul(va). add(vb.mul(vb)). neg(); vc.intoArray(c, i, m); } } Vector API try (MemorySegment segment = MemorySegment.allocateNative(100)) { for (int i = 0 ; i < 25 ; i++) { MemoryAccess.setIntAtOffset(i * 4, i); } } Foreign Function & Memory API (Second Incubator)