Download - JJUG CCC 2014 fall Javaが見るニュータイプの夢
![Page 1: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/1.jpg)
2014/11/15 きしだなおき
![Page 2: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/2.jpg)
ニュータイプ
![Page 3: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/3.jpg)
ニュータイプ
● ニュー→新しい● タイプ→型
![Page 4: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/4.jpg)
新しい型!
![Page 5: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/5.jpg)
Javaの今までの型
● 基本型
– 8つの基本的な型
● 参照型– オブジェクト
● 異なる型の値をまとめる
– 配列● 同じ型の値をまとめる
![Page 6: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/6.jpg)
今までの型の欠点
● 基本型– さまざまなアーキテクチャにあわせれない
● 参照型– オブジェクト
● 参照とヘッダがオーバーヘッド● メモリが散乱する
– 配列● 多次元配列がない(現在は1次元配列の多重化)● 大きい配列が定義できない(32億要素まで)
![Page 7: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/7.jpg)
つまり
● 新しいプロセッサに適応できない● 新しいメモリモデルに適応できない
![Page 8: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/8.jpg)
現在のコンピュータアーキテクチャ
![Page 9: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/9.jpg)
メモリのアクセス速度
種類 時間
クロック 1秒
レジスタ 1秒
コア内キャッシュ 3秒
共通キャッシュ 43秒
メインメモリ 6分
● 1クロックを1秒とすると
![Page 10: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/10.jpg)
いかにキャッシュに乗せるか
● いかにメモリをまとめて扱うか
![Page 11: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/11.jpg)
Pointクラス
class Point{ final int x; final int y;}
![Page 12: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/12.jpg)
Pointクラスの配列
![Page 13: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/13.jpg)
Pointクラスの配列の効率化
![Page 14: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/14.jpg)
ValueType版Point
value class Point{ final int x; final int y;}
![Page 15: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/15.jpg)
ValueType版Pointの配列
![Page 16: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/16.jpg)
次世代Javaのためのプロジェクト
● Project Valhalla– Specialization
– Value Types
– ClassDynamic
● Project Panama– Foreign Function Interface
– Object Layout
– Arrays 2.0
![Page 17: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/17.jpg)
Project Panama
● FFI/JNR– ネイティブ呼び出し
● Object Layout– オブジェクトの配置
● Arrays 2.0– 配列の拡張
![Page 18: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/18.jpg)
FFI(Foreign Funciton Interface)
● ネイティブライブラリの呼び出し
● JNR(Java Native Runtime)
![Page 19: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/19.jpg)
FFI/JNR
![Page 20: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/20.jpg)
Arrays2.0
● 多次元配列– 現状は、配列の配列
– ヒープの中に散らばる
● インデックス
– intより大きい値
● アクセス制限– リードオンリー、一度だけ書き込み、並列更新
![Page 21: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/21.jpg)
Project Valhalla
● Value Types– ユーザー定義基本型
● Specialization– 基本型が指定可能なGenerics
● Class Dynamic– クラスの動的リンク
![Page 22: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/22.jpg)
ValueTypesとSpecialization
● ValueTypes– VM優先
– enhancements to the Java Virtual Machine instruction set, and secondarily to the Java Languagehttp://cr.openjdk.java.net/~jrose/values/values-0.html
● Specialization– 言語優先
– enhancements to the Java Language (and secondarily, to the Java Virtual Machine)http://cr.openjdk.java.net/~briangoetz/valhalla/specialization.html
![Page 23: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/23.jpg)
ValueTypes
● Codes like a class, works like an int!● ローカルキーワードが導入される?
– valueをキーワードにできない
– classの前にだけ使えるキーワード
value class Point{ final int x; final int y;}
![Page 24: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/24.jpg)
ValueTypesの利用
static Point origin = __MakeValue(0, 0);static String stringValueOf(Point p) { return "Point("+p.x+","+p.y+")";}static Point displace(Point p, int dx, int dy) { if (dx == 0 && dy == 0) return p; Point p2 = __MakeValue(p.x + dx, p.y + dy); assert(!p.equals(p2)); return p2;}
● __MakeValueはなんらかのおしゃれな表記になるはず
![Page 25: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/25.jpg)
ValueTypesの応用
● 数値
– 複素数、Unsigned、Decimal● ネイティブ対応
– 128bit整数
● 代数データ
– Optional<T>、Choice<T,U>● タプル
– 複数戻り値
![Page 26: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/26.jpg)
ValueTypesの制約
● ロックに使えない● 参照での比較
● cloneできない– 意味がない
● Java 8でも似たような定義
– Value-based Classeshttps://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html
● あんまり大きくない型
![Page 27: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/27.jpg)
検討事項
● null● キャスト● リフレクション● アトミック性
– volatileの拡張
● 互換性
– Optional<T>をそのままValueTypeにできるか
![Page 28: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/28.jpg)
Specialization
ArrayList<int>
![Page 29: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/29.jpg)
Java8の美しくないクラス
● StreamとIntStream● OptionalとOptionalInt
![Page 30: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/30.jpg)
ValueType対応
● それぞれのValueTypeにあわせたコレクションを作るのは無理
![Page 31: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/31.jpg)
Genericなクラス
class Box<T>{ T value; Box(T v){ value = v; } T getValue(){ return T; }}
![Page 32: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/32.jpg)
現在のコンパイル結果
class Box{ Object value; Box(Object v){ value = v; } Object getValue(){ return value; }}
![Page 33: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/33.jpg)
Specialize対応のコンパイル結果
class Box{ Object*T value; Box(Object*T v){ value = v; } Object*T getValue(){ return value; }}
![Page 34: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/34.jpg)
Box<int>の場合
class Box{t=int}{ int value; Box(int v){ value = v; } int getValue(){ return value; }}
![Page 35: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/35.jpg)
つまり
Box<int> box = new Box<int>();
というのは
Box{t=int} box = new Box{t=int}();
![Page 36: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/36.jpg)
キャストの制約
● Specializeされたクラスはキャスト不可
Box box = new Box<int>();List nums = new List<int>();
![Page 37: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/37.jpg)
基本型と参照型の非互換の問題
● 基本型と参照型で同じコードが使えない。– 比較など
![Page 38: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/38.jpg)
条件付きメソッド
class Box<T>{ T value; <where T=int> int getTwice(){ return value * 2; }}
![Page 39: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/39.jpg)
問題点
● null● オーバーロード
List<T>{ void remove(T o); void remove(int idx);}
![Page 40: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/40.jpg)
Specializeされたクラスをいつ作るか
![Page 41: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/41.jpg)
ClassDynamic
● 動的なクラスリンク
● InvokeDynamicのクラス版
![Page 42: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/42.jpg)
応用
● プロキシ● タプル
– ScalaのTuple22問題
![Page 43: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/43.jpg)
いつになるの?
● Project Panama– Java 9?
– JavaOneでCharles NutterがJNRだけは入れたい、と言ってた
● Project Valhalla– Java 10?
● VMだけ変わって言語に反映されない可能性も
● .netと激しく競合するようになった今、できれば早いほうがいいな
– Value Types、Specializationは.netそのまま
![Page 44: JJUG CCC 2014 fall Javaが見るニュータイプの夢](https://reader031.vdocuments.net/reader031/viewer/2022020105/559c19251a28ab32598b465f/html5/thumbnails/44.jpg)
まとめ
Cool Java!