暗黙的に型付けされる構造体の Javaへの導入

1
暗黙的に型付けされる構造体の
Java言語への導入
理学部 情報科学科
06_04206 大久保 貴司
指導教員 千葉 滋 教授
2
局所的にしか用いない構造体の型を
いちいち定義する必要がある
• 構造体
▫ データをまとめるために利用
• Java の場合
▫ 定義が別途必要
 Inner class
 Nested class
 Anonymous class
:
人を表す構造体を
利用したい
Person p = new Person();
p.name = “hoge”;
p.age = 20;
class Person{
String name;
int age;
}
3
動的型付け言語による構造体の表現
• オブジェクトの型を定義する必要がない
▫ オブジェクトのメンバ (プロパティ) は自由に追加可能
• 動的型付け言語だからできる記述法
▫ Java にこのまま導入することは不可能
Java
Person p = new Person();
p.name = “hoge”;
p.age = 20;
class Person{
String name;
int age;
}
JavaScript
var p = {};
p.name = ”hoge”;
p.age = 20;
定義する必要なし
4
提案: 暗黙的に型付けされる構造体
• 動的型付け言語のような構文で構造体を
生成・利用可能
▫ ストラクトオブジェクトと var 型を導入
 メンバを自由に追加可能
 追加したメンバにはアクセス可能
• 同一メソッド内でのみ利用可能
本システムを用いた Java
var 型: ストラク
トオブジェクトを
参照する変数
の宣言時の型
var p = new();
p.name = “hoge”;
p.age = 20;
int i = p.age;
ストラクトオブジェ
クト(: 構造体を表
すオブジェクト)を
生成
5
暗黙的な型付け
• structural type [Cardelli ‘88]+ 型推論
▫ 型はstructural type を用いて表現
 型 = アクセス可能なメンバの集合
▫ ストラクトオブジェクトの型
 代入された変数のメンバ代入式から決定
▫ 変数の型
 変数に代入されたストラクトオブジェクトの型から決定
変数 p の型
Struct{
String name;
int age;
}
var p = new();
p.name = “hoge”;
p.age = 10;
20;
int i = p.age;
ストラクト
オブジェクトの型
struct {
String name;
int age;
}
6
Subtyping
• var 型の変数への代入
▫ 必要に応じてスーパータイプを生成
 共通のアクセス可能メンバのみメンバとして持つ
フィールド
代入
var circle = new();
circle.color = “red”;
circle.radius = 3;
フィールド
代入
var square = new();
square.color = “blue”;
square.size = 5;
変数代入
var shape;
shape = circle;
shape = square;
struct{
String color;
int radius; }
struct {
String color;
int size; }
Struct{
String color;
}
circleの型
squareの型
shapeの型
7
typeof の提供
• 型を取得するための演算子
▫ 本システムでは構造体の型の名前を明示的に指定で
きないため必要
p と同じ型のストラ
クトオブジェクトの
み格納可能
var p ;
Map<String, typeof(p)> map =
new HashMap<String, typeof(p)>();
for(int i = 0; i < 5; i ++){
p = new();
p.name = “hoge” + i;
p.age = 10;
map.put(“p” + i, p);
}
Struct{
String name;
int age;
}
p の型
8
実装
• JastAddJ を拡張
▫ JastAddJ: JastAdd を用いて実装された Java コンパイラ
• 標準のバイトコードに変換
▫ var 型 = Object 型
 変数ごとにインタフェースを作成、必要に応じてキャスト
 インタフェースがアクセス可能なフィールドを表す
▫ ストラクトオブジェクト
 上記のインタフェースを実装するクラスのインスタンス
ストラクトオブジェクトの型
class Var$$0 implements StringName{
変数の型
String name;
interface StringName{
String getName(){return name;}
String getName();
void setName(String name){
void setName(String name)
this.name = name;}
}
}
9
実験
• 内部クラスによる構造体と本システムを比較
▫ 構造体を生成・操作するメソッドを100個定義し、実行
するプログラム
▫ コンパイル時間と実行時間を計測
内部クラスを用いた構造体
run(){
Person p = new Person();
p.name = “hoge”;
p.age = 5;
:
class Person{…}
}
本システムを用いた構造体
run(){
var p = new();
p.name = “hoge”;
p.age = 5;
:
}
10
実験結果
• コンパイル時間
▫ 型推論や暗黙的に行われるクラス・インタフェースの定義によってオー
バーヘッドがかかっていると考えられる
▫ 既存のプログラムには影響を与えない
• 実行時間
▫ 実行時間には影響なく実現できた
2500
2000
30
本システム
約+40%
本システム
の利用
25
内部クラス
/JastAddJ
20
1500
15
1000
内部クラス/本
システムのコン
パイラ
10
500
5
0
0
コンパイル時間(ミリ秒)
var型/本システ
ムのコンパイラ
実行時間(ミリ秒)
11
関連研究
• Whiteoak [Gil ら ‘08]
▫ Javaにおいて structural typeな型を宣言できる
 インスタンスは生成できない
▫ 型を明示的に定義する必要はある
• OCaml 他
▫ 型推論を行う言語
 明示的に型を宣言する必要のない静的型付け言語
▫ オブジェクトの生成時にはクラス定義が必要
12
まとめと今後の課題
• まとめ
▫ 暗黙的に型付けされる構造体を実現
 動的型付け言語の記述法を静的型付け言語である
Javaで実現
▫ 暗黙的に付けられた型を取得する typeof を提供
• 今後の課題
▫ より適切な仕様の決定
▫ エラー検知を充実させる
▫ より幅広い var 型の利用