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