Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Javaの現状2024夏 / Java current status 2024 summer

Javaの現状2024夏 / Java current status 2024 summer

2024年7月5日(金)開催の「JJUG CCC 2024 Spring報告会」の登壇資料です。
https://javaq.connpass.com/event/320843/

Naoki Kishida

July 05, 2024
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. いまJavaを勉強する意味 • シェア • 大規模Webサービスや金融ではやはり強い • JVM • 性能と信頼性 •

    進化 • 出遅れて進化してるので、いま見てておもしろい • 言語 • 欠点はあるけど、そこまで悪くない。必要な機能はそろっている
  2. 教育向けの対応 • Pythonが強いので対策が進められている • Paving the on-ramp(Sep. 2022) • (進入路を舗装する)

    • https://openjdk.org/projects/amber/design-notes/on-ramp • 学習しやすさのための機能 • JShell(Java 9) • javaコマンドでの実行(Java 11) • クラスの省略(Java 22 preview) • System.outの省略(Java 23 preview) • Playground • dev.java/playground
  3. JShell • REPL(Read-Eval-Print Loop) • 対話的な実行 • 「Javaのプログラムの実行は面倒」への対応 • ただし実際のプログラミングとは別になってしまう

    >jshell | JShellへようこそ -- バージョン22 | 概要については、次を入力してください: /help intro jshell> 2+3 $1 ==> 5 jshell> var data = List.of("aa", "bb", "cc") data ==> [aa, bb, cc] jshell> data.stream().map(String::toUpperCase).collect(Collectors.joining("/")) $3 ==> "AA/BB/CC"
  4. Lambda式 • 関数型プログラミングの隆盛 • 関数を値として扱えるプログラミングスタイル • Webはリクエスト-レスポンスの関数的 • メソッドひとつのインタフェースのオブジェクトを関数として扱う •

    関数を値として扱えるわけではないけど、主要な用途をまかなえる Function<Integer, String> fn = new Function<>() { public String apply(Integer n) { return "hello".repeat(n); } }; Function<Integer, String> fn = n -> "hello".repeat(n)
  5. ローカル変数型推論 • 型を書くのは面倒 • 特に、newでは同じ型を書く必要があって冗長 • Rubyの流行で型を書かないことが流行る • Scalaの登場で型推論が流行る •

    ダイヤモンド型推論で型推論機構自体はもっていた • ローカル変数は寿命が短いので型がなくても理解できる ArrayList<String> strs = new ArrayList<>(); ArrayList<String> strs = new ArrayList<String>(); var strs = new ArrayList<String>();
  6. パターンマッチング • instanceof • 基本的なパターンマッチ機構の導入 • record • 値保持用のクラスを定義 •

    パターンマッチングで値の分解 • switch • パターンマッチングによる分岐 record MyRecord(String s, int n) {} var a = switch(o) { case String s -> s.length(); case MyRecord(_, var n) -> n; default -> 0; }
  7. 代数的データ型 • 代数: 掛算と足算 • record • 直積型: 型の掛算 •

    record Value(boolean a, byte b){} • boolean(2通り) x byte(256通り)で512通りの値を保持 • sealed class • 直和型: 型の足し算 • sealed interface Value { record BooleanValue(boolean v) {} record ByteValue(byte v) {} } • boolean(2通り) + byte(256通り)で258通りの値を保持
  8. 全部Javaで書く • Jlama • llama2.java • Foreign Memory APIとVector API

    • 基本型を定義できるProject Valhallaが必要 // matmul final int SIMD_SIZE = SPECIES.length(); final long FLOAT_SIZE = ValueLayout.JAVA_FLOAT.byteSize(); FloatVector val = FloatVector.zero(SPECIES); for (int j = 0; j < n; j+=SIMD_SIZE) { FloatVector a = FloatVector.fromMemorySegment( SPECIES, w, (i * n + j + 0*SIMD_SIZE) * FLOAT_SIZE, ByteOrder.LITTLE_ENDIAN); FloatVector b = FloatVector.fromArray(SPECIES, x, j + 0*SIMD_SIZE); val = a.fma(b, val); } xout[i] = val.reduceLanes(VectorOperators.ADD);