(57)【要約】【課題】分散オブジェクト間で通信の仲立ちとなるスタブおよびスケルトンにおいて、コールオーバヘッドの削減を実現する。【解決手段】ＩＤＬコンパイラにおいては、オペレーションの引数からマーシャル、アンマーシャルするデータを読み込み、まとめて変換するデータの集合と、個々に変換するデータの集合にグループ化し、グループ毎に変換を行う。【選択図】　図１
2004145677.tif 000002
【特許請求の範囲】
【請求項１】
分散オブジェクト間通信におけるインタフェース定義言語ファイルから送信するデータを取得して、それらのデータを通信データの形式に変換するためのコード生成方法であって、
変換対象のデータの先頭から連続して変換可能なデータの集合と、個々に変換するデータの集合とにグループ化し、グループ毎、またデータ毎にコードを生成することを特徴とするコード生成方法。
【請求項２】
請求項１記載のコード生成方法において、生成されたコードからグループ化された単位でデータの変換を行うことを特徴とするコード生成方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
分散オブジェクト技術の一つであるＣＯＲＢＡ（Ｃｏｍｍｏｎ　Ｏｂｊｅｃｔ　Ｒｅｑｕｅｓｔ　Ｂｒｏｋｅｒ　Ａｒｃｈｉｔｅｃｔｕｒｅ）における、インタフェース定義言語ファイル（ＩＤＬファイル）からスタブソースファイル、スケルトンソースファイルを生成する方法に関する。
【０００２】
【従来の技術】
従来、一つの計算機またはネットワークで接続された複数の計算機上で動作する複数のオブジェクト間の通信方法に関しては、ＯＭＧ（Ｏｂｊｅｃｔ　Ｍａｎａｇｅｍｅｎｔ　Ｇｒｏｕｐ）のＣＯＲＢＡ（Ｃｏｍｍｏｎ　Ｏｂｊｅｃｔ　Ｒｅｑｕｅｓｔ　Ｂｒｏｋｅｒ　Ａｒｃｈｉｔｅｃｔｕｒｅ）が挙げられる（例えば、非特許文献１）。ＣＯＲＢＡの仕様の一つに、特定のプログラミング言語から独立した文法を持つＩＤＬ（Ｉｎｔｅｒｆａｃｅ　Ｄｅｆｉｎｉｔｉｏｎ　Ｌａｎｇｕａｇｅ：インタフェース定義言語）がある。このＩＤＬの仕様に基づいて記述されたＩＤＬファイルをＩＤＬコンパイラを用いてコンパイルすることにより、通信処理を隠蔽するクライアント側のスタブソースファイル、サーバ側のスケルトンソースファイルが自動生成される。実際のオブジェクト間の通信はＯＲＢ（Ｏｂｊｅｃｔ　Ｒｅｑｕｅｓｔ　Ｂｒｏｋｅｒ）という通信基盤により行われる。これは、サーバに到達するためのネットワークアドレスの解決とコネクション確立、要求や応答メッセージの組み立てと送受信といった様々な処理を行っている。現在、ＩＤＬファイルから様々なプログラミング言語でスタブ、スケルトンソースを生成する多くのＩＤＬコンパイラが存在する。オブジェクト間で送受信される通信データの形式は共通に定義されており、ＣＯＲＢＡの仕様ではこの形式をＣＤＲ（Ｃｏｍｍｏｎ　Ｄａｔａ　Ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）と呼んでいる。クライアントからサーバにメッセージを送信する際には、スタブにおいて通信データに送信メッセージを書き込むマーシャル（ｍａｒｓｈａｌ）処理が行われ、ＯＲＢを介してサーバへ送られる。また、通信データをサーバが受信する際には、スケルトンにおいてＯＲＢから受け取った通信データから、メッセージを読み込むアンマーシャル（ｕｎｍａｒｓｈａｌ）処理が行われる。また、サーバがクライアントにメッセージを送信する際には、スケルトンにおいてメッセージのマーシャル処理を行い、クライアントのスタブにおいて、メッセージのアンマーシャル処理が行われる。マーシャル、アンマーシャル処理は、メッセージ中のデータを通信データの形式に変換するルーチン、またその逆の変換をするルーチンを含む形で構成されている。
【非特許文献１】Ｃｏｍｍｏｎ　Ｏｂｊｅｃｔ　Ｒｅｑｕｅｓｔ　Ｂｒｏｋｅｒ　Ａｒｃｈｉｔｅｃｔｕｒｅ，　ｖｅｒｓｉｏｎ　３．０，　Ｊｕｌｙ　２００２　ｐｐ．１５−１〜ｐｐ．１５−６５
【０００３】
【発明が解決しようとする課題】
スタブおよびスケルトンにおいて、データ毎にマーシャル、アンマーシャルを行うと、そのデータ毎に変換ルーチンを呼び出す必要がある。
【０００４】
本発明は、変換ルーチンの呼び出し回数を減らし、呼び出し時のオーバヘッドの削減を実現する方法、プログラムを提供することを目的とする。
【０００５】
【課題を解決するための手段】
上記目的を達成するための一つの手段として、変換対象のデータに対して、連続して変換可能なデータの集合を生成し、変換を行う。
【０００６】
【発明の実施の形態】
以下、本発明の一実施例を説明する。図１はＩＤＬコンパイラの構成を示したものである。ＩＤＬコンパイラ１００は、ＩＤＬファイルを読み込み、特定のプログラミング言語で記述されたスタブ、またスケルトンソースを生成する。これは、ＩＤＬファイル読み込み部１０１、字句解析部１０２、構文解析部１０３、スタブ、スケルトンコード生成部１０４とを有している。スケルトンコード生成部１０４の処理フローを図２に示す。スタブ、スケルトンコード生成部１０４は、変換データ読み込み部１０５、グループ化処理部１０６、コード生成部１０７とを有している。非グループ化テーブル１０８、グループ化テーブル１０９は、スタブ、スケルトンコードの生成過程において作成されるテーブルで、グループ化処理部１０６によって生成され、コード生成部１０７によって読み込まれ利用される。変換データ読み込み部１０５は、ＩＤＬファイル中のオペレーションの引数からマーシャル、またアンマーシャルされるデータを読み込む。グループ化処理部１０６は、まとめて変換するデータの集合と個々に変換するデータの集合とに分割する処理を行う。まとめて変換するデータは、グループ化テーブル１０９に書き込み、個々に変換するデータは非グループ化テーブル１０８に書き込む。グループ化処理部１０６の処理フローを図４に示す。コード生成部１０７は、非グループ化テーブル１０８、グループ化テーブル１０９を読み込み、マーシャル、またアンマーシャル処理を行うコードを生成する。
【０００７】
図２にスタブ、スケルトンのマーシャル、アンマーシャル処理を行うコードを生成する流れ図を示す。２０１は、マーシャル処理を行うコードを生成し、２１０は、アンマーシャル処理を行うコードを生成する。通信データは、データ型に対応したバイト境界に基づいてメッセージ中の各データが配置されている。データ間にパディング（詰め字）を挿入することで、バイト境界の調整を実現している。たとえば、ｃｈａｒ型の場合は、任意のバイト境界に配置されるが、ｓｈｏｒｔ型は、２バイト境界、ｌｏｎｇ型は４バイト境界、ｄｏｕｂｌｅ型は８バイト境界に配置されている。まず、マーシャル処理２０１を示す。マーシャル処理実行時には、クライアントプログラムによって渡された連続したメモリアドレス上に格納されたデータを通信データ上のデータ配置に適合するように書き込んでいく。２０２では、オペレーションの引数からマーシャル処理を行うデータを読み込む。スタブのマーシャル処理においては、引数の属性が、ｉｎ、ｉｎｏｕｔの引数から読み取り、スケルトンのマーシャル処理においては、ｏｕｔ、ｉｎｏｕｔの引数から読み取る。２０３において、読み込んだデータが存在するかどうか判定する。存在しない場合は、マーシャルの必要がないため、この処理を抜けて、アンマーシャル処理２１０に移る。一方、データが存在する場合は、グループ化処理２０４を実行する。この処理の流れ図を図４に示す。コード生成部２０５において、マーシャル処理を行うコード生成を行う。２０５では、マーシャル処理における非グループ化テーブル、グループ化テーブルを読み込み、グループ化テーブルのデータに対しては、各グループの先頭位置とその長さをパラメタとし、その先頭位置から、長さ分の領域のデータを通信データにコピーする変換ルーチンを生成し、これらを呼び出す処理を生成する。このルーチンは、コピーする長さ分だけ位置を進めることによって、通信データに書き込む次の位置を調節する。非グループ化テーブルのデータに対しては、個々のデータごとに通信データにコピーする変換ルーチンを生成し、これらを呼び出す処理を生成する。次に、２１０のアンマーシャル処理を示す。アンマーシャル処理実行時には、連続したメモリアドレス上に配置されたアンマーシャル後のデータを格納する変数にデータを読み込んでいく。まず、２１１において、アンマーシャルを行う引数から変換するデータを読み込む。スタブのアンマーシャル処理においては、引数の属性が、ｏｕｔ、ｉｎｏｕｔの引数から読み取り、スケルトンのアンマーシャル処理においては、ｉｎ、ｉｎｏｕｔの引数から読み取る。２１２において、読み込んだデータが存在するかどうか判定する。存在しない場合は、マーシャルの必要がないため、この処理を抜けて、マーシャル、アンマーシャル処理を行うコードの生成処理を終了する。一方データが存在する場合は、グループ化処理２１３を実行する。この処理の流れ図はマーシャル処理で行うグループ化処理と同じで、図４に示す。コード生成部２１４において、コード生成を行う。２１４では、アンマーシャル処理における非グループ化テーブル、グループ化テーブルを読み込み、グループ化テーブルのデータに対しては、先頭位置とその長さをパラメタとし、その先頭位置から長さ分通信データからスタブ、あるいはスケルトン中に定義された変数に読み込む変換ルーチンを生成し、これらを呼び出す処理を生成する。このルーチンは、読み込む長さ分だけ位置を進めることによって、通信データから読み込む次の位置を調節する。非グループ化テーブルのデータに対しては、個々のデータごとに通信データから読み込む変換ルーチンを生成し、これらを呼び出す処理を生成する。
【０００８】
図３は、データ構成図である。非グループ化テーブル３０１は、データの型３０２、データ名３０３の項目からなる。また、グループ化テーブル３０４は、グループ番号３０５、先頭位置３０６、長さ３０７の項目からなる。これらのテーブルはマーシャル、アンマーシャルごとに存在する。
【０００９】
図４は、グループ化処理の流れ図である。この処理はマーシャル、あるいはアンマーシャルされるデータの先頭から連続する固定長データを抽出し、グループ化テーブルにそれらを書き込んでいく。データを先頭から解析し途中に可変長データを検出した場合は、そのデータを含めそれ以降のデータを非グループ化テーブルに書き込む。固定長データとは、例えば、ｃｈａｒ、ｂｏｏｌｅａｎ、ｏｃｔｅｔ、ｓｈｏｒｔ、ｌｏｎｇ、ｄｏｕｂｌｅである。可変長データは、ｓｔｒｉｎｇやｓｅｑｕｅｎｃｅである。可変長データは、スタブ、スケルトンの実行時にその長さが決まるため、それ以降のデータに対して通信データ中のバイト境界の解析はＩＤＬのコンパイル時に行うことができない。したがって、非グループ化引数テーブルに書き込まれたデータの集合に対しては個々のデータに対する変換ルーチンを呼び出し、マーシャル、アンマーシャルする必要がある。まず、４０１において、グループ番号を識別する変数ｉを１に初期化する。４０２において、変換するデータの個数分のループを実行する。４０３において、データが固定長データかどうかの判定を行う。固定長データでない場合は、４１０においてそのデータを含めそれ以降に出現するデータを非グループ化テーブルに書き込む。その後当ループを抜け、処理を終了する。固定長データである場合は、４０４において、データが一番目のデータであるかどうかの判定を行う。一番目のデータである場合は、４０９において、グループ化テーブルのグループｉの先頭位置に当データ名を書き込み、４１１へ進む。一方、当データが一番目のデータでない場合は、４０５においてバイト境界の調整が必要かどうか判定する。調整が必要な場合は、４０６において、グループ化テーブルのグループｉの長さに必要なパディングの個数分を加える。その後、４０７においてグループ番号ｉを増分し、４０８において、グループ化テーブルのグループｉの先頭位置に当データ名を書き込む。４１１において、グループ化テーブルのグループｉの長さに当データの型のサイズを加える。
【００１０】
図５において、スタブのマーシャル処理、またスケルトンのアンマーシャル処理のコード生成例を示す。５０１はＩＤＬファイルの例である。これをＩＤＬコンパイラが読み込み（１０１）、字句解析（１０２）、構文解析（１０３）の後、スタブ、スケルトンコード生成部（１０４）において、非グループ化テーブル５０２、グループ化テーブル５０３を生成する。マーシャル処理時では、コード生成部１０７において、非グループ化テーブル５０２、グループ化テーブル５０３を読み込み５０４に示すコードを生成する。５０５は従来の方法による生成コードの例である。ここで生成されたコードは、ある特定の言語で出力されたスタブ、スケルトンではなく、変換ルーチンの呼び出す回数が減っていることを表すために一般的な形式で示している。ここで生成コード例中のｖａｒ１〜ｖａｒ１１は、クライアントプログラムから渡されたマーシャルされるデータを表し、ｏｕｔｐｕｔ（ｖａｒ，　ｎ）は、マーシャルするデータｖａｒを先頭にして、長さｎ分通信データにまとめて書き込む変換ルーチンである。ｏｕｔｐｕｔ．ｔｙｐｅ（ｖａｒ）は、個々のマーシャルされる型ｔｙｐｅのデータｖａｒを通信データへ書き込む変換ルーチンである。このＩＤＬファイル例においては、変換ルーチンの呼び出す回数が１１回から６回に減っている。また、アンマーシャル処理時では、コード生成部１０７において、５０６に示すコードを生成する。５０７は従来の方法による生成コードの例である。ここで生成コード例中のｖａｒ１〜ｖａｒ１１は、アンマーシャルされた後のデータを格納するための変数を表し、ｉｎｐｕｔ（ｎ，ｖａｒ）は、通信データからアンマーシャル後のデータを格納する変数ｖａｒを先頭に長さｎ分まとめて読み込む変換ルーチンである。このＩＤＬファイル例においては、マーシャル処理と同様に変換ルーチンの呼び出す回数が１１回から６回に減っている。
【００１１】
図６において、スケルトンのマーシャル処理、スタブのアンマーシャル処理のコード生成例を示す。６０１は５０１と同じＩＤＬファイルである。これをＩＤＬコンパイラが読み込み（１０１）、字句解析（１０２）、構文解析（１０３）の後、スタブ、スケルトンコード生成部１０７において、非グループ化テーブル６０２、グループ化テーブル６０３を生成する。マーシャル処理時では、コード生成部１０７において、非グループ化テーブル６０２、グループ化テーブル６０３を読み込み、６０４に示すコードを生成する。６０５は従来の方法による生成コードの例である。このＩＤＬファイル例においては、変換ルーチンの呼び出す回数が８回から５回に減っている。アンマーシャル処理時では、コード生成部１０７において、６０６に示すコードを生成する。６０７は従来の方法による生成コードの例である。このＩＤＬファイル例においては、マーシャル処理と同様に変換ルーチンの呼び出す回数が８回から５回に減っている。
【００１２】
【発明の効果】
上記に示した本発明によれば、呼び出し時のオーバヘッドの削減が期待できる。
【図面の簡単な説明】
【図１】全体構成を示した図である。
【図２】スタブ、スケルトンコードの生成処理を示した図である。
【図３】データ構成を示した図である。
【図４】グループ化処理を示した図である。
【図５】コード生成例を示した図である。
【図６】コード生成例を示した図である。
【符号の説明】
１００　ＩＤＬコンパイラ
１０１　ＩＤＬファイル読み込み部
１０２　字句解析部
１０３　構文解析部
１０４　スタブ、スケルトンコード生成部
１０５　引数読み込み部
１０６　グループ化処理部
１０７　コード生成部
１０８　非グループ化テーブル
１０９　グループ化テーブル
【図１】
2004145677.tif 000003
【図２】
2004145677.tif 000004
【図３】
2004145677.tif 000005
【図４】
2004145677.tif 000006
【図５】
2004145677.tif 000007
【図６】
2004145677.tif 000008