Josh : バイトコードレベルでのJava用 Aspect Weaver

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
Javaのための暗黙的に型定義される構造体
Dynamic AOPと その実装手法について
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
通信処理のカーネル内競合を 検出するアスペクト指向 カーネルレベルロガー
柳澤 佳里* 光来 健一* 千葉 滋* *東京工業大学 情報理工学研究科 数理・計算科学専攻
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
Flyingware : バイトコード変換による 安全なエージェントの実行
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
柳澤 佳里 (学籍番号: 03M37311) 指導教官: 千葉 滋 東京工業大学 情報理工学研究科 数理・計算科学専攻
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
安全なモバイルエージェント システム Flyingware のための 仮想ディスクの実現
アスペクト指向の 分散化支援ツール 西澤無我、千葉滋 東京工業大学 SPA summer 2002, Hakone.
暗黙的に型付けされる構造体の Java言語への導入
複数個のJoinpointの集合を 対象としたPointcutを 記述可能なアスペクト指向言語
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
Java Bytecode Modification and Applet Security
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
動的データ依存関係解析を用いた Javaプログラムスライス手法
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
Addistant:アスペクト指向の 分散プログラミング支援ツール
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
アスペクト指向言語のための 独立性の高いパッケージシステム
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
Java における 先進的リフレクション技術
契約による クラスとアスペクト間の 影響解析
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
静的情報と動的情報を用いた Javaプログラムスライス計算法
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
アスペクト指向プログラミングの 動的プログラムスライスへの応用
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Presentation transcript:

Josh : バイトコードレベルでのJava用 Aspect Weaver 中川 清志(東工大) 立堀 道昭(筑波大) 千葉 滋 (東工大)

オブジェクト指向の限界 オブジェクト指向はモジュラリティが優れているが限界もある ある種の処理は複数のオブジェクトに散らばってしまう ログ出力,メモリ管理などの システマティックな処理 その結果保守性が悪化し修正も困難になる

散らばってしまう例 : ログ出力 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クラスのソースコードを修正しなければならない

アスペクト指向 散らばっていたコードをアスペクトとしてモジュール化するのがアスペクト指向 アスペクトはオブジェクトによるモジュール分割を補完するもの この2種類のモジュールを合成して,1つのプログラムを作り出すことを weave という weave 実行

AspectJ の新処理系 Josh AspectJ 言語 AspectJ 言語の処理系(weaver) 汎用アスペクト指向言語の代表的なもの AspectJ 言語の処理系(weaver) ajc XEROX 版標準処理系 Josh 我々が新たに開発した処理系

AspectJの言語仕様(1) Introduction 既存クラスに新しいメンバを加える 既存クラスの階層構造をかえる フィールド,メソッドの追加 既存クラスの階層構造をかえる スーパクラス,インタフェースの変更 private int Point.z; public int Point.getZ() { return z; } declare parents : Point implements java.io.Serializable

AspectJの言語仕様(2) Advice Join-Point Join-Point にコード断片を埋め込むように指示 before, after, aroundの3種類 Join-Point プログラム実行の節目 例 : メソッド呼び出し,フィールド書き込み etc. before() : call (int Point.getZ()) { System.out.println(“before call getZ()”); } after() : get (int Point.z) { System.out.println(“after get z”); }

標準処理系 ajc の問題点 コンパイル時 weave 分割コンパイルできない ソースコードが必要 weaver ajc java source aspect コンパイル時 weave 分割コンパイルできない アスペクトを変更したらソースコードも再コンパイルしなければならない ソースコードが必要 サードパーティ製のクラスには使えない 動的ロードに不向き – プログラム時に利用するクラスがわかっていないといけない weaver ajc weaved source weaved bytecode コンパイラ

本研究の提案 : Josh 問題点に対応した新システムJosh を提案 ロード時に,バイトコードレベルで weave java source aspect 問題点に対応した新システムJosh を提案 ロード時に,バイトコードレベルで weave 部分コンパイル結果,バイトコードは一旦ローカルディスクに保存 コンパイラ 部分 コンパイラ Josh bytecode weaver weaved bytecode

Josh の利点 バイトコードレベルでのweave の有用性 ロード時の weave 分割コンパイル可能 アスペクトを変更してもソースの再コンパイルの必要がない ソースコード無しクラスにも適用できる ロード時の weave 複数のアスペクトを切り替えて使える

基本的にはソースコードのあるプログラムのアスペクトを書く ソースコードなしクラスの アスペクト ソースコードを見ないでアスペクトを書けるのか? 汎用性のあるアスペクトなら書ける 分散環境への適応 既存プログラムとは別に分散化のためのアスペクトを記述し,それらをweave して分散プログラムを生成(e.g. Addistant ) 新しいセキュリティ機構の導入 セキュリティチェックコードの挿入 基本的にはソースコードのあるプログラムのアスペクトを書く

バイトコードレベルでの weave の制限 Join-Point の消失 エラーの検出がロード時 コンパイル時にソースコードの情報が失われてしまうことがある 例:インライン展開 エラーの検出がロード時 ソースコードレベルならばコンパイルエラーになるものが、バイトコードレベルではロード時エラーになる 例 : 同じシグネチャのメソッドの追加

Josh の実装 部分コンパイラ Josh Weaver アスペクトをバイトコード化する アスペクトとJava バイトコードをweave する

部分コンパイラ (1) 役割 : ソースコードで存在する,アスペクト内のJavaコード断片をバイトコード化 ダミークラスにコード断片を埋め込んで通常のJavac でコンパイル コード断片だけではコンパイルエラーが起こりうる フィールドやメソッドの参照エラー (上の例では z) int Point.getZ() { return z; } これをバイト コード化したい

部分コンパイラ(2) バイトコード埋め込み先のクラスの, フィールドやメソッドも書き込む リフレクションの機能で調査可能 埋め込み先のクラスのフィールド public class Dummy { int z; int getZ() { return z; } コード断片

Josh Weaver 役割 : アスペクトのバイトコードをロード時にJavaバイトコードに埋め込む Javassist が提供する構造リフレクションを使い実装した プログラムのバイトコードを調べてJoin-Point を見つけ出す バイトコードを編集してアスペクトのバイトコード断片を埋め込む

javassist.CtClass 標準JavaリフレクションAPIと同様に,クラス定義を調べるメソッドを提供 getField(..), getMethod(..), getName(..), getSuperclass(..) さらにクラス定義を変更するメソッドを提供 addField(..), addMethod(..), setSuperclass(..), addInterface(..) Introductionの実現が可能

javassist.CodeConverter 特定のJoin-Point のバイトコードを変換する insertBeforeMethod(..) メソッド呼び出しの前に別メソッドを呼ぶ replaceFieldRead(..) フィールド読み込みを別メソッドに呼び代える CodeConverter の情報をクラスに反映させてバイトコード変換完了 Advice の実現が可能

Weaver のオーバヘッドの測定 実行時間 [ミリ秒] USparcIII 750MHz J2SE 1.3.1 クラスファイルのサイズ [KByte]

まとめ AspectJ 言語の新コンパイラJosh を提案 Josh の weave ロード時 バイトコードレベル 分割コンパイル可能 アスペクト変更による再コンパイルの手間を省ける ソースコードなしクラスにも適用できる サードパーティライブラリもOK 動的ロードにも対応