適用するメソッドを切り替えること で破壊的...
DESCRIPTION
適用するメソッドを切り替えること で破壊的 クラス拡張で生じるメソッド衝突を 避けられるモジュール機構 Method Shells. 48-126624 竹下若菜 東京大学 創造情報学専攻 千葉研究室. アプリケーションやソフトウェア. l 1 : HTML renderer. 既存のライブラリやフレームワークを組み合わせて実装 既存のプログラムを少し書き換える より多くのコードを再利用できる. l 2 : web browser. l 3 : HTML viewer. Application. 変更のモジュール化. l 1 : HTML renderer. - PowerPoint PPT PresentationTRANSCRIPT
+
適用するメソッドを切り替えることで破壊的クラス拡張で生じるメソッド衝突を避けられるモジュール機構Method Shells
48-126624 竹下若菜東京大学 創造情報学専攻千葉研究室
+アプリケーションやソフトウェア既存のライブラリやフレームワークを組み合わせて実装既存のプログラムを少し書き換える
より多くのコードを再利用できる
l1: HTML renderer
l2: web browser l3: HTML viewer
Application
2
+ 別ファイルに差分のみを記述することでメソッドの追加・再定義できる機能 変更をモジュール化できる
変更のモジュール化 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
既存コード
差分
再定義 & 追加
この機能を破壊的クラス拡張と総称する
+破壊的クラス拡張
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
別ファイルに差分のみを記述することでメソッドの追加・再定義できる機能 変更をモジュール化できる
+変更の衝突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
+提案:有効にするメソッドの切り替え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
+モジュール機構: 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); … }
+モジュール機構: Method Shellsモジュール :methodshell
破壊的クラス拡張とクラス宣言を含む有効にするメソッドを切り替えられる
shell グループ 一度に有効にするメソッドの集合 include 宣言によって定義
shell グループの切り替え link 宣言によって定義
renderer
browserviewer
include 宣言link 宣言shell グループ
8
+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); … }
+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(…); …}
+全体図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
+全体図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
+全体図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
+メソッド探索1. link している shellグループを探索2. 現在有効なグループを探索3. グローバルなグループを探索
renderer
browser viewer
Applicationapplicationメソッド呼び出し
1
2
3
4
5
include 宣言link 宣言shell グループ
14
+形式化 15
+最適化手法の提案 実行時間を減らす
コンパイル時にメソッド名を変更 メソッド名とメソッドが一対一に対応 分割コンパイルをあきらめている
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(); }
呼び出していることがコンパイル時に判明
+実験最適化版のプロトタイプコンパイラを実装最適化手法の効果を測定
1) セマンティクスに沿った実装と最適化手法とを比較 methodshell 数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部分のみ ReflectionAPI を用いて実装。
実験環境 CentOS release 6.2 Intel® Xeon® CPU E5-2687W 3.10GHz メモリ 64GB OpenJDK 1.7.0
2) GluonJ 、オリジナルの Java と最適化手法とを比較 include 宣言の影響を測定 破壊的クラス拡張の影響を測定
17
+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
+1) セマンティクスと提案手法との比較 (1/2)19
+1) セマンティクスと提案手法との比較 (2/2)20
+実験最適化版のプロトタイプコンパイラを実装最適化手法の効果を測定
1) セマンティクスに沿った実装と最適化手法とを比較 methodshell 数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部分のみ ReflectionAPI を用いて実装。
実験環境 CentOS release 6.2 Intel® Xeon® CPU E5-2687W 3.10GHz メモリ 64GB OpenJDK 1.7.0
2) GluonJ 、オリジナルの Java と最適化手法とを比較 include 宣言の影響を測定 破壊的クラス拡張の影響を測定
21
+2)GluonJ 、オリジナル Java と提案手法とを比較 22
+関連研究破壊的クラス拡張のスコープを制限
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
+発表 第 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
+まとめ破壊的クラス拡張
既存のコードを書き換えずに差分のみの記述でメソッドの追加・再定義ができる機能 メソッドの衝突の危険がある
Method Shells 有効な破壊的クラス拡張を切り替えることができるモジュール機構 一度に適用したい破壊的クラス拡張を shell グループにまとめることができる 最適化手法を提案し、効果を測定した
25