2020/10/4にオンラインで行われたJ Lang Fest Kansai Online #1での登壇資料です https://kansai-jvm-langs-fest.connpass.com/event/188249/
Javaが最強JVM言語になる日はくるのかLINE Fukuoka きしだ なおき2020/10/4 J Lang Fest Kansai Online #1 Microsoft Flight Simulator 2020
View Slide
自己紹介• きしだ なおき(@kis)• LINE Fukuoka• MSフライトシミュレータで墜落がうまくなった• オンライン登壇での待機中にキッチンを片付けたくなる
この発表で「Java」はJava言語を示します
Javaはいまでも最強JVM言語です終制作・著作ⓀⒾⓈMicrosoft Flight Simulator 2020
Java Bean関数型 セミコロン省略equalsStreampublic static void mainラッパークラス非同期処理nullメソッド定義パターンマッチング
Java Bean• コンストラクタ• setter / getter• toString / equals / hashCode• IDEでの自動生成やlombokでの暗黙の生成ができるとはいえ面倒
Java Beanへの対応• Records(JEP 384, preview)• イミュータブルなデータ運搬型を定義できる
Recordsの欠点• ミュータブルにはできない• setter / getterは定義されない• 属性と同じ名前のメソッドが定義される• 既存のフレームワークがそのまま使えない
パターンマッチ• パターンマッチかっこいい
パターンマッチへの対応• instanceofで型パターンマッチに対応(JEP 375, preview 2)• switch式(JEP 361, standard)• switchでのパターンマッチ(JEP Draft)• Recordの分解(未JEP)• 仕様決め難しそう
null• nullは悪• Optionalめんどい
nullへの対応• Optionalのパターンマッチへの対応(構想あり)• unapply相当の仕組みで対応する• 時間がかかりそう
文字列定義• 複数行の文字列を定義したい• 変数を埋め込みたい
文字列定義への対応• Text Blocks(JEP 378, standard)• ダブルクオート3つで複数行文字列の定義• 変数補完(インターポレーション)はない• formattedというメソッドが導入されたので代替• "message is %s".formatted("hello")
非同期処理• 通信中に別の処理をしたい• Kotlinにはコルーチンがある• Rxは人類には早すぎた
非同期処理への対応• Project Loom• 仮想スレッドのJVMへの導入• OS管理ではなくJVMで管理するスレッド(グリーンスレッド)• OSリソースを食わないので軽量• バイトコードレベルで対処を行う• 言語仕様への変更不要• synchronizedまわりに変更あるかも?• 他の言語にも恩恵あり• 着実に開発進んでる模様
ラッパークラス• intやbooleanなど基本型に対応するラッパークラスが必要• 変換自体は自動で行われるので意識することは少なくなった• Genericsで基本型が使えない• IntStreamやOptinalInt、IntFuncitonなど基本型用のクラスやインタフェースが必要
ラッパークラスへの対応• Project Valhallaで進行中• Listが書ける• バイトコードを拡張• 新しいバイトコード命令の追加• つまり大工事
Project Valhallaの問題点• あまり順調ではなさそう・・・• 基本型の値に対してメソッドを呼び出すことはできなそう• 123.times(System.out::println)のような書き方はできない
メソッド定義の簡素化• 式を返すだけなのにいろいろ書かないといけない• String myMessage(String m) {return "message is %s".formatter(m);}
メソッド定義の簡素化への対応• Concise Method Bodies(JEP draft)• String myMessage(String m) = "message is %s".formatted(m);• 処理が単一の式であればreturnが不要になる
ローカル関数• メソッドの中でメソッドを定義したい• ラムダを使うのは美しくない• 匿名クラスを使うのはハッキー• var m = new Object() {double area(double r) {return r * r * PI;}};println(m.area(5));
ローカル関数への対応• Gitにそれっぽいブランチがある
関数の後置(中置)• 関数をうしろに書きたい• Kotlinのletとか• String.formatに対するformattedのようなものを普通に使いたい
関数の後置への対応• String.transform• 他のクラスにも拡張するかも?
拡張メソッド• Stringとか拡張したい
拡張メソッドへの対応• 計画の気配なし• 理論的には可能
メインメソッド• public static void mainってややこしい• クラスが必要になるのもわかりにくい• 使い捨て処理を書くのが面倒• 初心者の入門を阻害
メインメソッドへの対応• 計画の気配なし• 理論的には可能• javacなしでjavaコマンドだけでの実行は可能• Launch Single-File Source-Code Programs(JEP 330)
equals• 同値性の検証にメソッド呼び出しが必要• 間違いがち• めんどう
equalsへの対応• 予定なし• 互換性考えると無理
Stream• stream()ってつけるの面倒• Listを出力したいときのcollect(Collectors.toList())が面倒• 直接toListってやりたい• toArrayはある
Streamへの対応• StreamをCollectionフレームワークに依存させたくないというBrian Goetzの強い意志があるので無理
関数型• ラムダ式によってリテラルとしては記述できるようになった• 型としてはインタフェースを使う必要がある• 必要な型に対応するインタフェースを覚えるのは大変• Function / Supplier / Comsumer• IntFunction / ByFunction・・・• 例外に対応しようとすると別に定義が必要• 仕様がややこしい
関数型への対応• 無理そう
セミコロン省略• 流行りはセミコロンの省略• Javaでセミコロンを書かずに処理を書くのは変態
セミコロン省略への対応• 過去のコードがコンパイルできるよう仕様変更するのは無理• セミコロンと和解せよ
その他• ifは式にならないの?• 条件演算子を使おう• 戻り値の型推論は?• 構文上、結局varって書くことになるのであまり意味がなさそう
ここまでのまとめ機能 状況Java Bean Recordで対応 フレームワークの対応が必要パターンマッチ 実装中 deconstructionは時間かかりそうnull Optionalへのパターンマッチ まだ時間がかかる文字列定義 Text Blocks 変数補完は入らなそう非同期処理 Project Loomラッパークラス Project Valhalla 先は長そうメソッド定義の簡素化 JEP draftローカルメソッド Gitにブランチあり関数の後置 String.translate拡張メソッド 理論的には可能 計画なしメインメソッド 理論的には可能 計画なしequals 無理Stream 無理関数型 無理セミコロン省略 無理
JavaがJVM最強言語になることはありません終制作・著作ⓀⒾⓈMicrosoft Flight Simulator 2020
まとめ• Javaの改善は続いている• 既存構文との整合性を考えると最強になりえない• Javaで言語機能が対応するとJVMに最適化機構が入る• 他の言語でも性能が改善する
JVMが最強実行環境であればそれでいいのだ終制作・著作ⓀⒾⓈMicrosoft Flight Simulator 2020