Josh : バイトコードレベルでのJava用 Aspect Weaver 中川 清志
アスペクト指向 オブジェクト指向はモジュラリティが優れているが限界もある ある種の処理は複数のオブジェクトに散らばってしまいモジュラリティが悪化する ログ処理などのシステマティックな処理 そのような処理をアスペクトとしてモジュール化するのがアスペクト指向である
例 : ログ出力 ログ出力をするタイミングを変えるような変更の度に, Car,Bikeクラスのソースコードを修正しなければならない class Bike{ void start() { Log.print(“start”); .. } class Car{ void start() { Log.print(“start”); .. } void back() { Log.print(“back”); class Log { static void print(String msg) { System.out.println(msg); } ログ出力をするタイミングを変えるような変更の度に, Car,Bikeクラスのソースコードを修正しなければならない
AspectJ AspectJは汎用アスペクト指向言語の代表的なもの aspect LogOut{ before() : execution(void Car.start()) { Log.print(“start”); } before() : execution(void Car.stop()) { Log.print(“stop”); } … } 散らばっていたコードをアスペクトに集約できる アスペクトは,プログラムのjoin point(メソッド呼び出し,フィールド参照など)にコード断片の埋め込みを指示
AspectJの weave の欠点 Weave コンパイル時 weave java source aspect 分割コンパイルできない アスペクトを変更したらソースコードも再コンパイルしなければならない ソースコードが必要 サードパーティ製のクラスには使えない 動的ロードに不向き weaver AspectJ コンパイラ weaved source weaved bytecode compiler
本研究の提案 : Josh 欠点に対応した新コンパイラJoshを提案 java source compiler ロード時に、バイトコードレベルでweave アスペクトを変更してもソースの再コンパイルの必要がない ソースコード無しクラスにも適用できる local disk bytecode weaver 部分 コンパイラ Josh weaved bytecode aspect
部分コンパイラ 役割 : ソースコードで存在する,アスペクト内のJavaコード断片をバイトコード化 ダミークラスにコード断片を埋め込んで通常のJavacでコンパイル 埋め込み先のクラスのダミーメソッド public class Dummy { void getName() {} void dummyMethod() { Log.print(“ start”); } コード断片
Josh Weaver 役割 : アスペクトのバイトコードをロード時にJavaバイトコードに埋め込む Javassistが提供する構造リフレクションを使い実装した プログラムのバイトコードを調べてJoin-point を見つけ出す バイトコードを編集してアスペクトのバイトコード断片を埋め込む
Weave のオーバヘッドの測定 実行時間 [ミリ秒] SparcIII 750MHz J2SE 1.3.1 クラスファイルのサイズ [KByte]
まとめ AspectJ言語の新コンパイラJoshを提案 Joshの weave ロード時 バイトコードレベル 分割コンパイル可能 アスペクト変更による再コンパイルの手間を省ける ソースコードなしクラスにも適用できる サードパーティライブラリもOK 動的ロードにも対応