適用するメソッドを切り替えること で破壊的...

25
+ 適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適適 Method Shells 48-126624 竹竹竹竹 竹竹竹竹 竹竹竹竹竹竹竹 竹竹竹竹竹

Upload: carys

Post on 24-Feb-2016

54 views

Category:

Documents


0 download

DESCRIPTION

適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method Shells. 48-126624 竹下若菜 東京大学 創造情報学専攻 千葉研究室. アプリケーションやソフトウェア. l 1 : HTML renderer. 既存のライブラリやフレームワークを組み合わせて実装 既存のプログラムを少し書き換える より多くのコードを再利用できる. l 2 : web browser. l 3 : HTML viewer. Application. 変更のモジュール化. l 1 : HTML renderer. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+

適用するメソッドを切り替えることで破壊的クラス拡張で生じるメソッド衝突を避けられるモジュール機構Method Shells

48-126624 竹下若菜東京大学 創造情報学専攻千葉研究室

Page 2: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+アプリケーションやソフトウェア既存のライブラリやフレームワークを組み合わせて実装既存のプログラムを少し書き換える

より多くのコードを再利用できる

l1: HTML renderer

l2: web browser l3: HTML viewer

Application

2

Page 3: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+ 別ファイルに差分のみを記述することでメソッドの追加・再定義できる機能 変更をモジュール化できる

変更のモジュール化 3

Ruby’s openclass AspectJ’s aspect

[‘01 Kiczales et al.] GluonJ

[’10 Chiba et al.] Classboxes

[’10 Bergel et al.] etc…

l2: web browser

another file

l1: HTML renderer

original file

既存コード

差分

再定義 & 追加

この機能を破壊的クラス拡張と総称する

Page 4: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+破壊的クラス拡張

l2: web browser

another file

l1: HTML renderer

original fileclass Webpage{

void print(String str){ // standard output

void setPopupItem(Popup p, HTML text){ // set text }void popup(HTML text){ Popup p = new Popup(); setPopupItem(p, text); … }

revise Webpage{

void print(String str){ // standard output

void setPopupItem(Popup p, HTML text){ alert(“disabled”); }void onClick(){ URL url = m.getURL(); popup(url); }

再定義

GluonJ によるコード例

追加

4

別ファイルに差分のみを記述することでメソッドの追加・再定義できる機能 変更をモジュール化できる

Page 5: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+変更の衝突l1: HTML renderer

l2: web browser l3: HTML viewer

Application

void popup(HTML text){ setPopupItem(p, text);void setPopupItem (Popup p, HTML text){ // show a popup window }

void setPopupItem (Popup p, HTML text){ alert(“disabled”); }

void setPopupItem (Popup p, HTML text){}

void check() { popup(…); …}

どの setPopupItemメソッドが有効になるか分からない

5

Page 6: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+提案:有効にするメソッドの切り替えl1: HTML renderer

l2: web browser l3: HTML viewer

ApplicationApplication

void popup(HTML text){ setPopupItem(p, text);void setPopupItem (Popup p, HTML text){ // show a popup window }

void setPopupItem (Popup p, HTML text){ alert(“disabled”); }

void setPopupItem (Popup p, HTML text){}

void check() { popup(…); …}

6

Page 7: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+モジュール機構: Method Shellsモジュール :methodshell

破壊的クラス拡張とクラス宣言を含む有効にするメソッドを切り替えられる

shell グループ 一度に有効にするメソッドの集合 include 宣言によって定義

shell グループの切り替え link 宣言によって定義

renderer methodshellmethodshell renderer;class Webpage{

}

void setPopupItem(Popup p, HTML text){ // set text}

7

void popup(HTML text){ Popup p = new Popup(); setPopupItem(p, text); … }

Page 8: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+モジュール機構: Method Shellsモジュール :methodshell

破壊的クラス拡張とクラス宣言を含む有効にするメソッドを切り替えられる

shell グループ 一度に有効にするメソッドの集合 include 宣言によって定義

shell グループの切り替え link 宣言によって定義

renderer

browserviewer

include 宣言link 宣言shell グループ

8

Page 9: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+shell グループの定義・拡張include 宣言で

shell グループを定義・拡張できる 一度に有効になる

include したmethodshell 中のメソッドは再定義できる

renderer methodshellmethodshell renderer;class Webpage{

}

void setPopupItem(Popup p, HTML text){ // set text           }

include 宣言link 宣言shell グループ

9

browser methodshellmethodshell browser;include renderer;revise Webpage{

}

void setPopupItem(Popup p, HTML text){ alert(“disabled”);         }void onClick(){ URL url = m.getURL(); popup(url);            }

再定義

void popup(HTML text){ Popup p = new Popup(); setPopupItem(p, text); … }

Page 10: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+shell グループの切り替えlink 宣言で切り替え先の shell グループを指定する

link 宣言しているshell グループ内のメソッドを呼び出すと、shell グループが切り替わる

application methodshellmethodshell application;link viewer;

}

void main(){ Webpage w = new WebPage(); w.check(); w.onClick();          }

viewer methodshellmethodshell renderer;include renderer;revise Webpage{

}

void setPopupItem(Popup p, HTML text){ // set text           }void check(File f){ popup(…); …}

include 宣言link 宣言shell グループ

check メソッドが呼ばれると、切り替わる

10

viewer methodshellmethodshell viewer;include renderer;revise Webpage{

}

void setPopupItem(Popup p, HTML text){ // set text           }void check(){ popup(…); …}

Page 11: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+全体図renderer

browser viewer

Applicationapplication

void popup(HTML text){ setPopupItem(p, text); }void setPopupItem (Popup p, HTML text){ // show a popup window }

void setPopupItem (Popup p, HTML text){ alert(“disabled”); }void onClick(){ popup(getURL()); }

void setPopupItem (Popup p, HTML text){ //show bold and red text}

void check() { popup(…); …}

void main(){ w.onClick(); w.check(); }

include 宣言link 宣言shell グループ

11

Page 12: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+全体図renderer

browser viewer

Applicationapplication

void popup(HTML text){ setPopupItem(p, text); }void setPopupItem (Popup p, HTML text){ // show a popup window }

void setPopupItem (Popup p, HTML text){ alert(“disabled”); }void onClick(){ popup(getURL()); }

void setPopupItem (Popup p, HTML text){ //show bold and red text}

void check() { popup(…); …}

void main(){ w.onClick(); w.check(); }

include 宣言link 宣言shell グループ

12

Page 13: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+全体図renderer

browser viewer

Applicationapplication

void popup(HTML text){ setPopupItem(p, text); }void setPopupItem (Popup p, HTML text){ // show a popup window }

void setPopupItem (Popup p, HTML text){ alert(“disabled”); }void onClick(){ popup(getURL()); }

void setPopupItem (Popup p, HTML text){ //show bold and red text}

void check() { popup(…); …}

void main(){ w.onClick(); w.check(); }

include 宣言link 宣言shell グループ

13

Page 14: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+メソッド探索1. link している shellグループを探索2. 現在有効なグループを探索3. グローバルなグループを探索

renderer

browser viewer

Applicationapplicationメソッド呼び出し

1

2

3

4

5

include 宣言link 宣言shell グループ

14

Page 15: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+形式化 15

Page 16: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+最適化手法の提案 実行時間を減らす

コンパイル時にメソッド名を変更 メソッド名とメソッドが一対一に対応 分割コンパイルをあきらめている

16

revise Webpage{

}

コンパイル時に変更

application methodshell browser methodshellvoid main(){ Webpage w = new WebPage(); w.onClick();          }

void onClick(){ URL url = m.getURL(); popup(url);       }

void onClick_browser(){ URL url = m.getURL(); popup(url);       }

void main(){ Webpage w = new WebPage(); w.onClick_browser();          }

呼び出していることがコンパイル時に判明

Page 17: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+実験最適化版のプロトタイプコンパイラを実装最適化手法の効果を測定

1) セマンティクスに沿った実装と最適化手法とを比較 methodshell 数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部分のみ ReflectionAPI を用いて実装。

実験環境  CentOS release 6.2  Intel® Xeon® CPU E5-2687W 3.10GHz メモリ 64GB  OpenJDK 1.7.0

2) GluonJ 、オリジナルの Java と最適化手法とを比較 include 宣言の影響を測定 破壊的クラス拡張の影響を測定

17

Page 18: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+root(a2)

(a) include の深さが増えていくもの(a1)

n 個

root

(b1)

(b2)

n個

(b) include の幅が増えていくもの

root

(c) link の深さが増えていくもの(c)

n 個

root

(d1)

(d2)

n個

(d) link の幅が増えていくもの

(e)

root(e’)

n 個(e) ある methodshell が所属している shell グループの数が増えていくもの((e) のメソッド中で (e’) のメソッドを呼び出している)

s1s2s1s2

s1 が” include s2” をしているs1 が” link s2” をしている

18

Page 19: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+1) セマンティクスと提案手法との比較 (1/2)19

Page 20: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+1) セマンティクスと提案手法との比較 (2/2)20

Page 21: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+実験最適化版のプロトタイプコンパイラを実装最適化手法の効果を測定

1) セマンティクスに沿った実装と最適化手法とを比較 methodshell 数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部分のみ ReflectionAPI を用いて実装。

実験環境  CentOS release 6.2  Intel® Xeon® CPU E5-2687W 3.10GHz メモリ 64GB  OpenJDK 1.7.0

2) GluonJ 、オリジナルの Java と最適化手法とを比較 include 宣言の影響を測定 破壊的クラス拡張の影響を測定

21

Page 22: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+2)GluonJ 、オリジナル Java と提案手法とを比較 22

Page 23: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+関連研究破壊的クラス拡張のスコープを制限

Classbox[’05 Alexandre, et al.] Ruby の refinement NewSpeak[‘10 Bracha, et al.]

有効なメソッドの切り替えはできない有効な破壊的クラス拡張の実行時切り替え

Us[’96 Smith, et al.] Context-oriented Programming[’08 Hirschfeld, et al.]

Method Shells の方がより宣言的

23

Page 24: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+発表 第 14 回プログラミングおよびプログラミング言語ワークショップ

2012/3/8~10 ポスター発表 日本ソフトウェア科学会第 29 回大会

2012/8/22~24 論文および登壇発表 第 15 回プログラミングおよびプログラミング言語ワークショップ

2013/3/4~6 ポスター発表 ACM Student Research Competition

2013/3/25~27 final round まで進出 ( ポスター発表と登壇発表 )

International Conference on Software Composition 2013 2013/6/19 論文および登壇発表

第 97 回プログラミング研究会 2014/1/14~15 登壇発表、論文誌査読待ち

24

Page 25: 適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method  Shells

+まとめ破壊的クラス拡張

既存のコードを書き換えずに差分のみの記述でメソッドの追加・再定義ができる機能 メソッドの衝突の危険がある

Method Shells 有効な破壊的クラス拡張を切り替えることができるモジュール機構 一度に適用したい破壊的クラス拡張を shell グループにまとめることができる 最適化手法を提案し、効果を測定した

25