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 型の利用
© Copyright 2024 ExpyDoc