(57)【特許請求の範囲】
【請求項１】
関数および関数呼出の関係を解析して関数情報および関数呼出情報を生成し、該関数情報および関数呼出情報を用いるプログラム変換処理の際の一括関数呼出化方法であって、
同一関数の複数回の呼出を構成する命令列を、同等な単一関数の呼出を構成する命令列とする情報を生成する一括呼出化情報生成ステップと、
上記一括呼出化情報から、同一関数の複数回実行処理を構成する命令列を一度に行う一括関数を構成する命令列を生成する一括関数生成ステップと、
上記一括呼出化情報から、同一関数の複数回の呼出を構成する命令列を１回の一括関数の呼出を構成する命令列に変換する一括呼出化変換ステップと
を有することを特徴とする一括関数呼出化方法。
【請求項２】
請求項１に記載の一括関数呼出化方法において、
上記一括呼出化情報生成ステップが、上記関数呼出情報を用いて同一関数を構成する命令列の呼出である同型関数呼出を認識して同型呼出情報を生成する同型呼出認識ステップと、
上記同型呼出認識ステップが生成する同型呼出から一括関数の呼出を構成する命令列に変換可能な呼出を選択する一括呼出選択ステップと
を有することを特徴とする一括関数呼出方法。
【請求項３】
請求項２に記載の一括関数呼出化方法において、
上記一括呼出選択ステップが、上記複数の同型呼出が一括関数の呼出を構成する命令列に変換可能な否かを判定する一括呼出化判定ステップと、
上記一括呼出化判定ステップにより一括関数の呼出を構成する命令列に変換可能であると判定された関数群の一括呼出化の情報を生成する一括呼出化情報登録ステップと
を有することを特徴とする一括関数呼出化方法。
【請求項４】
請求項２に記載の一括関数呼出化方法において、
上記同型呼出認識ステップは、ループ展開時に生成する同一関数の呼出を認識してループ展開時同型呼出情報を生成するループ展開時同型呼出認識ステップであり、
上記一括呼出選択ステップは、上記ループ展開時同型呼出認識ステップが生成するループ展開時同型呼出情報から一括関数を構成する命令列の呼出に変換可能な呼出を選択した一括呼出化情報を生成することを特徴とする一括関数呼出化方法。
【請求項５】
請求項４に記載の一括関数呼出化方法において、
上記一括呼出化情報生成ステップが決定する一括化係数を、ループ展開数とすることを特徴とする一括関数呼出化方法。
【請求項６】
請求項２に記載の一括関数呼出化方法において、
上記同型呼出認識ステップは、ループ並列化時に生成する同一関数の呼出を認識してループ並列化時同型呼出情報を生成するループ並列化同型呼出認識ステップであり、
上記一括呼出選択ステップは、上記ループ並列化時同型呼出認識ステップが生成するループ並列化時同型呼出情報から一括関数を構成する命令列の呼出に変換可能な呼出を選択した一括呼出化情報を生成することを特徴とする一括関数呼出化方法。
【請求項７】
請求項６に記載の一括関数呼出化方法において、
上記一括呼出化情報生成ステップが決定する一括化係数を、ループ並列化の展開数とすることを特徴とする一括関数呼出化方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はコンパイラなどのプログラム変換技術に係わり、特に、関数呼出機構を持つ言語に対して、関数および関数呼出の関係を解析して関数情報および呼出情報として生成するプログラム変換の際の一括関数呼出化方法に関する。
【０００２】
【従来の技術】
高級言語によるプログラミングでは、関数（手続きとも呼ばれるが、以降では関数で統一する）による構造化を行うのが一般的である。関数は、一連の処理をまとめてパラメータ化して記述したもの（以下、これを関数定義と呼ぶ）で、それを呼出す（以下単に呼出と呼ぶ）ことにより関数定義内の処理を実現できる。関数定義側のパラメータには、仮引数、返却変数（以下、仮返数と呼ぶ）があり、関数定義内の記述では、仮引数・仮返数（以下、仮パラメータと呼ぶ）を使って処理を記述する。呼出側のパラメータには、実引数、返却変数（以下、実返数と呼ぶ）があり、呼出側の変数／式を使ってパラメータの指定を行う（この呼出インタフェースとなる変数／式を実パラメータと呼ぶ）。尚、以下では、仮パラメータと実パラメータを総称して、インタフェース変数／式と呼ぶ。実パラメータには様々な値を指定することが可能で、これにより同様の処理（＝関数定義）を繰り返し実行することができる。
【０００３】
このように、関数はプログラミング上便利な機構である一方で、呼出時にオーバヘッドがかかるという問題点を抱えている。即ち、引数の受け渡しや、呼出時のスタックポインタの更新／退避回復、命令ジャンプに伴うキャッシュミスの可能性の増大といったことにより、処理性能の低下を招く。特に、処理内容が簡単な関数を反復呼出する場合には、呼出オーバヘッドは性能上無視できないものとなる。
【０００４】
このような状況に対処するため、高級言語では、インライン展開の機能を備えている場合が多い。インライン展開は、関数呼出を関数の定義本体の内容で置き換え、呼出を抑止するものである。具体的には、各呼出点で、関数定義の内容を展開し、仮パラメータを実パラメータで置き換えることにより実現する。インライン展開に関しては、佐々 政孝著岩波講座ソフトウェア科学５「プログラミング言語処理系」（ 岩波書店、１９８９）のｐｐ．４５０―４５１に詳しい。
【０００５】
【発明が解決しようとする課題】
インライン展開は、高級言語における呼出オーバヘッド削減のほとんど唯一の手段である。しかし、インライン展開の適用によりコードサイズが大きくなり過ぎると、キャッシュミスの機会が増え、かえって性能が低下する場合もある。そのため、大きな関数の呼出や、呼出個所が多い場合には、インライン展開を制限するのが普通である。即ち、コード量の極端な増加を伴う場合には、インライン展開による呼出オーバヘッドの削減は行うことができない。すなわち、従来技術においては、インライン展開が適用できない場合に、呼出オーバヘッドの削減を行う手段がないという課題があった。
本発明の目的は、インライン展開によらない呼出オーバヘッドの削減手段を設けることにより、インライン展開が適用できない場合にも、呼出オーバヘッドの削減を行い、オブジェクトプログラムの処理性能の向上を図ることが可能な一括関数呼出化方法を提供することにある。
【０００６】
【課題を解決するための手段】
インライン展開は、各呼出点で関数定義の処理内容を展開し、（その呼出点での）呼出を除去する。従って、インライン展開の適用の有無は、各呼出点の呼出回数を０とするか否かを判断することになる。複数回の同一関数の呼出の場合、インライン展開が適用できない場合でも、関数定義側に複数呼出分の処理を展開すれば、コードサイズを極端に増大させることなく、呼出回数を削減することが可能である。即ち、複数回の同一関数の処理を一度に実行する一括関数を生成し、複数回の同一関数の呼出を、１回の一括関数の呼出に置き換える一括化呼出生成手段を設けることで、インライン展開によらない呼出オーバヘッドの削減手段を設けることができる。
これにより、インライン展開が適用できない場合にも、呼出オーバヘッドの削減を行うことが可能となり、オブジェクトプログラムの処理性能の向上に寄与する。
【０００７】
【発明の実施の形態】
本発明は、同一関数の複数呼び出しを、一括処理する一括関数の呼び出しに変換する方式に関するものである。
以下では、本発明の１実施例を図面を用いて説明する。
尚、本発明は、ソースプログラムから変換後のソースプログラムを生成する場合にも、コンパイラが中間語から変換後の中間語に変換する場合にも、同様に適用可能であるが、実施例としてコンパイラに適用した場合（但し、中間語は同等なソースプログラムの形式で示す）を説明することにする。
【０００８】
図１は、本発明のコンパイル方法を実施するコンパイラが動作する計算機システムの構成図である。計算機システムは、ＣＰＵ１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４、外部記憶装置１０５より構成されている。
キーボード１０３より、ユーザからのコンパイラ起動命令を受け付ける。コンパイラ終了メッセージや、エラーメッセージは、ディスプレイ装置１０２に表示される。外部記憶装置１０５には、ソースプログラム１０６とオブジェクトプログラム１０７が格納される。
主記憶装置１０４には、コンパイラ１０８があり、コンパイル過程で必要となる中間語３、関数情報テーブル４、呼出情報テーブル５、一括呼出情報テーブル６、一括関数情報テーブル７が格納される。
コンパイル処理は、ＣＰＵ１０１によって、制御される。
【０００９】
図２に本実施例のコンパイラの処理手順を示す。
構文解析２０１では、ソースプログラム１０６を入力として字句構文解析を行ない、中間語３を出力する。
ループ展開処理２０２は中間後３を入力とし、反復処理を展開して反復回数を低減するループ展開を行い、中間語３を出力する。
一括関数化処理２は、中間語３を入力とし、複数の関数呼び出しを一括命令関数呼び出しに変換する一括関数化処理を行ない、中間語３を出力する。
コード生成処理２０３は、中間語を最終的なオブジェクトプログラム１０７の形式に変換する。
尚、ループ展開２０２は、本発明の適用機会を増やすため望ましい処理であるが、必須の処理ではない。
【００１０】
図３は、本発明における関数呼出一括化方法の１実施例を示すフローチャート図であり、図２の関数呼出一括化処理２の手順を表している。
先ず、関数情報テーブル生成処理２１により、ソースプログラム中の関数定義の各種情報を抽出し、関数情報テーブル４を作成する。同様に、呼出情報テーブル生成処理２２により、関数呼出に関する情報を抽出し、呼出情報テーブル５を生成する。
【００１１】
次に、一括呼出情報テーブル生成処理２３により、呼出情報テーブル５から複数の同一関数呼出を一括処理する一括関数に関する情報を抽出し、一括関数情報テーブル６を生成する。この一括呼出情報テーブル生成処理２３は、同一関数呼出に関する情報を抽出する同型呼出抽出処理２３０と、同型呼出集合から一括呼出化可能な呼出を抽出する一括呼出抽出処理２３１、抽出した一括呼出を一括呼出情報テーブルに登録する一括呼出情報テーブル登録処理２３２からなる。各処理に関しては図１７から図２３で詳しく述べる。
【００１２】
次に、一括関数生成処理２４により、一括関数情報テーブル７に基づき、中間後３に一括関数を生成する。
最後に、一括呼出化変換処理２５により、一括呼出情報テーブル６に基づき、中間語３中の関数呼出を一括関数呼出に変換する。
【００１３】
図４は、図３で示した関数呼出一括化関連処理と、入出力となる中間語やテーブル類の関係を示した処理構成図である。但し、中間語３は全般的に参照するため入出力関係は、主要なもののみを示した。
関数情報テーブル生成処理２１は、一括関数呼出化前中間語３１を入力とし、関数定義の情報を格納した関数情報テーブル４を生成する。関数情報テーブル４は、関数の一覧を格納する関数テーブル４１と、関数のインタフェースとなる仮引数および仮返数の情報を格納する仮パラメータテーブル４２から成る。
呼出情報テーブル生成処理２２は、一括呼出化前中間語３１を入力とし、関数呼出の情報を格納した呼出情報テーブル５を生成する。呼出情報テーブル５は、関数呼出の一覧を格納する呼出テーブル５１と、関数呼出のインタフェースとなる実引数および実返数の情報を格納する実パラメータテーブル５２から成る。
【００１４】
一括呼出化情報テーブル生成処理２３は、呼出情報テーブル５を入力とし、一括呼出化可能な関数呼出の情報を格納した一括呼出情報テーブル６と、一括呼出される関数定義の情報を格納した一括関数情報テーブル７を生成する。一括呼出情報テーブル６は、一括呼出化可能な呼出の一覧を格納する一括呼出テーブル６１と、一括呼出のインタフェースとなる実引数および実返数の情報を格納する実パラメータテーブル６２から成る。同様に、一括関数情報テーブル７は、一括呼出化される関数定義の一覧を格納する一括関数テーブル７１と、一括関数のインタフェースとなる仮引数および仮返数の情報を格納する仮パラメータテーブル７２から成る。
【００１５】
一括関数生成処理２４は、一括呼出化前中間語３１と一括関数情報テーブル７を入力とし、一括呼出化後中間語３２に一括関数を生成する。
一括呼出化変換処理２５は、一括呼出化前中間語３１と一括呼出情報テーブル６を入力とし、一括呼出化前中間語３１の関数呼出を一括関数呼出に変換し、一括呼出化後中間語３２に生成する。
【００１６】
次に、具体的な適用例の説明のため、処理対象たるソースプログラムの例を挙げておく。
図５は、本発明の一実施例の説明のためのソースプログラム例（Ｃ言語で書かれたプログラム例）である。
本実施例において、中間語３はソースプログラムと同等の情報を有しており特別に中間語の形式である必要はない。そこで、中間語３の例示に当たっては、ソースプログラムの形式で記述するものとする。従って、図５はソースプログラム例であるとともに、（一括呼出化前の）中間語３１の例ともなっている。
また、図２の説明でも述べたとおり、本実施例では（本質的には不要な）ループ展開を行っている。図５では、ループ展開は適用されていないが、ループ展開後に同一関数の呼出が生成される場合にも、一般性を失うことなく適用できる。
図５のプログラム例では、関数ｆ、ｇ、ｍａｉｎの３関数があり、関数ｍａｉｎが関数ｇを１回、関数ｇが関数ｆを２回呼び出している。１７行と２０行の関数ｆの呼出が、一括呼出可能な関数である。
【００１７】
図６は、図５のソースプログラム例に対する一括関数呼出化後のソースプログラム例であり、一括関数呼出化後中間語３２に対応している。図６では、図５にはなかった一括関数Ｆが新たに生成されている（３０行から３６行）。また、図５では関数ｇは関数ｆを２回呼び出していたが、図６では関数ｆの２回の呼出と同等の処理を行う一括関数Ｆの呼出１回（１６行）となっている。即ち、関数ｆの２回の呼出を一括関数Ｆの一回の呼出に変換しており、一括呼出化変換を行った結果の例である。
【００１８】
以降では、一括関数呼出化処理２の細部の説明を行なう。
説明にあたっては、図５の中間語を入力例とし、各種テーブルの出力例を逐次示していく。そこで、先ず、各種テーブルの構成例を説明してから、処理手順の説明を行なう。
以下、関数情報テーブル４、呼出情報テーブル５、一括呼出情報テーブル６、一括関数情報テーブル７の順にその構成例を述べる。
【００１９】
図７は、図５の例に対して求めた関数テーブル４１の構成例である。
関数テーブルは、プログラム中に出現する関数定義毎に、エントリが作成される。各関数には、一意な関数番号が付与されており、その関数番号により各エントリがアクセス可能となっている。各エントリは、関数番号欄４１１、関数名称欄４１２、定義行番号欄４１３、仮返数欄４１４、仮引数集合欄４１５、呼出集合欄４１６で構成される。
【００２０】
関数番号欄４１１には、関数テーブルのエントリ番号、関数名称欄４１２には、対応する関数の名称が格納される。
定義行番号欄４１３には、当該関数の中間語３での関数定義情報が格納される。この定義行番号欄により、対応する関数定義の全ての情報を得ることができる。例えば、関数の各種インタフェース情報の取得や、関数定義本体の読み出し／複写等も可能である。本実施例では、図７で示したように、ソースプログラムの行番号の形式で示してある。
仮返数欄４１４および仮引数集合欄４１５は、当該関数の仮返数および仮引数の情報が、仮パラメータテーブル４２のエントリ番号の形式で格納される。
呼出集合欄４１６は、当該関数中に存在する関数呼出の情報が、呼出テーブル５１のエントリ番号の形式で格納される。
【００２１】
図８は、図５の例に対して求めた仮パラメータテーブル４２の構成例である。
仮パラメータテーブルは、関数テーブル４１の関数インタフェース情報を格納するための補助テーブルである。仮返数や仮引数毎に、エントリが作成され、そのエントリ番号が関数テーブル４１の仮返数欄や仮引数集合欄に格納される。
各エントリは、仮パラメータ番号欄４２１、仮パラメータ位置番号欄４２２、仮パラメータ型欄４２３、仮パラメータ変数欄４２４で構成される。
【００２２】
仮パラメータ番号欄４２１には、仮パラメータテーブルのエントリ番号が格納される。
仮パラメータ位置番号欄４２２には、当該仮パラメータの出現位置が番号で示してある。仮返数の位置番号は０、ｉ番めの仮引数は位置番号ｉとなる。
仮パラメータ型欄４２３には、仮パラメータの型情報が格納される。
仮パラメータ変数欄４２４には、対応する仮パラメータの名称が格納される。
【００２３】
図９は、図５の例に対して求めた呼出テーブル５１の構成例である。
呼出テーブルは、プログラム中に出現する関数呼出毎に、エントリが作成される。各エントリは、呼出番号欄５１１、呼出行番号欄５１２、呼出関数番号欄５１３、実返数欄５１４、実引数集合欄５１５で構成される。
【００２４】
呼出番号欄５１１には、呼出テーブルのエントリ番号、呼出行番号欄５１２には、対応する関数呼出の行番号が格納される。
呼出関数番号欄５１３には、当該呼出が呼び出す関数が、関数テーブル４１の関数番号が格納される。
実返数欄５１４および実引数集合欄５１５は、当該呼出の実返数および実引数の情報が、実パラメータテーブル５２のエントリ番号の形式で格納される。
【００２５】
図１０は、図５の例に対して求めた実パラメータテーブル５２の構成例である。
実パラメータテーブルは、呼出テーブル５１の呼出インタフェース情報を格納するための補助テーブルである。実返数や実引数毎に、エントリが作成され、そのエントリ番号が呼出テーブル５１の実返数欄や実引数集合欄に格納される。各エントリは、実パラメータ番号欄５２１、実パラメータ位置番号欄５２２、実パラメータ式欄５２２で構成される。
【００２６】
実パラメータ番号欄５２１には、実パラメータテーブルのエントリ番号が格納される。
実パラメータ位置番号欄５２２には、当該実パラメータの出現位置が番号で示してある。実返数の位置番号は、（仮パラメータテーブル４２の仮パラメータ位置番号欄４２２と同様に）０、ｉ番めの実引数は位置番号ｉとなっている。
実パラメータ式欄５２３には、対応する実パラメータの名称が格納される。
【００２７】
図１１は、図５の例に対して求めた一括呼出テーブル６１の構成例である。
一括呼出テーブルは、一括関数の（一括）呼出毎に、エントリが作成される。各エントリは、一括呼出番号欄６１１、生成元呼出集合欄６１２、一括関数番号欄６１３、実返数名称欄６１４、実返数型欄６１５、実返数集合欄６１６、実引数集合欄６１７で構成される。
【００２８】
一括呼出番号欄６１１には、一括呼出テーブルのエントリ番号が格納される。
生成元呼出集合欄６１２には、一括呼出化する呼出の集合が、呼出テーブル５１のエントリ番号の形式で格納される。
一括関数番号欄６１３には、当該一括呼出が呼び出す一括関数が、一括関数テーブル７１のエントリ番号（一括関数関数番号）で格納される。
実返数名称欄６１４および実返数型欄６１５には、返数の名称および返数の型が格納される。
実返数集合欄６１６および実引数集合欄６１７は、当該一括呼出の実返数および実引数の情報が、一括実パラメータテーブル６２のエントリ番号の形式で格納される。
【００２９】
図１２は、図５の例に対して求めた一括実パラメータテーブル６２の構成例である。
一括実パラメータテーブルは、一括呼出テーブル６１の呼出インタフェース情報を格納するための補助テーブルである。実返数や実引数毎に、エントリが作成され、そのエントリ番号が一括呼出テーブル６１の実返数欄や実引数集合欄に格納される。各エントリは、一括実パラメータ番号欄６２１、一括実パラメータ位置番号欄６２２、生成元実パラメータ番号欄６２３、変換前名称欄６２４、変換後名称欄６２５で構成される。
【００３０】
一括実パラメータ番号欄６２１には、一括呼出実パラメータテーブルのエントリ番号が格納される。
一括実パラメータ位置番号欄６２２には、当該実パラメータの出現位置が番号で示してある。
生成元呼出集合欄６２３には、一括化する呼出が、呼出テーブル５１のエントリ番号の集合形式で格納される。
変換前名称欄７２４には、生成元呼出における実パラメータ名称、変換後名称欄７２５には、一括呼出化後の（一括）実パラメータ名称がそれぞれ格納される。尚、変換前名称欄７２４と変換後名称欄７２５は、実返数に対してのみ有効な欄である（実引数に関しては、常に空白となる）。
【００３１】
図１３は、図５の例に対して求めた一括関数テーブル７１の構成例である。
一括関数テーブルは、一括化関数生成を行う関数毎に、エントリが作成される。各関数には、一意な一括関数番号が付与されており、その一括関数番号により各エントリがアクセス可能となっている。各エントリは、一括関数番号欄７１１、一括関数名称欄７１２、一括化係数欄７１３、生成元関数番号欄７１４、仮返数型欄７１５、仮返数名称欄７１６、仮返数集合欄７１７、仮引数数集合欄７１８で構成される。
【００３２】
一括関数番号欄７１１には、一括関数テーブルのエントリ番号、
一括関数名称欄７１２には、生成する一括関数の名称が格納される。
一括化係数欄７１３には、何回の呼出を一括化するかの個数が格納される。
生成元関数番号欄７１４には、一括化する関数が関数テーブル４１の関数番号の形式で格納される。
仮返数型欄７１５および仮返数名称欄７１６には、返数の型および返数の名称が格納される。
仮返数集合欄７１７および仮引数集合欄７１８は、当該一括関数の仮返数および仮引数の情報が、一括仮パラメータテーブル７２のエントリ番号の形式で格納される。
【００３３】
図１４は、図５の例に対して求めた一括仮パラメータテーブル７２の構成例である。
一括仮パラメータテーブルは、一括関数テーブル７１の関数インタフェース情報を格納するための補助テーブルである。仮返数や仮引数毎に、エントリが作成され、そのエントリ番号が一括関数テーブル７１の仮返数集合欄や仮引数集合欄に格納される。各エントリは、一括仮パラメータ番号欄７２１、生成元仮パラメータ番号欄７２２、一括仮パラメータ位置番号欄７２３、反復番号欄７２４、変換前名称欄７２５、変換後名称欄７２６で構成される。
【００３４】
一括仮パラメータ番号欄７２１には、一括仮パラメータテーブルのエントリ番号が格納される。
生成元仮パラメータ番号欄７２２には、生成元関数の対応する仮パラメータが、仮パラメータテーブル４２の仮パラメータ番号の形式で格納される。
一括仮パラメータ位置番号欄７２３には、当該仮パラメータの出現位置が番号で示してある。一括仮パラメータ位置番号は、仮返数と仮引数は独立に数えられ、ｉ番めの仮返数／仮引数は位置番号ｉとなる。
【００３５】
反復番号欄７２４には、一括化の際に何番めの関数の仮パラメータであったかが格納される。この反復番号は０から数え始め、一括化係数がｎのときｎ−１までの番号が付与されることになる。
変換前名称欄７２５には、生成元関数における仮パラメータ名称、変換後名称欄７２６には、一括関数化後の（一括）仮パラメータ名称がそれぞれ格納される。
以上で、本実施例で用いる各種テーブル構成の説明を終る。
【００３６】
以下、これらのテーブルを生成／参照する各種処理の説明を順に行なう。
図１５は、関数情報テーブル生成処理２１のフローチャート図である。関数情報テーブル生成処理は、中間語３を逐次走査し、関数定義を検出したらその関数定義情報を収集・登録した関数情報テーブル４を生成する。以下、その手順を説明する。
【００３７】
先ず、関数番号ｆｉ、仮パラメータ番号ｆｐｉを０で初期化する（ステップ１５０１）。
次に、未処理関数があるか否かを判定（ステップ１５０２）し、未処理関数がなくなるまで、ステップ１５０３以下の処理を行なう。
未処理関数ｆがある場合には、先ず、関数エントリＦを生成し、関数番号ｆｉをインクリメントする（ステップ１５０３）。以下、ステップ１５０４以降でこの関数エントリＦに関数ｆの関数情報を格納する。
【００３８】
先ず、ｆの定義行番号をｆｌ、関数名をｆｎとする（ステップ１５０４）。次に、仮パラメータ集合ＦＰＳを求めるため、ＦＰＳを空集合で初期化する（ステップ１５０５）。そして、未処理仮パラメータがあるか否かを判定（ステップ１５０６）し、未処理仮パラメータがなくなるまで、ステップ１５０７以下の処理を行なう。
未処理仮パラメータｆｐがある場合には、仮パラメータエントリＦＰを生成し、仮パラメータ番号ｆｐｉをインクリメントする（ステップ１５０７）。
【００３９】
次に、ｆｐの仮パラメータ情報を仮パラメータテーブル４２に格納（ステップ１５０８）し、そのエントリ番号ｆｐｉを仮パラメータ集合ＦＰＳに加える（ステップ１５０９）。以下、未処理仮パラメータがなくなるまで、ステップ１５０６からステップ１５０９を反復実行する。尚、ステップ１５０８は仮パラメータ情報である、仮パラメータ番号、仮パラメータ位置、仮パラメータ種別、仮パラメータ型、仮パラメータ名称をエントリＦＰに格納するが、詳細は略す（図８の仮パラメータテーブル４２の説明を参照）。
【００４０】
ステップ１５０６の判定がｎｏとなった時点で、仮パラメータ集合ＦＰＳの収集が終わるので、Ｆに全ての関数情報を格納（ステップ１５１０）して、次の未処理関数判定（ステップ１５０２）を行う。全ての関数を処理し終わった時点で処理を終了する。
【００４１】
図７および図８は、図５で示されたソースプログラムに対し、上記の処理を行なった結果を示す関数情報テーブルの例となっている。
例えば、エントリ４１７は、図５の００３行から００８行までで定義されている関数ｆの情報が格納されている。また、仮返数欄により、名称ｒで仮パラメータ位置０（＝仮返数）、仮パラメータ型がｉｎｔである仮返数があることが分かる。
【００４２】
図１６は、呼出情報テーブル生成処理２２のフローチャート図である。
呼出情報テーブル生成処理は、中間語３を逐次走査し、関数呼出を検出したらその呼出情報を収集・登録した呼出情報テーブル５を生成する。以下、その手順を説明する。
【００４３】
先ず、呼出番号ｃｉ、実パラメータ番号ａｐｉを０で初期化する（ステップ１６０１）。
次に、未処理関数があるか否かを判定（ステップ１６０２）し、未処理関数がなくなるまで、ステップ１６０３以下の処理を行なう。
未処理関数ｆがある場合には、先ず、その関数エントリをＦとし（ステップ１６０３）、呼出集合ＣＳを空集合で初期化する（ステップ１６０４）。
次に、ｆに未処理の関数呼出があるか否かを判定（ステップ１６０５）し、存在する場合には、ステップ１６０６以降で呼出情報の登録を行う。
呼出情報の登録に当たっては、先ず、呼出エントリＣを生成し、呼出番号ｃｉをインクリメントする（ステップ１６０６）。
次に、呼出行番号ｃｌ、呼出関数番号ｆｉを求める（ステップ１６０７）。尚、呼出関数番号ｆｉの取得は、関数情報テーブル４１を検索することで容易に実現できる（関数情報テーブルに存在しない場合には空欄としておき、一括化対象から外す）。
【００４４】
次に、実パラメータ集合ＡＰＳを求めるため、ＡＰＳを空集合で初期化する（ステップ１６０８）。そして、未処理実パラメータがあるか否かを判定（ステップ１６０９）し、未処理実パラメータがなくなるまで、ステップ１６１０以下の処理を行なう。
即ち、未処理実パラメータａｐがある場合には、実パラメータエントリＡＰを生成し、実パラメータ番号ａｐｉをインクリメント（ステップ１６１０）後、ａｐの実パラメータ情報を実パラメータテーブル５２に格納（ステップ１６１１）し、そのエントリ番号ａｐｉを実パラメータ集合ＡＰＳに加える（ステップ１６１２）。尚、ステップ１６１１は、実パラメータ情報である、実パラメータ番号、実パラメータ位置番号、実パラメータ式をエントリＡＰに格納するが、詳細は略す（図１４の実パラメータテーブル５２の説明を参照）。
【００４５】
ステップ１６０９の判定がｎｏとなった時点で、実パラメータ集合ＡＰＳの収集が終わるので、Ｃに全ての呼出情報を格納（ステップ１６１３）する （実パラメータ集合ＡＰＳは、実返数と実引数を合わせたもので、呼出情報テーブルの実返数欄と実引数欄に格納する）。その後、 ＣＳにｃｉを加え（ステップ１６１４）、次の未処理呼出判定（ステップ１６０５）を行う。ステップ１６０５の判定がｎｏとなった段階で、関数ｆにおける全ての呼出を処理し終わるので、Ｆの呼出集合欄にＣＳを格納（ステップ１６１５）し、次の未処理関数の判定（ステップ１６０２）に進む。全ての関数を処理し終わった時点で処理を終了する。
【００４６】
図９および図１０は、図５のソースプログラムの例に対し、上記の処理を行なった結果を示す呼出情報テーブル５の例となっている。例えば、図９のエントリ５１６は、１７行目の関数ｆの呼出情報を格納したものである。この呼出では、実引数として（ｐ＊ｐ，ｑ＊ｑ）を渡し、実返数ｒ１に返却値が格納されることが分かる。
【００４７】
図１７は、一括呼出化情報テーブル生成処理２３のフローチャート図である。
一括呼出化情報テーブル生成処理は、呼出情報テーブル５１を逐次走査し、一括呼出化可能な呼出を検出したら、その一括呼出情報を収集・登録した一括呼出情報テーブル６および一括関数情報テーブル７を生成する。以下、その手順を説明する。
【００４８】
先ず、一括呼出番号ａｃｉ、一括実パラメータ番号ａａｐｉ、一括関数番号ａｆｉ、一括実パラメータ番号ａｆｐｉを０で初期化する（ステップ１７０１）。次に、未処理関数エントリがあるか否かを判定（ステップ１７０２）し、未処理関数エントリがなくなるまで、ステップ１７０３以下の処理を行なう。
未処理関数エントリＦがある場合には、先ず、その呼出集合をＣＳとする（ステップ１７０３）。
【００４９】
次に、ＣＳから同一関数の呼出の集合である同型呼出集合ＳＣＳの抽出処理（ステップ１７０４からステップ１７１１）に移る。この同型呼出集合ＳＣＳの抽出処理は、図３のステップ２３０に相当する。
先ず、ＣＳをワーク集合ＷＣＳに格納し、ＳＣＳを空集合で初期化する（ステップ１７０４）。
次に、ＣＳに未処理の呼出エントリＣがあるか否かを判定（ステップ１７０５）し、存在する場合には、Ｃの呼出番号ｃｉと呼出関数番号ｆｉを取得（ステップ１７０６）し、ＷＣＳからｃｉを除く（ステップ１７０７） 。
次に、ＷＣＳに未処理エントリＷＣがあるかどうかを判定（ステップ１７０８）し、存在する場合には、ＷＣの呼出番号ｗｃｉと呼出関数番号ｗｆｉを取得（ステップ１７０９）する。
そして、ｆｉとｗｆｉの一致判定（ステップ１７１０）により、同一関数の呼出であるかを調べる。同一関数である場合には、ＳＣＳにｗｃｉを加えて（ステップ１７１１）からステップ１７０８に進む。
【００５０】
ステップ１７０８で全てのワーク呼出集合の要素を判定した時点で、同型呼出集合ＳＣＳの抽出が完了する。
ここで、ＳＣＳが複数要素を持つか否かを判定（ステップ１７１２）し、複数存在する場合にのみ、一括呼出化情報抽出処理（ステップ２３１。詳細は図１８を参照）を実行し、ステップ１７０５以降で次の同型呼出集合ＳＣＳの処理に進む。
ステップ１７０５で全エントリを処理したら、ステップ１７０２に進み、次の関数エントリを処理する。
全ての関数エントリを処理しおわった時点で、一括呼出化情報テーブル生成処理を終了する。
【００５１】
図１８は、一括呼出化情報抽出処理２３１のフローチャート図である。一括呼出化情報抽出処理は、与えられた同型呼出集合ＳＣＳから、一括呼出化可能な呼出を集めた一括呼出集合ＡＳＣＳを抽出し、一括呼出情報テーブル６および一括関数情報テーブル７を生成する。以下、その手順を説明する。
先ず、ＳＣＳに未処理の呼出エントリＳＣがあるか否かを判定（ステップ１８０１）し、存在する場合には、Ｃの呼出番号ｓｃｉを取得（ステップ１８０２）する。
次に、ＳＣＳをワーク集合ＷＳＣＳに格納し、ＡＳＣＳを空集合で初期化（ステップ１８０３）後、ＷＳＣＳからｓｃｉを除く（ステップ１８０４） 。
次に、ＷＳＣＳに未処理エントリＷＳＣがあるかどうかを判定（ステップ１８０５）し、存在する場合には、ＷＳＣの呼出番号ｗｓｃｉを取得（ステップ１８０６）する。
【００５２】
そして、ｓｃｉとｗｓｃｉが一括呼出化可能であるかを判定（ステップ１８０７）し、可能である場合には、ＡＳＣＳにｗｓｃｉを加える（ステップ１８０８）。尚、この一括呼出化の可能性判定は、ｗｓｃｉの呼出が、ｓｃｉの呼出行番号の位置に移動可能か等により判定するが、本発明には直接関係しないので詳細は略す。
その後、ステップ１８０５に進み、次のＷＳＣの要素を調べる。
ステップ１８０５で全てのワーク呼出集合ＷＳＣＳの要素を判定した時点で、一括化呼出集合ＡＳＣＳの抽出が完了する。
ここで、ＡＳＣＳが複数要素を持つか否かを判定（ステップ１８０９）し、複数存在する場合にのみ、一括呼出化情報登録処理（ステップ２３２。詳細は図１９を参照）を実行する。
次に、ＳＣＳからＡＳＣＳを除き（ステップ１８１０）、ステップ１８０１以降で次の同型呼出集合ＳＣＳの要素の処理に進む。
ステップ１８０１で全エントリを処理しおわった時点で、一括呼出化情報抽出処理を終了する。
【００５３】
図１９は、一括呼出化情報登録処理２３２のフローチャート図である。一括呼出化情報登録処理は、与えられた一括呼出集合ＡＳＣＳから、一括呼出情報テーブル６および一括関数情報テーブル７を生成する。以下、その手順を説明する。
先ず、一括呼出エントリＡＣを作成して、ａｃｉをインクリメント（ステップ１９０１）後、ＡＳＣＳをＡＣの生成元呼出集合欄に格納する（ステップ１９０２）。
次に、ＡＳＣＳの（任意の要素の）呼出関数番号をｃｉ、要素数をａｆｋとする（ステップ１９０３）。
そして、 ＡＳＣＳから変数となる型ａｒｔを生成（ステップ１９０４）し、ＡＣの返数型欄に格納（ステップ１９０５）する。尚、 ａｒｔは、本実施例では配列型としたが、生成元呼出集合の全ての返数が表現できる型であれば何でもよい。 その生成方法は、本発明にとって本質的ではないので詳細は略す。
【００５４】
次に、一意な名称ａｃｎを生成し、ＡＣの実返数名称欄に格納（ステップ１９０６）後、一括呼出実引数登録処理（ステップ２３３。詳細は図２０）、一括呼出実返数登録処理（ステップ２３４。詳細は図２１）を行って、一括呼出情報テーブルへの登録を完了する。
【００５５】
次に、一括関数情報テーブルへの登録を行う。
先ず、一括関数エントリＡＦを作成して、ａｆｉをインクリメントする（ステップ１９１１）。
次に、ａｒｔをＡＦの返数型欄に格納（ステップ１９１２）する。
次に、一意な名称ａｆｎを生成し、ＡＦの仮返数名称欄に格納（ステップ１９１３）後、一括化係数欄にａｆｋを格納する（ステップ１９１４）。
最後に、一括関数仮引数登録処理（ステップ２３５。詳細は図２２）、一括関数仮返数登録処理（ステップ２３６。詳細は図２３）を行って、一括関数情報テーブルへの登録を完了する。
以上で、一括呼出情報テーブルと一括関数情報テーブルへの登録が完了するので、一括化呼出情報登録処理を終了する。
【００５６】
図２０は、一括呼出実返数登録処理２３３のフローチャート図である。一括呼出実返数登録処理は、一括呼出テーブルの各エントリにある生成元呼出集合から一括実パラメータテーブル６２を生成し、一括呼出テーブル６１の一括呼出実返数集合欄６１６に登録する。以下、その手順を説明する。
先ず、一括呼出実返数集合ＡＡＲＳを空集合で初期化する（ステップ２００１）。また、一括呼出実返数位置番号ａａｐｒも０で初期化する（ステップ２００２）。
【００５７】
そして、ＡＣの生成呼出元集合をＡＣＳ（ステップ２００３）として、ＡＣＳに未処理の呼出Ｃが存在かを判定（ステップ２００４）し、存在するときは、ステップ２００５からステップ２０１３を反復実行する。
この反復処理では、Ｃの実返数集合をＡＲＳ（ステップ２００５）とし、ＡＲＳに未処理の実返数ＡＲが存在かを判定（ステップ２００６）し、存在するときは、ステップ２００７からステップ２０１２を反復実行する。
この反復処理では、先ず、ａａｐｒをインクリメントする（ステップ２００７）。
次に、ＡＲの実パラメータ番号と名称を、それぞれａｒｉ、ａｒｎとする（ステップ２００８）。
次に、一括呼出実返数名称ａａｒｎを生成（ステップ２００９）する。
次に、一括呼出実パラメータエントリＡＡＰを生成し、ａａｐｉをインクリメント（ステップ２０１０）する。
【００５８】
次に、ＡＡＰに一括呼出実返数情報を登録（ステップ２０１１）後、ＡＡＲＳにａａｒｉを加える（ステップ２０１２）。
ステップ２００６の判定でｎｏとなったとき、全ての実返数の処理が終了するので、ＡＡＲＳをＡＣの一括呼出実返数集合欄に格納（ステップ２０１３）後、次のＡＣＳの処理を行う。
ＡＣＳの全ての呼出エントリを処理し終えた時点で、一括呼出実返数登録処理２３３が終了する。
【００５９】
図２１は、一括呼出実引数登録処理２３４のフローチャート図である。一括呼出実引数登録処理は、一括呼出テーブルの各エントリにある生成元呼出集合から一括実パラメータテーブル６２を生成し、一括呼出テーブル６１の一括呼出実引数集合欄６１７に登録する。以下、その手順を説明する。
【００６０】
先ず、一括呼出実引数集合ＡＡＡＳを空集合で初期化する（ステップ２１０１）。また、一括呼出実引数位置番号ａａｐａも０で初期化する（ステップ２１０２）。
そして、ＡＣの生成呼出元集合をＡＣＳ（ステップ２１０３）として、ＡＣＳに未処理の呼出Ｃが存在かを判定（ステップ２１０４）し、存在するときは、ステップ２1０５からステップ２１１３を反復実行する。
この反復処理では、Ｃの実引数集合をＡＰＳ（ステップ２１０５）とし、ＡＰＳに未処理の実引数ＡＰが存在かを判定（ステップ２１０６）し、存在するするときは、ステップ２１０７からステップ２１１２を反復実行する。
この反復処理では、先ず、ａａｐaをインクリメントする（ステップ２１０７）。
【００６１】
次に、ＡＰの実パラメータ番号と名称を、それぞれａｐｉ、ａｐｎとする（ステップ２１０８）。
次に、一括呼出実引数名称ａａｐｎを生成（ステップ２１０９）する。
次に、一括呼出実パラメータエントリＡＡＰを生成し、ａａｐｉをインクリメント（ステップ２１１０）する。
次に、ＡＡＰに一括呼出実引数情報を登録（ステップ２１１１）後、ＡＡＡＳにａａｐｉを加える（ステップ２１１２）。
ステップ２１０６の判定でｎｏとなったとき、全ての実引数の処理が終了するので、ＡＡＡＳをＡＣの一括呼出実返数集合欄に格納（ステップ２０１３）後、次のＡＣＳの処理を行う。
ＡＣＳの全ての呼出エントリを処理し終えた時点で、一括呼出実引数登録処理２３４が終了する。
【００６２】
図１１および図１２は、図９および図１０で示された呼出情報テーブル５を入力とし、図２０および図２１の処理を行なった結果を示す一括呼出情報テーブル６の例となっている。
例えば、図１１のエントリ６１８は、図９に示された呼出テーブル５１のエントリ５１６とエントリ５１７の呼出が一括呼出化可能であることを示している。この一括呼出は、実引数として（ｐ＊ｐ，ｑ＊ｑ，ｐ＊ｑ ，ｑ＊ｐ ）を渡し、型がｉｎｔの配列である実返数ａｒｆに返却値を格納すればよいことが分かる。
【００６３】
図２２は、一括関数仮返数登録処理２３５のフローチャート図である。一括関数仮返数登録処理は、一括関数テーブルの各エントリにある生成元関数番号と一括化係数から、一括仮パラメータテーブル７２を生成し、一括関数テーブル７１の一括関数仮返数集合欄７１７に登録する。以下、その手順を説明する。
先ず、一括関数仮返数集合ＡＦＲＳを空集合で初期化する（ステップ２２０１）。また、一括関数仮返数位置番号ａｆｐｒも０で初期化する（ステップ２２０２）。
次に、ＡＦの一括化係数をａｆｋ、ＡＦの生成元関数エントリをＦとする（ステップ２２０３。両者は、既に一括呼出化常用登録処理で算出済み）。
さらに、反復回数ｉを０で初期化（ステップ２２０４）後、 ｉがａｆｋと等しいかどうかを判定（ステップ２２０５）することで、ｉがａｆｋと等しくなるまで、 ステップ２２０６からステップ２２１２を反復実行する。
この反復処理では、先ず、ｉをインクリメントする（ステップ２２０６）。
次に、ａｆｐｒをインクリメントする（ステップ２２０７）。
【００６４】
次に、ＡＦの仮パラメータ番号と名称を、それぞれｆｐｉ、ｆｐｎとする（ステップ２２０８）。
次に、一括関数仮返数名称ａｆｐｎを生成（ステップ２２０９）する。
次に、一括関数仮パラメータエントリＡＦＰを生成し、ａｆｐｉをインクリメント（ステップ２２１０）する。
次に、ＡＦＰに一括関数仮返数情報を登録（ステップ２２１１）後、ＡＦＲＳにａｆｐｉを加える（ステップ２２１２）。
ステップ２２０５の判定でｎｏとなったとき、ＡＦＲＳをＡＦの一括関数仮返数集合欄に格納（ステップ２２１３）し、一括関数仮返数登録処理２３５が終了する。
【００６５】
図２３は、一括関数仮引数登録処理２３６のフローチャート図である。一括関数仮引数登録処理は、一括関数テーブルの各エントリにある生成元関数番号と一括化係数から、一括仮パラメータテーブル７２を生成し、一括関数テーブル７１の一括関数仮引数集合欄７１８に登録する。以下、その手順を説明する。
先ず、一括関数仮引数集合ＡＦＡＳを空集合で初期化する（ステップ２３０１）。また、一括関数仮引数位置番号ａｆｐａも０で初期化する（ステップ２３０２）。
次に、ＡＦの一括化係数をａｆｋ、ＡＦの生成元関数エントリをＦとする（ステップ２３０３。両者は、既に一括呼出化常用登録処理で算出済み）。
【００６６】
さらに、反復回数ｉを０で初期化（ステップ２３０４）後、 ｉがａｆｋと等しいかどうかを判定（ステップ２３０５）することで、ｉがａｆｋと等しくなるまで、 ステップ２３０６からステップ２３１５を反復実行する。
この反復処理では、先ず、 ｉをインクリメントする（ステップ２２０６）。次に、Ｆの仮引数集合をＦＡＳ（ステップ２３０７）とし、ＦＡＳに未処理の仮引数ＦＡが存在かを判定（ステップ２３０８）し、存在するするときは、ステップ２３０９からステップ２３１４を反復実行する。
この反復処理では、先ず、ａｆｐａをインクリメントする（ステップ２３０９）。
次に、ＡＦの仮パラメータ番号と名称を、それぞれｆｐｉ、ｆｐｎとする（ステップ２３１０）。
【００６７】
次に、一括関数仮引数名称ａｆｐｎを生成（ステップ２３１１）する。
次に、一括関数仮パラメータエントリＡＦＰを生成し、ａｆｐｉをインクリメント（ステップ２３１２）する。
次に、ＡＦＰに一括関数仮引数情報を登録（ステップ２３１３）後、ＡＦＡＳにａｆｐｉを加える（ステップ２３１４）。
ステップ２３０８の判定でｎｏとなったとき、全ての仮引数の処理が終了するので、ＡＦＡＳをＡＦの一括関数仮引数集合欄に格納（ステップ２３１５）後、
次の反復処理を行う。
ｉとａｆｋが一致するまで、一括化係数分反復実行した時点で、一括関数仮引数登録処理２３６が終了する。
【００６８】
図１３および図１４は、図７から図１０に示された関数情報テーブル４および呼出情報テーブル５を入力とし、図１７から図２３の処理を行なった結果を示す一括関数情報テーブル７の例となっている。
例えば、図１３のエントリ７１９は、図７に示された関数テーブル４１のエントリ４１７を、一括化係数２で一括関数化したものであることを示している。この一括関数は、仮引数として（ｘ０，ｙ０，ｘ１，ｙ１ ）を渡され、型がｉｎｔの配列である仮返数ｆｒｆを返却する。
以上で、一括呼出化情報テーブル生成処理２３の説明を終える。
一括呼出化情報テーブル生成処理２３の後、一括化関数生成処理２４、一括呼出化変換処理２５を行う。以下順に説明する。
【００６９】
図２４は、一括関数生成処理２４のフローチャート図である。
一括関数生成処理は、一括関数情報テーブル７の各エントリから、中間語３中に一括関数を生成する。以下、その手順を説明する。
未処理の一括関数エントリＡＦがあるかどうかを調べ（ステップ２４０１）、存在する全ての一括関数エントリに対し、ステップ２４０２以下の処理を行う。
先ず、ＡＦの生成元関数番号をｆｉ、ＡＦの一括化係数をａｆｋとする（ステップ２４０２）。
次に、ＡＦの仮返数集合ＡＦＲＳから、一括関数仮返数定義を生成する（ステップ２４０３）。
次に、ＡＦの仮引数集合ＡＦＡＳから、一括関数仮引数定義を生成する（ステップ２４０４）。
以上で、一括関数の呼出インタフェースの生成が完了するので、次に、ステップ２４０６からステップ２４１３で一括関数本体を生成する。
【００７０】
先ず、定義部反復回数ｍを０で初期化（ステップ２４０５）後、ｆｉの定義部ＦＢをコピーする（ステップ２４０６）。
次に、このコピーされた領域ＦＢ中の仮パラメータの変換を行う。
先ず、ＡＦの仮返数集合ＡＦＲＳと仮引数集合ＡＦＡＳの和集合を一括関数仮パラメータ集合ＡＦＰＳとする（ステップ２４０７）。
ＡＦＰＳに未処理の仮パラメータエントリＡＦＰがあるか否かを判定（ステップ２４０８）し、存在する場合はステップ２４０９以降で仮パラメータの変換を行う。
【００７１】
先ず、ＡＦＰの変換前名称をｂｃｎ、変換後名称をａｃｎとする（ステップ２４０９）。
次に、ＦＢに出現する名称ｂｃｎをａｃｎに変換する（ステップ２４１０）後、さらに次の仮パラメータの変換のため、ステップ２４０８に進む。
ＡＦＰＳの全要素の処理が終わったら、ｍをインクリメント（ステップ２４１１）し、一括化係数ａｆｋと一致するか否かを判定する（ステップ２４１２）。
一致しない間は、ステップ２４０６に進み反復実行し、ｍがａｆｋと一致したら、ＡＦの仮返数名称を用いて一括関数仮返数返却を生成（ステップ２４１３）し、ステップ２４０１に進んで次の一括関数エントリの処理を行う。
全ての一括関数エントリの処理が終わった時点で、一括関数生成処理が終了する。
【００７２】
図６は、図１３および図１４に示された一括関数情報テーブル７を入力とし、図２４の処理を行なった結果を示す（ソースプログラム形式による）中間語の例となっている。図６の３０行から３６行に、図１３のエントリ７１９で示された一括関数が生成されている。３２行には、一括関数仮返数定義が、３５行には一括関数仮返数返却分が、それぞれ生成されている。
【００７３】
図２５は、一括呼出化変換処理２５のフローチャート図である。
一括呼出化変換処理は、一括呼出情報テーブル６を使って、中間語３中の一括化可能同型呼出を、一括呼出に変換する。以下、その手順を説明する。
未処理の一括呼出エントリＡＣがあるかどうかを調べ（ステップ２５０１）、存在する全ての一括呼出エントリに対し、ステップ２５０２以下の処理を行う。
先ず、ＡＣの実返数名称から、一括呼出実返数定義を生成する（ステップ２５０２）。
次に、ＡＣの生成元呼出集合をＣＳ、ＡＣの実返数集合をＡＡＰＳとする（ステップ２５０３）。
次に、ＣＳの任意の要素Ｃを取り出し、呼出関数番号ｆｉを取得する（ステップ２５０４）。
【００７４】
次に、Ｃの呼出行番号から一括呼出生成位置ａｃｐを決定する（ステップ２５０５）。この一括呼出生成位置は、一括呼出化の可能性の判定により保証された場所ならば、何処でもよいが、本実施例では、便宜上、最初の呼出位置の直前とする。
次に、ＡＣから一括呼出を作成し、ａｃｐに生成する（ステップ２５０６）。尚、一括呼出の作成は、一括呼出実返数名称、一括関数番号、一括呼出実引数集合により容易に作成できるので、詳細は略す。
次に、ＣＳに未処理の呼出エントリＣがあるかどうかを判定（ステップ２５０７）し、存在する場合は、Ｃの呼出行番号を見て呼出を削除する（ステップ２５０８）。
【００７５】
ＣＳの全ての呼出を削除したら、ＡＡＲＳに未処理の一括呼出実引数エントリＡＡＲがあるかどうかを判定（ステップ２５０９）し、存在する場合には、ステップ２５１０からステップ２５１１で、実返数の変換を行う。
ＡＡＲの変換前名称をｂｃｎ、変換後名称をａｃｎ（ステップ２５１０）とし、ｆｉの関数本体領域に出現するｂｃｎをａｃｎに変換する（ステップ２５１１）。
ステップ２５０９の判定のｎｏとなったとき、全ての一括呼出実返数の変換が終わり、ＡＣに関する変換処理が終了する。
その後、ステップ２５０１に進み、次の一括呼出エントリの一括呼出化変換処理を行う。
全ての一括呼出エントリの処理が終わった時点で、一括呼出化変換処理が終了する。
【００７６】
図６は、図１３および図１４に示された一括呼出情報テーブル６を入力とし、図２５の処理を行なった結果を示す（ソースプログラム形式による）中間語の例となっている。
図５の１７行と２１行の２つの関数呼出が、図６では１６行の一括呼出へと変換されている。また、１４行には、一括呼出実返数定義生成されている。
本実施例によれば、関数呼出の回数を低減するにより、呼出オーバヘッドの削減を行うことが可能となり、オブジェクトプログラムの処理性能の向上に寄与する。
【００７７】
図２６に本発明の他の本実施例のコンパイラの処理手順を示す。図２６は、ループ展開時に一括関数呼出化する第２の実施例と、ループ並列化時に一括関数呼出化する第３の実施例に共通のコンパイラの処理手順である。
構文解析２０１とコード生成処理２０３は図のそれと同様なので説明は省略する。
ループ展開ないしループ並列化と一括関数呼出化処理２０５は中間後３を入力とし、反復処理を直列／並列展開するループ展開／ループ並列化を行い、一括関数呼出化変換を行った中間語３を出力する。ループ展開の場合が第２実施例、ループ並列化の場合が第３実施例となる。尚、処理の大部分とテーブル構成等は、第１の実施例と同様であるため、以下では、概略のみを説明する。
【００７８】
図２７は、本発明の第２の実施例であるループ展開時に一括関数呼出化する場合の図２６のステップ２０５の処理手順を示すフローチャート図である。以下順に説明する。
先ず、関数情報テーブル生成処理２７０１により、ソースプログラム中の関数定義の各種情報を抽出し、関数情報テーブル４を作成する。
次に、未処理のループＬが存在するか否かを判定（ステップ２７０２）し、存在する場合にはステップ２７０３からステップ２７１０までを反復実行する。
この反復処理では、先ずＬがループ展開可能であるかどうかを判定（ステップ２７０４）し、存在する場合にはステップ２７０５からステップ２７１０までを反復実行する。
【００７９】
この反復処理では、先ずＬをｎ回ループ展開を行う（ステップ２７０４）。
次に、呼出情報テーブル生成処理（ステップ２７０５）を行い、関数呼出に関する情報を抽出し、呼出情報テーブル５を生成する。
次に、Ｌからループ展開によって生成されたｎ個の同一関数の呼出を同型呼出集合ＳＣＳとする（ステップ２７０６）。
次に、同型呼出集合ＳＣＳから一括呼出化可能な呼出を抽出する一括呼出抽出処理（ステップ２７０７）を行い、抽出した一括呼出を一括呼出情報テーブルに登録する（ステップ２７０８）。
ステップ２７０２でｎｏとなった時、全てのループに対して処理を終え、一括関数生成処理（ステップ２７０９）、一括呼出化変換処理（ステップ２７１０）を行い、処理を終了する。
【００８０】
尚、以下に図２７のステップと図３のステップの対応関係を示す。以下の各ステップの処理内容は、括弧内で示した図３のステップと同様の処理である。
ステップ２７０１（図３のステップ２１）
ステップ２７０５（図３のステップ２２）
ステップ２７０９（図３のステップ２３１）
ステップ２７１０（図３のステップ２３２）
ステップ２７１１（図３のステップ２４）
ステップ２７１２（図３のステップ２５）
【００８１】
図２８は、本発明の第２および第３実施例の説明のためのソースプログラム例である。本実施例においても、中間語３ソースプログラムの形式で記述するものとする。従って、図２８はソースプログラム例であるとともに、（一括呼出化前の）中間語３１の例ともなっている。図２８のプログラム例では、関数ｇの１６行から２２行に、関数ｆを呼び出すループが存在する。
【００８２】
図２９は、図２７のステップ２７０４でループ展開した段階の中間語３を、ソースプログラム形式で表現したものである。図２８の１６行から２２行に関数呼出を含むループが、図２９の１６行から２２行へとループ展開されている。
【００８３】
図３０は、図２７ソースプログラムを入力とし、図２６の処理を行った結果の中間語３を、ソースプログラム形式で表現したものである。図２９の１６行から２２行のループ展開中の関数ｆの呼出が一括関数呼出化されている。
本実施例によれば、ループ展開時に一括関数呼出化を行うため、ループ展開数に応じた効率的な一括関数呼出化を行うことができる。
【００８４】
図３１は、本発明の第３の実施例であるループ並列化時に一括関数呼出化する場合の図２６のステップ２０５の処理手順を示すフローチャート図である。本処理手順は、図２７とほとんど同じなので説明は省略する（ステップ３１０４とステップ３１０６が若干異なる）。
【００８５】
図３２は、図３０のステップ２７０４でループ並列化した段階の中間語３を、ソースプログラム形式で表現したものである。図３２の１８行および１９行にある「ｘ｜｜ｙ；」の記法は、ｘとｙが並列に実行されることを示している。図２８の１６行から２２行に関数呼出を含むループが、図３２の１６行から２１行へとループ並列化されていることが分かる。
【００８６】
図３３は、図２７のソースプログラムを入力とし、図３０の処理を行った結果の中間語３を、ソースプログラム形式で表現したものである。図３１の１６行から２２行のループ並列化中の関数ｆの呼出が一括関数呼出化されていることがわかる。
本実施例によれば、ループ並列化時に一括関数呼出化を行うため、ループの並列度に応じた効率的な一括関数呼出化を行うことができる。
【００８７】
【発明の効果】
本発明によれば、コンパイラないしソース変換プログラムは、同一関数の呼出を一括関数の呼出に変換することができる。即ち、インライン展開によらない呼出オーバヘッドの削減手段を提供している。、
これにより、インライン展開が適用できない場合にも、呼出オーバヘッドの削減を行うことが可能となり、オブジェクトプログラムの処理性能の向上に寄与する。
【図面の簡単な説明】
【図１】本発明を実施するコンパイラが稼働する計算機システムの構成図である。
【図２】本発明を実施するコンパイラの処理手順を示すフローチャート図である。
【図３】コンパイラの一括関数呼出化処理２のフローチャート図である。
【図４】本発明におけるコンパイラの一括関数呼出化処理２の処理構成図である。
【図５】ソースプログラムの例（一括関数呼出化前の中間語３１のソースプログラム形式による構成例）である。
【図６】一括関数呼出化後の中間語３２のソースプログラム形式による構成例である。
【図７】関数テーブル４１の構成例である。
【図８】仮パラメータテーブル４２の構成例である。
【図９】呼出テーブル５１の構成例である。
【図１０】実パラメータテーブル５２の構成例である。
【図１１】一括呼出テーブル６１の構成例である。
【図１２】一括実パラメータテーブル６２の構成例である。
【図１３】一括関数テーブル７１の構成例である。
【図１４】一括仮パラメータテーブル７２の構成例である。
【図１５】関数情報テーブル生成処理２１のフローチャート図である。
【図１６】呼出情報テーブル生成処理２２のフローチャート図である。
【図１７】一括呼出化情報テーブル生成処理２３のフローチャート図である。
【図１８】一括呼出化情報抽出処理２３１のフローチャート図である。
【図１９】一括呼出化情報登録処理２３２のフローチャート図である。
【図２０】一括呼出実返数登録処理２３３のフローチャート図である。
【図２１】一括呼出実引数登録処理２３４のフローチャート図である。
【図２２】一括関数仮返数登録処理２３５のフローチャート図である。
【図２３】一括関数仮引数登録処理２３４のフローチャート図である。
【図２４】一括関数生成処理２４のフローチャート図である。
【図２５】一括呼出化変換処理２５のフローチャート図である。
【図２６】第２および第３実施例のコンパイラの処理手順である。
【図２７】ループ展開用一括関数呼出化処理のフローチャート図である。
【図２８】第２および第３実施例の説明のためのソースプログラムの例である。
【図２９】ループ展開後の中間語のソースプログラム形式による構成例である。
【図３０】ループ展開用一括関数呼出化変換後の中間語のソースプログラム形式による構成例である。
【図３１】ループ並列化用一括関数呼出化処理のフローチャート図である。
【図３２】ループ展開後の中間語３のソースプログラム形式による構成例である。
【図３３】ループ並列化用一括関数呼出化変換後の中間語のソースプログラム形式による構成例である。
【図１】
0003726992.tif 000002
【図２】
0003726992.tif 000003
【図３】
0003726992.tif 000004
【図４】
0003726992.tif 000005
【図５】
0003726992.tif 000006
【図６】
0003726992.tif 000007
【図７】
0003726992.tif 000008
【図８】
0003726992.tif 000009
【図９】
0003726992.tif 000010
【図１０】
0003726992.tif 000011
【図１１】
0003726992.tif 000012
【図１２】
0003726992.tif 000013
【図１３】
0003726992.tif 000014
【図１４】
0003726992.tif 000015
【図１５】
0003726992.tif 000016
【図１６】
0003726992.tif 000017
【図１７】
0003726992.tif 000018
【図１８】
0003726992.tif 000019
【図１９】
0003726992.tif 000020
【図２０】
0003726992.tif 000021
【図２１】
0003726992.tif 000022
【図２２】
0003726992.tif 000023
【図２３】
0003726992.tif 000024
【図２４】
0003726992.tif 000025
【図２５】
0003726992.tif 000026
【図２６】
0003726992.tif 000027
【図２７】
0003726992.tif 000028
【図２８】
0003726992.tif 000029
【図２９】
0003726992.tif 000030
【図３０】
0003726992.tif 000031
【図３１】
0003726992.tif 000032
【図３２】
0003726992.tif 000033
【図３３】
0003726992.tif 000034