44
2014/11/15 きしだなおき

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

  • Upload
    -

  • View
    8.659

  • Download
    6

Embed Size (px)

DESCRIPTION

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

Citation preview

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

2014/11/15 きしだなおき

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

ニュータイプ

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

ニュータイプ

● ニュー→新しい● タイプ→型

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

新しい型!

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

Javaの今までの型

● 基本型

– 8つの基本的な型

● 参照型– オブジェクト

● 異なる型の値をまとめる

– 配列● 同じ型の値をまとめる

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

今までの型の欠点

● 基本型– さまざまなアーキテクチャにあわせれない

● 参照型– オブジェクト

● 参照とヘッダがオーバーヘッド● メモリが散乱する

– 配列● 多次元配列がない(現在は1次元配列の多重化)● 大きい配列が定義できない(32億要素まで)

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

つまり

● 新しいプロセッサに適応できない● 新しいメモリモデルに適応できない

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

現在のコンピュータアーキテクチャ

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

メモリのアクセス速度

種類 時間

クロック 1秒

レジスタ 1秒

コア内キャッシュ 3秒

共通キャッシュ 43秒

メインメモリ 6分

● 1クロックを1秒とすると

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

いかにキャッシュに乗せるか

● いかにメモリをまとめて扱うか

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

Pointクラス

class Point{ final int x; final int y;}

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

Pointクラスの配列

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

Pointクラスの配列の効率化

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

ValueType版Point

value class Point{ final int x; final int y;}

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

ValueType版Pointの配列

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

次世代Javaのためのプロジェクト

● Project Valhalla– Specialization

– Value Types

– ClassDynamic

● Project Panama– Foreign Function Interface

– Object Layout

– Arrays 2.0

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

Project Panama

● FFI/JNR– ネイティブ呼び出し

● Object Layout– オブジェクトの配置

● Arrays 2.0– 配列の拡張

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

FFI(Foreign Funciton Interface)

● ネイティブライブラリの呼び出し

● JNR(Java Native Runtime)

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

FFI/JNR

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

Arrays2.0

● 多次元配列– 現状は、配列の配列

– ヒープの中に散らばる

● インデックス

– intより大きい値

● アクセス制限– リードオンリー、一度だけ書き込み、並列更新

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

Project Valhalla

● Value Types– ユーザー定義基本型

● Specialization– 基本型が指定可能なGenerics

● Class Dynamic– クラスの動的リンク

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

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が見るニュータイプの夢

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が見るニュータイプの夢

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が見るニュータイプの夢

ValueTypesの応用

● 数値

– 複素数、Unsigned、Decimal● ネイティブ対応

– 128bit整数

● 代数データ

– Optional<T>、Choice<T,U>● タプル

– 複数戻り値

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

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が見るニュータイプの夢

検討事項

● null● キャスト● リフレクション● アトミック性

– volatileの拡張

● 互換性

– Optional<T>をそのままValueTypeにできるか

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

Specialization

ArrayList<int>

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

Java8の美しくないクラス

● StreamとIntStream● OptionalとOptionalInt

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

ValueType対応

● それぞれのValueTypeにあわせたコレクションを作るのは無理

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

Genericなクラス

class Box<T>{ T value; Box(T v){ value = v; } T getValue(){ return T; }}

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

現在のコンパイル結果

class Box{ Object value; Box(Object v){ value = v; } Object getValue(){ return value; }}

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

Specialize対応のコンパイル結果

class Box{ Object*T value; Box(Object*T v){ value = v; } Object*T getValue(){ return value; }}

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

Box<int>の場合

class Box{t=int}{ int value; Box(int v){ value = v; } int getValue(){ return value; }}

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

つまり

Box<int> box = new Box<int>();

というのは

Box{t=int} box = new Box{t=int}();

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

キャストの制約

● Specializeされたクラスはキャスト不可

Box box = new Box<int>();List nums = new List<int>();

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

基本型と参照型の非互換の問題

● 基本型と参照型で同じコードが使えない。– 比較など

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

条件付きメソッド

class Box<T>{ T value; <where T=int> int getTwice(){ return value * 2; }}

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

問題点

● null● オーバーロード

List<T>{ void remove(T o); void remove(int idx);}

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

Specializeされたクラスをいつ作るか

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

ClassDynamic

● 動的なクラスリンク

● InvokeDynamicのクラス版

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

応用

● プロキシ● タプル

– ScalaのTuple22問題

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

いつになるの?

● 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が見るニュータイプの夢

まとめ

Cool Java!