IDLでは、リモート実行モジュールを定義します。この記述からstub生成プロ グラムomrpc-genにより、リモート実行モジュールに対するリモート実行プロ グラムを生成します。コマンドomrpc-ccは、ライブラリのリンクまで行うリモー ト実行プログラム生成ドライバです。
以下に、記述例を示します。
Module mat_mult; Define dmmul(mode_in int n, mode_in double A[n][n], mode_in double B[n][n], mode_out double C[n][n]) { double t; int i,j,k; for (i=0;i<n;i++){ for (j=0;j<n;j++){ t = 0; for (k=0;k<n;k++){ t += A[i*n + k] * B[k*n+j]; /* inner product */ } C[i*n+j] = t; } } }
Module文は、このファイルに記述されているモジュール名を指定します。 このモジュール内の関数はDefine文で記述します。引数の記述は、C言語に似 ていますが、以下の点が異なります。
Defineでの関数の宣言の後には、{...}において、任意のC言語のプログラムを 記述することができます。引数の名前はそのまま、C言語の引数の名前として 使うことができます。
また、ライブラリの関数を呼び出す場合には、以下のように記述することもで きます。
Define dmmul(mode_in int n, mode_in double A[n][n], mode_in double B[n][n], mode_out double C[n][n]) Calls "C" mmul(n,A,B,C);
これは、C言語で記述されたmmulという関数を呼び出す例です。
なお、一つのモジュールの定義のファイル内に複数の関数を宣言することがで きます。これらは、まとめて、一つのリモート実行プログラムになります。
現在のところ、基本データタイプとその配列しか指定することができません。 将来のバージョンにて、構造体などをサポートする予定です。
IDLの記述には以下の要素があります。
モジュール名を宣言します。
Module module_name;
module_nameは、モジュール名の識別子です。 IDLファイルは、最初に、Module文でモジュール名を宣言しなくてはなりませ ん。
リモート呼び出しをする関数のインタフェースを定義します。
Define function_name (parameter1,parameter2,...) "...descrpition..." interface_body
関数名function_nameは、関数の名前です。parameterは、以下のように記述し ます。
mode type_specifier parameter_name
modeは、引数がinputであるか、outputであるかを指定するもので、 inputの場合は、mode_inまたはIN, outputの場合はmode_out, OUTと記述しま す。また、一次的に用いるデータ領域を確保する場合にはworkと指定すること ができます。type_specifierはCの基本データ型名と文字列を示すstringを用 いることができます。
配列の引数の場合には、C言語のようにsizeを指定します。
mode type_specifier parameter_name[size]...
多次元の場合には、C言語のようにそれぞれの次元について[]に囲み指定しま す。
また、sizeには、optionとして、転送する配列領域の下限、上限、ストライドを指定 することができます。
mode type_specifier parameter_name[size:low,high,stride]...
bodyとの間には、文字列として関数についての情報を文字列として記述するこ とができます。
bodyには以下のように、C言語で記述します。
Define function_name (...) { C言語のプログラム }
Cの関数記述中では、引数についてはC言語でのパラメータ変数としてアクセス することができます。
また、単にリンクされる関数を呼び出す場合には、Callsの後に関数呼び出し を記述することができます。
Define function_name (...) Calls foo(...);
このモジュール内全体で用いるデータ、関数についてC言語でのプログラムを 記述しておくことができます。例えば、関数の定義をC言語で記述する場合に、 必要な関数宣言を記述したり、複数の関数共有する変数や関数を記述すること ができます。
Globals { ... 任意のプログラム }
Fortranプログラムとリンクする場合に、関数のmanglingに関する規則を指定 します。
OmniRPCのIDL記述は、NinfのIDLをベースにしています。以下の点で異なって います。
以下に、IDLの文法についてのinformalな定義を示す。なお、以下において、
program := {declaration}* declaration:= 'Module' IDENTIFIER ';' | 'Define' interface_definition OPT_STRING interface_body | 'Globals' '{' C_PROGRAM '}' | 'Fortranformat' STRING ';' ; interface_definition:= IDENTIFIER '(' parameter {',' parameter}* ')' ; parameter:= decl_specifier declarator ; decl_specifier: type_specifier | MODE | MODE type_specifier | type_specifier MODE | type_specifier MODE type_specifier ; MODE := 'mode_in' | 'IN' | 'mode_out' | 'OUT'; declarator=: IDENTIFIER | '(' declarator ')' | declarator '['expr_or_null ']' | declarator '['expr_or_null ':' range_spec ']' | '*' declarator ; range_spec=: expr | expr ',' expr | expr ',' expr ',' expr ; interface_body: '{' C_PROGRAM '}' | CALLS OPT_STRING IDENTIFIER '(' IDENTIFIER {',' IDEFINTIER}* ')' ';' ; expr_or_null:= expr | /* null */; expr:= primary_expr | '*' expr /* pointer reference */ | '-' expr /* unary minus */ | expr '/' expr | expr '%' expr | expr '+' expr | expr '-' expr | expr '*' expr | expr '^' expr | expr RELOP expr | expr '?' expr ':' expr ; primary_expr:= primary_expr '[' expr ']' | IDENTIFIER | CONSTANT | '(' expr ')' ;