Addistant:アスペクト指向の

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