分散 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
© Copyright 2024 ExpyDoc