IDL(インタフェース記述言語)の記述

リモート実行プログラムを作成するためには、各リモート関数のインタフェー スを記述したIDLファイルを記述しなくてはなりません。ここでは、そのIDLに ついて説明します。
IDLファイルとリモート実行プログラムの生成
記述例
詳細
Ninf IDLとの違い
IDLの文法

IDLファイルとリモート実行プログラムの生成

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 module_name;

module_nameは、モジュール名の識別子です。 IDLファイルは、最初に、Module文でモジュール名を宣言しなくてはなりませ ん。

Define文

リモート呼び出しをする関数のインタフェースを定義します。

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

Globals文

このモジュール内全体で用いるデータ、関数についてC言語でのプログラムを 記述しておくことができます。例えば、関数の定義をC言語で記述する場合に、 必要な関数宣言を記述したり、複数の関数共有する変数や関数を記述すること ができます。

Globals { ... 任意のプログラム }

Fortranformat文

Fortranプログラムとリンクする場合に、関数のmanglingに関する規則を指定 します。

Ninf IDLとの違い

OmniRPCのIDL記述は、NinfのIDLをベースにしています。以下の点で異なって います。

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