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