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