slide1
Download
Skip this Video
Download Presentation
プログラム変換のための クラスオブジェクトモデル

Loading in 2 Seconds...

play fullscreen
1 / 72

プログラム変換のための クラスオブジェクトモデル - PowerPoint PPT Presentation


  • 84 Views
  • Uploaded on

プログラム変換のための クラスオブジェクトモデル. 筑波大学 大学院 工学研究科 電子・情報工学専攻 立堀道昭. 研究背景. オブジェクト指向モデルの 限界. オブジェクト指向の コード再利用・分離. Java のようなオブジェクト指向プログラムはクラスによって、モジュール分けされる モジュール - 再利用可能な単位 クラスによるモジュール分けは 万能ではない Crosscutting Concerns. Motivating Example 1 分散配置プログラム. 分散オブジェクトを配置するコードは プログラム全体に四散する. Host B. Host A.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'プログラム変換のための クラスオブジェクトモデル' - minnie


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

プログラム変換のためのクラスオブジェクトモデル

筑波大学 大学院 工学研究科

電子・情報工学専攻

立堀道昭

学位論文公開発表

slide2

研究背景

オブジェクト指向モデルの限界

学位論文公開発表

slide3
オブジェクト指向のコード再利用・分離
  • Java のようなオブジェクト指向プログラムはクラスによって、モジュール分けされる
    • モジュール - 再利用可能な単位
  • クラスによるモジュール分けは万能ではない
    • Crosscutting Concerns

学位論文公開発表

motivating example 1
Motivating Example 1分散配置プログラム
  • 分散オブジェクトを配置するコードはプログラム全体に四散する

Host B

Host A

class P {.. new C() ..}

class A {.. remote.gen(“P”) ..}

class C {.. new P() ..}

class B {.. remote.gen(“P”) ..}

class D {.. new P() ..}

学位論文公開発表

slide5
配置設計の変更に伴うプログラムの修正
  • 配置設計の変更に伴い、多くのクラスのコードを少しづつ修正しなければならない

class P{..remote.gen(“C”)..}

Changed allocation of P’s instances

class A{..new P()..}

classC{..remote.gen(“P”)..}

class B{..new P()..}

classD{..remote.gen(“P”)..}

学位論文公開発表

motivating example 2
Motivating Example 2遠隔参照
  • 遠隔オブジェクトをシームレスに提供するプロキシクラスには大量の通信コード記述

class A_Proxy { C getIt() { ..通信コード.. }void setIt() { ..通信コード.. }}

class A { C getIt() {} void setIt() {}}

class B {}

class C {}

B_Proxy

..

C_Proxy

学位論文公開発表

slide7
類似のコードの頻出
  • 似たようなコードが頻出するが、再利用できない

A_Proxy

D_Proxy

ライブラリ?

{パラメータを正規化  直列化して通信  通信先から送られてきた    結果をリターン}

B_Proxy

E_Proxy

C_Proxy

学位論文公開発表

crosscutting concerns
Crosscutting Concerns
  • 配置設計の関心事項(concern)がプログラムのモジュール構造を横切って(crosscut)いることが問題

微に入り細を穿つ記述、四散するロジック、類似の記述の繰り返し

    • 大きな記述量 - 分散に関する簡単な事項を簡潔に記述できない
    • 保守性の悪さ - 絡み合ったコードの修正は困難

プログラミングを重労働にしている要因のひとつ

学位論文公開発表

slide9
設計上の問題ではない
  • Design patterns[GoF94] など、よい設計を実現するための様々なプログラミング技法はある
  • しかし、「あちらをたてればこちらがたたず」という場合がしばしば

学位論文公開発表

slide10
差分パッチによる実現
  • Diff ファイルのパッチとして分離して書けばよい?
    • パッチファイルに再利用性なく、記述量膨大

パッチあて

パッチファイル

単純に分離するだけではだめ

学位論文公開発表

advanced separation of concerns asoc
Advanced Separation of Concerns (ASoC)
  • 理想形
    • 記述の分離
    • 関心点の抽象化
  • 現在盛んに研究されている [OOPSLA, ECOOP, ICSE, Reflection]
    • オブジェクト指向モデルだけでは不十分
    • AOP[Kiczales97], MDSoC[Tarr99], …

学位論文公開発表

slide12
プログラム変換による ASoC- 本研究のアプローチ
  • パッチをプログラム変換を行うプログラムとして記述
    • sed, awk, perl, java?

プログラム変換

しかし、プログラム変換を行うプログラムの記述は容易ではない

プログラム変換プログラム

学位論文公開発表

slide13
オブジェクト指向プログラムの変換
  • オブジェクト指向プログラム
    • クラスをはじめとする宣言的な要素によりプログラムが構成される
  • 構文木やバイト列といった表現
    • オブジェクト指向プログラムのロジックからかい離している

クラスを直接表現する抽象データ構造が望まれる

学位論文公開発表

overview
本研究の Overview
  • プログラム変換によるコード再利用・分割の実現
    • オブジェクト指向の枠内ではできなかった部分に挑む
  • クラスオブジェクトモデルによってプログラム変換器の作成を容易に
    • オブジェクト指向プログラムをオブジェクト指向プログラムで変換するシステム設計のための抽象データ構造モデル

学位論文公開発表

slide15
本発表の以降の構成
  • クラスオブジェクトモデルを適用した実際のシステムの設計・実装・応用
    • オブジェクト指向プログラミング一般向けシステム
      • OpenJava - ソーステキストベースのプログラム変換
        • [LNCS1826][情報処理学会論文誌41巻8号]
      • Javassist - バイトコードベースのプログラム変換
        • [情報処理学会論文誌42巻11号]
    • 分散プログラミング専用システム
      • Addistant –分散配置の SoC
        • [ECOOP2001]

学位論文公開発表

openjava

OpenJava

Java 言語のためのオブジェクト指向マクロ

学位論文公開発表

slide17
拡張可能言語の必要性
  • 複雑なプログラミング
    • 分散処理
      • 煩雑なネットワーク処理
    • デザインパターン
      • 例 Adapter, Visitor, …
  • 言語による直接のサポートがない
    • distributed,adapts などのキーワードが使えればプログラムを簡潔に記述できる

学位論文公開発表

slide18
Program

変換

….

Method call

変換

name

Arguments list

変換

従来型のプログラム変換による言語拡張機構
  • C/C++ マクロ
    • 非常に単純な文法拡張のみ
  • EPP[Ichisugi98], JSE[Bachrach01]
    • 広域にわたる変換の記述が難しい
      • 構文木を直接操作

学位論文公開発表

openjava1
OpenJava
  • Java のためのマクロ機構
    • Java で言語拡張ができるようになった
      • distributed マクロ
      • adapts マクロ
  • 特徴
    • 自己反映(reflection)モデルの採用
    • クラスオブジェクト API
      • 構文木を直接扱わずに変換を記述できる

学位論文公開発表

openjava2
visits

distributed

adapts

IOIO

OOI

.oj

Translator

javac

.java

IOIO

OOI

.class

OpenJava の処理系概要
  • ソーステキスト変換器
    • 拡張言語で書かれたソースコードを通常の Java 言語のソースコードに変換

マクロ

マクロ

学位論文公開発表

reflection
Reflection モデルの採用

プログラムでプログラムを扱うモデル

  • プログラムでプログラムの情報を得ること
    • 例:このクラスは何個メソッドをもっている?
    • Java の Reflection API
  • プログラムでその言語の仕様を変えること
    • 言語拡張にあたる
    • Java にはない

学位論文公開発表

reflection1
オブジェクト指向の Reflection
  • メタオブジェクト
    • 通常扱えないデータ (プログラム、コンパイラ等)をオブジェクトとして扱えるようにする
  • メタオブジェクトの API
    • 何をメタオブジェクトにするか
    • どのようにメタオブジェクトにアクセスさせるか
  • API の設計は自明ではない。この出来が肝要
  • OpenJava ではクラスオブジェクトを設計した

学位論文公開発表

openjava3
OpenJava のマクロ
  • マクロはメタクラスとして実装される

マクロのプログラム

class VerboseClass extends OJClass {

translateDeclaration()

expandAllocation()

expandMethodCall()

expandType()

デフォルトの

メタクラスを拡張

拡張したい部分の変換をオーバーライド

メタクラスを選択

マクロの適用

OpenJava の予約語

class MyObject instantiates VerboseClass

学位論文公開発表

openjava4
OpenJava のクラスオブジェクト
  • クラスオブジェクトの操作によって間接的に構文木が変換される

例:getSuperclass(), getField(name), addMethod(m)

      • オブジェクト機構の操作であり直感的
      • 変換の操作を簡潔に記述できる
  • オブジェクトの型(クラス)ごとに、異なる変換を適用できる

例:expandAllocation() のオーバーライド

      • 衝突なしに複数の言語拡張を導入できる

学位論文公開発表

slide25
クラスオブジェクトの操作
  • オブジェクト指向の論理構造の操作

プログラム

クラスオブジェクト

getName()

getMethods()

getSuffix()

setName()

addMethod()

removeMethod()

OpenJavaSystem

システムはクラスオブジェクトの操作に基づいて

構文木を自動的に変換

学位論文公開発表

slide26
呼出し側の変換例
  • ソースプログラム
  • 変換後のソースプログラム
  • 拡張のためのプログラム

class Person

instantiates ReplacedClass

{

:

p = new Person()

p = new PersonProxy()

public class ReplacedClassextendsOJClass {

Allocation expandAllocation(Allocation expr) {

String newname = expr.getType().getName() + “Proxy”;

return new Allocation(newname,expr.getArguments());

}

:

学位論文公開発表

slide27
クラス宣言側の変換例
  • ソースプログラム
  • 変換後のソースプログラム

public class VectorStackinstantiatesAdapterClass

adaptsVector 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 ); } }

学位論文公開発表

slide28
クラス宣言側の変換例(cont.)
  • 拡張のためのプログラム

public class AdapterClassextendsOJClass {

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()) ) );

}

:

Vector

Stack

Stack のメソッド

を調べる

新しいメソッド

を作る

学位論文公開発表

openjava5
OpenJava まとめ
  • オブジェクト指向言語用マクロ機構
  • クラスオブジェクトによる変換
    • ソースコード変換がクラスの操作として直感的に記述可能になった
      • 構文木を直接操作せず、オブジェクト機構を操作

学位論文公開発表

javassist

Javassist

バイトコード変換による構造リフレクションの実現

学位論文公開発表

slide31
Java のリフレクション
  • 内視(introspection)
    • 標準 java.lang.reflectパッケージ
  • プログラムの意味の変更(intercession)
    • 提供されていない
    • セキュリティ上、実行性能上の問題を引き起こす

学位論文公開発表

behavioral reflection
動作リフレクション(Behavioral Reflection)
  • MetaXa, Kava, (Sun JDK1.3,) …
  • メタオブジェクト機構

modify

Meta program

Metaobject

trap

reflect

Object

Object

method call

学位論文公開発表

slide33
これは最もよい抽象化だろうか?
  • 動作リフレクションは全ての種類のアプリケーションにとって直感的なわけでない
    • 遠隔メソッド呼び出し(RMI)のための言語拡張
    • 遠隔 Accountオブジェクトのwithdraw()メソッドを呼び出す

学位論文公開発表

slide34
動作リフレクションによる RMI
  • メタプログラムはプロキシを作る

proxy object

network

metaobject

metaobject

invoke

trap

dummy

callee

withdraw()

withdraw()

caller

instance of

Account class

学位論文公開発表

dummy
この dummy オブジェクトは
  • 自動的に作られなければならない
    • コンストラクタのパラメータには何を渡せばよいのか
    • もし Account のコンストラクタが副作用を起こしたら
      • Dummy オブジェクトの生成においてはコンストラクタ呼び出しを省く必要がある

これらの問題を回避するためには、プロキシクラスを作り出す必要がある

学位論文公開発表

slide36
問題点のまとめ
  • 動作リフレクションの「トラップ」モデルは
    • 多くの言語拡張に便利である
    • が、全てにというわけではない
  • ある種のアプリケーションには、この抽象化はマッチしない
    • 数々のアドホックなトリックが必要になる

学位論文公開発表

javassist1
Javassist
  • 我々の提案する Java 用の構造リフレクション(structural reflection)システム
  • 内視(introspection)
    • Java reflection API とほぼ互換
  • プログラムの意味の変更(intercession)
    • 新たなクラスを作る
    • 既存のクラス定義を変更する

プログラムの構造的な側面を扱う

学位論文公開発表

slide38
構造リフレクション
  • 今日あまり使われない
  • が、Smalltalk, CLOS, ObjVlisp, Classtalk, …によって提供されていたもの

学位論文公開発表

slide39
構造リフレクションによる RMI
  • プロキシクラスはメタプログラムにより自動的に作られる
    • Accountクラスに空のコンストラクタを追加
    • RMI を行う withdraw()メソッドを追加

class AccountProxy extends Account {

int withdraw() {

.. Communication with RMI server ..

}

}

class Account {

Account() {}

}

学位論文公開発表

javassist api
Javassist API
  • クラス・ダイアグラム
    • Class, Field, Constructor, Method オブジェクトは改変可能

Class

Field

Method

Constructor

学位論文公開発表

slide41
Java のバイナリ互換性
  • Javassist はあらゆる変更を許すわけではない
    • 例:フィールドの削除は許されない
    • ある種の変更はプログラムの正当性を壊す恐れが強い
  • Javassist はバイナリ互換性を保つような変更のための API のみを提供する

学位論文公開発表

slide42
ロード時のリフレクション
  • 標準の JVM を利用するために
    • リフレクションはロード時にのみ許される

User meta program

Local Disk

modify a class file

Javassistclass loader

Java VM

class file

(bytecode)

Network

学位論文公開発表

slide43
バイトコード変換器
  • JOIE, Java Class API
    • バイトコード編集のための Java のライブラリ
  • Javassist
    • ソーステキストレベルの抽象度
    • ユーザはバイトコードの知識を必要としない
    • 使い易さ v.s. 記述力

Javassist

JOIE, Java Class API

学位論文公開発表

method body
メソッド本体部(method body)の編集の仕方
  • バイトコードの知識なしに
  • Javassist の提供する編集方法
    • 他のメソッドから本体をコピー
      • 型名置き換え
      • パラメータを Object 型の配列に変換
    • 典型的なメソッド本体から選択
      • Delegator, default constructor, …

学位論文公開発表

slide45
実験:プログラム変更の準備に要する時間
  • クラスを reify するのに関わる時間

学位論文公開発表

slide46
まとめ
  • Reflection
    • Behavioral reflection
      • MetaXa, Kava
    • Structural reflection
      • OpenJava, Javassist

Load-time

Compile-time

学位論文公開発表

addistant

Addistant

既存Javaプログラムのバイトコード変換による機能分散

学位論文公開発表

slide48
ソフトウェアの分散実行

例えば、GUI とアプリケーション・ロジックの分離

  • 管理コストの削減
  • 安価なクライアント環境を活用できるよう

「PC anywhere」

「ゼロ・アドミニストレーション」

「シン・クライアント」

学位論文公開発表

slide49
既存ソフトウェアの分散化
  • 従来の環境(全自動の遠隔 GUI)
    • X Window System、VNC、Rawt[IBM Haifa 98]
  • 従来の分散化支援ツール
    • JavaRMI、HORB、ObjectSpace、…
    • Emerald[Black87]、”remotenew”[Nagaratnam96]、JavaParty[Philippen99]、…

学位論文公開発表

x window
X Window
  • Xlib ライブラリレベルで分散化
    • 低レベルな命令が大量にネットワークを飛び交う

マウスが動いた

マウスボタン押された

Xlib

マウスボタン離された

ユーザプログラム

線を書け

学位論文公開発表

slide51
ORBを用いた手動(半自動)変換
  • ユーザプログラムを変更
    • 応答性能のよい遠隔表示が可能

ORB

ライブラリ

ウィンドウ内でクリックあり

ユーザプログラム

ユーザプログラム

内部ウィンドウ表示

学位論文公開発表

slide52
既存の分散化手法
  • X Window
    • ライブラリ・レベルの分散化
      • 完全自動だが遅い
  • ORB
    • プログラム全体を手で変更して分散化
      • 速いが、開発に余分な工数が必要

XProtocol

ユーザプログラム

GUIモジュール

ユーザプログラム

学位論文公開発表

addistant1
提案するシステムAddistant
  • より自動化されたORB
    • プログラム全体を自動変更して分散化
    • 開発者はプログラムを直接いじる必要はない
  • 現実的なシステムをめざす
    • 実用的な Swing アプリケーションにも対応
    • 既存の Java 仮想機械 (JVM) の利用
    • バイトコード変換
    • 開発者による分散化の指示の簡素化

学位論文公開発表

addistant2
Addistant の基本設計
  • クラスローダによるバイトコード変換
    • バイトコード変換にはJavassist[Chiba00] を利用
  • クラス単位のインスタンスの配置方針
    • 開発者がポリシーファイルに宣言的記述
    • 例: GUI のクラスはあちら、その他のユーザクラスはこちら

学位論文公開発表

slide55
現実的なシステムに向けて
  • プロキシ・マスタ方式の限界
    • 遠隔オブジェクト(マスタ)に対応して、手元では代理のオブジェクト(プロキシ)を用いる
    • Java RMI など、多くのORB で使われている方式

従来の ORB の実装法をそのまま

既存のプログラムに適用は無理…

メソッド呼び出し

プロキシ

マスタ

ネットワーク通信

学位論文公開発表

slide56
システム・クラスの存在
  • プロキシ・マスタ方式
    • クラス定義またはクラスを使う側のコードの変更が必要
    • システムクラスの場合バイトコード変換禁止
    • 例:プロキシクラスを元のクラスのサブクラスとする実装法
      • 元のクラスが final クラスのときは使えない、など

学位論文公開発表

addistant3
Addistant の方式
  • クラス毎に異なる実装法で遠隔参照を実現
    • 実装法により、変更が必要なコードの範囲が異なる
    • システムクラスの変更を避けるように実装法を選択
    • “長いものには巻かれろ”法
  • XML風のポリシーファイルで宣言的に指定
    • 「置き換え」、「名前変更」、「サブクラス」、「複製」

学位論文公開発表

slide58
Widget

Widget

show()

show()

.. Show ..

.. Send ..

「置き換え」手法(例:ユーザクラス)
  • 対象クラスをプロキシに置き換え
    • 元のクラスを変更できる場合
    • ひとつのJVM上には、プロキシかマスタのどちらか一方のみ

Widget w = new Widget();

w.show();

分散化

置き換える

学位論文公開発表

java awt window
Widget

WidgetProxy

show()

show()

.. Show ..

.. Send ..

「名前変更」手法(例:java.awt.Window)
  • コード中に現れた対象クラス名をプロキシクラスのものに変更
    • 元のクラスを変更できない場合
    • 使っている側のコードを変更する

Widget w = new Widget();

w.show();

分散化

WidgetProxy w

= new WidgetProxy();

学位論文公開発表

java util vector
Widget

WidgetProxy

show()

show()

.. Send ..

.. Show ..

「サブクラス」手法(例:java.util.Vector)
  • 対象クラスのサブクラスとしてプロキシクラスを定義
    • 1つのJVM上にプロキシとマスタを混在させたい場合

Widget w = new Widget();

w.show();

分散化

指示の場合によっては

Widget w

= new WidgetProxy();

学位論文公開発表

java lang string
「複製」手法(例:java.lang.String)
  • プロキシクラスは作らず、遠隔メソッド呼び出しの際、オブジェクトを移送して複製を渡す
    • Shallow copy
  • 変則版 - 「書き戻し複製」手法
    • 配列オブジェクトに用いる

byte[] buf = …;istream.read(buf);

学位論文公開発表

window
応答性能の実験クリック –Window表示
  • クリックしてから内部ウインドウが完全に表示されるまで
    • スタートアップホスト
      • Sparc 440MHz
    • GUI ホスト
      • PentiumII 500MHz
    • ネットワーク
      • 10Base-T Half
      • 100Base-TX Full

学位論文公開発表

window1
応答性能の実験クリック –Window表示
  • クリックしてから内部ウインドウが完全に表示されるまで
    • スタートアップホスト
      • Sparc 440MHz
    • GUI ホスト
      • PentiumII 500MHz
    • ネットワーク
      • 10Base-T Half
      • 100Base-TX Full

学位論文公開発表

swing
分散 Swing アプリケーション
  • ポリシーファイル

[email protected] [email protected] ..

[email protected][InputStream|OutputStream|..]

[email protected]*

[email protected][AbstractCollection|..]

[email protected]

[email protected]

-

学位論文公開発表

slide65
応答性能の測定結果
  • プログラム全体の変換による速度改善
    • 応答時間(秒) (10Base-T(100Base-TX))
    • 通信量(キロバイト)

学位論文公開発表

slide66
まとめ
  • 既存の Java プログラムを複数のホスト上に分散させるための支援ツールAddistant を提案
    • 透過な分散 JVM を既存の JVM を用いて構築する際に鍵となる技術
    • プログラム変換によるアプローチ

学位論文公開発表

slide67

本発表の総括

発表のまとめと今後の展望

学位論文公開発表

slide68
本研究の貢献
  • クラスオブジェクトモデルの提案
    • オブジェクト指向プログラムを変換するシステム設計のための抽象データ構造モデル
  • 本モデルに基づいて具体的なシステムの設計と実装を研究
    • オブジェクト指向プログラミング一般向けシステム
      • OpenJava, Javassist
    • 分散プログラミング専用システム
      • Addistant

学位論文公開発表

openjava javassist
OpenJava/Javassist
  • クラスオブジェクトモデル
    • 構文木/バイトコードの詳細を知らなくても、プログラム変換を行えるように、クラスオブジェクトモデルを適用したデータ構造を提供
    • 変換を Java 言語で記述
      • 構造リフレクション(Structural Reflection)を提供するシステム

動作リフレクション(Behavioral Reflection)

学位論文公開発表

slide70
リフレクション

Runtime structural reflection makes

it difficult to do optimization with

static type information.

language

design

program-

ming

adaptable

compile

fast

OpenJava

load

JIT-compile

Javassist

run

OpenJIT

Load-time is

a good trade-off point.

MetaXa,

Kava

学位論文公開発表

addistant4
Addistant
  • Addistant
    • 分散配置の記述を「まとめて別に」行える
    • バイトコード変換による実現により既存の Java 実行時処理系を活用できる
    • システムクラスの存在など、実際上の問題に対処した
    • Javassist 応用のケーススタディ

学位論文公開発表

slide72
今後の展望
  • DSL for ASoC 用のフレームワーク構築
    • OpenJava、Javassist
      • プログラム変換による Advanced Separation of Concerns で Addistant のような Domain Specific Language を提供するための基盤技術
    • Addistant のようなシステムをより気軽に作れるような具体的なシステム
      • XML + Java

学位論文公開発表

ad