分散支援アスペクト指向言語

分散 Java プログラミング用の
アスペクト指向言語へむけて
東工大 千葉研
西澤無我
SPA 2003, in Hakone
1
研究の目標

分散 crosscutting concern (CC)
をモジュール化

異なるモジュール、異なるホストにまたがる
関心事


典型例:
異なるホストにまたがるObserver Patternの実装
AspectJ は分散処理を直接サポートしない
SPA 2003, in Hakone
2
対戦型○×ゲームの開発

3 つのホストに分散して動作する


2 つのホストは各プレーヤー
に対する GUI を処理する
残りのホストはゲーム全体
のロジックを制御する
on “spark”, “yulian”
GUI を処理:Frame,
Button オブジェクトなど
Button
オブジェクト
on “picard”
ゲームを制御:
TicTacToe オブジェクトなど
SPA 2003, in Hakone
3
on “spark”,
“yulian”
クラス図
Frame
gameBoard : Button[9]
分散 Crosscutting concern
jframe : JFrame
1
on “picard”
TicTacToe
gameBoard : int[9]
whoseTurn : int
9
on “spark”,
“yulian”
Button
jbutton : JButton
pos : int
whoWins()
color : int
start()
myColor : int
reset()
getJButton()
クリックされた後のゲーム
の制御(Win – lossなど)
SPA 2003, in Hakone
setColor(int)
actionPerformed(..)
4
このプログラム内の
分散 crosscutting concern

ゲームを制御するモジュール (TicTacToe)
と GUI パーツ (Button) 間に、ネットワー
ク対戦を実現するための処理がまたがる
Player からのクリック
picard 上の制御プログラムにどちらの player が
どのボタンをクリックしたのか通知する
分散 CC
picard 上の制御プログラムが勝敗を管理
spark, yulian 上の GUI プログラムを update する
SPA 2003, in Hakone
5
本システムの提案

分散 crosscutting concern を、簡潔にモ
ジュール化可能

異なるホスト間の同期処理を記述

例:
ホスト A での処理が終了した後、ホスト B の処理
を開始する、という逐次的な処理を記述できる

AspectJ-like な文法で記述
SPA 2003, in Hakone
6
○×ゲームを実現する
アスペクト記述 異なるホスト間であっても Advice の外
int p, c;
before(Button button): で宣言された変数は、値は共有される
&& within(Button)
&& target(button)
&& expr( p = button.pos; c = Button.myColor; )
&& execution(void actionPerformed())
ホスト picard 上で
実行させる処理を記述
ホスト spark, yulian
上で実行させる処理を
記述
on(“picard”) {
if ((c != TicTacToe.whoseTurn)
|| (TicTacToe.gameBoard[p] != -1)) { return ; }
TicTacToe.whoWins();
}
on(“spark”, “yulian”) {
Button button = Frame.gameBoard[p];
button.setColor(c);
}
SPA 2003, in Hakone
7
言語仕様(1)
pointcut 指定子1

within


target


Join point の検索範囲を、指定したモジュー
ル内部に限定
Join point の検索範囲を、指定したオブジェ
クトの振る舞いのみに限定
execution

指定したメソッドの実行を抽出
SPA 2003, in Hakone
8
言語仕様(2)
pointcut 指定子2

expr( statement* )


pointcut を指定する側で実行させたい処理
を記述できる
statement は Java のソースで記述
例:
expr( p = 3 );
expr( setX(2); );
SPA 2003, in Hakone
9
言語仕様(3)
advice body内の記述

on(host) { statement* }



Join point に到達すると、指定したホスト上
で複数の statement を処理することが可能
statement は Java のソースで記述
on(host) { … } は連接可能
例 on(“picard”) { … … }
on(“spark”, “yulian”) { … … }
ある Join point に到達すると、ホスト picard 上で指
定された処理を実行し、その処理が終了した後、ホスト
spark, yulian 上で処理を実行する
SPA 2003, in Hakone
10
言語仕様(4)
アスペクト変数



Advice の外で宣言された変数
異なるホスト、異なるアスペクト間であっても値
が共有される
共有データの実現


on(host) { … } のブロック文が終了する直前に、本
システムが値を update
例:
int 型のアスペクト変数 p, c は、picard 上での処理
が終わる際に、spark, yulian 上の p, c の値を
update
SPA 2003, in Hakone
11
現在のアスペクト記述

実装状況(1)
宣言的にアスペクトを記述
Pointcut pointcut = new Pointcut();
pointcut.within(“Button”);
pointcut.target(“Button”);
pointcut.execution(“actionPerformed”);
AdviceBody body = new AdviceBody();
body.setBefore(“picard”, “{ … }”);
Advice advice = new Advice(pointcut, body);
Pointcut, AdviceBody の再利用性が高い
SPA 2003, in Hakone
12
実装状況(2)
Runtime Library

アスペクトはクラスに変換される
class Button {
void actionPerformed(..) {
Advice_spark.sendMsg(..);
}
}
class Aspect_picard {
static void before_$1(..) {
// advice body
}
class Aspect_spark {
static void sendMsg(..) {
static void receiveMsg(..) {
// ネットワーク処理
// ネットワーク処理
Runtime Library
}
}
}
}
SPA 2003, in Hakone
13
関連研究
- AspectJ + RMI

遠隔オブジェクト参照を利用する得失



アスペクト間の共有データを作成し辛い
パフォーマンスの低下
耐故障性を備えたシステムを構築し辛い
SPA 2003, in Hakone
14
まとめと今後の課題

分散 Java プログラミングのための AOP
言語を作成中




異なるホスト間の同期処理を実現
アスペクト間で共有するデータを実現
AspectJ-like な文法で記述可能
様々なサンプルをとりあげ、言語仕様を固
めていきたい
SPA 2003, in Hakone
15
SPA 2003, in Hakone
16