プログラム分散化のための アスペクト指向言語

アスペクト指向の
分散化支援ツール
西澤無我、千葉滋
東京工業大学
SPA summer 2002, Hakone
1
分散ソフトの開発支援ツール

Addistant[Tatsubori01],
J-Orchestra[Tilevich02]

以下のコードを既存プログラムに自動合成可能



利点


遠隔メソッド呼び出しの実装方法
オブジェクトの分散配置
プログラム全体として可読性、保守性の向上
本研究の目標

より多くの機能を自動合成可能に
例:オブジェクトの複製を、複数のホストに配置し
一貫性、同一性を維持するアプリケーション
SPA summer 2002, Hakone
2
対戦型○×ゲームの開発

3 つのホストに分散して動作する


2 つのホストは各プレーヤー
に対する GUI を処理する
残りのホストはゲーム全体
のロジックを制御する
遠隔ホスト
GUI を処理:
Square オブジェクトなど
Square オブ
ジェクトの複製
アプリケーション・ホスト
ゲームを制御:
TicTacToe オブジェクトなど
SPA summer 2002, Hakone
3
Square クラス

ます目をあらわす
class Square {
TicTacToe ttt;
char mark; // 'O', 'X', or ' '
int pos; // position
ます目の位置を表す
Square(TicTacToe t, int p) {
ttt = t; pos = p;
}
void setMark(char c) { mark = c; }
char getMark() { return mark; }
void pressed() { ttt.clicked(pos); }
}
TicTacToe t = ...;
for (int i = 0; i < 9; ++i)
board[i] = new Square(t, i);
SPA summer 2002, Hakone
ます目がマウスでクリックされた
とき、TicTacToe オブジェクトの
メソッド clicked を呼ぶ
TicTacToe クラス内部の
Square オブジェクトの生成
4
Square オブジェクトの複製

複製の間の完璧な同一性の保証は不要


フィールドの値は常に同じ
緩い一貫性
pressed() の動作は同じでない


今、手番でないホストからのクリックは無視するため
ツールが生成する同一性保証のコード
ユーザがカスタマイズできる必要がある
 アプリケーションに特化したカスタマイズ


pressed() だけ特別扱い
SPA summer 2002, Hakone
5
非分散の Java
プログラム
Jarcler の提案

アスペクト
記述
アスペクト指向の
開発支援ツール


ユーザが分散処理によ
るカスタマイズをアスペ
クトとして簡潔に記述
より多くの機能を自動合
成することができる
bytecode
変換
アプリケーション 遠隔ホスト用
ホスト用bytecode bytecode
SPA summer 2002, Hakone
6
Squareの複製の実装
- 複製の生成
Square クラスと同じ名前のメソ
ッドをすべて持つSquarePair オ
ブジェクトに置換。 SquarePair
の内部で Square オブジェクトを
2 つ生成。
Square
Weave前
×9
TicTacToe
遠隔ホスト上
SquarePair の setMark() が呼ばれると
2 つの Square の setMark() が呼ばれる。
Weave 後
TicTacToe
Square
network
SquarePai
r
×9
SPA summer 2002, Hakone
network
Square
7
アスペクトの記述 (1)
- Square の複製を生成

2 つの遠隔ホスト上に Square オブジェクトを生
成する
remote class TicTacToe at “server”;
remote class Square;
use SquarePair insteadof Square in TicTacToe;
public class SquarePair {
Square s1;
Square s2;
SquarePair(TicTacToe ttt, int pos) {
s1 = new Square(“player1”, ttt, pos);
s2 = new Square(“player2”, ttt, pos);
ホスト名
}
“player1”
void setMark(char c) {
s1.setMark(c); s2.setMark(c);
}
}
SPA summer 2002, Hakone
ホスト名
“player2”
8
Squareの複製の実装
- TicTacToe.clicked() を変更
char 型の nextPlayer という
変数を持っている:現在の手番
を表す変数
遠隔ホスト1
Square
click
myMark = ‘O’
TicTaToe
nextPlayer = ‘O’
X
遠隔ホスト2
click
Square
myMark = ‘X’

引数を 1 つ加える。
TicTacToe.clicked(pos, myMark)

その引数で手順でないホストからのクリック
を無視する
SPA summer 2002, Hakone
9
アスペクトの記述(2)
- TicTacToe.clicked()の変更


手順でないプレーヤー
によるクリックがあった
場合には無効とする
クラス、メソッドそして
フィールドの追加、変
更


Introduction 構文
Advice 構文
before, after, around
static char Square.myMark;
on “player1” { Square.myMark = ‘O’; }
on “player2” { Square.myMark = ‘X’; }
void around(TicTacToe ttt, int pos):
target(ttt) && args(pos)
&& within(Square) && callerside
&& call(void clicked(int)) {
ttt.clicked(pos, Square.myMark);
}
void TicTacToe.clicked(int pos,
int player)
{
if (player != nextPlayer)
return ;
// クリックを無視
clicked(pos);
}
SPA summer 2002, Hakone
10
オブジェクトの複製を実現する
アスペクト

Crosscutting concern

Middleware(この場合、自動合成されたコー
ド) と Application との間にまたがっている
Application
Middleware layer
アプリケーション・ロジックのモジュール
支援ツールが自動合成する、クライアント・スタ
ブとサーバ・スケルトン
Square オブジェクトの複製を生成するためのコード
例:Squareの複製を生成するのはアプリケーション・ロジックであるが、それら
Squareオブジェクトを分散配置するのは支援ツールがするべき処理である
SPA summer 2002, Hakone
11
関連研究(1)
- AspectJ [Kiczales01]

Java を拡張した、汎用の AOP 言語


アプリケーション・クラス間の crosscutting
concern をアスペクトに記述できる
Middleware と application との間ではな
い
アプリケーション・クラス間
の crosscutting concern
Middleware layer

アプリケーション
・クラス
Jarcler は分散に対応した AOP ツール
SPA summer 2002, Hakone
12
関連研究(2)
- Reflective Middleware

メタ・プログラミングでカスタマイズ

直感的でない。簡単ではない。
Object trapMethodCall(Method m, Object[] args) {
if (m.getName().equals(“clicked”) {
if (getCallerHost() != nextPlayer)
return null;
// クリックを無視
}
return super.trapMethodCall(args);
}
Middlewware と Application 間のcrosscutting
concern を無理やり Middleware に押し込めた
SPA summer 2002, Hakone
Application
Middleware layer
13
まとめ

Jarcler

アスペクト指向の Java 用分散化支援ツール
ユーザによるカスタマイズを、コード生成に反映
 例:複製オブジェクトを作成


Middleware と application にまたがる
crosscutting concern に対応
AspectJ では対応できない
 Reflection ではプログラミングが難しい

SPA summer 2002, Hakone
14
SPA summer 2002, Hakone
15
SPA summer 2002, Hakone
16
Jarcler の処理
Application
weave
Middleware layer
aspect
SPA summer 2002, Hakone
Application
Middleware layer
17
Addistant
プロジェクト

既存プログラム
bytecode
分散化の
指針の記述
目標


既存プログラムをバイト
コードレベルで自動的に
機能分散
既存プログラムと
分散化の指針を分離
して記述
既存プログラムをどう分
散させるか、等の指示
bytecode
変換
アプリケーション 遠隔ホスト用
ホスト用bytecode bytecode
SPA summer 2002, Hakone
18
多重化 ORB
TicTacToe


Windowを1個生成
標準ORBの
分散化
ORB
ORB
アプリケーション
ホスト
遠隔ホスト
多重化ORBの分散化
二重に生成
TicTacToe
ORB
Windowを1個生成
遠隔ホスト1
多重化ORB
ORB
アプリケーション
ホスト
遠隔ホスト2
SPA summer 2002, Hakone
19
関連研究 - X Window

Xlib ライブラリレベルで分散化

低レベルな命令が大量にネットワークを飛
び交う


応答性能が悪い
Addistant の分散化

メッセージプロトコルがやりとり

応答性のよい遠隔表示が可能
SPA summer 2002, Hakone
20
関連研究 – D言語[Lopes97]

分散プログラミング支援の AOP



並列に動作するスレッド間の協調動作
IDL を提供
ソースファイルが必要

分散化の指示を、プログラムに直接埋め込む
SPA summer 2002, Hakone
21
SPA summer 2002, Hakone
22