+ 適用するメソッドを切り替えることで破壊的クラス拡張で 生じるメソッド衝突を避けられるモジュール機構 Method Shells 48-126624 竹下若菜 東京大学 創造情報学専攻 千葉研究室 + 2 アプリケーションやソフトウェア 既存のライブラリやフ レームワークを組み合 わせて実装 l1: HTML renderer 既存のプログラムを少 し書き換える より多くのコードを再利 l2: web browser l3: HTML viewer 用できる Application + 変更のモジュール化 別ファイルに差分のみ を記述することでメ ソッドの追加・再定義 できる機能 変更をモジュール化で きる openclass AspectJ’s aspect 3 l1: HTML renderer original file 既存コード Ruby’s [‘01 Kiczales et al.] 再定義 & 追加 l2: web browser another file GluonJ この機能を [’10 Chiba et al.] 破壊的クラス拡張 Classboxes と総称する [’10 Bergel et al.] etc… 差分 + 破壊的クラス拡張 別ファイルに差分のみ を記述することでメ ソッドの追加・再定義 できる機能 変更をモジュール化で きる 4 l1: HTML renderer original file class Webpage{ void setPopupItem(Popup p, HTML text){ // set text } void popup(HTML text){ Popup p = new Popup(); void print(String str){ setPopupItem(p, text); … } // standard output 再定義 l2: web browser 追加 another file revise Webpage{ void setPopupItem(Popup p, HTML text){ alert(“disabled”); } void onClick(){ void str){ URLprint(String url = m.getURL(); // standard output } popup(url); GluonJによ るコード例 + void popup(HTML text){ setPopupItem(p, text); void setPopupItem (Popup p, HTML text){ // show a popup window } 変更の衝突 l1: HTML renderer void setPopupItem (Popup p, HTML text){ } void setPopupItem (Popup p, HTML text){ alert(“disabled”); } l2: web browser どのsetPopupItem メソッドが 有効になるか 分からない Application l3: HTML viewer void check() { popup(…); …} 5 提案:有効にする + メソッドの切り替え void popup(HTML text){ setPopupItem(p, text); void setPopupItem (Popup p, HTML text){ // show a popup window } l1: HTML renderer void setPopupItem (Popup p, HTML text){ } void setPopupItem (Popup p, HTML text){ alert(“disabled”); } l3: HTML viewer l2: web browser Application Application void check() { popup(…); …} 6 + モジュール機構:Method Shells 7 モジュール:methodshell 破壊的クラス拡張とクラス宣言を含む 有効にするメソッドを切り替えられる shellグループ 一度に有効にするメソッドの集合 include宣言によって定義 shellグループの切り替え link宣言によって定義 renderer methodshell methodshell renderer; class Webpage{ void setPopupItem(Popup p, HTML text){ // set text } void popup(HTML text){ Popup p = new Popup(); setPopupItem(p, text); … } } + モジュール機構:Method Shells 8 モジュール:methodshell 破壊的クラス拡張とクラス宣言を含む 有効にするメソッドを切り替えられる shellグループ 一度に有効にするメソッドの集合 include宣言によって定義 shellグループの切り替え renderer link宣言によって定義 browser include 宣言 link 宣言 shell グループ viewer shellグループの定義・拡張 + include宣言でshell グループを定義・ 拡張できる 一度に有効になる includeした methodshell中の メソッドは再定義 できる include 宣言 link 宣言 shell グループ 9 renderer methodshell methodshell renderer; class Webpage{ void setPopupItem(Popup p, HTML text){ // set text } void popup(HTML text){ Popup p = new Popup(); setPopupItem(p, text); … }} browser methodshell methodshell browser; include renderer; revise Webpage{ void setPopupItem(Popup p, HTML text){ alert(“disabled”); } void onClick(){ URL url = m.getURL(); popup(url); } } 再定義 shellグループの切り替え + 10 viewer methodshell link宣言で切り替え 先のshellグループを 指定する link宣言しているshell グループ内のメソッド を呼び出すと、shellグ ループが切り替わる methodshell viewer; renderer; include renderer; revise Webpage{ void setPopupItem(Popup p, HTML text){ // set text } void check(){ check(File f){ popup(…); …} } application methodshell methodshell application; link viewer; include 宣言 link 宣言 shell グループ void main(){ Webpage w = new WebPage(); w.check(); w.onClick(); } } checkメソッド が呼ばれると、 切り替わる void popup(HTML text){ setPopupItem(p, text); } void setPopupItem (Popup p, HTML text){ // show a popup window } + 全体図 11 renderer void setPopupItem (Popup p, HTML text){ alert(“disabled”); } void onClick(){ popup(getURL()); } void setPopupItem (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w.onClick(); w.check(); } include 宣言 link 宣言 shell グループ application Application void check() { popup(…); …} void popup(HTML text){ setPopupItem(p, text); } void setPopupItem (Popup p, HTML text){ // show a popup window } + 全体図 12 renderer void setPopupItem (Popup p, HTML text){ alert(“disabled”); } void onClick(){ popup(getURL()); } void setPopupItem (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w.onClick(); w.check(); } include 宣言 link 宣言 shell グループ application Application void check() { popup(…); …} void popup(HTML text){ setPopupItem(p, text); } void setPopupItem (Popup p, HTML text){ // show a popup window } + 全体図 13 renderer void setPopupItem (Popup p, HTML text){ alert(“disabled”); } void onClick(){ popup(getURL()); } void setPopupItem (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w.onClick(); w.check(); } include 宣言 link 宣言 shell グループ application Application void check() { popup(…); …} + 1. 14 メソッド探索 5 2 renderer linkしているshell グループを探索 2. 現在有効なグルー プを探索 3. グローバルなグ ループを探索 include 宣言 link 宣言 shell グループ 4 1 viewer browser メソッド 呼び出し application Application 3 + 形式化 15 + 最適化手法の提案 16 実行時間を減らす コンパイル時にメソッド名を変更 メソッド名とメソッドが一対一に対応 分割コンパイルをあきらめている 呼び出していることが コンパイル時に判明 application methodshell void main(){ Webpage w = new WebPage(); w.onClick(); } browser methodshell revise Webpage{ void onClick(){ URL url = m.getURL(); popup(url); } コンパイル時に変更 void main(){ Webpage w = new WebPage(); w.onClick_browser(); } void onClick_browser(){ URL url = m.getURL(); popup(url); } } + 実験 17 最適化版のプロトタイプコンパイラを実装 最適化手法の効果を測定 1) セマンティクスに沿った実装と最適化手法とを比較 methodshell数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部 分のみReflectionAPIを用いて実装。 2) GluonJ、オリジナルのJavaと最適化手法とを比較 include宣言の影響を測定 破壊的クラス拡張の影響を測定 実験環境 CentOS release 6.2 Intel® Xeon® CPU E5-2687W 3.10GHz メモリ64GB OpenJDK 1.7.0 + n個 (d1) n 個 root (a2) (a1) 18 root (d2) (a) includeの深さが増えていくもの (d) linkの幅が増えていくもの (b1) (e) n 個 root (e’) (b2) (b) includeの幅が増えていくもの root n個 (e) あるmethodshellが所属している shellグループの数が増えていくもの n個 ((e)のメソッド中で(e’)のメソッドを呼び出して いる) (c) root (c) linkの深さが増えていくもの s2 s1 s1が”include s2”をしてい る s2 s1 s1が”link s2”をしている + 1)セマンティクスと提案手法との比較(1/2) 19 + 1)セマンティクスと提案手法との比較(2/2) 20 + 実験 21 最適化版のプロトタイプコンパイラを実装 最適化手法の効果を測定 1) セマンティクスに沿った実装と最適化手法とを比較 methodshell数増加に伴うメソッド探索時間の増加を測定 セマンティクスに沿った実装:手動でコンパイル。実行時処理の部 分のみReflectionAPIを用いて実装。 2) GluonJ、オリジナルのJavaと最適化手法とを比較 include宣言の影響を測定 破壊的クラス拡張の影響を測定 実験環境 CentOS release 6.2 Intel® Xeon® CPU E5-2687W 3.10GHz メモリ64GB OpenJDK 1.7.0 +2)GluonJ、オリジナルJavaと提案手法 とを比較 22 + 23 関連研究 破壊的クラス拡張のスコープを制限 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の方がより宣言的 + 発表 第14回プログラミングおよびプログラミング言語ワークショップ 日本ソフトウェア科学会第29回大会 2013/3/25~27 final roundまで進出(ポスター発表と登壇発表) International Conference on Software Composition 2013 2013/3/4~6 ポスター発表 ACM Student Research Competition 2012/8/22~24 論文および登壇発表 第15回プログラミングおよびプログラミング言語ワークショップ 2012/3/8~10 ポスター発表 2013/6/19 論文および登壇発表 第97回プログラミング研究会 2014/1/14~15 登壇発表、論文誌査読待ち 24 + 25 まとめ 破壊的クラス拡張 既存のコードを書き換えずに差分のみの記述でメ ソッドの追加・再定義ができる機能 メソッドの衝突の危険がある Method Shells 有効な破壊的クラス拡張を切り替えることができ るモジュール機構 一度に適用したい破壊的クラス拡張をshellグルー プにまとめることができる 最適化手法を提案し、効果を測定した
© Copyright 2025 ExpyDoc