Slide 1

Slide 1 text

Javaが最強JVM言語に なる日はくるのか LINE Fukuoka きしだ なおき 2020/10/4 J Lang Fest Kansai Online #1 Microsoft Flight Simulator 2020

Slide 2

Slide 2 text

自己紹介 • きしだ なおき(@kis) • LINE Fukuoka • MSフライトシミュレータで墜落がうまくなった • オンライン登壇での待機中にキッチンを片付け たくなる

Slide 3

Slide 3 text

この発表で「Java」はJava言語を示します

Slide 4

Slide 4 text

Javaはいまでも 最強JVM言語です 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020

Slide 5

Slide 5 text

Java Bean 関数型 セミコロン省略 equals Stream public static void main ラッパークラス 非同期処理 null メソッド定義 パターンマッチング

Slide 6

Slide 6 text

Java Bean • コンストラクタ • setter / getter • toString / equals / hashCode • IDEでの自動生成やlombokでの暗黙の生成ができるとはいえ 面倒

Slide 7

Slide 7 text

Java Beanへの対応 • Records(JEP 384, preview) • イミュータブルなデータ運搬型を定義できる

Slide 8

Slide 8 text

Recordsの欠点 • ミュータブルにはできない • setter / getterは定義されない • 属性と同じ名前のメソッドが定義される • 既存のフレームワークがそのまま使えない

Slide 9

Slide 9 text

パターンマッチ • パターンマッチかっこいい

Slide 10

Slide 10 text

パターンマッチへの対応 • instanceofで型パターンマッチに対応(JEP 375, preview 2) • switch式(JEP 361, standard) • switchでのパターンマッチ(JEP Draft) • Recordの分解(未JEP) • 仕様決め難しそう

Slide 11

Slide 11 text

null • nullは悪 • Optionalめんどい

Slide 12

Slide 12 text

nullへの対応 • Optionalのパターンマッチへの対応(構想あり) • unapply相当の仕組みで対応する • 時間がかかりそう

Slide 13

Slide 13 text

文字列定義 • 複数行の文字列を定義したい • 変数を埋め込みたい

Slide 14

Slide 14 text

文字列定義への対応 • Text Blocks(JEP 378, standard) • ダブルクオート3つで複数行文字列の定義 • 変数補完(インターポレーション)はない • formattedというメソッドが導入されたので代替 • "message is %s".formatted("hello")

Slide 15

Slide 15 text

非同期処理 • 通信中に別の処理をしたい • Kotlinにはコルーチンがある • Rxは人類には早すぎた

Slide 16

Slide 16 text

非同期処理への対応 • Project Loom • 仮想スレッドのJVMへの導入 • OS管理ではなくJVMで管理するスレッド(グリーンスレッド) • OSリソースを食わないので軽量 • バイトコードレベルで対処を行う • 言語仕様への変更不要 • synchronizedまわりに変更あるかも? • 他の言語にも恩恵あり • 着実に開発進んでる模様

Slide 17

Slide 17 text

ラッパークラス • intやbooleanなど基本型に対応するラッパークラスが必要 • 変換自体は自動で行われるので意識することは少なくなった • Genericsで基本型が使えない • IntStreamやOptinalInt、IntFuncitonなど基本型用のクラスや インタフェースが必要

Slide 18

Slide 18 text

ラッパークラスへの対応 • Project Valhallaで進行中 • Listが書ける • バイトコードを拡張 • 新しいバイトコード命令の追加 • つまり大工事

Slide 19

Slide 19 text

Project Valhallaの問題点 • あまり順調ではなさそう・・・ • 基本型の値に対してメソッドを呼び出すことはできなそう • 123.times(System.out::println)のような書き方はできない

Slide 20

Slide 20 text

メソッド定義の簡素化 • 式を返すだけなのにいろいろ書かないといけない • String myMessage(String m) { return "message is %s".formatter(m); }

Slide 21

Slide 21 text

メソッド定義の簡素化への対応 • Concise Method Bodies(JEP draft) • String myMessage(String m) = "message is %s".formatted(m); • 処理が単一の式であればreturnが不要になる

Slide 22

Slide 22 text

ローカル関数 • メソッドの中でメソッドを定義したい • ラムダを使うのは美しくない • 匿名クラスを使うのはハッキー • var m = new Object() { double area(double r) { return r * r * PI; } }; println(m.area(5));

Slide 23

Slide 23 text

ローカル関数への対応 • Gitにそれっぽいブランチがある

Slide 24

Slide 24 text

関数の後置(中置) • 関数をうしろに書きたい • Kotlinのletとか • String.formatに対するformattedのようなものを普通に 使いたい

Slide 25

Slide 25 text

関数の後置への対応 • String.transform • 他のクラスにも拡張するかも?

Slide 26

Slide 26 text

拡張メソッド • Stringとか拡張したい

Slide 27

Slide 27 text

拡張メソッドへの対応 • 計画の気配なし • 理論的には可能

Slide 28

Slide 28 text

メインメソッド • public static void mainってややこしい • クラスが必要になるのもわかりにくい • 使い捨て処理を書くのが面倒 • 初心者の入門を阻害

Slide 29

Slide 29 text

メインメソッドへの対応 • 計画の気配なし • 理論的には可能 • javacなしでjavaコマンドだけでの実行は可能 • Launch Single-File Source-Code Programs(JEP 330)

Slide 30

Slide 30 text

equals • 同値性の検証にメソッド呼び出しが必要 • 間違いがち • めんどう

Slide 31

Slide 31 text

equalsへの対応 • 予定なし • 互換性考えると無理

Slide 32

Slide 32 text

Stream • stream()ってつけるの面倒 • Listを出力したいときのcollect(Collectors.toList())が面倒 • 直接toListってやりたい • toArrayはある

Slide 33

Slide 33 text

Streamへの対応 • StreamをCollectionフレームワークに依存させたくないという Brian Goetzの強い意志があるので無理

Slide 34

Slide 34 text

関数型 • ラムダ式によってリテラルとしては記述できるようになった • 型としてはインタフェースを使う必要がある • 必要な型に対応するインタフェースを覚えるのは大変 • Function / Supplier / Comsumer • IntFunction / ByFunction・・・ • 例外に対応しようとすると別に定義が必要 • 仕様がややこしい

Slide 35

Slide 35 text

関数型への対応 • 無理そう

Slide 36

Slide 36 text

セミコロン省略 • 流行りはセミコロンの省略 • Javaでセミコロンを書かずに処理を書くのは変態

Slide 37

Slide 37 text

セミコロン省略への対応 • 過去のコードがコンパイルできるよう仕様変更するのは無理 • セミコロンと和解せよ

Slide 38

Slide 38 text

その他 • ifは式にならないの? • 条件演算子を使おう • 戻り値の型推論は? • 構文上、結局varって書くことになるのであまり意味がなさそう

Slide 39

Slide 39 text

ここまでのまとめ 機能 状況 Java Bean Recordで対応 フレームワークの対応が必要 パターンマッチ 実装中 deconstructionは時間かかりそう null Optionalへのパターンマッチ まだ時間がかかる 文字列定義 Text Blocks 変数補完は入らなそう 非同期処理 Project Loom ラッパークラス Project Valhalla 先は長そう メソッド定義の簡素化 JEP draft ローカルメソッド Gitにブランチあり 関数の後置 String.translate 拡張メソッド 理論的には可能 計画なし メインメソッド 理論的には可能 計画なし equals 無理 Stream 無理 関数型 無理 セミコロン省略 無理

Slide 40

Slide 40 text

JavaがJVM最強言語に なることはありません 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020

Slide 41

Slide 41 text

まとめ • Javaの改善は続いている • 既存構文との整合性を考えると最強になりえない • Javaで言語機能が対応するとJVMに最適化機構が入る • 他の言語でも性能が改善する

Slide 42

Slide 42 text

JVMが最強実行環境で あればそれでいいのだ 終 制作・著作 ⓀⒾⓈ Microsoft Flight Simulator 2020