説明

プログラム変換方式

【課題】 インターフェース定義ファイルを必要とせずにスタブ・コードを生成することのできるプログラム変換方式を提供することにある。
【解決手段】 処理選択部110は入力プログラム20から関数定義211、212…を読み込み、所在識別子がCLIENTのときはクライアント関数処理部120に関数定義を出力し、該処理部120は関数複写部1210によりクライアントプログラム310に関数定義を追加処理し、所在識別子がSERVERのときはサーバ関数処理部130に関数定義を出力し、該処理部130は関数複写部1310によりサーバプログラム320に関数定義を追加処理し、サーバ・スタブ生成部1320でサーバ・スタブを生成してサーバプログラム320にサーバ・スタブを追加処理し、またクライアント・スタブ生成部1330でクライアント・スタブを生成してクライアントプログラム310にクライアント・スタブを追加処理する。

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は分散処理を行うプログラムのためのプログラム変換方式に係わり、特に、単一のプログラムを、遠隔手続き呼び出しを用いて協調動作する複数のプログラムに分割するプログラム変換方式に関する。
【0002】
【従来の技術】近年、多数の計算機をネットワークに接続して運用する形態の計算機システムが普及している。また、これらの計算機システム向けに、別々の計算機上で実行される複数のプログラムによって、一つのアプリケーションを構成する分散処理プログラムの開発がさかんに行われている。分散処理プログラムの形態としては、クライアント・サーバ型と呼ばれる形態が一般的である。クライアント・サーバ型の分散処理プログラムでは、アプリケーションをクライアント・プログラムとサーバ・プログラムと呼ばれる2種類のプログラムに分割して実装し、クライアント・プログラムがサーバ・プログラムの提供する処理を必要に応じて呼び出す形で処理を進める。クライアント・プログラムとサーバ・プログラムの間の通信処理は煩雑であるため、通信処理をなるべく意識せずにクライアント・サーバ型のプログラムを作成することを可能にする目的で、遠隔手続き呼び出し、またはRPC(Remote Procedure Call)と呼ばれる通信方式が提案されている。遠隔手続き呼び出しでは、例えば「DCEプログラミングガイド」(ジョン・シャーリー他著「Guide to Writing DCE Applications」中田温朗訳、オーム社、1994年)の3ページに示されるように、スタブ・コードとRPCランタイム・ライブラリと呼ばれるモジュールを用いて、クライアント・プログラムからサーバ・プログラム上の手続きを呼び出すことを可能にしている。ここで、スタブ・コードとはサーバ上の手続きに渡すパラメータとネットワークで送受信するパケットの間の変換を行うモジュールであり、パラメータをパケットに変換するクライアント・スタブ・コードと、パケットをパラメータに変換するサーバ・スタブ・コードの2種類のスタブ・コードがある。また、RPCランタイム・ライブラリとは、各アプリケーションで共通に使用できる通信処理ライブラリである。なお、本明細書では、以後スタブ・コードを単にスタブと略記する。また、手続きと関数を同義の語として用いる。
【0003】スタブは、前掲書の6ページに示されるように、個々のアプリケーションに応じてプログラム作成者が作成するインターフェース定義ファイルから、IDL(Interface Definition Language)コンパイラと呼ばれるプログラムによって、自動的に生成して使用する。従来のIDLコンパイラを用いたクライアント・サーバ型のプログラム開発では、プログラム開発者は以下の手順でクライアント・プログラムとサーバ・プログラムをそれぞれ開発していた。
(手順1)アプリケーションの処理全体を、クライアント・プログラムに含める関数群と、サーバ・プログラムに含める関数群に分割し、それぞれクライアント・アプリケーション・コード、サーバ・アプリケーション・コードとして実装する。
(手順2)クライアント・アプリケーション・コードの中から起動されるサーバ・アプリケーション・コード内の関数に対するインターフェース定義ファイルを作成する。
(手順3)IDLコンパイラを用いてインターフェース定義ファイルからクライアント・スタブとサーバ・スタブを生成する。
(手順4)クライアント・アプリケーション・コードとクライアント・スタブとRPCランタイム・ライブラリを結合してクライアント・プログラムを作成し、サーバ・アプリケーション・コードとサーバ・スタブとRPCランタイム・ライブラリを結合してサーバ・プログラムを作成する。
【0004】
【発明が解決しようとする課題】上記の手順に沿ってプログラム開発を進める必要があった従来の技術には、以下の二つの問題点がある。第一の問題点は、インターフェース定義ファイルをプログラム作成者が作成しなければならず、作業量が多いということである。第二の問題点は、関数の所在をクライアント・プログラムとサーバ・プログラムの間で移動させるための作業量が多く、アプリケーションの性能の向上がしずらいということである。
【0005】以下、それぞれの問題点について説明する。まず、第一の問題点について説明する。従来技術では、サーバ・アプリケーション・コード内に記述された関数のうち、クライアント・アプリケーション・コードから起動する全ての関数に対してプログラム開発者がインターフェース定義を作成する必要がある。そのため、プログラム開発者の作業量が多い。次に、第二の問題点について説明する。アプリケーションの性能は、アプリケーションを構成する個々の関数の、クライアントとサーバへの分配のしかたに依存する。それは、以下の二つの理由による。第一の理由は、クライアント・プログラム上の関数がサーバ・プログラム上の関数を起動する頻度が、クライアント・サーバ間の通信量を左右するためである。通信量を減らしてアプリケーションの性能を向上させるためには、一方の関数が他方の関数を頻繁に起動するような関数同士は、クライアントかサーバのどちらか一方にまとめて配置する必要がある。第二の理由は、関数の分配のしかたが、クライアント・プログラムを実行する計算機であるクライアント計算機と、サーバ・プログラムを実行する計算機であるサーバ計算機に対する負荷分散を決定するためである。例えば、クライアント計算機に比べてサーバ計算機の処理能力が高い場合には、負荷の高い関数をなるべくサーバ・プログラム上に配置した方が性能が向上する。逆にサーバ計算機に接続されたクライアント計算機の数が多い場合のように、クライアント計算機に比べてサーバ計算機の処理能力が低い場合には、負荷の高い関数をなるべくクライアント・プログラム上に配置した方が性能が向上する。
【0006】以上二つの理由から、アプリケーション全体としての性能向上を図るためには、通信量が少なく、負荷分散が適切になるように関数の分配を決定する必要がある。ところが、各関数の間の呼び出し頻度や、各関数による計算負荷は、プログラム作成の初期では不明な場合が多い。そのため、プログラムの作成がかなり進んだ時点で、性能向上のために関数の配置を変更したくなる場合がある。しかし、従来の技術では関数の配置を変更しようとすると、プログラム作成者が以下の二つの作業を行う必要があるため、作業量が多い。第一に、配置を変更したい関数の記述場所を、クライアント・アプリケーション・コードからサーバ・アプリケーション・コードへ、またはその逆へ移動させなければならない。第二に、移動させた関数に対応するインターフェース定義を追加または削除しなければならない。以上二つの理由により、従来技術では関数の所在をクライアント・プログラムとサーバ・プログラムの間で移動させるための作業量が多く、その結果としてアプリケーションの性能の向上がしずらい。
【0007】本発明の第一の目的は、インターフェース定義ファイルを必要とせずにスタブ・コードを生成することのできるプログラム変換方式を提供することにある。本発明の第二の目的は、アプリケーションの処理を構成する関数の記述場所を変更することなく、関数の所在をクライアント・プログラムとサーバ・プログラムの間で、容易に移動させることのできるプログラム変換方式を提供することにある。
【0008】
【課題を解決するための手段】上記目的を達成するため、本発明は、複数の関数定義を有する入力プログラムを入力として、クライアント・プログラムとサーバ・プログラムを出力とするプログラム変換方式であり、処理選択手段と、関数複写手段を有するクライアント関数処理手段と、関数複写手段とクライアント・スタブ生成手段とサーバ・スタブ生成手段を有するサーバ関数処理手段からなるプログラム変換部を備え、前記各関数定義は予め所在識別子が設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、該関数定義に設定された所在識別子がクライアントを示すとき該関数定義を前記クライアント関数処理手段に出力し、前記所在識別子がサーバを示すとき該関数定義を前記サーバ関数処理手段に出力し、前記クライアント関数処理手段は、入力された関数定義を前記関数複写手段により前記クライアント・プログラムに追加処理し、前記サーバ関数処理手段は、入力された関数定義を前記関数複写手段により前記サーバ・プログラムに追加処理し、前記クライアント・スタブ生成手段によりクライアント・スタブを生成し前記クライアント・プログラムに追加処理し、前記サーバ・スタブ生成手段によりサーバ・スタブを生成し前記サーバ・プログラムに追加処理するようにしている。
【0009】また、複数の関数定義を有する入力プログラムを入力として、クライアント・プログラムとサーバ・プログラムを出力とするプログラム変換方式であり、処理選択手段と、関数複写手段を有するクライアント関数処理手段と、関数複写手段とクライアント・スタブ生成手段とサーバ・スタブ生成手段を有するサーバ関数処理手段からなるプログラム変換部を備え、前記各関数定義は予め所在識別子が設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、該関数定義に設定された所在識別子がクライアントを示すとき該関数定義を前記クライアント関数処理手段に出力し、前記所在識別子がサーバを示すとき該関数定義を前記サーバ関数処理手段に出力し、かつ読み込んだ関数定義に基づき各関数定義に対応するスタブの生成状況を管理する関数管理テーブルを生成し、前記クライアント関数処理手段は、入力された関数定義を前記関数複写手段により前記クライアント・プログラムに追加処理し、かつ該関数複写手段は入力された関数定義中に呼び出すべき前記サーバプログラムに属する関数定義があるとき、前記関数管理テーブルを参照し、該関数定義に係るスタブが生成されていなければ前記サーバ関数処理手段に該関数定義に係るスタブの生成指示を出力し、前記サーバ関数処理手段は、入力された関数定義を前記関数複写手段により前記サーバ・プログラムに追加処理し、かつ前記スタブの生成指示を受けたとき、前記クライアント・スタブ生成手段により該生成指示に従いクライアント・スタブを生成し前記クライアント・プログラムに追加処理し、前記サーバ・スタブ生成手段により該生成指示に従いサーバ・スタブを生成し前記サーバ・プログラムに追加処理するようにしている。
【0010】また、前記複数の関数定義を有する入力プログラムに関数定義の他に関数の所在と名前とパラメータ情報とを記述した宣言である前方参照宣言を設け、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記前方参照宣言に基づき関数の名前、所在およびパラメータ情報を記録したテーブルを生成し、次いで読み込まれる関数定義を該テーブルを参照してクライアント関数処理手段あるいはサーバ関数処理手段に出力するようにしている。
【0011】また、複数の関数定義を有する入力プログラムを入力として、該入力プログラムを2以上の任意の複数のプログラムに分割し、該分割した複数のプログラム間で互いの関数定義を呼び出すためのスタブを生成するプログラム変換方式であり、処理選択手段と、関数複写手段と、クライアント・スタブ生成手段と、サーバ・スタブ生成手段からなるプログラム変換部を備え、前記各関数定義は、関数定義が前記分割した複数のプログラムのいずれに所在するかを示す所在識別子が予め設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、各関数定義についての、関数名、所在、パラメータ情報、サーバ・スタブの生成状況、前記分割した複数のプログラム毎におけるクライアント・スタブの生成状況を示す関数管理テーブルを生成し、前記関数複写手段は、前記関数定義を読み込み、該関数定義の所在識別子に対応する前記分割したプログラムに該関数定義を追加処理し、かつ該関数定義中に呼び出すべき他の関数定義があるとき、前記関数管理テーブルを参照し、スタブの生成状況に応じて、前記サーバ・スタブ生成手段によりサーバ・スタブを生成し、クライアント・スタブ生成手段によりクライアント・スタブを生成し、それぞれ対応する前記分割したプログラムに追加処理するようにしている。
【0012】また、前記複数の関数定義を有する入力プログラムに関数定義の他に関数の所在と名前とパラメータ情報とを記述した宣言である前方参照宣言を設け、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記前方参照宣言に基づき前記関数テーブルを初期生成するようにしている。
【0013】また、前記入力プログラムに任意の関数から参照および更新が可能である大域変数定義と、該大域変数定義の所在と名前と型を記述した宣言である大域変数宣言を含め、前記プログラム変換部に大域変数複写手段と、変数用サーバ・スタブ生成手段と、変数用クライアント・スタブ生成手段を設け、前記各大域変数定義は、大域変数定義が前記分割した複数のプログラムのいずれに所在するかを示す所在識別子が予め設定されており、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記大域変数宣言に基づき前記関数テーブルを初期生成し、次いで読み込まれる各大域変数定義についての、変数名、型、所在、変数用サーバ・スタブの生成状況、前記分割した複数のプログラム毎における変数用クライアント・スタブの生成状況を示す大域変数管理テーブルを生成し、前記大域変数複写手段は、前記大域変数定義を読み込み、該大域変数定義の所在識別子に対応する前記分割したプログラムに該大域変数定義を追加処理し、前記関数複写手段は、前記関数定義を読み込み、該関数定義中に更新/参照される大域変数定義があるときは、該関数定義を該更新/参照に応じて変換して対応する前記分割したプログラムに追加処理し、かつ前記大域変数関数管理テーブルを参照し、変数用スタブの生成状況に応じて、前記変数用サーバ・スタブ生成手段により変数用サーバ・スタブを生成し、変数用クライアント・スタブ生成手段により変数用クライアント・スタブを生成し、それぞれ対応する前記分割したプログラムに追加処理するようにしている。
【0014】
【発明の実施の形態】
《第一実施例》はじめに本発明の第一実施例について説明する。第一実施例で提示するプログラム変換部では、入力プログラム中の関数定義に付随して記述された所在識別子の値に応じて、関数定義をクライアント・プログラムとサーバ・プログラムのいずれかに分配する。さらに、サーバ・プログラム上の全ての関数に対応するスタブを自動的に生成する。本実施例によれば、所在識別子を書き換えるだけで関数の所在を変更することが可能となり、また、インターフェース定義ファイルをプログラム作成者が作成することなく、出力されるクライアント・プログラムからは、サーバ・プログラム上の任意の関数を遠隔手続き呼び出しによって呼び出すことが可能となる。
【0015】図1は本実施例の構成図であり、図2〜図4R>4は本実施例の処理のPAD図である。図1において、10は本発明で提供するプログラム変換方式を実装したプログラム変換部であり、20はプログラム変換部10の入力である入力プログラムであり、310はプログラム変換部10の第一の出力であるクライアント・プログラムであり、320はプログラム変換部10の第二の出力であるサーバ・プログラムである。入力プログラム20は、関数定義211、212、…を有し、関数定義211、212、…は各関数の所在を、クライアント・プログラムとサーバ・プログラムの中から指定する所在識別子2111、2121、…を有する。
【0016】プログラム変換部10は、以下に説明する処理選択部110と、クライアント関数処理部120と、サーバ関数処理部130を有する。処理選択部110は、入力プログラム20の中の関数定義211、212、…を順次読み込み、各関数定義に対応する所在識別子2111、2121、…に応じて、該所在識別子がクライアントを意味する識別子の場合、すなわち、関数定義211に示すように所在識別子として“CLIENT”が設定されている場合には、クライアント関数処理部120を起動し、該所在識別子がサーバを意味する識別子である場合、すなわち、関数定義212に示すように所在識別子として“SERVER”が設定されている場合には、サーバ関数処理部130を起動する。なお、本実施例では、クライアントを意味する識別子の例として“CLIENT”を、サーバを意味する識別子の例として“SERVER”をそれぞれ用いるが、他の識別子や記号を用いてもよい。
【0017】クライアント関数処理部120は、入力プログラム20の中の関数定義をクライアント・プログラム310に追加する関数複写部1210を有する。サーバ関数処理部130は、入力プログラム20の中の関数定義をサーバ・プログラム320に追加する関数複写部1310と、該関数に対応するサーバ・スタブ3241、…を生成してサーバプログラム320に追加するサーバ・スタブ生成部1320と、該関数に対応するクライアント・スタブ3131、…を生成してクライアントプログラム31に追加するクライアント・スタブ生成部1330を有する。クライアント・プログラム310は、プログラム変換部10が生成するプログラムであり、関数複写部1210が追加する関数定義3111、…とクライアント・スタブ生成部1330が追加するクライアント・スタブ3131、…を有する。
【0018】サーバ・プログラム320は、プログラム変換部10が生成するプログラムであり、関数複写部1310が追加する関数定義3211、…とサーバ・スタブ生成部1320が追加するサーバ・スタブ3241、…を有する。
【0019】図1を用いて本実施例の動作の概要について説明する。本実施例では、プログラム変換部10が入力プログラム2(ソースプログラムあるいはオブジェクトプログラム)の中の関数定義を逐次読み込んで処理を進める。読み込んだ関数定義の所在識別子の値が“CLIENT”であるか“SERVER”であるかによって、処理選択部110が、以下の2通りの処理のいずれかを選択して実行する。関数定義211のように、所在識別子2111の値が“CLIENT”である場合には、処理選択部110はクライアント関数処理部120を起動する。クライアント関数処理部120は、関数複写部1210を起動して関数定義211をクライアント・プログラム310に関数定義3111として追加する。すなわち、プログラム変換部10は、入力プログラム20の中で所在識別子が“CLIENT”である関数定義をクライアント・プログラム310に追加する。一方、関数定義212のように、所在識別子2121の値が“SERVER”である場合には、処理選択部110はサーバ関数処理部130を起動する。サーバ関数処理部130は、まず関数複写部1310を起動して関数定義212をサーバ・プログラム320に追加する。次に、サーバ・スタブ生成部1320を起動して関数定義212に対応したサーバ・スタブを生成し、サーバ・プログラム320に、サーバ・スタブ3241として追加する。さらに、クライアント・スタブ生成部1330を起動して関数定義212に対応したクライアント・スタブを生成し、クライアント・プログラム310に、クライアント・スタブ3131として追加する。すなわち、プログラム変換部10は、入力プログラム20の中で所在識別子が“SERVER”である関数定義をサーバ・プログラム320に複写し、その関数をクライアント・プログラムから呼び出すためのスタブを自動的に追加する。
【0020】以下では、図2〜図3を用いて、本実施例の動作の詳細について説明する。図2は、処理選択部の処理を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ1101)処理選択部110は、処理の入力である入力プログラム20から、まだ読み込むべき入力がある限り、ステップ1102〜ステップ1105の処理を繰り返す。
(ステップ1102)処理選択部110は、入力プログラム20から所在識別子を読み込み、変数locに格納する。
(ステップ1103)処理選択部110は、locの値が“CLIENT”である場合にはステップ1104を実行し、“SERVER”である場合にはステップ1105を実行する。
(ステップ1104)処理選択部110は、クライアント関数処理部120を起動する。
(ステップ1105)処理選択部110は、サーバ関数処理部130を起動する。
以上が処理選択部110の処理である。
【0021】図3は、クライアント関数処理部120の処理を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ1201)クライアント関数処理部120は、入力プログラム20から関数定義を一つ読み込む。
(ステップ1202)クライアント関数処理部120は、関数複写部1210を起動して、ステップ1201で読み込んだ関数定義をクライアント・プログラム310に追加する。
以上がクライアント関数処理部120の処理である。関数複写部1210の詳細は自明なので説明を省略する。
【0022】図4は、サーバ関数処理部130の処理を示すPAD図である。以下本図を用いて処理内容を説明する。
(ステップ1301)サーバ関数処理部130は、入力プログラム20から関数定義を一つ読み込む。
(ステップ1302)サーバ関数処理部130は、関数複写部1310を起動してステップ1301で読み込んだ関数をサーバ・プログラム320に追加する。
(ステップ1303)サーバ関数処理部130は、サーバ・スタブ生成部1320を起動してステップ1301で読み込んだ関数に対するサーバ・スタブを生成し、生成したサーバ・スタブをサーバ・プログラム320に追加する。
(ステップ1304)サーバ関数処理部130は、クライアント・スタブ生成部1330を起動してステップ1301で読み込んだ関数に対するクライアント・スタブを生成し、生成したクライアント・スタブをクライアントプログラム310に追加する。
【0023】以上がサーバ関数処理部130の処理である。関数複写部1310の詳細は自明であるため、またサーバ・スタブ生成部1320、クライアント・スタブ生成部1330は従来のIDLコンパイラで用いられる周知技術によって構成できるため、それぞれ説明を省略する。上記の構成によれば、入力プログラム中の関数定義に付随して記述された所在識別子の値に応じて関数定義をクライアント・プログラムとサーバ・プログラムのいずれかに分配し、さらに、サーバ・プログラム上の全ての関数に対応するスタブを自動的に生成することが可能である。このため、出力されるクライアント・プログラムからは、サーバ・プログラム上の任意の関数を呼び出すことができる。本実施例によれば、所在識別子を設定することにより関数の所在を決定可能であり、また、所在識別子を書き換えてプログラム変換処理を再度行なえば、関数の所在を変更することが可能であり、また、インターフェース定義ファイルをプログラム作成者が作成することなく、出力されるクライアント・プログラムからは、サーバ・プログラム上の任意の関数を遠隔手続き呼び出しによって呼び出すことが可能となることは明らかである。よって、本実施例によれば、本発明の目的を達成することができる。
【0024】《第二実施例》次に、第二実施例について説明する。第一実施例では、サーバ・プログラム内の全ての関数に対してスタブを生成するが、スタブを作る必要がある関数は、サーバ・プログラム内の関数のうち、クライアント・プログラム内から呼び出される関数だけである。しかるに、第一実施例では、クライアント・プログラムから呼び出すことがない関数に対する不必要なスタブまで生成してしまうために、プログラム変換部の処理時間が余計にかかる。さらに、不必要なスタブを含む分だけ、生成するクライアント・プログラムとサーバ・プログラムのメモリ消費量が多くなるため、効率が悪い。そこで、本実施例では、プログラム変換部の処理時間を短縮し、生成するサーバ・プログラムとクライアント・プログラムのメモリ消費量を抑えるために、実際にクライアント・プログラムから呼び出されるサーバ・プログラム内の関数に対してのみ、スタブを生成する方式の例を提示する。
【0025】以下では、図5〜図7を用いて本実施例について説明する。本実施例では、図1の構成における処理選択部110を、図6に処理内容を示す処理選択部111で置き換え、さらに処理選択部111には、図5に示す、スタブの生成を管理するためのテーブルである関数管理テーブル140を設ける。また、関数複写部120は、図7に処理内容を示す関数複写部121で置き換える。
【0026】まず、図5に構成を示す関数管理テーブル140について説明する。関数管理テーブル140には、処理選択部111または関数複写部1210が、入力プログラム20を処理する過程で、新たな名前の関数の定義または関数の呼び出しを見い出す度に、その関数を管理するためのレコードを追加する。各レコードは、以下に説明する1401〜1404のフィールドを有する。1401は関数名フィールドであり、関数の名前を格納する。1402は所在フィールドであり、関数の所在情報を格納する。格納する値は、“CLIENT”、“SERVER”、“未知”のいずれかである。関数の所在が明らかである場合には“CLIENT”または“SERVER”のいずれかを格納し、未知である場合には“未知”を格納する。関数の所在が未知となるのは、入力プログラム20の中で関数定義に先だって関数呼び出しが記述される場合である。1403はパラメータ形式フィールドであり、関数のパラメータ形式情報、例えばパラメータの数と型などの情報を格納する。1404はスタブフィールドであり、スタブ生成の有無を管理するために、“未”、“要”、“済”のいずれかの値を格納する。クライアント・プログラム内の関数からの呼び出しがなく、スタブが未だ必要とされていない場合には“未”を、クライアント・プログラム内の関数からの呼び出しがあったものの、パラメータ形式が不明であるためにスタブを生成できず、パラメータ形式が分かり次第スタブを作る必要がある場合には“要”を、スタブの生成が済んでいる場合には“済”を、それぞれ格納する。なお、本実施例および以後の実施例において、各種のテーブルの各フィールドに格納する具体的な値としては、実施例で例として用いる値以外の語や記号を用いてもよい。
【0027】次に、本実施例の動作の概要について説明する。本実施例では、関数管理テーブル140によって各関数のスタブ生成の必要性を管理しながら処理を進める。そのためには、クライアント・プログラム上の関数からサーバ・プログラム上の関数呼び出しがあるかどうかを知る必要がある。そこで、クライアント・プログラムに関数の複写処理と並行して、複写する関数の中から呼び出される関数の所在とスタブの有無を、関数管理テーブル140を用いて調べる。調べた結果に応じて以下の何れかの処理を実行する。呼び出される関数の関数定義を既に読み込んでおり、その関数がサーバ・プログラム上の関数でかつ、スタブが未生成である場合には、関数管理テーブル140に記録してあるパラメータ形式情報を元に、その関数に対応するスタブを生成し、スタブが生成済であることを関数管理テーブル140に記録する。呼び出される関数の関数定義を未だ読み込んでいないために、その関数がサーバ・プログラム上の関数なのかクライアント・プログラム上の関数なのか不明である場合には、関数定義を読み込んでパラメータ形式情報が判明するまではスタブを生成できないので、該関数のスタブの生成が必要であることを関数管理テーブルに記録しておく。後に該関数の関数定義を読み込んだ時点で、該関数がサーバ・プログラム上の関数であることが判明した場合にはその時点でスタブを生成する。逆に、該関数がクライアント・プログラム上の関数であることが判明した場合には、遠隔手続き呼び出しではなくなるので、スタブを生成しない。上記の場合以外は、単に複写処理のみを行う。
【0028】次に図6〜7のPAD図を用いて、本実施例の動作の詳細について説明する。まず図6に従って本実施例における処理選択部111の処理内容を説明する。
(ステップ1121)処理選択部111は、入力プログラム20から、まだ読み込むべき入力がある限りステップ1122〜1135を繰り返す。
(ステップ1122)処理選択部111は、入力プログラム20から所在識別子を読み込み、変数locに格納する。
(ステップ1123)処理選択部111は、locの値が“CLIENT”である場合にはステップ1124〜1127を実行し、“SERVER”である場合にはステップ1128〜1135を実行する。
(ステップ1124)処理選択部111は、入力プログラム20の中の次の関数定義が関数管理テーブル140に登録されていなければステップ1125を実行する。
(ステップ1125)処理選択部111は、関数管理テーブル140に該関数のためのレコードを追加し、該レコードの関数名フィールド1401に該関数の関数名を格納する。
(ステップ1126)処理選択部111は、関数管理テーブル140中の該関数に対するレコードの所在フィールド1402に“CLIENT”を格納する。
(ステップ1127)処理選択部111は、クライアント関数処理部120を起動する。
(ステップ1128)処理選択部111は、入力プログラム20の中の次の関数定義が関数管理テーブル140に登録されていればステップ1129〜1131を実行し、登録されていなければステップ1132〜1133を実行する。
(ステップ1129)処理選択部111は、サーバ・スタブ生成部1320を起動する。
(ステップ1130)処理選択部111は、クライアント・スタブ生成部1330を起動する。
(ステップ1131)処理選択部111は、関数管理テーブル140中の該関数に対するレコードのスタブ・フィールド1404に“済”を格納する。
(ステップ1132)処理選択部111は、関数管理テーブル140中に該関数に対するレコードを追加し、該レコードのパラメータ形式フィールド1403に、該関数のパラメータ形式情報を格納する。
(ステップ1133)処理選択部111は、該レコードのスタブ・フィールド1404に“未”を格納する。
(ステップ1134)処理選択部111は、該レコードの所在フィールド1402に“SERVER”を格納する。
(ステップ1135)処理選択部111は、関数複写部1210を起動する。以上が、処理選択部111の処理内容である。
【0029】次に、図7を用いて本実施例における関数複写部1211の処理内容を説明する。本実施例では、関数複写部1211は、入力プログラム20の中の関数定義をクライアント・プログラム310に追加すると共に、その関数の中の関数呼び出しのために必要となるスタブの生成を管理する。処理内容を以下に説明する。
【0030】(ステップ12111)関数複写部1211は、関数の終わりになるまでステップ12112〜12121を繰り返す。
(ステップ12112)関数複写部1211は、入力プログラム20から文を一つ読み込む。
(ステップ12113)関数複写部1211は、ステップ12112で読み込んだ文が関数呼び出しを含む場合にはステップ12114〜12120を実行する。
(ステップ12114)関数複写部1211は、該関数が関数管理テーブル140に登録済でない場合にはステップ12115〜12116を実行し、登録済である場合にはステップ12117〜12120を実行する。
(ステップ12115)関数複写部1211は、関数管理テーブル140に該関数のためのレコードを追加し、関数名フィールド1401に該関数の関数名を格納する。
(ステップ12116)関数複写部1211は、該レコードの所在フィールド1402に“未知”を、スタブ・フィールド1404に“要”を格納する。
(ステップ12117)関数複写部1211は、関数管理テーブル140の該関数のためのレコードの所在フィールド1402が“SERVER”であり、かつ該レコードのスタブ・フィールド1404が“未”である場合には、ステップ12118〜12120を実行する。
(ステップ12118)関数複写部1211は、サーバ・スタブ生成部1320を起動する。
(ステップ12119)関数複写部1211は、クライアント・スタブ生成部1330を起動する。
(ステップ12120)関数複写部1211は、関数管理テーブル140の該関数のためのレコードのスタブ・フィールド1404に“済”を格納する。
(ステップ12121)関数複写部1211は、ステップ12112で読み込んだ文をクライアント・プログラム31に追加する。
以上が、関数複写部1211の処理内容である。
【0031】上述の構成によれば、実際にクライアント・プログラムから呼び出されるサーバ・プログラム内の関数に対してのみ、スタブを生成することが可能であることは明らかである。その結果、プログラム変換部の処理時間を短縮し、生成するサーバ・プログラムとクライアント・プログラムのメモリ消費量を抑えることが可能である。
【0032】《第三実施例》次に、第三実施例について説明する。
【0033】第一、第二の実施例では、所在識別子を入力プログラム中の各関数定義に隣接して記述する必要があるため、関数の所在の記述が入力プログラム中に散在してしまう。そのため、多くの関数の所在を一括して変更したり、各関数の所在を把握しようとしたりする場合に不便である。そこで、本実施例では各関数の所在の一元的な管理を可能とするために、関数の所在とパラメータ形式を指定する宣言である前方参照宣言によって関数の所在を指定することが可能であるプログラム変換部の例を提示する。前方参照宣言は関数定義に比べて短く記述できるので、入力プログラム中の先頭部などにまとめて記述することによって、各関数の所在の一元的な管理が可能となる。本実施例として、第2実施例の入力プログラム中に前方参照宣言を設けた場合について説明するが、第1実施例の入力プログラム中に前方参照宣言を設けるようにしてもよいのはいうまでもない。
【0034】以下、図8〜9を用いて本実施例について説明する。本実施例では、第二実施例の構成における処理選択部111を、図9に処理内容を示す処理選択部112で置き換える。図8は、本実施例における入力プログラム21の構成である。図8において、入力プログラム21は、関数定義211、212、…の他に、前方参照宣言221、222、…を有し、前方参照宣言221、222、…はそれぞれ所在識別子2211、2221、…を有する。次に、本実施例の動作の概要について説明する。本実施例では、入力プログラム中に関数の前方参照宣言があると、処理選択部112が関数管理テーブル140に、関数の名前、所在およびスタブの生成に必要となるパラメータ形式情報を記録しておく。後に関数定義を読み込んだら、関数管理テーブル140に記録された所在情報に基づいて該関数の複写先を決定する。
【0035】次に、本実施例の動作の詳細について説明する。図9は処理選択部112の処理内容である。以下、本図を用いて処理内容を説明する。
(ステップ1141)処理選択部112は、入力プログラム21からまだ読み込むべき入力がある限り、ステップ1142〜1148を繰り返す。
(ステップ1142)処理選択部112は、入力プログラム21から所在識別子を読み込み、変数locに格納する。
(ステップ1143)処理選択部112は、入力プログラム21の次の入力が前方参照宣言である場合にはステップ1144〜1145を実行し、関数定義である場合にはステップ1146〜1148を実行する。
(ステップ1144)処理選択部112は、前方参照宣言を読み込み、関数管理テーブル1401に該関数のためのレコードを追加し、該レコードの関数名フィールド1401に該関数の名前を、所在フィールド1402に該関数の所在を、パラメータ形式フィールド1403に該関数のパラメータ形式情報をそれぞれ格納する。
(ステップ1145)処理選択部112は、該レコードのスタブ・フィールド1404に“未”を格納する。
(ステップ1146)処理選択部112は、関数管理テーブル1401の該関数定義に対応するレコードの所在フィールド1402の値が“CLIENT”である場合にはステップ1147を実行し、“SERVER”である場合にはステップ1148を実行する。
(ステップ1147)処理選択部112は、クライアント関数処理部120を起動する。
(ステップ1148)処理選択部112は、関数複写部1310を起動する。以上が処理選択部112の処理内容である。
【0036】上記の構成によれば、入力プログラム中の、前方参照宣言によって関数の所在を指定することが可能となるため、関数の所在の一元的な管理することが可能となる。
【0037】《第四実施例》次に、第四実施例について説明する。
【0038】第一〜第三の実施例では、クライアント・プログラム上の関数からサーバ・プログラム上の関数を呼ぶことは可能であるが、それとは逆にサーバ・プログラム上の関数からクライアント・プログラム上の関数を呼ぶことは不可能である。しかし、アプリケーションの種類によってはサーバ・プログラム上の関数からクライアント・プログラム上の関数を呼び出すことが必要となる場合がある。また、第一〜第三の実施例では、入力プログラムをクライアント・プログラムとサーバ・プログラムの二つのプログラムに分割しているが、サーバ・プログラムをさらに複数のプログラムに分割する場合などのように、三つ以上のプログラムにアプリケーションを分割することが必要となる場合がある。そこで、本実施例では、入力プログラムを二つ以上の任意の複数のプログラムに分割し、それらのプログラム間で互いの関数を呼び出すためのスタブを、必要に応じて自動的に生成することが可能であるようなプログラム変換部の例を示す。
【0039】以下図10〜図13を用いて本実施例について説明する。図10は、本実施例の構成図である。図1010において、11は本発明で提供するプログラム変換方式を実装したプログラム変換部であり、22はプログラム変換部11の入力である入力プログラム、311、321、331はプログラム変換部11の出力である出力プログラムである。入力プログラム22は関数定義211、212、…を有し、関数定義211、212、…はそれぞれ所在識別子2111、2121、…を有する。本実施例では所在識別子の値として二つ以上の任意の複数の値を取ることができるが、例として“CLIENT”、“SERVER1”、“SERVER2”の三つの値を用いる。所在識別子の種類は2つ以上であればいくつでもよく、また具体的な値としてはこれら以外の語や記号を用いても良い。プログラム変換部11は、処理選択部113と、関数複写部1212と、サーバ・スタブ生成部1320と、クライアント・スタブ生成部1330を有し、処理選択部はさらに関数管理テーブル141を有する。出力プログラム311、321、331は関数複写部1212が追加する関数定義3111、3211、3311、…と、サーバ・スタブ生成部1320が生成するサーバ・スタブ3241、3341、…クライアント・スタブ生成部1330が生成するクライアント・スタブ3131、3331、…を有する。
【0040】図11は、関数管理テーブル141の構成図である。関数管理テーブル141には、処理選択部113または関数複写部1212が、入力プログラム22を処理する過程で、新たな名前の関数定義または呼び出しを見いだす度に、その関数を管理するためのレコードを追加する。関数管理テーブル141の各レコードは、以下に説明する1401から14063のフィールドを有する。1401は関数名フィールドであり、関数名を格納する。1402は所在フィールドであり、関数の所在情報を格納する。具体的な値の例として、本実施例では“CLIENT”、“SERVER1”、“SERVER2”、“未知”を用いる。1403はパラメータ形式フィールドであり、関数のパラメータ形式情報を格納する。1405はサーバ・スタブ・フィールドであり、サーバ・スタブの生成を管理するために、“未”、“要”、“済”のいずれかの値を格納する。該関数に対する遠隔手続き呼び出しが入力プログラム22の中に見いだされず、サーバ・スタブが未だ必要とされていない場合には“未”を、呼び出しが見いだされたため、パラメータ形式が分かり次第サーバ・スタブを作る必要がある場合には“要”を、サーバ・スタブの生成が済んでいる場合には“済”を、それぞれ格納する。14061、14062、…は出力プログラムごとに設けるクライアント・スタブ・フィールドであり、クライアント・スタブの生成を管理するために、“未”、“要”、“済”のいずれかの値を格納する。各値の意味はサーバ・スタブ・フィールド1405と同様である。以後では、出力プログラムxに対応するクライアント・スタブ・フィールドを、クライアント・スタブ[x]フィールドと表記する。
【0041】図11を用いて本実施例の動作の概要について説明する。本実施例では、関数管理テーブル141を用いてスタブの生成を管理しながら処理を進める。例えば関数定義211に対しては、以下のように処理を行う。まず、処理選択部113は、関数管理テーブル141を用いて、関数定義211への呼び出しが記録していないかどうか判定する。関数定義211の所在となる“CLIENT”以外の所在からの呼び出しが既に記録されている場合には、その呼び出しを可能にするためのスタブを生成する。次に、処理選択部113は、関数複写部1212を起動する。関数複写部1212は、関数定義211を、所在識別子2111の値に基づき、“CLIENT”に対応する出力プログラム311に複写する。複写処理と並行して、関数定義211の中に記述された関数呼び出しを調べ、調べた結果に応じて以下のいずれかの処理を行う。既に関数定義を読み込みが済んでおり、関数管理テーブル141に記録された関数への呼び出しであり、関数定義211とは違う所在の関数である場合には、その呼び出しのためにスタブが必要となるので、まだスタブが生成されていなければ、スタブを生成する。未だ関数定義を読み込んでいないために、所在が不明である関数への呼び出しが見いだされた場合には、該関数の関数定義を処理するまでは、スタブが必要かどうか分からないので、出力プログラム311からその関数への呼び出しがあったことを関数管理テーブル141に記録しておく。上記二つ以外の場合には、単に複写する。
【0042】次に、図12〜図13を用いて本実施例の動作の詳細について説明する。図12は処理選択部113の処理内容を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ1151)処理選択部113は、入力プログラム22からまだ読み込むべき入力がある限り、ステップ1152〜1163を繰り返す。
(ステップ1152)処理選択部113は、入力プログラム22から所在識別子を読み込み、変数locに格納する。
(ステップ1153)処理選択部113は、ステップ1155〜1163を実行する。
(ステップ1154)処理選択部113は、関数複写部1212を起動する。
(ステップ1155)処理選択部113は、入力プログラム22の中の次の関数定義が関数管理テーブル141に登録されていればステップ1156〜1162を実行し、登録されていない場合にはステップ1163を実行する。
(ステップ1156)処理選択部113は、関数管理テーブル141の該関数に対応するレコードの、クライアント・スタブ[loc]フィールドに“未”を格納する。
(ステップ1157)処理選択部113は、クライアント・スタブ[i]フィールドが“要”である全ての所在iについてステップ1158〜1162を実行する。
(ステップ1158)処理選択部113は、サーバ・スタブ・フィールド1405が“未”である場合にはステップ1159〜1160を起動する。
(ステップ1159)処理選択部113は、サーバ・スタブ生成部1320を起動する。
(ステップ1160)処理選択部113は、サーバ・スタブ・フィールド1405に“済”を格納する。
(ステップ1161)処理選択部113は、クライアント・スタブ生成部1330を起動する。
(ステップ1162)処理選択部113は、クライアント・スタブ[i]フィールドに“済”を格納する。
(ステップ1163)処理選択部113は、関数管理テーブル141に該関数に対応するレコードを追加し、該レコードの関数名フィールド1401には該関数の関数名を、所在フィールド1402にはlocの値を、パラメータ形式フィールド1403には該関数のパラメータ形式情報を、サーバ・スタブ・フィールド1405と全てのクライアント・スタブ・フィールドには“未”を、それぞれ格納する。
以上が処理選択部113の処理内容である。
【0043】図13は関数複写部1212の処理内容を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ12131)関数複写部1212は、入力プログラム22から所在識別子を読み込み変数locに格納する。
(ステップ12132)関数複写部1212は、関数定義の終わりになるまでステップ12133〜12136を繰り返す。
(ステップ12133)関数複写部1212は、入力プログラム22から文を一つ読み込む。
(ステップ12134)関数複写部1212は、ステップ12133で読み込んだ文が関数呼び出しを含む場合には、ステップ12135を実行する。
(ステップ12135)関数複写部1212は、ステップ12137〜12146を実行する。
(ステップ12136)関数複写部1212は、ステップ12133で読み込んだ文を、変数locが指定する出力プログラムに追加する。
(ステップ12137)関数複写部1212は、該関数が関数管理テーブル141に登録されていない場合にはステップ1238を実行し、登録されている場合にはステップ12139〜12146を実行する。
(ステップ12138)関数複写部1212は、関数管理テーブル141に、該関数に対応するレコードを追加し、該レコードの関数名フィールド1401には該関数の名前を、所在フィールド1402には“未知”をそれぞれ格納する。
(ステップ12139)関数複写部1212は、該関数に対応する所在フィールド1402が“未知”である場合にはステップ12140を実行し、“未知”以外の場合にはステップ12141〜12146を実行する。
(ステップ12140)関数複写部1212は、該関数に対応するクライアント・スタブ[loc]フィールドに“要”を格納する。
(ステップ12141)関数複写部1212は、該関数に対応するサーバ・スタブ・フィールドが“未”である場合にはステップ12142〜12143を実行する。
(ステップ12142)関数複写部1212は、サーバ・スタブ生成部1320を起動する。
(ステップ12143)関数複写部1212は、該関数に対応するサーバ・スタブ・フィールドに“済”を代入する。
(ステップ12144)関数複写部1212は、該関数に対応するクライアント・スタブ[loc]フィールドが“未”である場合には、ステップ12145〜12146を実行する。
(ステップ12145)関数複写部1212は、クライアント・スタブ生成部1330を起動する。
(ステップ12146)関数複写部1212は、該関数に対応するクライアント・スタブ[loc]フィールドに“済”を格納する。
【0044】上述の構成によれば、入力プログラムを二つ以上の任意の複数のプログラムに分割し、それらのプログラム間で互いの関数を呼び出すためのスタブを、必要に応じて自動的に生成することが可能である。
【0045】《第五実施例》次に、第五実施例について説明する。第一〜第四の実施の実施例では、入力プログラム中の関数定義については、各出力プログラムに分配することが可能であるが、変数については出力プログラムに分配することができない。しかし、アプリケーションの種類よっては、各関数から共通して使用できる変数が必要になる場合がある。そこで、本実施例では入力プログラム中に、全関数から共通して参照と更新ができる変数である大域変数の定義が可能であるようなプログラム変換部の例を提示する。本実施例で示すプログラム変換部では、入力プログラム中の大域変数についても関数定義同様に、所在識別子によって分配先の出力プログラムを指定する。そして、分配先のプログラム以外のプログラムからでもそれぞれの変数を操作できるようにするためのスタブを、必要に応じて各出力プログラムに追加することにより、どの出力プログラムからでも任意の大域変数に対する操作を可能にする。
【0046】以下、図14〜図17を用いて本実施例について説明する。図14は、本実施例の構成図である。図14において、23は入力プログラムであり、12はプログラム変換部であり、312、322、332、…は出力プログラムである。入力プログラム23は関数定義211、212、…と大域変数定義231、232、…を有する。関数定義211、212、…と大域変数定義231、232、…はそれぞれ、所在識別子2111、2121、…および2311、2321、…を有する。プログラム変換部12は、処理選択部114と、大域変数複写部134と、関数複写部122と、サーバ・スタブ生成部1320と、クライアント・スタブ生成部1330と、変数用サーバ・スタブ生成部1340と、変数用クライアント・スタブ1350を有し、処理選択部114は、関数管理テーブル141と大域変数管理テーブル150を有する。出力プログラム312、322、332…は、大域変数複写部134が追加する大域変数定義3221…と、関数複写部122が追加する関数定義3111…と、サーバ・スタブ生成部1320が生成して追加する図示しないサーバ・スタブと、クライアント・スタブ生成部1330が生成して追加する図示しないクライアント・スタブと、変数用サーバ・スタブ生成部1340が生成して追加する変数用サーバスタブ3261…と、変数用クライアント・スタブ生成部1350が生成して追加する変数用クライアント・スタブ3151…を有する。
【0047】図15は、大域変数管理テーブル150の構成図である。大域変数管理テーブル150には、処理選択部114が大域変数定義231、232、…を読み込む度に、その変数を管理するためのレコードを追加する。大域変数管理テーブル150の各レコードには、以下に説明する1501〜15053のフィールドを有する。1501は変数名フィールドであり、変数名を格納する。1502は型フィールドであり、変数の型情報を格納する。1503は所在フィールドであり、変数の所在情報を格納する。本実施例では、具体的な値の例として“CLIENT”、“SERVER1”、“SERVER2”を用いる。1504はサーバ・スタブ・フィールドであり、該変数を操作するための変数用サーバ・スタブの生成を管理するために、“未”、“要”、“済”のいずれかの値を格納する。15051、15052、15053、…は、出力プログラム別のクライアント・スタブ・フィールドであり、クライアント・スタブの生成を管理するために、“未”、“要”、“済”のいずれかの値を格納する。各値の意味は、サーバ・スタブ・フィールド1504と同様である。以後では、出力プログラムxに対するクライアント・スタブ・フィールドを、クライアント・スタブ[x]フィールドと表記する。
【0048】次に、図14を用いて本実施例の動作の概要について説明する。本実施例では、関数管理テーブル141によって関数のためのスタブの生成を管理し、大域変数管理テーブル150によって大域変数のためのスタブの生成を管理しながら処理を進める。例えば、入力プログラム23からの入力が、231のように大域変数定義である場合には、以下の処理を実行する。まず、処理選択部114は、大域変数管理テーブルに大域変数定義231の所在と型情報を記録しておく。次に大域変数定義複写部134を起動して、所在識別子2311の値に基づき、“SERVER1”に対応する出力プログラム322に複写する。一方、入力プログラム23からの入力が、211のように関数定義である場合には、第四の実施の実施例と同様の処理を実行する。ただし、関数を複写する際に第四の実施の実施例の処理に加えて、関数定義211の所在と異なる所在の大域変数定義に対する更新と参照を、該変数のスタブ呼び出しに変換する。
【0049】以下では、図16〜図17を用いて、本実施例の動作の詳細について説明する。図16は、処理選択部114の処理内容を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ1171)処理選択部114は、入力プログラム23から、まだ読み込むべき入力がある限りステップ1172〜1184を繰り返す。
(ステップ1172)処理選択部114は、入力プログラム23から所在識別子を読み込み、変数locに格納する。
(ステップ1173)処理選択部114は、次の入力の種類が大域変数宣言である場合にはステップ1174〜1175を実行し、関数定義である場合には、図12に示したステップ1153と、本図のステップ1176を実行する。
(ステップ1174)処理選択部114は、入力プログラム23から大域変数定義を読み込み、大域変数管理テーブル150に該変数のためのレコードを追加し、該レコードの変数名フィールド1501には該変数の変数名を、型フィールド1502には該変数の型情報を、所在フィールド1503には該変数の所在識別子の値を、サーバ・スタブ・フィールドには“未”を、全てのクライアント・スタブ・フィールド15051、15052、…には“未”を、それぞれ格納する。
(ステップ1175)処理選択部114は、大域変数複写部134を起動する。
(ステップ1176)処理選択部114は、関数複写部122を起動する。
以上が、処理選択部114の処理内容である。
【0050】図17は、関数複写部122の処理内容を示すPAD図である。以下、本図を用いて処理内容を説明する。
(ステップ12201)関数複写部122は、入力プログラム23から所在識別子を読み込み、変数locに代入する。
(ステップ12202)関数複写部122は、関数定義の終わりになるまでステップ12203〜12207を繰り返す。
(ステップ12203)関数複写部122は、入力プログラム23から文を一つ読み込む。
(ステップ12204)関数複写部122は、ステップ12203で読み込んだ文が関数呼び出しを含む場合には、図13に示したステップ12135を実行する。
(ステップ12205)関数複写部122は、ステップ12203で読み込んだ文が大域変数の更新または参照を含む場合にはステップ12206を実行する。
(ステップ12206)関数複写部122は、ステップ12208〜ステップ12214を実行する。
(ステップ12207)関数複写部122は、ステップ12203で読み込み、ステップ12214で必要に応じて変換された文をlocが指定する出力プログラムに追加する。
(ステップ12208)関数複写部122は、大域変数管理テーブル150の該大域変数に対応するレコードのサーバ・スタブ・フィールド1504が“未”である場合にはステップ12209〜12210を実行する。
(ステップ12209)関数複写部122は、変数用サーバ・スタブ生成部1340を起動する。
(ステップ12210)関数複写部122は、該大域変数に対応するサーバ・スタブ・フィールド1504に“済”を格納する。
(ステップ12211)関数複写部122は、該大域変数に対応するクライアント・スタブ・フィールド[loc]が“未”である場合にはステップ12212〜12213を実行する。
(ステップ12212)関数複写部122は、変数用クライアント・スタブ生成部1340を起動する。
(ステップ12213)関数複写部122は、該大域変数に対応するクライアント・スタブ・フィールド[loc]に“済”を格納する。
(ステップ12214)関数複写部122は、ステップ12203で読み込んだ文中の、該大域変数に対する更新または参照を、変数用クライアント・スタブの呼び出しに変換する。
【0051】上述の構成によれば、入力プログラム中の大域変数定義を、所在識別子によって指定された分配先の出力プログラムに追加し、分配先のプログラム以外のプログラムからでもそれぞれの変数を操作できるようにするためのスタブを、必要に応じて各出力プログラムに追加することができる。その結果、どの出力プログラムからでも任意の大域変数に対する操作が可能となる。
【0052】
【発明の効果】本発明によれば、インターフェース定義ファイルを必要とせずにスタブ・コードを生成することが可能となる。さらに、アプリケーションの処理を構成する関数の所在をクライアントとサーバの間で、容易に移動させることが可能となる。すなわち、プログラム作成者は、入力プログラム内で処理の記述場所を移動させたい関数の所在識別子を変更するだけで、該関数の所在をクライアント・プログラムとサーバ・プログラムの間で移動させることが可能となる。その結果、関数の所在を移動させることによってアプリケーションの性能を向上させることが容易となる。
【図面の簡単な説明】
【図1】第一実施例の構成を示す図である。
【図2】処理選択部110の処理内容を示すPAD図である。
【図3】クライアント関数処理部120の処理内容を示すPAD図である。
【図4】サーバ関数処理部130の処理内容を示すPAD図である。
【図5】関数管理テーブル140の構成を示す図である。
【図6】処理選択部111の処理内容を示すPAD図である。
【図7】は、関数複写部1211の処理内容を示すPAD図である。
【図8】入力プログラム21の構成を示す図である。
【図9】処理選択部112の処理内容を示すPAD図である。
【図10】第四の実施例の構成を示す図である。
【図11】関数管理テーブル141の構成を示す図である。
【図12】処理選択部113の処理内容を示すPAD図である。
【図13】関数複写部1212の処理内容を示すPAD図である。
【図14】第五の実施例の構成を示す図である。
【図15】大域変数管理テーブル150の構成を示す図である。
【図16】処理選択部114の処理内容を示すPAD図である。
【図17】関数複写部122の処理内容を示すPAD図である。
【符号の説明】
10、11、12 プログラム変換部
110〜114 処理選択部
120 クライアント関数処理部
130 サーバ関数処理部
1210、1211、1212、1310、122 関数複写部
1320 サーバ・スタブ生成部
1330 クライアント・スタブ生成部
1340 変数用サーバ・スタブ生成部
1350 変数用クライアント・スタブ生成部
140、141 関数管理テーブル
150 大域変数管理テーブル
20〜23 入力プログラム
211、212 関数定義
2111、2121 所在識別子
221、222 前方参照宣言
231、232 大域変数定義
310 クライアント・プログラム
320 サーバ・プログラム
311、321、322、331、332 出力プログラム
3111、3211、3311 関数定義
3131、3331 クライアント・スタブ
3241、3341 サーバ・スタブ
3221 大域変数定義
3151 変数用クライアント・スタブ
3261 変数用サーバ・スタブ

【特許請求の範囲】
【請求項1】 複数の関数定義を有する入力プログラムを入力として、クライアント・プログラムとサーバ・プログラムを出力とするプログラム変換方式であって、処理選択手段と、関数複写手段を有するクライアント関数処理手段と、関数複写手段とクライアント・スタブ生成手段とサーバ・スタブ生成手段を有するサーバ関数処理手段からなるプログラム変換部を備え、前記各関数定義は予め所在識別子が設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、該関数定義に設定された所在識別子がクライアントを示すとき該関数定義を前記クライアント関数処理手段に出力し、前記所在識別子がサーバを示すとき該関数定義を前記サーバ関数処理手段に出力し、前記クライアント関数処理手段は、入力された関数定義を前記関数複写手段により前記クライアント・プログラムに追加処理し、前記サーバ関数処理手段は、入力された関数定義を前記関数複写手段により前記サーバ・プログラムに追加処理し、前記クライアント・スタブ生成手段によりクライアント・スタブを生成し前記クライアント・プログラムに追加処理し、前記サーバ・スタブ生成手段によりサーバ・スタブを生成し前記サーバ・プログラムに追加処理することを特徴とするプログラム変換方式。
【請求項2】 複数の関数定義を有する入力プログラムを入力として、クライアント・プログラムとサーバ・プログラムを出力とするプログラム変換方式であって、処理選択手段と、関数複写手段を有するクライアント関数処理手段と、関数複写手段とクライアント・スタブ生成手段とサーバ・スタブ生成手段を有するサーバ関数処理手段からなるプログラム変換部を備え、前記各関数定義は予め所在識別子が設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、該関数定義に設定された所在識別子がクライアントを示すとき該関数定義を前記クライアント関数処理手段に出力し、前記所在識別子がサーバを示すとき該関数定義を前記サーバ関数処理手段に出力し、かつ読み込んだ関数定義に基づき各関数定義に対応するスタブの生成状況を管理する関数管理テーブルを生成し、前記クライアント関数処理手段は、入力された関数定義を前記関数複写手段により前記クライアント・プログラムに追加処理し、かつ該関数複写手段は入力された関数定義中に呼び出すべき前記サーバプログラムに属する関数定義があるとき、前記関数管理テーブルを参照し、該関数定義に係るスタブが生成されていなければ前記サーバ関数処理手段に該関数定義に係るスタブの生成指示を出力し、前記サーバ関数処理手段は、入力された関数定義を前記関数複写手段により前記サーバ・プログラムに追加処理し、かつ前記スタブの生成指示を受けたとき、前記クライアント・スタブ生成手段により該生成指示に従いクライアント・スタブを生成し前記クライアント・プログラムに追加処理し、前記サーバ・スタブ生成手段により該生成指示に従いサーバ・スタブを生成し前記サーバ・プログラムに追加処理することを特徴とするプログラム変換方式。
【請求項3】 請求項1または請求項2記載のプログラム変換方式において、前記複数の関数定義を有する入力プログラムに関数定義の他に関数の所在と名前とパラメータ情報とを記述した宣言である前方参照宣言を設け、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記前方参照宣言に基づき関数の名前、所在およびパラメータ情報を記録したテーブルを生成し、次いで読み込まれる関数定義を該テーブルを参照してクライアント関数処理手段あるいはサーバ関数処理手段に出力することを特徴とするプログラム変換方式。
【請求項4】 複数の関数定義を有する入力プログラムを入力として、該入力プログラムを2以上の任意の複数のプログラムに分割し、該分割した複数のプログラム間で互いの関数定義を呼び出すためのスタブを生成するプログラム変換方式であって、処理選択手段と、関数複写手段と、クライアント・スタブ生成手段と、サーバ・スタブ生成手段からなるプログラム変換部を備え、前記各関数定義は、関数定義が前記分割した複数のプログラムのいずれに所在するかを示す所在識別子が予め設定されており、前記処理選択手段は、前記入力プログラムの有する関数定義を順次読み込み、各関数定義についての、関数名、所在、パラメータ情報、サーバ・スタブの生成状況、前記分割した複数のプログラム毎におけるクライアント・スタブの生成状況を示す関数管理テーブルを生成し、前記関数複写手段は、前記関数定義を読み込み、該関数定義の所在識別子に対応する前記分割したプログラムに該関数定義を追加処理し、かつ該関数定義中に呼び出すべき他の関数定義があるとき、前記関数管理テーブルを参照し、スタブの生成状況に応じて、前記サーバ・スタブ生成手段によりサーバ・スタブを生成し、クライアント・スタブ生成手段によりクライアント・スタブを生成し、それぞれ対応する前記分割したプログラムに追加処理することを特徴とするプログラム変換方式。
【請求項5】 請求項4記載のプログラム変換方式において、前記複数の関数定義を有する入力プログラムに関数定義の他に関数の所在と名前とパラメータ情報とを記述した宣言である前方参照宣言を設け、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記前方参照宣言に基づき前記関数テーブルを初期生成することを特徴とするプログラム変換方式。
【請求項6】 請求項4または請求項5記載のプログラム変換方式において、前記入力プログラムに任意の関数から参照および更新が可能である大域変数定義と、該大域変数定義の所在と名前と型を記述した宣言である大域変数宣言を含め、前記プログラム変換部に大域変数複写手段と、変数用サーバ・スタブ生成手段と、変数用クライアント・スタブ生成手段を設け、前記各大域変数定義は、大域変数定義が前記分割した複数のプログラムのいずれに所在するかを示す所在識別子が予め設定されており、前記処理選択手段は、前記入力プログラムを順次読み込み、先に読み込まれる前記大域変数宣言に基づき前記関数テーブルを初期生成し、次いで読み込まれる各大域変数定義についての、変数名、型、所在、変数用サーバ・スタブの生成状況、前記分割した複数のプログラム毎における変数用クライアント・スタブの生成状況を示す大域変数管理テーブルを生成し、前記大域変数複写手段は、前記大域変数定義を読み込み、該大域変数定義の所在識別子に対応する前記分割したプログラムに該大域変数定義を追加処理し、前記関数複写手段は、前記関数定義を読み込み、該関数定義中に更新/参照される大域変数定義があるときは、該関数定義を該更新/参照に応じて変換して対応する前記分割したプログラムに追加処理し、かつ前記大域変数関数管理テーブルを参照し、変数用スタブの生成状況に応じて、前記変数用サーバ・スタブ生成手段により変数用サーバ・スタブを生成し、変数用クライアント・スタブ生成手段により変数用クライアント・スタブを生成し、それぞれ対応する前記分割したプログラムに追加処理することを特徴とするプログラム変換方式。

【図2】
image rotate


【図1】
image rotate


【図3】
image rotate


【図4】
image rotate


【図5】
image rotate


【図8】
image rotate


【図11】
image rotate


【図15】
image rotate


【図6】
image rotate


【図7】
image rotate


【図9】
image rotate


【図10】
image rotate


【図12】
image rotate


【図16】
image rotate


【図13】
image rotate


【図14】
image rotate


【図17】
image rotate


【公開番号】特開平9−160762
【公開日】平成9年(1997)6月20日
【国際特許分類】
【出願番号】特願平7−339951
【出願日】平成7年(1995)12月4日
【出願人】(000005108)株式会社日立製作所 (27,607)