(57)【特許請求の範囲】
【請求項１】
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手段と、
前記解析手段にて特定された入力データを送信し、その後、前記解析手段にて特定された出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手段と、
前記解析手段にて特定された入力データを受信し、その後、前記解析手段にて特定された出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手段と、を含み、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される、転送プログラム生成装置。
【請求項２】
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手段と、
前記解析手段にて特定された入力データを送信し、その後、前記解析手段にて特定された出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手段と、
前記解析手段にて特定された入力データを受信し、その後、前記解析手段にて特定された出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手段と、を含み、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析手段は、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する、転送プログラム生成装置。
【請求項３】
転送プログラム生成装置が行う転送プログラム生成方法であって、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析ステップと、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成ステップと、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成ステップと、を含み、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される、転送プログラム生成方法。
【請求項４】
転送プログラム生成装置が行う転送プログラム生成方法であって、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析ステップと、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成ステップと、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成ステップと、を含み、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析ステップでは、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する、転送プログラム生成方法。
【請求項５】
コンピュータに、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手順と、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手順と、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手順と、を実行させ、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される、プログラム。
【請求項６】
コンピュータに、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手順と、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手順と、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手順と、を実行させ、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析手順では、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、転送プログラム生成装置、処理システム、転送プログラム生成方法およびプログラムに関し、特には、複数のプロセッサを用いてプログラムを実行する際に用いられる転送用プログラムを生成する転送プログラム生成装置、処理システム、転送プログラム生成方法およびプログラムに関する。
【背景技術】
【０００２】
あるプロセッサ（以下「第１プロセッサ」と呼ぶ）が実行しているプログラムにて規定された処理の一部を、別のプロセッサ（以下「第２プロセッサ」と呼ぶ）が実行する分散処理が知られている。
【０００３】
分散処理では、複数のプロセッサが並列にプログラムを実行できる。このため、分散処理では、プログラムの処理時間を短縮することができる。また、分散処理では、第１プロセッサが単独でプログラムを実行するときに比べて、第１プロセッサの負荷が下がるので、第１プロセッサが同時に別のプログラムを実行することが可能になる。また、分散処理では、第１プロセッサが、第２プロセッサが有する固有の機能を利用することが可能になる。
【０００４】
一般に、互いに異なる計算機上のプロセッサは、互いに異なるメモリアドレス空間（以下「アドレス空間」と呼ぶ）を使用する。
【０００５】
このため、第２プロセッサが、第１プロセッサが使用するアドレス空間と異なるアドレス空間（以下「別アドレス空間」と呼ぶ）を使用する場合、互いに異なるアドレス空間を使用する第１および第２プロセッサが、１つのプログラムを実行することになる。また、マルチコアプロセッサを持つ単一の計算機でも、複数のＯＳ（Operating System）が搭載され、かつ、ＯＳごとにアドレス空間が異なる場合は、アドレス空間の異なる複数のプロセッサが１つのプログラムを動かすことになる。
【０００６】
第１プロセッサが実行しているプログラムにて規定された処理の一部を、別アドレス空間を使用する第２プロセッサに実行させる手続きは、リモートプロシージャコール（RPC：Remote Procedure Call）として知られている。
【０００７】
RPCは、第１プロセッサが別アドレス空間上の関数を呼び出す技術である。RPCが用いられると、第１プロセッサで実行されるプログラム中の一部の関数を、別アドレス空間を使用する第２プロセッサに実行させることが可能になる。
【０００８】
プログラムを実行している第１プロセッサとアドレス空間が異なる第２プロセッサが、プログラムで規定された関数を実行するためには、第１プロセッサが、第２プロセッサが関数を実行するために必要なデータを第２プロセッサに転送し、第２プロセッサが、関数の実行結果を第１プロセッサに転送する必要がある。このため、プログラムに、データ転送処理を規定する転送プログラムを追加する必要がある（以下、この追加されるプログラムを「スタブ」と呼ぶ）。
【０００９】
スタブの追加は、プログラマにとって余計な手間であるため、第２プロセッサに処理の一部をオフロードする際の障壁となる。
【００１０】
特許文献１には、インターフェース定義言語（IDL：Interface Definition Language）を利用してスタブを生成するクライアント／サーバアプリケーション作成装置（以下、単に「作成装置」と呼ぶ）が記載されている。
【００１１】
IDLは、プログラムのソースコードを記述するための言語ではなく、関数の入出力を定義するための言語である。特許文献１に記載の作成装置は、IDLで定義された情報を用いて、自動的にスタブを作成する。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００５−３５２８９１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
特許文献１に記載の作成装置では、スタブを作成するためにIDLが利用される。このため、特許文献１に記載の作成装置を使用するプログラマは、IDLを利用して関数の入出力を定義する必要がある。よって、プログラマは、IDLについて学習する必要があり、プログラムのソースコードとは別に、IDLを用いて関数の入出力を定義する必要があるという課題があった。
【００１４】
本発明の目的は、上述した課題を解決可能な転送プログラム生成装置、処理システム、転送プログラム生成方法およびプログラムを提供することにある。
【課題を解決するための手段】
【００１５】
本発明の転送プログラム生成装置は、所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手段と、前記解析手段にて特定された入力データを送信し、その後、前記解析手段にて特定された出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手段と、前記解析手段にて特定された入力データを受信し、その後、前記解析手段にて特定された出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手段と、を含み、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される。また、
本発明の転送プログラム生成装置は、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手段と、
前記解析手段にて特定された入力データを送信し、その後、前記解析手段にて特定された出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手段と、
前記解析手段にて特定された入力データを受信し、その後、前記解析手段にて特定された出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手段と、を含み、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析手段は、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する。
【００１７】
本発明の転送プログラム生成方法は、転送プログラム生成装置が行う転送プログラム生成方法であって、所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析ステップと、前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成ステップと、前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成ステップと、を含み、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される。また、
本発明の転送プログラム生成方法は、
転送プログラム生成装置が行う転送プログラム生成方法であって、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析ステップと、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成ステップと、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成ステップと、を含み、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析ステップでは、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する。
【００１８】
本発明のプログラムは、コンピュータに、所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手順と、前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手順と、前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手順と、を実行させ、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定し、
前記属性は、前記引数に付加された文字列であり、
前記文字列は、当該文字列が付加された引数に対して、入力か出力かを区別するデータ転送方向と、転送するデータサイズと、を特定する方法を示す文字列で構成される。また、
本発明のプログラムは、
コンピュータに、
所定関数を呼び出す処理が記述された主プログラムを実行する第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用して前記所定関数を実行する第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データとを、前記主プログラムのソースコードに記述された前記所定関数についての関数の宣言に基づいて特定する解析手順と、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した、前記主プログラムおよび前記所定関数とは異なる呼出元プログラムを生成する第１生成手順と、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した、前記所定関数とは異なる呼出先プログラムを生成する第２生成手順と、を実行させ、
前記関数の宣言には、引数を用いて前記入力データと前記入力データのサイズとを規定するための所定仕様に従って前記入力データと前記入力データのサイズが規定されており、
前記所定仕様は、前記引数に対して、入力に対応するデータ転送方向と、転送するデータサイズと、を特定する方法を示す仕様であり、
前記解析手順では、前記所定仕様に従って前記関数の宣言を解析することによって、前記規定されたサイズの入力データを特定する。
【発明の効果】
【００１９】
本発明によれば、転送プログラムを生成する際のプログラマの負担を軽減することが可能になる。
【図面の簡単な説明】
【００２０】
【図１】本発明の第１実施形態の構成を説明するための図面である。
【図２】本発明の第１実施形態の変形例を説明するための図面である。
【図３】本発明の第１実施形態の動作を説明するための図面である。
【図４】本発明の第１実施形態の動作を説明するための図面である。
【図５】本発明の第２実施形態の構成を説明するための図面である。
【図６】本発明の第３実施形態の構成を説明するための図面である。
【図７】本発明の第４実施形態の構成を説明するための図面である。
【図８】本発明の第４実施形態で用いられる追加仕様を説明するための図面である。
【図９】本発明の第４実施形態で用いられる追加仕様を説明するための図面である。
【図１０】本発明の第５実施形態の構成を説明するための図面である。
【図１１】本発明の第５実施形態の変形例を説明するための図面である。
【図１２】本発明の第６実施形態の構成を説明するための図面である。
【発明を実施するための形態】
【００２１】
次に、本発明を実施するための形態について図面を参照して詳細に説明する。
【００２２】
（第１実施形態）
図１は、本発明の第１実施形態のスタブ生成部１の構成を示すブロック図である。
【００２３】
図１において、スタブ生成部１は、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１は、転送データ決定部１１と、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、を含む。転送データ決定部１１は、関数宣言解析部２を備える。
【００２４】
スタブ生成部１は、主プログラムに記述されたある関数（以下「リモート関数」と呼ぶ）についての関数の宣言（以下「リモート関数の宣言」と呼ぶ）１０１を受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。
【００２５】
リモート関数の宣言１０１は、例えば、主プログラムのヘッダファイルに記述されている。リモート関数は、一般的に所定関数と呼ぶことができる。呼び出し元スタブ１０２は、一般的に第１転送プログラムまたは呼出元プログラムと呼ぶことができる。呼び出し先スタブ１０３は、一般的に第２転送プログラムまたは呼出先プログラムと呼ぶことができる。
【００２６】
リモート関数とは、主プログラムを実行しリモート関数の呼び出し元であるプロセッサ（以下「呼び出し元プロセッサ」と呼ぶ）が使用するアドレス空間とは異なるアドレス空間を使用するプロセッサ（以下「呼び出し先プロセッサ」と呼ぶ）で実行される関数とする。
【００２７】
呼び出し元プロセッサは、一般的に第１プロセッサと呼ぶことができる。呼び出し先プロセッサは、一般的に第２プロセッサと呼ぶことができる。
【００２８】
本実施形態では、リモート関数として、呼び出し元プロセッサが呼び出し先プロセッサにリモート関数を実行させるために呼び出し元プロセッサと呼び出し先プロセッサとの間で転送される必要があるデータ（以下「転送データ」と呼ぶ）をプログラミング言語の仕様に従った関数の宣言（リモート関数の宣言１０１）から判断できる関数が用いられる。本実施形態でリモート関数として用いられる関数の例については後述する。
【００２９】
転送データは、入力データと出力データとから構成される。入力データとは、リモート関数の実行前に、呼び出し元プロセッサから呼び出し先プロセッサに転送されるデータである。さらに言えば、入力データは、呼び出し先プロセッサがリモート関数を実行するために必要なデータである。出力データとは、リモート関数の実行後に、呼び出し先プロセッサから呼び出し元プロセッサへ転送されるデータである。さらに言えば、出力データは、リモート関数の実行結果である。
【００３０】
なお、関数の宣言とは、プログラミング言語にて規定された情報であって、関数を呼び出すために必要な情報であり、一般に、関数の名前（名称）、引数リスト（引数単位で、引数の型と引数となる変数名とを示したリスト）、および、戻り値の型などの情報を含み、関数の処理内容の記述を含まない。
【００３１】
スタブ生成部１は、リモート関数が記述された主プログラムを実行する呼び出し元プロセッサにて実行される呼び出し元スタブ１０２と、呼び出し先プロセッサにて実行される呼び出し先スタブ１０３と、を生成する。
【００３２】
転送データ決定部１１は、一般的に解析手段と呼ぶことができる。
【００３３】
転送データ決定部１１は、主プログラムのソースコードに記述された特定情報を受け付ける。特定情報は、転送データを特定するための情報である。転送データ決定部１１は、特定情報を受け付けると、その特定情報に基づいて、転送データを特定する。本実施形態では、特定情報として、リモート関数の宣言１０１が用いられる。
【００３４】
関数宣言解析部２は、主プログラムのソースコードの記述に使用されたプログラミング言語の仕様に基づきリモート関数の宣言１０１を解析することによって、転送データを決定する。
【００３５】
呼び出し元スタブ生成部１２は、一般的に第１生成手段と呼ぶことができる。
【００３６】
呼び出し元スタブ生成部１２は、転送データ決定部１１によって決定された転送データに基づいて、呼び出し元スタブ１０２を生成する。
【００３７】
呼び出し元スタブ１０２は、転送データ決定部１１にて特定された入力データをリモート関数の実行前に送信し、転送データ決定部１１にて特定された出力データをリモート関数の実行終了後に受信する、という手順を少なくとも含む処理を、呼び出し元プロセッサに実行させるために使用される呼出元プログラムである。
【００３８】
呼び出し先スタブ生成部１３は、一般的に第２生成手段と呼ぶことができる。
【００３９】
呼び出し先スタブ生成部１３は、転送データ決定部１１によって決定された転送データに基づいて、呼び出し先スタブ１０３を生成する。
【００４０】
呼び出し先スタブ１０３は、転送データ決定部１１にて特定された入力データをリモート関数の実行前に受信し、転送データ決定部１１にて特定された出力データをリモート関数の実行終了後に送信する、という手順を少なくとも含む処理を、呼び出し先プロセッサに実行させるために使用される呼出先プログラムである。
【００４１】
なお、スタブ生成部１は、コンピュータにて実現されてもよい。図２は、スタブ生成部１が、コンピュータであるＣＰＵ（Central Processing Unit）１００にて実現される例を示した図である。図２において、図１に示したものと同一機能を有するものには同一符号を付してある。
【００４２】
図２では、ＣＰＵ１００は、ハードディスク２００に記録されたプログラムを読み込み実行することによって、関数宣言解析部２、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。ハードディスク２００は、コンピュータにて読み取り可能な記録媒体の一例である。なお、記録媒体は、ハードディスク２００に限らず適宜変更可能である。また、関数宣言解析部２、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【００４３】
次に、本実施形態の動作について説明する。
【００４４】
最初に、スタブ生成部１によるスタブ生成動作を説明する。
【００４５】
まず、関数宣言解析部２が、リモート関数の宣言１０１を読み込む。
【００４６】
本実施形態では、リモート関数として、転送データをリモート関数の宣言１０１から判断できる関数が用いられている。本実施形態では、リモート関数の宣言１０１には、データサイズが規定された引数を示す引数情報（引数リスト）と、データサイズが規定された戻り値を示す戻り値情報（戻り値の型および関数名）とが、少なくとも記述されている。
【００４７】
関数宣言解析部２は、リモート関数の宣言１０１を読み込むと、主プログラムのプログラミング言語の仕様に基づきリモート関数の宣言１０１を解析することによって、リモート関数の入力データおよび出力データ、つまり、転送データを決定する。
【００４８】
関数宣言解析部２がリモート関数の入力データおよび出力データを決定する方法としては、例えば、リモート関数の宣言１０１に記述されたリモート関数の引数を入力データとして決定し、リモート関数の戻り値を出力データとして決定する方法が用いられる。
【００４９】
関数宣言解析部２は、リモート関数の入力データおよび出力データを決定すると、リモート関数の入力データおよび出力データを、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、に提供する。
【００５０】
呼び出し元スタブ生成部１２は、リモート関数の入力データおよび出力データを受け付けると、呼び出し元スタブ１０２を生成する。
【００５１】
呼び出し先スタブ生成部１３は、リモート関数の入力データおよび出力データを受け付けると、呼び出し先スタブ１０３を生成する。
【００５２】
次に、呼び出し元スタブ１０２と呼び出し先スタブ１０３とを利用して、リモート関数を、主プログラムを実行するプロセッサ（呼び出し元プロセッサ）と異なるプロセッサ（呼び出し先プロセッサ）で実行する場合の動作（以下「実行動作」と呼ぶ）について説明する。
【００５３】
なお、実行動作は、リモートプロシージャコール（RPC）技術で一般的な動作であるため、ここでは実行動作を簡単に説明する。
【００５４】
以下では、主プログラムＡを実行しているプロセッサ１ａが、リモート関数１０４をプロセッサ１ｂ上で実行させる場合について説明する。
【００５５】
図３は、リモート関数１０４の実行までの動作を示した図である。
【００５６】
まず、プロセッサ１ａは、主プログラムＡを実行することによって、呼び出し元スタブ１０２を呼び出し、呼び出し元スタブ１０２を実行する。
【００５７】
プロセッサ１ａは、呼び出し元スタブ１０２を実行すると、入力データをプロセッサ１ｂに送信し、その後、プロセッサ１ｂにリモート関数１０４の実行を指示する。
【００５８】
続いて、プロセッサ１ｂ上で呼び出し先スタブ１０３が実行され、プロセッサ１ｂは、入力データを受信し、リモート関数１０４を呼び出し、リモート関数１０４の実行を開始する。
【００５９】
図４は、リモート関数１０４の実行終了後の動作を示した図である。
【００６０】
リモート関数１０４の実行が終了すると、呼び出し先スタブ１０３を実行するプロセッサ１ｂが、リモート関数１０４の演算結果を、出力データとして、プロセッサ１ａに送信する。呼び出し元スタブ１０２を実行するプロセッサ１ａは、出力データを受信し、その出力データをプログラムＡに渡す。
【００６１】
なお、プロセッサ１ａとプロセッサ１ｂとは、単一計算機上の異なるプロセッサでもよいし、異なる計算機上のプロセッサでもよい。
【００６２】
次に、本実施形態の一具体例を説明する。
【００６３】
本実施形態では、リモート関数として、リモート関数の転送データをリモート関数の宣言１０１から決定することが可能な関数（以下「第１関数」と呼ぶ）が用いられる。
【００６４】
具体的な第１関数についての関数の定義および関数宣言をプログラム言語であるＣ言語で記述した例を以下に示す。
【００６５】
なお、第１関数についての関数の宣言には、リモート関数の名称と、リモート関数の戻り値が存在することを示し戻り値のデータサイズを規定する戻り値の型と、リモート関数の引数が存在することを示し引数のデータサイズを規定する引数リストと、が記述されている。
関数の定義：
int add(int x, int y)
[
int z;
z = x + y;
return z;
]
関数の宣言：
int add(int x, int y);
リモート関数を呼び出すプログラムの例を以下に示す。
void main(void)
[
int a, b, c;
:
c = add(a, b);
]
add関数の定義および宣言から、add関数の実行に必要な入力データは、引数であるxとyであることと、add関数からの出力データは、戻り値であることが分かる。また、add関数の定義および宣言から、x、yおよび戻り値のそれぞれはint型の変数であることが分かり、よって、転送するべきデータのサイズも決定できる。
【００６６】
したがって、add関数は、リモート関数の宣言１０１から転送データを決定できる関数である。
【００６７】
関数宣言解析部２は、リモート関数の宣言１０１を解析して、リモート関数の引数を入力データとして決定し、リモート関数の戻り値を出力データとして決定し、各データのサイズを、データ（引数と戻り値）の型から決定する。
【００６８】
呼び出し元スタブ生成部１２は、関数宣言解析部２が決定したadd関数についての転送データに基づき、呼び出し元スタブ１０２として、int型変数２個を引数に取り、戻り値がint型であるスタブ関数を生成する。
【００６９】
呼び出し元スタブ１０２であるスタブ関数には、引数で受け取った２つのint型のデータを呼び出し先プロセッサへ送信し、呼び出し先プロセッサにadd関数を実行するように指示をした後、呼び出し先プロセッサからint型のデータを１つ受け取るという一連の動作が記述される。呼び出し元スタブ１０２であるスタブ関数を、以下に示す。
int add_caller_stub(int x, int y)
[
int z;
send(&x, sizeof(int));
send(&y, sizeof(int));
call(ADD);
recv(&z, sizeof(int));
return z;
]
なお、上記スタブ関数において、sendはデータの送信、callは指定した関数の呼び出し、recvはデータの受信を示すための擬似的な関数である。実際には、呼び出し先プロセッサを特定するための引数などが追加されても良い。例えば、呼び出し元スタブ生成部１２は、呼び出し先プロセッサを特定するための引数をさらに受け付け、その引数を、上記スタブ関数に追加してもよい。
【００７０】
次に、呼び出し先スタブ生成部１３が生成する呼び出し先スタブ（スタブ関数）１０３を以下に示す。
void add_callee_stub(void)
[
int x, y, z;
recv(&x, sizeof(int));
recv(&y, sizeof(int));
z = add(x, y);
send(&z, sizeof(int));
]
呼び出し先スタブ１０３には、呼び出し元プロセッサからint型のデータを２つ受信し、次に、これらの受信されたデータを引数として用いてadd関数を実行し、add関数の実行結果を呼び出し元プロセッサに送信するという一連の動作が記述される。なお、実際には、呼び出し先スタブ１０３には、呼び出し元プロセッサを特定するための引数などが追加されても良い。例えば、呼び出し先スタブ生成部１３は、呼び出し元プロセッサを特定するための引数をさらに受け付け、その引数を、呼び出し先スタブ１０３に追加してもよい。
【００７１】
本実施形態によれば、転送データ決定部１１は、主プログラムのソースコードに記述された特定情報（入力データと出力データとを特定するための情報）に基づいて、入力データと出力データとを特定する。
【００７２】
呼び出し元スタブ生成部１２は、転送データ決定部１１にて特定された入力データおよび出力データを用いて、呼び出し元スタブ１０２を生成する。また、呼び出し先スタブ生成部１３は、転送データ決定部１１にて特定された入力データおよび出力データを用いて、呼び出し先スタブ１０３を生成する。
【００７３】
このため、主プログラムのソースコードに記述された特定情報に基づいて、呼び出し元スタブ１０２と呼び出し先スタブ１０３を生成することが可能になる。
【００７４】
したがって、主プログラムのソースコードの他に、IDLを用いて関数の入出力を定義しなくても、呼び出し元スタブ１０２と呼び出し先スタブ１０３を生成することが可能になる。
【００７５】
よって、スタブ（転送プログラム）を生成するために、プログラマが、プログラムのソースコードとは別に、IDLを用いて関数の入出力を定義する必要がなくなり、プログラマの負担を軽減することが可能になる。
【００７６】
また、呼び出し元スタブ１０２と呼び出し先スタブ１０３が生成されるため、プログラマは、リモート関数を呼び出し先プロセッサで実行させるためのデータ転送処理を規定する関数をソースコード内に生成する必要がなくなり、プログラマの負担を軽減することが可能になる。
【００７７】
また、本実施形態では、リモート関数の宣言１０１には、データサイズが規定された引数を示す引数情報と、データサイズが規定された戻り値を示す戻り値情報とが、少なくとも記述されている。そして、関数宣言解析部２は、引数情報に示された引数を入力データとして特定し、戻り値情報に示された戻り値を出力データとして特定する。
【００７８】
この場合、リモート関数の宣言１０１から、入力データおよび出力データを特定することが可能になる。
【００７９】
（第２実施形態）
次に、本発明の第２実施形態について説明する。
【００８０】
図５は、本実施形態のスタブ生成部１Ａの構成を示すブロック図である。図５において、図１に示したものと同一構成のものには同一符号を付してある。
【００８１】
図５において、スタブ生成部１Ａは、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１Ａは、転送データ決定部１１Ａと、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、を含む。転送データ決定部１１Ａは、引数属性解析部３を備える。
【００８２】
スタブ生成部１Ａは、主プログラムに記述されたリモート関数についてのリモート関数の宣言１０１Ａを受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。なお、リモート関数の宣言１０１Ａは、例えば、主プログラムのヘッダファイルに記載されている。
【００８３】
本実施形態では、リモート関数として、プログラミング言語の仕様に従った関数の宣言から転送データを判断できない関数が用いられる。本実施形態でリモート関数として用いられる関数の例については後述する。
【００８４】
本実施形態では、リモート関数の宣言１０１Ａには、データサイズが規定された複数の引数と、引数のそれぞれが入力データであるか出力データであるかを示す属性とが、少なくとも記述されている。例えば、リモート関数の宣言１０１Ａは、プログラミング言語の仕様に従った関数の宣言に、属性が追加して記述されたものである。
【００８５】
転送データ決定部１１Ａは、一般的に解析手段と呼ぶことができる。
【００８６】
転送データ決定部１１Ａは、主プログラムのソースコードに記述された特定情報を受け付ける。転送データ決定部１１Ａは、特定情報を受け付けると、その特定情報に基づいて、転送データを特定する。本実施形態では、特定情報として、リモート関数の宣言１０１Ａが用いられる。
【００８７】
引数属性解析部３は、リモート関数の宣言１０１Ａに記述された情報を用いて、転送データを決定する。
【００８８】
本実施形態のその他の構成要素は、第１実施形態に記載されたものと同じであるため説明を省略する。
【００８９】
なお、スタブ生成部１Ａは、コンピュータにて実現されてもよい。この場合、コンピュータは、ハードディスク等の記録媒体に記録されたプログラムを読み込み実行することによって、引数属性解析部３、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。なお、引数属性解析部３、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【００９０】
また、呼び出し元プロセッサ（例えば、図３、４に示したプロセッサ１ａ）は、主プログラムと呼び出し元スタブ１０２とを実行し、呼び出し先プロセッサ（例えば、図３、４に示したプロセッサ１ｂ）は、呼び出し先スタブ１０３とリモート関数とを実行する。
【００９１】
本実施形態は、プログラミング言語の仕様で定められたリモート関数の宣言のみ（リモート関数の宣言１０１Ａから属性を除いたもの）では、転送データが決定できない場合にも、転送データを決定できるという効果を奏する。本実施形態でリモート関数として用いられる関数の例については後述する。
【００９２】
本実施形態の特徴的な動作は、引数属性解析部３の動作である。その他の部分の動作は、第１実施形態から明らかであるため、説明を省略する。引数属性解析部３の動作を以下に示す。
【００９３】
引数属性解析部３は、リモート関数の宣言１０１Ａを読み込み、リモート関数の宣言１０１Ａに記述された引数のうち、属性にて入力データであると示された引数を入力データとして特定し、リモート関数の宣言１０１Ａに記述された引数のうち、属性にて出力データであると示された引数を出力データとして特定する。
【００９４】
次に、本実施形態の一具体例を説明する。
【００９５】
本実施形態では、リモート関数として、リモート関数の転送データを、プログラミング言語の仕様に従った関数の宣言（リモート関数の定義）から決定できない関数（以下「第２関数」と呼ぶ）が用いられる。なお、リモート関数として、第１実施形態で示した第１関数が用いられてもよい。
【００９６】
具体的な第２関数についての関数の定義および関数宣言をプログラム言語であるＣ言語で記述した例を以下に示す。
下に示す。
関数の宣言：
void func(int *x, int *y);
関数の定義：
void func(int *x, int *y)
[
*y = *x * 2;
]
関数の定義によれば、この関数では、入力データは１個のint型データ(*x)で、出力データは１個のint 型データ(*y)である。しかしながら、関数の宣言だけでは、それぞれの引数（int *x, int *y）が入力データであるのか出力データであるのかを判断することができない。
【００９７】
本実施形態では、リモート関数の宣言に以下のような属性が付加される。
void func(_ _input int *x, _ _output int *y);
ここで、属性_ _inputは、ポインタ型変数（int *x）が入力であることを示し、属性_ _outputはポインタ型変数（int *y）が出力であることを示す。
【００９８】
引数属性解析部３は、属性_ _inputが付加されたポインタ型の引数（int *x）を入力データとし、属性_ _outputが付加されたポインタ側の引数（int *y）を出力データとすることで、転送データを決定する。
【００９９】
引数属性解析部３は、転送データを、呼び出し元スタブ生成部１２と呼び出し先スタブ生成部１３に提供する。呼び出し元スタブ生成部１２は、転送データに基づいて、呼び出し元スタブ１０２を生成し、呼び出し先スタブ生成部１３は、転送データに基づいて、呼び出し先スタブ１０３を生成する。
【０１００】
呼び出し元スタブ１０２と呼び出し先スタブ１０３を以下に示す。
呼び出し元スタブ１０２
void stub_caller_func(int *x, int *y)
[
send(x, sizeof(int));
call(FUNC);
recv(y, sizeof(int));
]
呼び出し先スタブ１０３
void stub_callee_func(void)
[
int x, y;
recv(&x, sizeof(int));
func(&x, &y);
send(&y, sizeof(int));
]
本実施形態によれば、リモート関数の宣言１０１Ａには、データサイズが規定された複数の引数と、引数のそれぞれが入力データであるか出力データであるかを示す属性とが、少なくとも記述されている。そして、引数属性解析部３は、リモート関数の宣言１０１Ａに記述された引数のうち、属性にて入力データであると示された引数を入力データとして特定し、リモート関数の宣言１０１Ａに記述された引数のうち、属性にて出力データであると示された引数を出力データとして特定する。
【０１０１】
このため、プログラミング言語の仕様で定められたリモート関数の宣言のみ（リモート関数の宣言１０１Ａから属性を除いたもの）では、転送データが決定できない場合にも、リモート関数の宣言１０１Ａに記載された属性情報を参照することによって、転送データを決定することが可能になる。
【０１０２】
なお、本実施形態は、以下のように変形されてもよい。
【０１０３】
例えば、属性として、関数の宣言に記述された引数のそれぞれのデータサイズと、関数の宣言に記述された引数のそれぞれが入力データであるか出力データであるかと、を示す属性が用いられてもよい。
【０１０４】
例えば、属性_ _input4が引数の直前に記述された場合、属性_ _input4は、属性_ _input4の直後に記述された引数が入力データであり、その引数のサイズが4byteであることを示す。また、属性_ _output4が引数の直前に記述された場合、属性_ _output4は、属性_ _output4の直後に記述された引数が出力データであり、その引数のサイズが4byteであることを示す。
【０１０５】
この場合、引数属性解析部３は、関数の宣言に記述された引数のうち、属性にてデータサイズが示され入力データであると示された引数を、入力データとして特定し、関数の宣言に記述された引数のうち、属性にてデータサイズが示され出力データであると示された引数を、出力データとして特定する。
【０１０６】
この変形例では、属性によって、引数のデータサイズと、引数のそれぞれが入力データであるか出力データであるかを特定することが可能になる。
【０１０７】
（第３実施形態）
次に、本発明の第３実施形態について説明する。
【０１０８】
図６は、本実施形態のスタブ生成部１Ｂの構成を示すブロック図である。図６において、図１に示したものと同一構成のものには同一符号を付してある。
【０１０９】
図６において、スタブ生成部１Ｂは、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１Ｂは、転送データ決定部１１Ｂと、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、を含む。転送データ決定部１１Ｂは、コメント解析部４を備える。
【０１１０】
スタブ生成部１Ｂは、主プログラムに記述されたリモート関数についてのリモート関数の宣言１０１Ｂおよびリモート関数の宣言１０１Ｂに付加されたコメントを受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。なお、コメントが付加されたリモート関数の宣言１０１Ｂは、例えば、主プログラムのヘッダファイルに記載されている。
【０１１１】
本実施形態では、リモート関数として、第１関数が用いられる。本実施形態でリモート関数として用いられる関数の例については後述する。
【０１１２】
本実施形態では、リモート関数の宣言１０１Ｂには、データサイズが規定された複数の引数が少なくとも記述されている。例えば、リモート関数の宣言１０１Ｂは、プログラミング言語の仕様に従った関数の宣言と同一の情報を示す。また、コメントには、引数のそれぞれが入力データであるか出力データであるかを示す情報が示されている。
【０１１３】
転送データ決定部１１Ｂは、一般的に解析手段と呼ぶことができる。
【０１１４】
転送データ決定部１１Ｂは、主プログラムのソースコードに記述された特定情報を受け付ける。転送データ決定部１１Ｂは、特定情報を受け付けると、その特定情報に基づいて、転送データを特定する。本実施形態では、特定情報は、リモート関数の宣言１０１Ｂと、リモート関数の宣言１０１Ｂに付加されたコメントにて構成される。
【０１１５】
コメント解析部４は、リモート関数の宣言１０１Ｂに記述された情報（例えば、リモート関数の名称、戻り値の型および引数リスト）とリモート関数の宣言１０１Ｂに付加されたコメントを用いて、転送データを決定する。
【０１１６】
本実施形態のその他の構成要素は、第１実施形態に記載されたものと同じであるため説明を省略する。
【０１１７】
なお、スタブ生成部１Ｂは、コンピュータにて実現されてもよい。この場合、コンピュータは、ハードディスク等の記録媒体に記録されたプログラムを読み込み実行することによって、コメント解析部４、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。なお、コメント解析部４、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【０１１８】
また、呼び出し元プロセッサ（例えば、図３、４に示したプロセッサ１ａ）は、主プログラムと呼び出し元スタブ１０２とを実行し、呼び出し先プロセッサ（例えば、図３、４に示したプロセッサ１ｂ）は、呼び出し先スタブ１０３とリモート関数とを実行する。
【０１１９】
本実施形態は、プログラミング言語の仕様で定められたリモート関数の宣言のみ（リモート関数の宣言１０１Ｂにコメント付加されていないもの）では、転送データが決定できない場合にも、転送データを決定できるという効果を奏する。
【０１２０】
なお、入力データと出力データとを示すコメントは、プログラムの可読性を向上させることなどを目的として、主プログラムのソースコードに記述されることがある。このため、プログラムの可読性を向上させることを目的として記述されたコメントを、転送データを決定するために使用すれば、新たにコメントを付加する作業を軽減できるという効果も奏する。本実施形態でリモート関数として用いられる関数の例については後述する。
【０１２１】
本実施形態の特徴的な動作は、コメント解析部４の動作である。その他の部分の動作は、第１実施形態から明らかであるため、説明を省略する。コメント解析部４の動作を以下に示す。
【０１２２】
コメント解析部４は、リモート関数の宣言１０１Ｂに記述された引数のうち、コメントにて入力データであると示された引数を入力データとして特定し、リモート関数の宣言１０１Ｂに記述された引数のうち、コメントにて出力データであると示された引数を出力データとして特定する。
【０１２３】
次に、本実施形態の一具体例を説明する。
【０１２４】
本実施形態では、リモート関数として、第２実施形態で説明した第２関数が用いられる。
【０１２５】
Ｃ言語にて記述された、コメントが付加されたリモート関数の宣言１０１Ｂを以下に示す。
/**
* @param[in]  x
* @param[out] y
*/
void func(int *x, int *y);
本実施形態では、コメント解析部４は、コメント中で@param[in]で修飾された引数は入力データであり、コメント中で@param[out]で修飾された引数は出力データであると決定する動作を行う。
【０１２６】
コメント解析部４は、転送データを、呼び出し元スタブ生成部１２と呼び出し先スタブ生成部１３に提供する。呼び出し元スタブ生成部１２は、転送データに基づいて、呼び出し元スタブ１０２を生成し、呼び出し先スタブ生成部１３は、転送データに基づいて、呼び出し先スタブ１０３を生成する。
【０１２７】
呼び出し元スタブ生成部１２にて生成される呼び出し元スタブ１０２は、第２実施形態で示したものと同じであり、呼び出し先スタブ生成部１３にて生成される呼び出し元スタブ生成部１３も、第２実施形態で示したものと同じである。
【０１２８】
本実施形態によれば、リモート関数の宣言１０１Ｂには、データサイズが規定された複数の引数が少なくとも記述されている。また、コメントには、引数のそれぞれが入力データであるか出力データであるかを示す情報が示されている。そして、コメント解析部４は、リモート関数の宣言１０１Ｂに記述された引数のうち、コメントにて入力データであると示された引数を入力データとして特定し、リモート関数の宣言１０１Ｂに記述された引数のうち、コメントにて出力データであると示された引数を出力データとして特定する。
【０１２９】
このため、プログラミング言語の仕様で定められたリモート関数の宣言のみ（リモート関数の宣言１０１Ｂのみ）では、転送データが決定できない場合にも、リモート関数の宣言１０１Ｂに付加されたコメントを参照することによって、転送データを決定することが可能になる。
【０１３０】
なお、本実施形態は、以下のように変形されてもよい。
【０１３１】
例えば、コメントとして、関数の宣言に記述された引数のそれぞれのデータサイズと、関数の宣言に記述された引数のそれぞれが入力データであるか出力データであるかと、を示すコメントが用いられてもよい。
【０１３２】
例えば、
/**
* @param[in]4  x
* @param[out]4 y
*/
というコメントが用いられる。
【０１３３】
この場合、コメント解析部４は、コメント中で@param[in]4で修飾された引数はデータサイズが4byteの入力データであり、コメント中で@param[out]4で修飾された引数はデータサイズが4byteの出力データであると決定する動作を行う。
【０１３４】
この変形例では、コメントによって、引数のデータサイズと、引数のそれぞれが入力データであるか出力データであるかを特定することが可能になる。
【０１３５】
また、本実施形態は、属性を用いた第２実施形態を含むように変形されてもよい。
【０１３６】
例えば、関数の宣言には、複数の引数と、引数のそれぞれが入力データであるか出力データであるかとを示す属性とが、記述され、コメントには、引数のそれぞれのデータサイズを示す情報が示される。この変形例では、特定情報は関数の宣言とコメントにて構成される。
【０１３７】
この場合、転送データ決定部１１Ｂは、関数の宣言に記述された引数のうち、コメントにてデータサイズが示され属性にて入力データであると示された引数を、入力データとして特定し、関数の宣言に記述された引数のうち、コメントにてデータサイズが示され属性にて出力データであると示された引数を、出力データとして特定する。
【０１３８】
また、例えば、関数の宣言には、複数の引数と、引数のそれぞれのデータサイズを示す属性とが、記述され、コメントには、引数のそれぞれが入力データであるか出力データであるかを示す情報が示される。この変形例でも、特定情報は関数の宣言とコメントにて構成される。
【０１３９】
この場合、転送データ決定部１１Ｂは、関数の宣言に記述された引数のうち、属性にてデータサイズが示されコメントにて入力データであると示された引数を、入力データとして特定し、関数の宣言に記述された引数のうち、属性にてデータサイズが示されコメントにて出力データであると示された引数を、出力データとして特定する。
【０１４０】
上記各変形例では、属性とコメントとに基づいて、転送データを決定することが可能になる。
【０１４１】
（第４実施形態）
次に、本発明の第４実施形態について説明する。
【０１４２】
図７は、本実施形態のスタブ生成部１Ｃの構成を示すブロック図である。図７において、図１に示したものと同一構成のものには同一符号を付してある。
【０１４３】
図７において、スタブ生成部１Ｃは、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１Ｃは、転送データ決定部１１Ｃと、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、を含む。転送データ決定部１１Ｃは、追加仕様解析部５を備える。
【０１４４】
スタブ生成部１Ｃは、主プログラムに記述されたリモート関数についてのリモート関数の宣言１０１Ｃと、入力データと出力データとを規定するための追加仕様を示した情報（以下「追加仕様」と呼ぶ）１０４と、を受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。なお、リモート関数の宣言１０１Ｃは、例えば、主プログラムのヘッダファイルに記載されている。また、追加仕様は、一般的に所定仕様と呼ぶことができる。
【０１４５】
追加仕様１０４は、プログラミング言語の仕様では定められていない仕様であり、関数の入力データと出力データとを規定するための仕様である。
【０１４６】
リモート関数の宣言１０１Ｃは、プログラミング言語の仕様と追加仕様１０４の両方に従って記述されたものである。
【０１４７】
転送データ決定部１１Ｃは、一般的に解析手段と呼ぶことができる。
【０１４８】
転送データ決定部１１Ｃは、主プログラムのソースコードに記述された特定情報を受け付ける。転送データ決定部１１Ｃは、特定情報を受け付けると、その特定情報に基づいて、転送データを特定する。本実施形態では、特定情報として、リモート関数の宣言１０１Ｃが用いられる。
【０１４９】
追加仕様解析部５は、リモート関数の宣言１０１Ｃと追加仕様１０４とを受け付ける。
【０１５０】
追加仕様解析部５は、追加仕様１０４に従ってリモート関数の宣言１０１Ｃを解析することによって、転送データを決定する。
【０１５１】
本実施形態のその他の構成要素は、第１実施形態に記載されたものと同じであるため説明を省略する。
【０１５２】
なお、スタブ生成部１Ｃは、コンピュータにて実現されてもよい。この場合、コンピュータは、ハードディスク等の記録媒体に記録されたプログラムを読み込み実行することによって、追加仕様解析部５、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。なお、追加仕様解析部５、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【０１５３】
また、呼び出し元プロセッサ（例えば、図３、４に示したプロセッサ１ａ）は、主プログラムと呼び出し元スタブ１０２とを実行し、呼び出し先プロセッサ（例えば、図３、４に示したプロセッサ１ｂ）は、呼び出し先スタブ１０３とリモート関数とを実行する。
【０１５４】
本実施形態は、呼び出し先プロセッサで実行できる関数が、追加仕様に従ってリモート関数の宣言で記述された関数に限定されるが、プログラミング言語の仕様で定められたリモート関数の宣言では、転送データが決定できない場合にも、転送データを決定できるという効果を奏する。本実施形態でリモート関数として用いられる関数の例については後述する。
【０１５５】
本実施形態の特徴的な動作は、追加仕様解析部５の動作である。その他の部分の動作は、第１実施形態から明らかであるため、説明を省略する。追加仕様解析部５の動作を以下に示す。
【０１５６】
追加仕様解析部５は、リモート関数の宣言１０１Ｃと追加仕様１０４とを読み込み、追加仕様１０４に従ってリモート関数の宣言１０１Ｃを解析することによって、転送データを決定する。
【０１５７】
次に、本実施形態の一具体例を説明する。
【０１５８】
まず、第２実施形態で示した関数funcを例に説明する。
【０１５９】
この関数の宣言を以下に示す。なお、第２実施形態で述べたように、この関数は、第２関数である。
void func(int *x, int *y);
本実施形態では、関数funcの追加仕様として、１つ目の引数は入力データへのポインタ型変数（int *x）、２つ目の引数は出力データへのポインタ型変数（int *y）であると定める。図８（ａ）は、この追加仕様を説明するための図である。
【０１６０】
追加仕様解析部５は、この追加仕様を利用して、転送データとして、*xが入力データ、*yが出力データであると決定する。図９（ａ）は、追加仕様解析部５の動作の一例を規定したプログラムを示した図である。
【０１６１】
呼び出し元スタブ生成部１２にて生成される呼び出し元スタブ１０２は、第２実施形態で示したものと同じであり、呼び出し先スタブ生成部１３にて生成される呼び出し元スタブ生成部１３は、第２実施形態で示したものと同じである。
【０１６２】
次に、以下の関数を例に、別の追加仕様の例を説明する。
int func2(_ _input_pointer void *p, int size);
ここで、属性_ _input_pointerは、この属性が付加された引数のポインタで示されるアドレスから先のデータが入力データであることを示す属性であるとする。しかし、この属性だけでは入力データのサイズを決定することができない。そこで、属性_ _input_pointerが付加された引数の次の引数はデータのサイズを示す引数であるという追加仕様が加えられる。図８（ｂ）は、この追加仕様を説明するための図である。
【０１６３】
追加仕様解析部５は、この追加仕様を元に、転送するべき入力データのサイズを決定する。図９（ｂ）は、追加仕様解析部５の動作の一例を規定したプログラムを示した図である。
【０１６４】
呼び出し元スタブ生成部１２にて生成される呼び出し元スタブ１０２の例を以下に示す。
int stub_caller_func2(void *p, int size)
[
int tmp;
send(&size, sizeof(int));
send(p, size);
call(FUNC2);
recv(&tmp, sizeof(int));
return tmp;
]
呼び出し先スタブ生成部１３にて生成される呼び出し先スタブ１０３の例を以下に示す。
int stub_callee_func2(void)
[
void *p;
int size;
int tmp;
recv(&size, sizeof(int)); 
p = malloc(size);
recv(p, size);
tmp = func2(p, size);
send(&tmp, sizeof(int));
]
本実施形態によれば、リモート関数の宣言１０１Ｃには、追加仕様に従って特定情報が記述されている。追加仕様解析部５は、追加仕様に従ってリモート関数の宣言Ｃを解析することによって、入力データと出力データとを特定する。
【０１６５】
このため、プログラミング言語の仕様で定められたリモート関数の宣言のみでは、転送データが決定できない場合にも、転送データを決定することが可能になる。
【０１６６】
（第５実施形態）
次に、本発明の第５実施形態について説明する。
【０１６７】
図１０は、本実施形態のスタブ生成部１Ｄの構成を示すブロック図である。図１０において、図１に示したものと同一構成のものには同一符号を付してある。
【０１６８】
図１０において、スタブ生成部１Ｄは、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１Ｄは、転送データ決定部１１Ｄと、呼び出し元スタブ生成部１２と、呼び出し先スタブ生成部１３と、を含む。転送データ決定部１１Ｄは、関数定義解析部６を備える。
【０１６９】
スタブ生成部１Ｄは、主プログラムに記述されたリモート関数についてのリモート関数の定義１０５を受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。
【０１７０】
リモート関数の定義とは、リモート関数の処理内容を記述したプログラムのソースコードである。
【０１７１】
転送データ決定部１１Ｄは、一般的に解析手段と呼ぶことができる。
【０１７２】
転送データ決定部１１Ｄは、主プログラムのソースコードに記述された特定情報を受け付ける。転送データ決定部１１Ｄは、特定情報を受け付けると、その特定情報に基づいて、転送データを特定する。本実施形態では、特定情報として、リモート関数の定義１０５が用いられる。
【０１７３】
関数定義解析部６は、リモート関数の定義１０５を受け付け、リモート関数の定義１０５を解析して、転送データを決定する。本実施形態のその他の構成要素は、第１実施形態に記載されたものと同じであるため説明を省略する。
【０１７４】
なお、スタブ生成部１Ｄは、コンピュータにて実現されてもよい。この場合、コンピュータは、ハードディスク等の記録媒体に記録されたプログラムを読み込み実行することによって、関数定義解析部６、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。なお、関数定義解析部６、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【０１７５】
また、呼び出し元プロセッサ（例えば、図３、４に示したプロセッサ１ａ）は、主プログラムと呼び出し元スタブ１０２とを実行し、呼び出し先プロセッサ（例えば、図３、４に示したプロセッサ１ｂ）は、呼び出し先スタブ１０３とリモート関数とを実行する。
【０１７６】
本実施形態は、スタブを生成するためにリモート関数の定義１０５が必要となるが、プログラミング言語の仕様で定められたリモート関数の宣言からは転送データが決定できない場合にも、リモート関数の定義を解析することで、転送データを決定できるという効果がある。
【０１７７】
本実施形態の特徴的な動作は、関数定義解析部６の動作である。その他の部分の動作は、第１実施形態から明らかであるため、説明を省略する。関数定義解析部６の動作を以下に示す。
【０１７８】
関数定義解析部６は、リモート関数の定義１０５を読み込み、リモート関数の定義１０５を解析して入力データと出力データとを決定する。
【０１７９】
次に、本実施形態の一具体例を説明する。
【０１８０】
まず、第２実施形態で示した関数funcを例に説明する。
【０１８１】
この関数の宣言を以下に示す。第２実施形態で述べたように、この関数は、第２関数である。
関数の宣言：
void func(int *x, int *y);
以下に関数の定義を示す。
関数の定義：
void func(int *x, int *y)
[
*y = *x * 2;
]
関数定義解析部６は、この関数の定義を読み込み、この関数の定義を解析することによって、引数xが入力データへのポインタで、引数yが出力データへのポインタであると決定する。
【０１８２】
呼び出し元スタブ生成部１２にて生成される呼び出し元スタブ１０２は、第２実施形態の一例で示したものと同じであり、呼び出し先スタブ生成部１３にて生成される呼び出し元スタブ生成部１３は、第２実施形態の一例で示したものと同じである。
【０１８３】
本実施形態によれば、関数定義解析部６は、リモート関数の定義１０５に基づいて転送データを決定する。このため、プログラミング言語の仕様で定められたリモート関数の宣言からは転送データが決定できない場合にも、リモート関数の定義を解析することで、転送データを決定できるという効果がある。
【０１８４】
なお、本実施形態の変形例として、転送データ決定部１１Ｄが、関数宣言解析部２、引数属性解析部３、コメント解析部４、追加仕様解析部５および関数定義解析部６のそれぞれの解析部のうち、複数の解析部を備える構成をとっても良い。この場合、リモート関数の特徴に合わせて、転送データを決定する解析部を選定することが可能になる。
【０１８５】
図１１は、転送データ決定部１１Ｄが、関数宣言解析部２と引数属性解析部３を備えた変形例を示した図である。
【０１８６】
図１１に示した変形例では、リモート関数の宣言に属性が付加されなくてもリモート関数の宣言から転送データを決定できるリモート関数に対しては、関数宣言解析部２を用いて転送データが決定され、それ以外のリモート関数に対しては引数属性解析部３を用いて転送が決定される。
【０１８７】
図１１に示した変形例では、リモート関数の宣言に付加する属性の数を少なくすることが可能となり、プログラマの負担を軽減することができるという効果がある。
【０１８８】
（第６実施形態）
次に、本発明の第６実施形態について説明する。
【０１８９】
図１２は、本実施形態のスタブ生成部１Ｅの構成を示すブロック図である。図１２において、図１に示したものと同一のものには同一符号を付してある。
【０１９０】
図１２において、スタブ生成部１Ｅは、一般的に転送プログラム生成装置と呼ぶことができる。スタブ生成部１Ｅは、主プログラムに記述されたリモート関数群の宣言１０６を受け付け、呼び出し元スタブ１０２と、呼び出し先スタブ１０３と、を出力する。スタブ生成部１Ｅの内部の構成については、第１乃至第５実施形態のスタブ生成部のいずれの構成をとっても良い。
【０１９１】
リモート関数群の宣言１０６は、複数のリモート関数のそれぞれについてのリモート関数の宣言を含む。なお、リモート関数群の宣言１０６は、プログラムのヘッダファイルに記載されている。
【０１９２】
本実施形態では、リモート関数として、関数一つだけを別のプロセッサで実行する場合は転送データを決定できないが、複数の関数を別のプロセッサで実行する場合には、転送データが決定できる関数が用いられる。なお、複数のリモート関数のそれぞれは、一般的に特定関数と呼ぶことができ、互いに異なる処理を規定する。
【０１９３】
また、本実施形態では、主プログラムのソースコードには、複数のリモート関数と、複数のリモート関数のすべてが呼び出し先プロセッサで実行される場合に特定されるリモート関数ごとの特定情報と、が記述されている。
【０１９４】
本実施形態は、スタブ生成部１Ｅが、リモート関数群を構成する複数のリモート関数のそれぞれに対してスタブを生成する。リモート関数群を構成する複数のリモート関数のそれぞれは、スタブ生成部１Ｅにて生成されたスタブを用いることによって、呼び出し先プロセッサで実行される。このため、本実施形態は、個々の関数単体では呼び出し先プロセッサで実行するための転送データを決定できない関数を、呼び出し先プロセッサで実行することを可能にするという効果を奏する。
【０１９５】
例えば、本実施形態は、ライブラリ内の関数が単体では呼び出し先プロセッサで実行できない関数である場合にも、ライブラリ内の複数の関数を呼び出し先プロセッサで実行することで、単体では不可能だったオフロードが可能になるというような状況で用いることができる。
【０１９６】
本実施形態は、内部構造が隠蔽されたライブラリを、呼び出し先プロセッサ（呼び出し元プロセッサが使用するアドレス空間とは異なるアドレス空間を使用するプロセッサ）にオフロードする場合に利用できるという特徴がある。
【０１９７】
ライブラリは、ヘッダファイルとオブジェクトファイルの形で提供されることが多いが、内部構造が隠蔽されているために、関数の引数にポインタが利用されている場合に、そのポインタが指すデータの実体を知ることができない。したがって、関数一つをオフロードするための転送データを決定することができない。
【０１９８】
しかしながら、内部構造へのアクセスはライブラリ内の関数で行われるため、ライブラリ内の関数をすべて呼び出し先プロセッサで実行する場合は、内部構造へのアクセスはすべて呼び出し先プロセッサで実行される。このため、ライブラリ内の関数をすべて呼び出し先プロセッサで実行する場合は、ポインタが指すデータの実体を転送する必要はなく、ポインタのみを転送すれば良い。したがって、第１乃至４実施形態のスタブ生成部を用いて、スタブを生成することによって、ライブラリ全体を呼び出し先プロセッサで実行することができる。
【０１９９】
なお、スタブ生成部１Ｅは、コンピュータにて実現されてもよい。この場合、コンピュータは、ハードディスク等の記録媒体に記録されたプログラムを読み込み実行することによって、スタブ生成部１Ｅ内の転送データ決定部、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３として機能する。なお、転送データ決定部、呼び出し元スタブ生成部１２および呼び出し先スタブ生成部１３のそれぞれは、ハードウェアにて実現されてもよい。
【０２００】
また、呼び出し元プロセッサ（例えば、図３、４に示したプロセッサ１ａ）は、主プログラムと呼び出し元スタブ１０２とを実行し、呼び出し先プロセッサ（例えば、図３、４に示したプロセッサ１ｂ）は、呼び出し先スタブ１０３とリモート関数とを実行する。
【０２０１】
次に、本実施形態の一具体例を説明する。
【０２０２】
以下の具体例は、内部構造が隠蔽されたライブラリ内の全ての関数を呼び出し先プロセッサで実行する場合の例である。
【０２０３】
まず、ライブラリのヘッダファイル（dog.hとする）を以下に示す。
struct dog Dog;
Dog *dog_init(int id);
void dog_get_id(Dog *p);
このライブラリは、１つのデータ型と２つの関数から構成されている。dog_init関数は、Dog型のデータをメモリ上に確保し、dog_get_id関数は、Dog型データを参照してidを返すという動作とする。両関数の実装とDog型データの実装は、ライブラリを利用する側には隠蔽されているとする。これらの関数を利用する例は以下の様になる。
#include "dog.h"
void main(void) 
[
int id;
Dog *p = dog_init(1);
id = dog_get_id(p);
]
まず、二つの関数のうち、dog_get_id関数のみを呼び出し先プロセッサで実行する場合を考える。
【０２０４】
まず、dog_init関数によって、Dog型のデータが呼び出し元のメモリアドレス空間上に確保される。
【０２０５】
dog_get_id関数を、呼び出し先プロセッサで実行するためには、ポインタ引数pで示されるDog型データとidを送信する必要がある（dog_get_id関数の実装によっては、ポインタ引数pで示されるDog型データとidを送信する必要がない場合もあるが、関数の実装を参照しない本実施形態では、そのような場合を考慮しない）。
【０２０６】
しかしながら、Dog型の実装が隠蔽されているため、データのサイズが分からず転送データを決定できない。このため、dog_get_id関数のみを呼び出し先プロセッサで実行することができない。
【０２０７】
次に、dog_get_id関数とdog_init関数との両方を呼び出し先プロセッサで実行する場合を考える。
【０２０８】
この場合は、まず、dog_init関数を呼び出し先プロセッサで実行すると、呼び出し先プロセッサ上のアドレス空間にDog型のデータが確保される。
【０２０９】
続いて、dog_get_id関数も呼び出し先プロセッサで実行する際は、Dog型データは既に呼び出し先プロセッサ上のアドレス空間に存在するため、呼び出し先プロセッサへ転送する必要があるのは、ポインタ引数pで示されるDog型データの実体ではなく、ポインタのみで良い。同様に、dog_init関数の出力データも、Dog型データではなく、ポインタのみで良い。
【０２１０】
したがって、ポインタのみを渡すという仕様に加えて、dog_init関数とdog_get_id関数の両方を呼び出し先プロセッサで実行させることによって、単体では呼び出し先プロセッサで実行不可能だった関数も実行可能になる。
【０２１１】
この場合に生成されるスタブの例を以下に示す。
【０２１２】
dog_init関数についての呼び出し元スタブ１０２：
Dog * stub_caller_dog_init(int id)
[
Dog *p;
send(&id, sizeof(int));
call(DOG_INIT);
recv(&p, sizeof(Dog *));
return p;
]
dog_init関数についての呼び出し先スタブ１０３：
void stub_callee_dog_init(void)
[
int id;
Dog *p;
recv(&id, sizeof(int));
p = dog_init(id);
send(&p, sizeof(Dog *));
]
dog_get_id関数についての呼び出し元スタブ１０２：
int stub_caller_dog_get_id(Dog *p)
[
int id;
send(&p, sizeof(Dog *));
call(DOG_GET_ID);
recv(&id, sizeof(int));
return id;
]
dog_get_id関数についての呼び出し先スタブ１０３：
void stub_callee_dog_get_id(void)
[
int id;
Dog *p;
recv(&p, sizeof(Dog *));
id = dog_get_id(p);
send(&id, sizeof(int));
]
本実施形態では、主プログラムのソースコードには、リモート関数群を構成する複数のリモート関数と、リモート関数群を構成する複数のリモート関数のすべてが呼び出し先プロセッサ実行される場合に特定されるリモート関数ごとの特定情報と、が記述されている。
【０２１３】
なお、リモート関数群を構成する複数のリモート関数は、同一のライブラリに登録されているものでもよい。
【０２１４】
スタブ生成部１Ｅ内の転送データ決定部は、リモート関数ごとに、リモート関数についての特定情報に基づいて転送データ（入力データと出力データ）を特定する。
【０２１５】
スタブ生成部１Ｅ内の呼び出し元スタブ生成部１２は、リモート関数ごとに特定された転送データ（入力データおよび出力データ）に基づいて、リモート関数ごとに、呼び出し元スタブ１０２を生成する。
【０２１６】
スタブ生成部１Ｅ内の呼び出し先スタブ生成部１３は、リモート関数ごとに特定された転送データ（入力データおよび出力データ）に基づいて、リモート関数ごとに、呼び出し先スタブ１０３を生成する。
【０２１７】
このため、本実施形態によれば、個々の関数単体では呼び出し先プロセッサで実行するための転送データを決定できない関数を、呼び出し先プロセッサで実行することを可能にするという効果を奏する。
【０２１８】
なお、上記各実施形態では、主プログラムのソースコードがＣ言語で記述された例を示したが、主プログラムのソースコードを記述するために使用されるプログラム言語は、Ｃ言語に限らず適宜変更可能である。
【０２１９】
上記各実施形態は、ある計算機上のプログラムの一部を他の計算機上で実行させることによって、単一の計算機では処理できないプログラムを実行したり、他のプログラムを実行させるために計算機の負荷を下げるといった用途に適用できる。また、上記各実施形態は、単一計算機上の複数のプロセッサを用いて、あるプロセッサ上で動作しているプログラムの一部を別のプロセッサで動作させ、同様の効果を得るといった用途にも利用できる。
【０２２０】
以上説明した各実施形態において、図示した構成は単なる一例であって、本発明はその構成に限定されるものではない。
【０２２１】
（付記１）所定関数が記述された主プログラムを実行する第１プロセッサ用の第１転送プログラムと、前記第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用し前記所定関数を実行する第２プロセッサ用の第２転送プログラムと、を生成する転送プログラム生成装置であって、
前記第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データと、を特定するための、前記主プログラムのソースコードに記述された特定情報に基づいて、前記入力データと前記出力データとを特定する解析手段と、
前記解析手段にて特定された入力データを送信し、その後、前記解析手段にて特定された出力データを受信する、という処理を規定した呼出元プログラムを、前記第１転送プログラムとして生成する第１生成手段と、
前記解析手段にて特定された入力データを受信し、その後、前記解析手段にて特定された出力データを送信する、という処理を規定した呼出先プログラムを、前記第２転送プログラムとして生成する第２生成手段と、を含む転送プログラム生成装置。
【０２２２】
（付記２）付記１に記載の転送プログラム生成装置において、
前記主プログラムのソースコードには、互いに異なる処理を規定し各々が前記所定関数である複数の特定関数と、前記複数の特定関数のすべてが前記第２プロセッサで実行される場合での当該特定関数ごとの特定情報と、が記述されており、
前記解析手段は、前記特定関数ごとに、当該特定関数についての特定情報に基づいて前記入力データと前記出力データとを特定し、
前記第１生成手段は、前記解析手段にて前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出元プログラムを前記第１転送プログラムとして生成し、
前記第２生成手段は、前記解析手段にて前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出先プログラムを前記第２転送プログラムとして生成する、転送プログラム生成装置。
【０２２３】
（付記３）付記２に記載の転送プログラム生成装置において、
前記複数の特定関数は、同一のライブラリに登録されたものである、転送プログラム生成装置。
【０２２４】
（付記４）付記１に記載の転送プログラム生成装置において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズと前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成装置。
【０２２５】
（付記５）付記１に記載の転送プログラム生成装置において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数が記述されており、
前記コメントには、前記引数のそれぞれのデータサイズと、前記引数のそれぞれが前記入力データであるか前記出力データであるかと、を示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成装置。
【０２２６】
（付記６）付記１に記載の転送プログラム生成装置において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれのデータサイズを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成装置。
【０２２７】
（付記７）付記１に記載の転送プログラム生成装置において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手段は、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成装置。
【０２２８】
（付記８）所定関数が記述された主プログラムを実行する第１プロセッサ用の第１転送プログラムと、前記第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用し前記所定関数を実行する第２プロセッサ用の第２転送プログラムと、を生成する転送プログラム生成装置での転送プログラム生成方法であって、
前記第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データと、を特定するための、前記主プログラムのソースコードに記述された特定情報に基づいて、前記入力データと前記出力データとを特定する解析ステップと、
前記入力データを送信し、その後、前記出力データを受信する、という処理を規定した呼出元プログラムを、前記第１転送プログラムとして生成する第１生成ステップと、
前記入力データを受信し、その後、前記出力データを送信する、という処理を規定した呼出先プログラムを、前記第２転送プログラムとして生成する第２生成ステップと、を含む転送プログラム生成方法。
【０２２９】
（付記９）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、データサイズが規定された引数を示す引数情報と、データサイズが規定された戻り値を示す戻り値情報とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析ステップでは、前記引数情報に示された引数を、前記入力データとして特定し、前記戻り値情報に示された戻り値を、前記出力データとして特定する、転送プログラム生成方法。
【０２３０】
（付記１０）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３１】
（付記１１）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、データサイズが規定された複数の引数が記述されており、
前記コメントには、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記コメントにて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３２】
（付記１２）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、前記入力データと前記出力データとを規定するための所定仕様に従って前記特定情報が記述されており、
前記解析ステップでは、前記所定仕様に従って前記関数の宣言を解析することによって、前記入力データと前記出力データとを特定する、転送プログラム生成方法。
【０２３３】
（付記１３）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の定義が記述されており、
前記関数の定義には、前記所定関数の処理内容が記述されており、
前記特定情報は、前記関数の定義であり、
前記解析ステップでは、前記関数の定義を解析することによって、前記入力データと前記出力データとを特定する、転送プログラム生成方法。
【０２３４】
（付記１４）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、互いに異なる処理を規定し各々が前記所定関数である複数の特定関数と、前記複数の特定関数のすべてが前記第２プロセッサで実行される場合での当該特定関数ごとの特定情報と、が記述されており、
前記解析ステップでは、前記特定関数ごとに、当該特定関数についての特定情報に基づいて前記入力データと前記出力データとを特定し、
前記第１生成ステップでは、前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出元プログラムを前記第１転送プログラムとして生成し、
前記第２生成ステップでは、前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出先プログラムを前記第２転送プログラムとして生成する、転送プログラム生成方法。
【０２３５】
（付記１５）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズと前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３６】
（付記１６）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数が記述されており、
前記コメントには、前記引数のそれぞれのデータサイズと、前記引数のそれぞれが前記入力データであるか前記出力データであるかと、を示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３７】
（付記１７）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれのデータサイズを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３８】
（付記１８）付記８に記載の転送プログラム生成方法において、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析ステップでは、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて出力データであると示された引数を、前記出力データとして特定する、転送プログラム生成方法。
【０２３９】
（付記１９）所定関数が記述された主プログラムを実行する第１プロセッサ用の第１転送プログラムと、前記第１プロセッサが使用するアドレス空間とは異なるアドレス空間を使用し前記所定関数を実行する第２プロセッサ用の第２転送プログラムと、を生成するコンピュータに、
前記第２プロセッサが前記所定関数を実行するために必要な入力データと、前記所定関数の実行結果である出力データと、を特定するための、前記主プログラムのソースコードに記述された特定情報に基づいて、前記入力データと前記出力データとを特定する解析手順と、
前記入力データを送信し、その後、前記出力データを受信する、という一連の処理を規定した呼出元プログラムを、前記第１転送プログラムとして生成する第１生成手順と、
前記入力データを受信し、その後、前記出力データを送信する、という一連の処理を規定した呼出先プログラムを、前記第２転送プログラムとして生成する第２生成手順と、を実行させるためのプログラム。
【０２４０】
（付記２０）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、データサイズが規定された引数を示す引数情報と、データサイズが規定された戻り値を示す戻り値情報とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析手順では、前記引数情報に示された引数を、前記入力データとして特定し、前記戻り値情報に示された戻り値を、前記出力データとして特定する、プログラム。
【０２４１】
（付記２１）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、データサイズが規定された複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す属性とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にて出力データであると示された引数を、前記出力データとして特定する、プログラム。
【０２４２】
（付記２２）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、データサイズが規定された複数の引数が記述されており、
前記コメントには、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記コメントにて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにて出力データであると示された引数を、前記出力データとして特定する、プログラム。
【０２４３】
（付記２３）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、前記入力データと前記出力データとを規定するための所定仕様に従って前記特定情報が記述されており、
前記解析手順では、前記所定仕様に従って前記関数の宣言を解析することによって、前記入力データと前記出力データとを特定する、プログラム。
【０２４４】
（付記２４）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の定義が記述されており、
前記関数の定義には、前記所定関数の処理内容が記述されており、
前記特定情報は、前記関数の定義であり、
前記解析手順では、前記関数の定義を解析することによって、前記入力データと前記出力データとを特定する、プログラム。
【０２４５】
（付記２５）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、互いに異なる処理を規定し各々が前記所定関数である複数の特定関数と、前記複数の特定関数のすべてが前記第２プロセッサで実行される場合での当該特定関数ごとの特定情報と、が記述されており、
前記解析手順では、前記特定関数ごとに、当該特定関数についての特定情報に基づいて前記入力データと前記出力データとを特定し、
前記第１生成手順では、前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出元プログラムを前記第１転送プログラムとして生成し、
前記第２生成手順では、前記特定関数ごとに特定された入力データおよび出力データに基づいて、前記特定関数ごとに、前記呼出先プログラムを前記第２転送プログラムとして生成する、プログラム。
【０２４６】
（付記２６）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言が記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズと前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記特定情報は、前記関数の宣言であり、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、プログラム。
【０２４７】
（付記２７）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数が記述されており、
前記コメントには、前記引数のそれぞれのデータサイズと、前記引数のそれぞれが前記入力データであるか前記出力データであるかと、を示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され出力データであると示された引数を、前記出力データとして特定する、プログラム。
【０２４８】
（付記２８）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれが前記入力データであるか前記出力データであるかとを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれのデータサイズを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記コメントにてデータサイズが示され前記属性にて出力データであると示された引数を、前記出力データとして特定する、プログラム。
【０２４９】
（付記２９）付記１９に記載のプログラムにおいて、
前記主プログラムのソースコードには、前記所定関数についての関数の宣言と、前記関数宣言に付加されたコメントが記述されており、
前記関数の宣言には、複数の引数と、前記引数のそれぞれのデータサイズを示す属性とが、記述されており、
前記コメントには、前記引数のそれぞれが前記入力データであるか前記出力データであるかを示す情報が示され、
前記特定情報は、前記関数の宣言と前記コメントにて構成され、
前記解析手順では、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて入力データであると示された引数を、前記入力データとして特定し、前記関数の宣言に記述された引数のうち、前記属性にてデータサイズが示され前記コメントにて出力データであると示された引数を、前記出力データとして特定する、プログラム。
【符号の説明】
【０２５０】
１、１Ａ、１Ｂ、１Ｃ、１Ｄ、１Ｅ  スタブ生成部
１ａ、１ｂ  プロセッサ
１１、１１Ａ、１１Ｂ、１１Ｃ、１Ｄ  転送データ決定部
１２    呼び出し元スタブ生成部
１３    呼び出し先スタブ生成部
２      関数宣言解析部
３      引数属性解析部
４      コメント解析部
５      追加仕様解析部
６      関数定義解析部
１００      ＣＰＵ
２００      ハードディスク
【図１】
0005521616.tif 000002
【図２】
0005521616.tif 000003
【図３】
0005521616.tif 000004
【図４】
0005521616.tif 000005
【図５】
0005521616.tif 000006
【図６】
0005521616.tif 000007
【図７】
0005521616.tif 000008
【図８】
0005521616.tif 000009
【図９】
0005521616.tif 000010
【図１０】
0005521616.tif 000011
【図１１】
0005521616.tif 000012
【図１２】
0005521616.tif 000013