What is CORBA?
CORBAで使われる重要な用語についてここで触れます。
CORBA object |
1つのORBによって設置され、クライアントによって呼ばれる
リクエストを持つ、「仮想的な」実体(virutal entity)。
プログラミング言語によって実装されないかぎり実際には存在しない
という意味で「仮想な」もの。CORBA objectのプログラミングによる
実現は、仮想メモリがOSの上では存在しないものの物理メモリを使って
シミュレートされるのと似ています。
|
target object |
CORBAリクエストの発行の中で、そのリクエストのターゲットである
CORBA object。
|
client |
CORBA objectに1つのリクエストを発行する実体。
|
server |
1つ以上のCORBA objectが存在するアプリケーションプログラム。
|
request |
クライアントによって1つのCORBA object上に発行される操作。
|
object reference |
1つのCORBA objectを特定し、設置し、指し示すのに使われるハンドル。
|
servant |
1つ以上のCORBA objectを実装するプログラミング言語の実体。
CORBA objectの本体や実装を用意するを
CORBA objectを具現化する(incarnate)と言い、ServantはCORBA objectを
具現化するとものと言われます。
|
CORBAの特徴は
です。
IDLはC++やJavaのようなプログラミング言語ではなく、
オブジェクトやアプリケーションプログラムを記述できません。
IDLはあらゆるプログラミング言語に独立に、オブジェクトのインターフェースを
定義します。次に簡単な例題を示します。
interface Employee {
long number();
};
この例題はnumberと名付けられた操作(operation)を含むEmployeeと名付けられたinterface
を定義しています。numberは引数は無く、返り値のタイプがlong(32ビット)です。
Employee interfaceはCORBAのオブジェクトとして実装され、numberはその
オブジェクトの番号(number)を返すメソッドとなります。
次の例はEmployeeオブジェクトリファレンスを返すメソッド, lookupを
定義しています。引数は32ビット入力のemp_numberです。
interface EmployeeRegistry {
Employee lookup( in long emp_number );
};
IDLはまた、1つ以上のinterfaceを継承できます。
次に例を示します。
interface Printer {
void print();
}
interface ColorPrinter : Printer {
enum ColorMode { BlackAndWhite, FullColor };
void set_color( in ColorMode mode );
};
ColorPrinter interfaceはPrinter interfaceを継承しています。クライアント
プログラムがPrinterオブジェクトを扱えるように書かれているならば、
ColorPrinterオブジェクトも利用することができます。
ここではIDLがどのように異なったプログラミング言語に翻訳するかが示されます。
例えば、C++言語においてはinterfaceはclassに、operationはそれらのclassの
メンバー関数にマップされます。同様に、Java言語においてはinterfaceは
public Java interfaceにマップされます。ここではまた、
アプリケーションプログラムがORBをどのように使うか、サーバプログラムが
servantをどのように実装するかが示されます。
OMGではすでにC, C++, Smalltalk, COBOL, Ada, Javaのlanguage mapppingを
標準化しました。まだ標準化されていませんが、Eiffel, Modula 3, Perl,
Tcl, Objective-C, Pythonのlanguage mapppingが存在します。
CORBAの言語独立性はヘテロジニアスなシステムを構築するキーとなるものです。
CORBAアプリケーションプログラムはリクエストを受け取るかリクエストをCORBA
オブジェクトに発行するかで動作します。リクエスト発行の2つのアプローチとしては
- Static invocation and dispatch
- Dynamic invocation and dispatch
があります。前者では、IDLは言語依存のstubとskeltonを生成します。
stubはクライアント側でリクエスト発行を行います。C++言語では、CORBA stubは
classのメンバー関数です。stub関数をサポートするローカルなC++オブジェクトは
しばしはproxyと呼ばれます。一方skeltonは、サーバ側の関数です。それは
サーバプログラムによって受け取られるリクエストの発行を行ないます。
サーバプログラムは適当なservantにdispatchされます。
さて、後者は、前者がコンパイル時にCORBAリクエストを構築したのと違って、
ランタイムにその構築とdispatchを行ないます。
Object adapterはORBとservantの間の糊のような役目を持ちます。
CORBA2.1以前はBasic Object Adaptor (BOA)だけでした。これはCORBA実装において
互換性がありません。CORBA2.2でBOAを置き換えるために、
Portable Object Adaptor (POA)が作られ、BOAをCORBAから取り去り、
これで互換性が保証されました。
CORBA2.0はGeneral Inter-ORB Protocol (GIOP)を導入ました。
GIOPはORB間の互換性を保証するための転送のシンタックスとメッセージフォーマット
を指定する抽象プロトコルです。IIOPはGIOPをTCP/IP上にどのように実装するかを
示したものです。これによりORB間の相互運用が可能になりました。