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

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
オブジェクト指向プログラミング(4) 静的分析(2)
プログラミング基礎I(再) 山元進.
Javaのための暗黙的に型定義される構造体
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
アルゴリズムとデータ構造1 2007年6月12日
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
情報伝播によるオブジェクト指向プログラム理解支援の提案
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとデータ構造 2011年6月13日
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
オブジェクト指向入門.
アスペクト指向プログラミングを用いたIDSオフロード
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
静的型付きオブジェクト指向言語 のための 暗黙的に型定義されるレコード
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アスペクト指向言語のための 独立性の高いパッケージシステム
バイトコードを単位とするJavaスライスシステムの試作
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
統合開発環境によって表現された 言語機構によるコードのモジュール化
C#プログラミング実習 第3回.
アルゴリズムとデータ構造 2012年6月11日
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
サブゼミ第7回 実装編① オブジェクト型とキャスト.
アルゴリズムとデータ構造1 2009年6月15日
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
統合開発環境のための プログラミング言語拡張 フレームワーク
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
C言語講座第5回 2017 構造体.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

暗黙的に型付けされる構造体の Java言語への導入 理学部 情報科学科 06_04206  大久保 貴司 指導教員 千葉 滋 教授

局所的にしか用いない構造体の型を いちいち定義する必要がある データをまとめるために利用 Java の場合 定義が別途必要 Inner class Nested class Anonymous class        : Person p = new Person(); p.name = “hoge”; p.age = 20; class Person{ String name; int age; } 人を表す構造体を 利用したい ・一般的に構造体とは複数のデータをまとめるために用いられる。 ・Javaなどのようにクラスベースオブジェクト指向言語では、クラスによって代用されるため、サポートされていないこと多い。 ・プログラムを記述している際に局所的に構造体を生成したい場合が、しばしばあります。 ・Javaでは局所的に用いるオブジェクトを生成するための言語機構として、 内部クラスやアノニマスクラスなどが提供されていますが、構造体は一般的にこのように内部クラスで表します。 図説明!! しかし局所的にしか用いない構造体のためにこのようなクラス定義を別に記述しなければならないのは煩雑に思われます。 class Person{ String name; int age; }

動的型付け言語による構造体の表現 オブジェクトの型を定義する必要がない 動的型付け言語だからできる記述法 オブジェクトのメンバ (プロパティ) は自由に追加可能 動的型付け言語だからできる記述法 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; ・一方、動的型付け言語では、そのような定義をわざわざする必要はありません。 ・なぜなら、型を明示的に宣言する必要がないからです。 ・例えば、JavaScriptでは、……プロパティを任意に追加できます。 ・従って、先ほどのプログラムは、クラス定義だけを省いたような記述で書くことができます。 ・しかし、これは動的型付け言語であるからできる記述法であり、静的型付けを維持したままJavaにこのような記述法を導入するのは難しい。 定義する必要なし

提案: 暗黙的に型付けされる構造体 動的型付け言語のような構文で構造体を 生成・利用可能 同一メソッド内でのみ利用可能  生成・利用可能 ストラクトオブジェクトと var 型を導入 メンバを自由に追加可能 追加したメンバにはアクセス可能 同一メソッド内でのみ利用可能 そこで、本研究ではJavaにおける暗黙的に型付けされる構造体を提案します。 本システムではストラクトオブジェクトとvar型を導入し、型を暗黙的に付けることで、先ほどのJavaScriptのコードのように、 クラス定義をせずに構造体を生成・利用が可能となっています。 これが本システムを用いたJavaで書いた構造体を利用するプログラムです。 ストラクトオブジェクトとはnew()で生成される構造体を表すオブジェクトであり、 Var型とはストラクトオブジェクトを参照する変数の宣言時の型です。 このvar型で宣言された変数pを用いて、自由にストラクトオブジェクトにメンバを追加でき、 追加したメンバの値は取り出すことができます。 Var型とはストラクトオブジェクトを参照する変数の宣言時の型であり、コンパイル時に暗黙的に型付けされます。 なので、JavaScriptのvar変数というよりは、C#のvar型に近く、それを構造体に適用したものです。 本システムを用いた Java var 型: ストラクトオブジェクトを参照する変数の宣言時の型 ストラクトオブジェクト(: 構造体を表すオブジェクト)を生成 var p = new(); p.name = “hoge”; p.age = 20; int i = p.age;

暗黙的な型付け structural type [Cardelli ‘88]+ 型推論 型はstructural type を用いて表現 型 = アクセス可能なメンバの集合 ストラクトオブジェクトの型 代入された変数のメンバ代入式から決定 変数の型 変数に代入されたストラクトオブジェクトの型から決定 本システムにおける構造体の型は、structural typeを用いて表現しています。 Structural typeとは構造によって型が決定される型システムです。 本システムでは、型はアクセス可能なメンバの集合として表されます。 そして、アクセス可能なメンバというのはメンバの代入式から決定しています。 例えば、この例では 具体的には、まずストラクトオブジェクトの型が…のようにして決定されます。 ストラクト オブジェクトの型 変数 p の型 var p = new(); p.name = “hoge”; p.age = 20; int i = p.age; Struct{ String name; int age; } struct { String name; int age; } p.name = “hoge”; p.age = 10;

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; } circleの型 フィールド代入 フィールド代入 squareの型 struct { String color; int size; } 一方、var型の変数に他の変数が参照するストラクトオブジェクトを代入することも可能です。 図説明。 このような場合、 その変数の型はそれらの中で共通なアクセス可能なメンバになります。 具体的には、 このようにすることで、クラスの継承関係のような振る舞いが可能となる。 つまり、shapeの型がcircleとsquareの型のスーパータイプとして振る舞っている。 変数代入 shapeの型 Struct{ String color; }

p と同じ型のストラクトオブジェクトのみ格納可能 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); } 本システムでは、暗黙的に型を付けることで、記述を簡単にしているが、そのため構造体の型を明示的に型の名前を指定できない。 変数宣言はvarを用いて行われ、ストラクトオブジェクトの生成はnewで行われるため必要ないようにも思えるが、 ジェネリクスの型引数やinstanceofによる比較など、明示的に型の名前が必要になる場合が他にも色々あります。 そのため、構造体の型を取得するために、本システムではtypeof演算子を提供しています。 ー>図で説明 p の型 Struct{ String name; int age; }

実装 JastAddJ を拡張 標準のバイトコードに変換 var 型 = Object 型 ストラクトオブジェクト JastAddJ: JastAdd を用いて実装された Java コンパイラ 標準のバイトコードに変換 var 型 = Object 型 変数ごとにインタフェースを作成、必要に応じてキャスト インタフェースがアクセス可能なフィールドを表す ストラクトオブジェクト 上記のインタフェースを実装するクラスのインスタンス 本システムでは、 ストラクトオブジェクトの型 class Var$$0 implements StringName{   String name;   String getName(){return name;}   void setName(String name){    this.name = name;} } 変数の型 interface StringName{   String getName();   void setName(String name) }

実験 内部クラスによる構造体と本システムを比較 構造体を生成・操作するメソッドを100個定義し、実行 するプログラム コンパイル時間と実行時間を計測 内部クラスを用いた構造体 本システムを用いた構造体 run(){  Person p = new Person();  p.name = “hoge”;  p.age = 5;       :  class Person{…} } run(){  var p = new();  p.name = “hoge”;  p.age = 5;        : }

実験結果 コンパイル時間 実行時間 型推論や暗黙的に行われるクラス・インタフェースの定義によってオー バーヘッドがかかっていると考えられる 既存のプログラムには影響を与えない 実行時間 実行時間には影響なく実現できた 本システム の利用 本システム約+40%

関連研究 Whiteoak [Gil ら ‘08] OCaml 他 Javaにおいて structural typeな型を宣言できる インスタンスは生成できない 型を明示的に定義する必要はある OCaml 他 型推論を行う言語 明示的に型を宣言する必要のない静的型付け言語 オブジェクトの生成時にはクラス定義が必要

まとめと今後の課題 まとめ 今後の課題 暗黙的に型付けされる構造体を実現 暗黙的に付けられた型を取得する typeof を提供 動的型付け言語の記述法を静的型付け言語である   Javaで実現 暗黙的に付けられた型を取得する typeof を提供 今後の課題 より適切な仕様の決定 エラー検知を充実させる より幅広い var 型の利用