Get Slide

+
適用するメソッドを切り替えることで破壊的クラス拡張で
生じるメソッド衝突を避けられるモジュール機構
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グルー
プにまとめることができる
 最適化手法を提案し、効果を測定した