さかい::進捗報告::2003-05-29

進捗報告 (2003-05-22)

慶應義塾大学 総合政策学部 3年

酒井 政裕 <sakai at tom.sfc.keio.ac.jp>

今日話すこと

今日はちょっと休憩して、CORBAとBonoboについての簡単な説明。

CORBAとは?

  • CORBA = Common Object Request Broker Architecture
  • 分散オブジェクト技術

分散オブジェクト技術

  • オブジェクトを分散配置し、ローカルにあるオブジェクトと 同様に呼び出せるようにする
  • 分散
    • マシン間
    • プロセス間
    • スレッド間

一般的な仕組み

  • ローカルにはスタブと呼ばれるオブジェクトのみをおいておく
  • スタブのメソッドが呼び出されたとき、引数をマーシャリングしORB(Object Request Broker)を介しリモートに要求を送る。
  • リモートのORBは要求を受け取ると、「スケルトン」とよばれるコードに要求を引き渡す。
  • スケルトンは引数をアンマーシャリングし、実際のオブジェクトのメソッドを呼び出す。

実装

  • 言語非依存
    • CORBA
    • COM, DCOM
    • SOAP
  • 言語依存
    • JavaRMI, HORB
    • dRuby

比較

  • 「言語非依存」の技術は「言語依存」のものに比べて一般に複雑
  • CORBAも結構複雑

CORBA : インターフェース定義

  • オブジェクトのインターフェースはIDLで定義
  • IDL = Interface Definition Language
  • IDLから各言語用のスタブとスケルトンのコードを生成する

Bonobo

  • GNOMEのコンポーネント技術
  • 分散オブジェクト技術にはCORBAを使用

Bonoboの名前の由来

  • ピグミーチンパンジーとも呼ばれるお猿
  • コミュニケーションの手段として、生殖活動を目的としない交尾を頻繁にする
  • ソフトウェアのコンポーネントも、簡単にくっつく事が出来るべきだよねぇ

……って事らしい。

GNOMEの開発者はお猿がお好き?

コンポーネントの実装

  • 実行ファイル
  • 共有ライブラリ

のいずれかとして実装する。

  • glibの提供するオブジェクトシステムであるgobjectの仕組みを使って、 CORBAの面倒な部分を隠してしまっている。
  • インスタンスの作り方, サポートするインターフェース, etc の情報を.serverファイルに書く
  • .serverファイルをインストールして、コンポーネントを登録する

Bonoboの使い方(クライアント)

  • オブジェクトの参照を得るための柔軟な方法をBonoboが提供している
  • queryInterfaceで目的のインターフェースを得る
  • 後はCORBAで普通にメソッドを呼び出す
  • Widgetの埋め込みには(gtk+のクラスの)BonoboWidgetクラスを使う
  • オブジェクトを使い終わったら unref

OAF Query (1)

CORBA_Object o = bonobo_activation_activate ("repo_ids.has ('IDL:GNOME/Graph/Layout:1.0')", NULL, 0, NULL, &ev);

GNOME/Graph/Lyout:1.0インターフェースをサポートするコンポーネントをインスタンス化する。

OAF Query (2)

もっと複雑なキュエリー

"(repo_ids.has_all (['IDL:Bonobo/Control:1.0',
		       'IDL:Nautilus/ContentView:1.0']) OR
  repo_ids.has_one (['IDL:Bonobo/Control:1.0',
		       'IDL:Bonobo/Embeddable:1.0'])) AND
  repo_ids.has('IDL:Bonobo/PersistFile:1.0') AND
  foo:bar.defined()"

Moniker

別名による呼び出し。

  • 例) URI や MIME type による呼び出し

queryInterface

BonoboはCORBAの多重継承は使わず、かわりにインターフェース集約を用いる。で、クライアント側がインターフェースを得るためにはqueryInterfaceを使う。

CORBA_Object plotter_object = bonobo_object_query_interface (BONOBO_OBJECT (component), "IDL:Plotter/Control:1.0");

Last modified:2005/10/10 01:35:14
Keyword(s):
References: