Addistant:アスペクト指向の 分散プログラミング支援ツール 立堀道昭 (筑波大) 千葉滋 (東工大) 板野肯三 (筑波大) July 26, 2001 SWoPP 2001 PRO, Okinawa 1 概要 • Java による分散プログラミングの 支援ツール Addistant • 特に機能分散を行うプログラム開発を対象に • 言語処理系と実行系で実現 • 既存の Java virtual machine (JVM) を活用 • Addistant の特徴 • アスペクト指向の導入 • 拡張クラスローダによる実現 July 26, 2001 SWoPP 2001 PRO, Okinawa 2 分散プログラミングの障害 • 非分散のロジックに分散のためのコードが 絡み合い各所にちらばっている • Crosscutting concerns • 低いモジュラリティ • 分散プログラミングを難しくしているものの1つ • 分散に関する事項がプログラム全体に四散し ており、簡潔に記述できない • 絡み合ったコードの保守・変更は困難 July 26, 2001 SWoPP 2001 PRO, Okinawa 3 Crosscutting Distribution Concerns (1/2) • 機能分散プログラム中、分散オブジェクト を配置するコードは散在する class A { .. new L_Proxy(“..”) .. } class B { .. new L_Proxy(“..”) .. } class C { .. new L() .. } class D { .. new L() .. } class L { .. new C() .. } July 26, 2001 SWoPP 2001 PRO, Okinawa 4 Crosscutting Distribution Concerns (2/2) • 配置換えに伴い、散在するコードの書き換 えが必要 class A { .. new L(..) .. } class C { .. new L_Proxy(..) .. } class B { .. new L(..) .. } class D { .. new L_Proxy(..) .. } 配置換え class L { .. new C_Proxy() .. } July 26, 2001 SWoPP 2001 PRO, Okinawa 5 プログラミング技法による対処 の限界 • Abstract Factory デザイン・パターン • 常に Factory クラスを通してインスタンスを生成し、 Factory のサブクラスで生成を制御 ProductL p = factory.create_L_at_C(); class Factory { .. ProductL create_L_at_B(); ProductL create_L_at_C(); .. } • Factory method はコンテキスト分、数多く必要 • 生成されるクラスは共通の親をもたねばならない July 26, 2001 SWoPP 2001 PRO, Okinawa 6 提案するツール Addistant • 機能分散プログラムの開発を支援 • 絡み合う分散配置コードの分離 • 抽象化による分散配置記述の簡素化 • 実現手段 • 既存の Java 仮想機械 (JVM) を利用 • ソースコードの変更が不可能なクラスにも対 処 July 26, 2001 SWoPP 2001 PRO, Okinawa 7 Addistant の基本設計 • クラス単位のインスタンスの配置方針 • 開発者が配置アスペクトとして宣言的記述 • 例: GUI のクラスはあちら、その他のユーザク ラスはこちら • クラスローダによるバイトコード変換 • java.lang.ClassLoader のサブクラス • 第三者によって提供されたソースコードのない クラスライブラリにも対応できる July 26, 2001 SWoPP 2001 PRO, Okinawa 8 ロード時のバイトコード変換 • 与えられた配置アスペクトに従って、 Addistant の処理系が Java プログラムを 自動的に変換 • Java クラス・ローダ機構を利用 • JVMにクラスをロードする前にバイトコードを 書き換える • バイトコード変換にはJavassist[Chiba00] を 利用 July 26, 2001 SWoPP 2001 PRO, Okinawa 9 分散配置アスペクト言語 • 独立したポリシーファイルに記述 <policy> <import … from=“hostH”> A B </import> <import … from=“hostI”> p.q.[C|D] </import> <import …> E </import> クラスAとBを “hostH”変数のホスト に配置 p.q.Cとp.q.Dを “hostI”に配置 Eについては 限定しない </policy> July 26, 2001 SWoPP 2001 PRO, Okinawa 10 配置クラス指定子 • 配置するクラスを、あるまとまりで指定できる • パッケージ、サブパッケージ COM.xxx.file.* COM.yyy.- • サブクラス [email protected] [email protected] ただし、重複する場合、上方の宣言が有効 July 26, 2001 SWoPP 2001 PRO, Okinawa 11 現実的なシステムに向けて • プロキシ・マスタ方式の限界 • 遠隔オブジェクト(マスタ)に対応して、手元では代理 のオブジェクト(プロキシ)を用いる • Java RMI など、多くのORB で使われている方式 従来の ORB の実装法をそのまま適用は無理… メソッド 呼び出し プロキシ マスタ ネットワーク通信 July 26, 2001 SWoPP 2001 PRO, Okinawa 12 システム・クラスの存在 • プロキシ・マスタ方式 • クラス定義またはクラスを使う側の コードの変更が必要 • システムクラスの場合バイトコード変換禁止 • 例:プロキシクラスを元のクラスの サブクラスとする実装法 • 元のクラスが final クラスのときは使えない、など July 26, 2001 SWoPP 2001 PRO, Okinawa 13 Addistant のプロキシ実装方式 • クラス毎に異なる実装法で遠隔参照を実現 • 実装法により、変更が必要なコードの範囲が 異なる • システムクラスの変更を避けるように 実装法を選択 • アスペクト言語で宣言的に指定 • 「置き換え」、「名前変更」、 「サブクラス」、「複製」 July 26, 2001 SWoPP 2001 PRO, Okinawa 14 「置き換え」手法 (例:ユーザクラス) • 対象クラスをプロキシに置き換え • 元のクラスを変更できる場合 • ひとつのJVM上には、プロキシかマスタのどち らか一方のみ Widget w = new Widget(); w.show(); Widget show() 分散化 置き換える Widget show() July 26, 2001 .. Show .. SWoPP 2001 PRO, Okinawa .. Send .. 15 「名前変更」手法 (例:java.awt.Window) • コード中に現れた対象クラス名を プロキシクラスのものに変更 • 元のクラスを変更できない場合 • 使っている側のコードを変更する Widget w = new Widget(); w.show(); Widget show() .. Show .. WidgetProxy show() .. Send .. 分散化 WidgetProxy w = new WidgetProxy(); July 26, 2001 SWoPP 2001 PRO, Okinawa 16 「サブクラス」手法 (例:java.util.Vector) • 対象クラスのサブクラスとしてプロキシクラ スを定義 • 1つのJVM上にプロキシとマスタを 混在させたい場合 Widget w = new Widget(); w.show(); Widget show() .. Show .. WidgetProxy show() .. Send .. 分散化 指示の場合によっては Widget w = new WidgetProxy(); July 26, 2001 SWoPP 2001 PRO, Okinawa 17 「複製」手法 (例:java.lang.String) • プロキシクラスは作らず、遠隔メソッド呼び 出しの際、オブジェクトを移送して複製を渡 す • Shallow copy • 変則版 - 「書き戻し複製」手法 • 配列オブジェクトに 用いる July 26, 2001 byte[] buf = …; istream.read(buf); SWoPP 2001 PRO, Okinawa 18 関連研究 - AOP • Aspect Oriented Programming (AOP) • 絡み合うコードを分けて書くように、書けるよう にする、プログラミングのパラダイム • 何を分けられるようにし、どのようにアスペクト 言語を設計・実現するかが課題 • Javaベースの AOP 言語 • D [Lopes97] • AspectJ [Xerox Palo Alto 97-] July 26, 2001 SWoPP 2001 PRO, Okinawa 19 D [Lopes97] • 分散専用 AOP 言語 • Java + 並列同期アスペクト + IDLアスペクト • Addistant は、 • Java + 分散配置アスペクト + プロキシ実装ア スペクト • バイトコードレベルのウィーバ(アスペクト合成 器) • アスペクト言語として相補的な役割 July 26, 2001 SWoPP 2001 PRO, Okinawa 20 AspectJ [Xerox Palo Alto 97-] • Java を拡張した、汎用の AOP 言語 • Addistant は分散専用 • 現在の AspectJ [Kiczales2001] には、Addistant で達成した Separation of Concerns を直接実現す る機能が不在 • 記述力の欠如 - Addistant と同様の Separation of Concerns を実現できない(Join-point のカバー不足) • 再利用性の欠如 - ライブラリとして Addistant と同様の 機能を提供できない (Points-cut 語彙の不足) July 26, 2001 SWoPP 2001 PRO, Okinawa 21 応用例: 応答性能のよい遠隔表示 • X Window X Protocol • ライブラリ・レベルで分散化 • 応答性能悪い ユーザ プログラム • 応答性能のよい遠隔表示のためには • プログラム全体を手で変更して分散化 • 速いが、開発に余分な工数が 必要 July 26, 2001 GUIモジュール ユーザ プログラム SWoPP 2001 PRO, Okinawa 22 X Window • Xlib ライブラリレベルで分散化 • 低レベルな命令が大量に ネットワークを飛び交う マウスが動いた マウスボタン押された Xlib ユーザ プログラム July 26, 2001 マウスボタン離された 線を書け SWoPP 2001 PRO, Okinawa 23 適切なプログラム分割による 応答性能のよい遠隔表示 • ユーザプログラムを変更 • 応答性能のよい遠隔表示が可能 ORB ライブラリ ユーザ プログラム July 26, 2001 ウィンドウ内で クリックあり 内部ウィンドウ表示 SWoPP 2001 PRO, Okinawa ユーザ プログラム 24 分散 Swing アプリケーション • ポリシーファイル <policy> <import proxy="rename" from="display"> [email protected] [email protected] .. </import> <import proxy="rename" from="application"> [email protected].[InputStream|OutputStream|..] [email protected].* </import> <import proxy="subclass"> [email protected].[AbstractCollection|..] </import> <import proxy="writeBackCopy"> array@</import> <import proxy="replace" from="application"> user@</import> <import proxy="copy"> </import> </policy> July 26, 2001 SWoPP 2001 PRO, Okinawa 25 まとめ • Addistant – 機能分散プログラム開発の支援ツール • アスペクト指向を導入し、分散配置コードをま とめて簡潔に記述できるようにした • 実際に既存のプログラムに対して遠隔表示機 能を追加する実験をおこない、有用性を確認 した July 26, 2001 SWoPP 2001 PRO, Okinawa 26 今後の課題 • 現在の Addistant の実装は、2つのホスト上で の分散に限られているが、この設計が3つ以 上のホストにも対応できることを確認する • 支援効果の定量的な測定のための測定基準 を開発し、Addistant を利用する場合の効果を 予測しやすくする • 分散サイクリックGC への対応 July 26, 2001 SWoPP 2001 PRO, Okinawa 27 応答性能の実験 クリック – Window表示 • クリックしてから内部 ウインドウが完全に表 示されるまで • スタートアップホスト • Sparc 440MHz • GUI ホスト • PentiumII 500MHz • ネットワーク • 10Base-T Half • 100Base-TX Full July 26, 2001 SWoPP 2001 PRO, Okinawa 28 応答性能の実験 クリック – Window表示 • クリックしてから内部 ウインドウが完全に表 示されるまで • スタートアップホスト • Sparc 440MHz • GUI ホスト • PentiumII 500MHz • ネットワーク • 10Base-T Half • 100Base-TX Full July 26, 2001 SWoPP 2001 PRO, Okinawa 29 応答性能の測定結果 • プログラム全体の変換による速度改善 • 応答時間(秒) (10Base-T(100Base-TX)) 誤差±0.1秒 X Window Rawt Addistant 1回目 5.6(1.6) 3.2(2.6) 2.0(2.0) 2回目 5.6(1.4) 0.0(0.0) 0.0(0.0) X Window Rawt Addistant 1回目 3493.57 116.20 81.88 2回目 3438.96 10.95 0.06 • 通信量(キロバイト) July 26, 2001 SWoPP 2001 PRO, Okinawa 30
© Copyright 2025 ExpyDoc