Advertisement
Advertisement

More Related Content

More from なおき きしだ(20)

Advertisement

JJUG CCC 2014 fall Javaが見るニュータイプの夢

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