2002/1/28 筑筑筑筑 筑筑筑筑筑筑筑筑 1 筑筑筑筑筑筑筑筑筑筑筑 筑筑筑筑筑筑筑筑筑筑筑筑 筑筑筑筑 筑筑筑 筑筑筑筑筑 筑筑 筑筑筑筑筑筑 ・ 筑筑筑筑
Jan 28, 2016
2002/1/28 筑波大学 学位論文公開発表 1
プログラム変換のためのクラスオブジェクトモデル
筑波大学 大学院 工学研究科電子・情報工学専攻
立堀道昭
2002/1/28 筑波大学 学位論文公開発表 2
研究背景
オブジェクト指向モデルの限界
2002/1/28 筑波大学 学位論文公開発表 3
オブジェクト指向のコード再利用・分離
Java のようなオブジェクト指向プログラムはクラスによって、モジュール分けされるモジュール - 再利用可能な単位
クラスによるモジュール分けは万能ではないCrosscutting Concerns
2002/1/28 筑波大学 学位論文公開発表 4
Motivating Example 1分散配置プログラム
分散オブジェクトを配置するコードはプログラム全体に四散する
class C {.. new P() ..}
class A {.. remote.gen(“P”) ..}
class P {.. new C() ..}
class D {.. new P() ..}
class B {.. remote.gen(“P”) ..}
Host AHost B
2002/1/28 筑波大学 学位論文公開発表 5
配置設計の変更に伴うプログラムの修正
配置設計の変更に伴い、多くのクラスのコードを少しづつ修正しなければならない
class C {.. remote.gen(“P”) ..}
class A {.. new P() ..}
class P {.. remote.gen(“C”) ..}
class D {.. remote.gen(“P”) ..}
class B {.. new P() ..}
Changed allocation of P’s instances
2002/1/28 筑波大学 学位論文公開発表 6
Motivating Example 2遠隔参照
遠隔オブジェクトをシームレスに提供するプロキシクラスには大量の通信コード記述class A_Proxy {
C getIt() { .. 通信コード .. } void setIt() { .. 通信コード .. }}
class A { C getIt() {} void setIt() {}}
class B {}
class C {}
.
.
B_Proxy
C_Proxy
2002/1/28 筑波大学 学位論文公開発表 7
類似のコードの頻出
似たようなコードが頻出するが、再利用できない
B_Proxy
C_Proxy
A_Proxy D_Proxy
E_Proxy
{ パラメータを正規化 直列化して通信 通信先から送られてきた 結果をリターン}
ライブラリ?
2002/1/28 筑波大学 学位論文公開発表 8
Crosscutting Concerns
配置設計の関心事項( concern )がプログラムのモジュール構造を横切って( crosscut )いることが問題微に入り細を穿つ記述、四散するロジック、
類似の記述の繰り返し 大きな記述量 - 分散に関する簡単な事項を簡潔
に記述できない 保守性の悪さ - 絡み合ったコードの修正は困難
プログラミングを重労働にしている要因のひとつ
2002/1/28 筑波大学 学位論文公開発表 9
設計上の問題ではない
Design patterns[GoF94] など、よい設計を実現するための様々なプログラミング技法はあるしかし、「あちらをたてればこちらがたたず」という場合がしばしば
2002/1/28 筑波大学 学位論文公開発表 10
Diff ファイルのパッチとして分離して書けばよい?パッチファイルに再利用性なく、記述量膨
大
差分パッチによる実現
単純に分離するだけではだめ単純に分離するだけではだめパッチファイル
パッチあて
2002/1/28 筑波大学 学位論文公開発表 11
Advanced Separation of Concerns (ASoC)
理想形記述の分離関心点の抽象化
現在盛んに研究されている [OOPSLA, ECOOP, ICSE, Reflection]オブジェクト指向モデルだけでは不十分AOP[Kiczales97], MDSoC[Tarr99], …
2002/1/28 筑波大学 学位論文公開発表 12
プログラム変換による ASoC- 本研究のアプローチ
パッチをプログラム変換を行うプログラムとして記述sed, awk, perl, java?
しかし、プログラム変換を行うプログラムの記述は容易ではない
しかし、プログラム変換を行うプログラムの記述は容易ではない
プログラム変換プログラム
プログラム変換
2002/1/28 筑波大学 学位論文公開発表 13
オブジェクト指向プログラムの変換
オブジェクト指向プログラム クラスをはじめとする宣言的な要素によりプログ
ラムが構成される
構文木やバイト列といった表現 オブジェクト指向プログラムのロジックから
かい離している
クラスを直接表現する抽象データ構造が望まれる
2002/1/28 筑波大学 学位論文公開発表 14
本研究の Overview
プログラム変換によるコード再利用・分割の実現 オブジェクト指向の枠内ではできなかった部分に
挑む
クラスオブジェクトモデルによってプログラム変換器の作成を容易に オブジェクト指向プログラムを
オブジェクト指向プログラムで変換するシステム設計のための抽象データ構造モデル
2002/1/28 筑波大学 学位論文公開発表 15
本発表の以降の構成
クラスオブジェクトモデルを適用した実際のシステムの設計・実装・応用 オブジェクト指向プログラミング一般向けシステ
ム OpenJava - ソーステキストベースのプログラム変換
[LNCS1826][ 情報処理学会論文誌 41 巻 8 号 ] Javassist - バイトコードベースのプログラム変換
[ 情報処理学会論文誌 42 巻 11 号 ]
分散プログラミング専用システム Addistant – 分散配置の SoC
[ECOOP2001]
2002/1/28 筑波大学 学位論文公開発表 17
OpenJava
Java 言語のためのオブジェクト指向マクロ
2002/1/28 筑波大学 学位論文公開発表 18
拡張可能言語の必要性
複雑なプログラミング 分散処理
煩雑なネットワーク処理 デザインパターン
例 Adapter, Visitor, …
言語による直接のサポートがない distributed,adapts などのキーワードが使えればプログラムを簡潔に記述できる
2002/1/28 筑波大学 学位論文公開発表 19
従来型のプログラム変換による言語拡張機構
C/C++ マクロ非常に単純な文法拡張のみ
EPP[Ichisugi98], JSE[Bachrach01]広域にわたる変換の
記述が難しい構文木を直接操作
Program
Method call
name Arguments list
….変換
変換変換
2002/1/28 筑波大学 学位論文公開発表 20
OpenJava
Java のためのマクロ機構Java で言語拡張ができるようになった
distributed マクロadapts マクロ
特徴自己反映( reflection )モデルの採用クラスオブジェクト API
構文木を直接扱わずに変換を記述できる
2002/1/28 筑波大学 学位論文公開発表 21
OpenJava の処理系概要
ソーステキスト変換器拡張言語で書かれたソースコードを
通常の Java 言語のソースコードに変換visits
distributed adapts
TranslatorTranslator
IOIOOOIIOIOOOI.oj IOIO
OOIIOIOOOI.classjavacjavac.java
マクロマクロ
2002/1/28 筑波大学 学位論文公開発表 22
Reflection モデルの採用
プログラムでプログラムを扱うモデルプログラムでプログラムの情報を得ること例:このクラスは何個メソッドをもっている?Java の Reflection API
プログラムでその言語の仕様を変えること言語拡張にあたるJava にはない
2002/1/28 筑波大学 学位論文公開発表 23
オブジェクト指向の Reflection
メタオブジェクト 通常扱えないデータ (プログラム、コンパイラ等)
をオブジェクトとして扱えるようにする
メタオブジェクトの API 何をメタオブジェクトにするか どのようにメタオブジェクトにアクセスさせるか
API の設計は自明ではない。この出来が肝要
OpenJava ではクラスオブジェクトを設計した
2002/1/28 筑波大学 学位論文公開発表 24
OpenJava のマクロ
マクロはメタクラスとして実装される
class VerboseClass extends OJClass { translateDeclaration() expandAllocation() expandMethodCall() expandType()
マクロのプログラム
デフォルトのメタクラスを拡張
拡張したい部分の変換をオーバーライド
マクロの適用
class MyObject instantiates VerboseClassOpenJava の予約語
メタクラスを選択
2002/1/28 筑波大学 学位論文公開発表 25
OpenJava のクラスオブジェクト
クラスオブジェクトの操作によって間接的に構文木が変換される例: getSuperclass(), getField(name), addMethod(m)
オブジェクト機構の操作であり直感的 変換の操作を簡潔に記述できる
オブジェクトの型(クラス)ごとに、異なる変換を適用できる例: expandAllocation() のオーバーライド
衝突なしに複数の言語拡張を導入できる
2002/1/28 筑波大学 学位論文公開発表 26
クラスオブジェクトの操作
オブジェクト指向の論理構造の操作
OpenJavaSystem
OpenJavaSystem
クラスオブジェクトgetName()getMethods()getSuffix()setName()addMethod()removeMethod()
プログラム
システムはクラスオブジェクトの操作に基づいて構文木を自動的に変換
2002/1/28 筑波大学 学位論文公開発表 27
呼出し側の変換例
ソースプログラム
変換後のソースプログラム
拡張のためのプログラムpublic class ReplacedClass extends OJClass { Allocation expandAllocation(Allocation expr) { String newname = expr.getType().getName() + “Proxy”; return new Allocation(newname, expr.getArguments()); } :
p = new Person()
p = new PersonProxy()
class Person instantiates ReplacedClass{ :
2002/1/28 筑波大学 学位論文公開発表 28
クラス宣言側の変換例
ソースプログラム
変換後のソースプログラム
public class VectorStack instantiates AdapterClass adapts Vector in v to Stack{ Object pop() { return v.remove(); } void push( Object o ) { v.add( o ); }
public class VectorStack implements Stack { private Vector v; VectorStack(Vector o) { this.v = o; } boolean isEmpty() { return v.isEmpty(); } Enumeration elements() { return v.elements(); } Object pop() { return v.remove(); } void push( Object o ) { v.add( o ); } }
2002/1/28 筑波大学 学位論文公開発表 29
クラス宣言側の変換例( cont. )
拡張のためのプログラムpublic class AdapterClass extends OJClass { void translateDeclaration() { OJClass adaptee = .. getSuffix(“adapts”) ..; Variable v = .. getSuffix(“adapts”) ..; OJClass target = .. getSuffix(“adapts”) ..; OJMethod[] tmethods = target.getMethods(); for (int i = 0; i < tmethods.length; ++i) { if (adaptee.getMethod(tmethods[i]) != null){ OJMethod newmtd = new OJMethod(tmethods[i]); newmtd.setBody( new ReturnStatement( new MethodCall(v, newmtd.getName(), newmtd.getParameters()) ) ); } :
Stack のメソッド
を調べる
Vector
Stack
新しいメソッド
を作る
2002/1/28 筑波大学 学位論文公開発表 30
OpenJava まとめ
オブジェクト指向言語用マクロ機構クラスオブジェクトによる変換ソースコード変換がクラスの操作として直感的に記述可能になった
構文木を直接操作せず、オブジェクト機構を操作
2002/1/28 筑波大学 学位論文公開発表 31
Javassist
バイトコード変換による構造リフレクションの実現
2002/1/28 筑波大学 学位論文公開発表 32
Java のリフレクション
内視( introspection )標準 java.lang.reflect パッケージ
プログラムの意味の変更( intercession )提供されていないセキュリティ上、実行性能上の問題を引き起こす
2002/1/28 筑波大学 学位論文公開発表 33
動作リフレクション(Behavioral Reflection)
MetaXa, Kava, (Sun JDK1.3,) …
メタオブジェクト機構
ObjectObjectmethod call
trap reflect
Metaobject
Meta programmodify
2002/1/28 筑波大学 学位論文公開発表 34
これは最もよい抽象化だろうか?
動作リフレクションは全ての種類のアプリケーションにとって直感的なわけでない
例遠隔メソッド呼び出し( RMI )のための言語拡張
遠隔 Account オブジェクトの withdraw() メソッドを呼び出す
2002/1/28 筑波大学 学位論文公開発表 35
動作リフレクションによる RMI
メタプログラムはプロキシを作る
dummy callee
caller
metaobjectmetaobject
trap
network
invoke
instance ofAccount class
withdraw()withdraw()
proxy object
2002/1/28 筑波大学 学位論文公開発表 36
この dummy オブジェクトは
自動的に作られなければならないコンストラクタのパラメータには何を渡せばよいのか
もし Account のコンストラクタが副作用を起こしたら
Dummy オブジェクトの生成においてはコンストラクタ呼び出しを省く必要がある
これらの問題を回避するためには、プロキシクラスを作り出す必要があるこれらの問題を回避するためには、プロキシクラスを作り出す必要がある
2002/1/28 筑波大学 学位論文公開発表 37
問題点のまとめ
動作リフレクションの「トラップ」モデルは多くの言語拡張に便利であるが、全てにというわけではない
ある種のアプリケーションには、この抽象化はマッチしない数々のアドホックなトリックが必要になる
2002/1/28 筑波大学 学位論文公開発表 38
Javassist
我々の提案する Java 用の構造リフレクション( structural reflection )システム内視 (introspection)Java reflection API とほぼ互換
プログラムの意味の変更( intercession )新たなクラスを作る既存のクラス定義を変更する
プログラムの構造的な側面を扱うプログラムの構造的な側面を扱う
2002/1/28 筑波大学 学位論文公開発表 39
構造リフレクション
今日あまり使われない
が、 Smalltalk, CLOS, ObjVlisp, Classtalk, … によって提供されていたもの
2002/1/28 筑波大学 学位論文公開発表 40
構造リフレクションによる RMI
プロキシクラスはメタプログラムにより自動的に作られるAccount クラスに空のコンストラクタを追加
RMI を行う withdraw() メソッドを追加 class AccountProxy extends
Account { int withdraw() { .. Communication with RMI server .. }}
class Account { Account() {} …}
2002/1/28 筑波大学 学位論文公開発表 41
Javassist API
クラス・ダイアグラムClass, Field, Constructor, Method オブ
ジェクトは改変可能
Class
Field Method Constructor
2002/1/28 筑波大学 学位論文公開発表 42
Java のバイナリ互換性
Javassist はあらゆる変更を許すわけではない例:フィールドの削除は許されないある種の変更はプログラムの正当性を壊す恐れが強い
Javassist はバイナリ互換性を保つような変更のための API のみを提供する
2002/1/28 筑波大学 学位論文公開発表 43
ロード時のリフレクション
標準の JVM を利用するためにリフレクションはロード時にのみ許され
る
Java VMJavassistclass loader
User meta program
class file(bytecode)
Local Disk
Network
modify a class file
2002/1/28 筑波大学 学位論文公開発表 44
バイトコード変換器
JOIE, Java Class APIバイトコード編集のための Java のライ
ブラリ
Javassistソーステキストレベルの抽象度ユーザはバイトコードの知識を必要としな
い使い易さ v.s. 記述力Javassist JOIE, Java Class API
2002/1/28 筑波大学 学位論文公開発表 45
メソッド本体部 (method body) の編集の仕方
バイトコードの知識なしに
Javassist の提供する編集方法他のメソッドから本体をコピー
型名置き換えパラメータを Object 型の配列に変換
典型的なメソッド本体から選択Delegator, default constructor, …
2002/1/28 筑波大学 学位論文公開発表 46
実験:プログラム変更の準備に要する時間
クラスを reify するのに関わる時間
0
5
10
15
20
25
30
35
40
0 5 10 15 20 25 30 35 40Size of .class file (Kbyte)
Pro
cess
ing
time
(sec
)
OpenJava
Javac
Jikes
Javassist
2002/1/28 筑波大学 学位論文公開発表 47
まとめ
ReflectionBehavioral reflection
MetaXa, KavaStructural reflection
OpenJava, Javassist
Load-timeCompile-time
2002/1/28 筑波大学 学位論文公開発表 48
Addistant
既存 Java プログラムのバイトコード変換による
機能分散
2002/1/28 筑波大学 学位論文公開発表 49
ソフトウェアの分散実行
例えば、GUI とアプリケーション・ロジックの分離
管理コストの削減安価なクライアント環境を活用できるよう
「 PC anywhere 」「ゼロ・アドミニストレーション」「シン・クライアント」
2002/1/28 筑波大学 学位論文公開発表 50
既存ソフトウェアの分散化
従来の環境(全自動の遠隔 GUI )X Window System 、 VNC 、 Rawt[IBM Haifa
98]
従来の分散化支援ツールJavaRMI 、 HORB 、 ObjectSpace …、Emerald[Black87] ”、 remotenew”[Nagaratnam96]
、 JavaParty[Philippen99] …、
2002/1/28 筑波大学 学位論文公開発表 51
X Window
Xlib ライブラリレベルで分散化低レベルな命令が大量にネットワークを飛び交う
線を書け
マウスが動いた
マウスボタン押された
マウスボタン離された
ユーザプログラム
Xlib
2002/1/28 筑波大学 学位論文公開発表 52
ORB を用いた手動(半自動)変換ユーザプログラムを変更応答性能のよい遠隔表示が可能
ユーザプログラム
内部ウィンドウ表示
ウィンドウ内でクリックあり
ORBライブラリ
ユーザプログラム
2002/1/28 筑波大学 学位論文公開発表 53
既存の分散化手法
X Windowライブラリ・レベルの分散化
完全自動だが遅い
ORBプログラム全体を手で変更して分散化
速いが、開発に余分な工数が必要
ユーザプログラム
X Protocol
ユーザプログラム
GUI モジュール
2002/1/28 筑波大学 学位論文公開発表 54
提案するシステムAddistant
より自動化された ORB プログラム全体を自動変更して分散化 開発者はプログラムを直接いじる必要はない
現実的なシステムをめざす 実用的な Swing アプリケーションにも対応既存の Java 仮想機械 (JVM) の利用 バイトコード変換 開発者による分散化の指示の簡素化
2002/1/28 筑波大学 学位論文公開発表 55
Addistant の基本設計
クラスローダによるバイトコード変換バイトコード変換には Javassist[Chiba00]
を利用
クラス単位のインスタンスの配置方針開発者がポリシーファイルに宣言的記述例: GUI のクラスはあちら、その他のユーザクラスはこちら
2002/1/28 筑波大学 学位論文公開発表 56
現実的なシステムに向けてプロキシ マスタ方式の限界・ 遠隔オブジェクト(マスタ)に対応して、手元で
は代理のオブジェクト(プロキシ)を用いる Java RMI など、多くの ORB で使われている方式
従来の ORB の実装法をそのまま既存のプログラムに適用は無理…
マスタプロキシメソッド呼び出し
ネットワーク通信
2002/1/28 筑波大学 学位論文公開発表 57
システム・クラスの存在
プロキシ・マスタ方式クラス定義またはクラスを使う側の
コードの変更が必要システムクラスの場合バイトコード変換禁止
例:プロキシクラスを元のクラスのサブクラスとする実装法
元のクラスが final クラスのときは使えない、など
2002/1/28 筑波大学 学位論文公開発表 58
Addistant の方式
クラス毎に異なる実装法で遠隔参照を実現 実装法により、変更が必要なコードの範囲が異なる
システムクラスの変更を避けるように実装法を選択
“ 長いものには巻かれろ”法
XML風のポリシーファイルで宣言的に指定 置き換え」、「名前変更」、「サブクラス」、 複製」「 「
2002/1/28 筑波大学 学位論文公開発表 59
「置き換え」手法(例:ユーザクラス)
対象クラスをプロキシに置き換え元のクラスを変更できる場合ひとつの JVM 上には、プロキシかマスタ
のどちらか一方のみ
Widget w = new Widget();w.show();
Widgetshow()
分散化
Widgetshow()
.. Show ..
.. Send ..
置き換える
2002/1/28 筑波大学 学位論文公開発表 60
「名前変更」手法(例: java.awt.Window )
コード中に現れた対象クラス名をプロキシクラスのものに変更元のクラスを変更できない場合使っている側のコードを変更する
Widget w = new Widget();w.show();
Widgetshow()
分散化
WidgetProxy w = new WidgetProxy();
WidgetProxyshow()
.. Show ..
.. Send ..
2002/1/28 筑波大学 学位論文公開発表 61
「サブクラス」手法(例: java.util.Vector )対象クラスのサブクラスとしてプロキシクラスを定義1つの JVM 上にプロキシとマスタを混在させたい場合
Widget w = new Widget();w.show();
Widgetshow()
分散化
Widget w = new WidgetProxy();
WidgetProxyshow()
指示の場合によっては.. Send ..
.. Show ..
2002/1/28 筑波大学 学位論文公開発表 62
「複製」手法(例: java.lang.String )
プロキシクラスは作らず、遠隔メソッド呼び出しの際、オブジェクトを移送して複製を渡すShallow copy
変則版 - 「書き戻し複製」手法配列オブジェクトに
用いる byte[] buf = …;istream.read(buf);
2002/1/28 筑波大学 学位論文公開発表 63
応答性能の実験クリック – Window 表示
クリックしてから内部ウインドウが完全に表示されるまで スタートアップホス
ト Sparc 440MHz
GUI ホスト PentiumII 500MHz
ネットワーク 10Base-T Half 100Base-TX Full
2002/1/28 筑波大学 学位論文公開発表 64
応答性能の実験クリック – Window 表示
クリックしてから内部ウインドウが完全に表示されるまで スタートアップホス
ト Sparc 440MHz
GUI ホスト PentiumII 500MHz
ネットワーク 10Base-T Half 100Base-TX Full
2002/1/28 筑波大学 学位論文公開発表 65
分散 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>
2002/1/28 筑波大学 学位論文公開発表 66
応答性能の測定結果
プログラム全体の変換による速度改善応答時間 (秒 ) (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
2002/1/28 筑波大学 学位論文公開発表 67
まとめ
既存の Java プログラムを複数のホスト上に分散させるための支援ツールAddistant を提案透過な分散 JVM を既存の JVM を用いて
構築する際に鍵となる技術プログラム変換によるアプローチ
2002/1/28 筑波大学 学位論文公開発表 68
本発表の総括
発表のまとめと今後の展望
2002/1/28 筑波大学 学位論文公開発表 69
本研究の貢献
クラスオブジェクトモデルの提案 オブジェクト指向プログラムを変換するシステム
設計のための抽象データ構造モデル
本モデルに基づいて具体的なシステムの設計と実装を研究 オブジェクト指向プログラミング一般向けシステ
ム OpenJava, Javassist
分散プログラミング専用システム Addistant
2002/1/28 筑波大学 学位論文公開発表 70
OpenJava/Javassist
クラスオブジェクトモデル構文木 / バイトコードの詳細を知らなくても、
プログラム変換を行えるように、クラスオブジェクトモデルを適用したデータ構造を提供
変換を Java 言語で記述構造リフレクション( Structural Reflection )を
提供するシステム動作リフレクション( Behavioral Reflection )
2002/1/28 筑波大学 学位論文公開発表 71
リフレクション
compile
load
run
MetaXa,Kava
Javassist
OpenJavafast
adaptable
program-ming
languagedesign
Runtime structural reflection makesit difficult to do optimization withstatic type information.
Load-time isa good trade-off point.
OpenJIT
JIT-compile
2002/1/28 筑波大学 学位論文公開発表 72
Addistant
Addistant分散配置の記述を「まとめて別に」行えるバイトコード変換による実現により既存の
Java 実行時処理系を活用できるシステムクラスの存在など、実際上の問題
に対処した
Javassist 応用のケーススタディ
2002/1/28 筑波大学 学位論文公開発表 73
今後の展望
DSL for ASoC 用のフレームワーク構築OpenJava 、 Javassist
プログラム変換による Advanced Separation of Concerns で Addistant のような Domain Specific Language を提供するための基盤技術
Addistant のようなシステムをより気軽に作れるような具体的なシステム
XML + Java