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

  • View
    8.659

  • Download
    6

  • Category

    Software

Preview:

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!