+
適用するメソッドを切り替えることで破壊的クラス拡張で
生じるメソッド衝突を避けられるモジュール機構
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 2026 ExpyDoc