of 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 バイトコードを高級言語や 低水準言語に変換する仕組み を導入 x instanceof Integer i var a = new ArrayList(); 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
◦ コンパイラ・グループ 19 Java SEの動向 概要 Project Amber: https://openjdk.org/projects/amber/ • 特徴 ◦ 少なくとも2回プレビュー ◦ JEPだけではなく、ガイドや設計メモが公開 var a = new ArrayList(); x instanceof Integer i sealed class Shape permits Circle, Rectangle
(x instanceof Integer i) { // ここで i を使用できる System.out.println(i); } Pattern Matching for instanceof var str = """ You can write two line string. """; Text Blocks var a = "Foo"; Local-Variable Type Inference public Employee(int age) { if (age < 18 || age > 67) throw new IllegalArgumentException(); // super()/this()の前に処理が実行できる super(age); } Flexible Constructor Bodies void main() { IO.println("Hello, World!"); } Simple Source Files and Instance Main Methods
numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; Switch Expressions String r = switch (string) { case String s when s.length() > 4 -> "..."; case String s -> s; case null -> "null"; default -> "not String"; }; Pattern Matching for switch String s = switch (obj) { case 0 -> "OK"; case int i when i >= 100 -> "Warning"; case int _ -> "Unknown"; }; Primitive Types in Patterns, instanceof, and switch (Second Preview)
y 値 値 x y 値 値 0 1 2 x y 値 値 :アドレス 0 1 2 0 1 2 x y x y x y 0 1 2 値 値 値 Point[] プリミティブの性能特性をもつ オブジェクトの配列 プリミティブの場合 x y class Point { int x; int y; } Pointオブジェクト 連続したメモリ領域に値を含ん だ配列が割り当てられる。 この配列がCPUのキャッシュに 乗ればキャッシュ内だけで連続 して処理ができる オブジェクトの場合 1つのオブジェクトがもつプリ ミティブ型のフィールドは連 続したメモリ領域に割り当て られる 配列の各要素は、オブジェクトへのアドレス が格納されている。 この配列がCPUのキャッシュに乗っても、オ ブジェクトを参照しにDRAMへアクセスしない といけない Valhallaの場合 x y value class Point { int x; int y; } Pointオブジェクト 配列の各要素にPointオブジェクトの内容 が格納される。 プリミティブ型の配列と同じ効果が得られ る。 参照 参照 参照 例:Pointクラス Point[]
final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED; static void vectorComputation (float[] a, float[] b, float[] c) { int i = 0; int upperBound = SPECIES.loopBound(a.length); for (; i < upperBound; i += SPECIES.length()) { // FloatVector va, vb, vc; var va = FloatVector.fromArray(SPECIES, a, i); var vb = FloatVector.fromArray(SPECIES, b, i); var vc = va.mul(va) . add(vb.mul(vb)) . neg(); vc.intoArray(c, i); } for (; i < a.length; i++) { c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f; } } Vector API