(57)【特許請求の範囲】
【請求項１】
ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を解放するコードとを生成するコンパイル装置であって、
複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類部と、
前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を解放するコードとを生成するコード生成部と、を備える
ことを特徴とするコンパイル装置。
【請求項２】
前記関数呼び出しと該関数呼び出しが属する前記グループにおいて最初に実行される関数呼び出しとの間で、該関数呼び出しの返却値のサイズが変更されるか否かを判定する返却値サイズ判定部、を更に備え、
前記コード生成部は、前記グループに属する前記関数呼び出しのうち、前記返却値サイズ判定部により返却値のサイズが不変であると判定された全ての前記関数呼び出しにおける返却値のサイズの最大値を、前記所定のサイズとする
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記コード生成部は、前記返却値サイズ判定部により前記返却値のサイズが変更されると判定された前記関数呼び出しについて、該関数呼び出しの返却値のサイズと該関数呼び出しが属する前記グループごとの前記返却値記憶領域のサイズとを比較し、該関数呼び出しの返却値のサイズの方が大きいときに、該関数呼び出しの返却値のサイズを前記所定のサイズとして、再度前記グループごとの前記返却値記憶領域を割り付けるコードと該返却値記憶領域を解放するコードとを生成する
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項４】
前記コード生成部は、前記関数呼び出しの返却値のサイズと該関数呼び出しが属する前記グループごとの前記返却値記憶領域のサイズとを比較し、該関数呼び出しの返却値のサイズの方が大きいときに、該関数呼び出しの返却値のサイズで、該関数呼び出しの返却値が使用する前記返却値記憶領域を割り付けるコードと該返却値記憶領域を解放するコードとを生成する
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項５】
ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を解放するコードとを生成するコンパイル方法であって、
複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、
前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を解放するコードとを生成するコード生成ステップと、を備える
ことを特徴とするコンパイル方法。
【請求項６】
コンピュータに、ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を解放するコードとを生成させるためのコンパイルプログラムであって、
複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、
前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を解放するコードとを生成するコード生成ステップと、を前記コンピュータに実行させる
ことを特徴とするコンパイルプログラム。                                                                              
【発明の詳細な説明】
【技術分野】
【０００１】
本発明に係るいくつかの態様は、ソースプログラムをコンパイルする技術に関する。
【背景技術】
【０００２】
フォートラン（以下、Ｆｏｒｔｒａｎという）言語によるソースプログラムをコンパイルする場合において、ある関数呼び出しの返却値が変数や式などであるため、関数呼び出しの前に返却値のサイズが不明である（分からない）ときに、従来のコンパイル装置（又はコンパイルプログラム）は、呼び出された関数の中で返却値を記憶（保存）する領域（以下、返却値記憶領域という）を割り付ける（割り当る）コードを生成し、使用後に割り付けた返却値記憶領域を解放するコードを生成していた。このような返却値記憶領域の割り付け及び開放の一例が特許文献１に記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平９−３３０２２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、返却値のサイズが不明な関数呼び出しのたびに、返却値記憶領域の割り付け及び解放を実行する必要があるため、このようなオブジェクトプログラムでは実行時間が長くなっていた。
【０００５】
本発明のいくつかの態様は前述の問題に鑑みてなされたものであり、オブジェクトプログラムの実行時間を短縮することのできるコンパイル装置、コンパイル方法、及びコンパイルプログラムを提供することを目的の１つとする。
【課題を解決するための手段】
【０００６】
本発明に係るコンパイル装置は、ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイル装置であって、複数の前述の関数呼び出しのうち、同時に使用する複数の関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の関数呼び出しを同じグループにまとめる関数呼び出し分類部と、前述のグループごとに、該グループに属する全ての関数呼び出しが共用する所定のサイズの返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成部と、を備える。
【０００７】
本発明に係るコンパイル方法は、ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイル方法であって、複数の前述の関数呼び出しのうち、同時に使用する複数の関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、前述のグループごとに、該グループに属する全ての関数呼び出しが共用する所定のサイズの返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成ステップと、を備える。
【０００８】
本発明に係るコンパイルプログラムは、ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイルプログラムであって、複数の前述の関数呼び出しのうち、同時に使用する複数の関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、前述のグループごとに、該グループに属する全ての関数呼び出しが共用する所定のサイズの返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成ステップと、を備える。
【発明の効果】
【０００９】
本発明によれば、返却値記憶領域の割り付けの回数と当該返却値記憶領域の開放の回数とをともに削減することができ、オブジェクトプログラムの実行時間を短縮することができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の第一実施形態におけるコンパイル装置を説明するブロック図である。
【図２】図１に示したソースプログラムの一例を説明する図である。
【図３】図１に示した変数宣言テーブルの一例を説明する構成図である。
【図４】図１に示した関数宣言テーブルの一例を説明する構成図である。
【図５】図１に示した式情報テーブルの一例を説明する構成図である。
【図６】図１に示した関数呼び出しテーブルの一例を説明する構成図である。
【図７】図１に示した返却値情報テーブルの一例を説明する構成図である。
【図８】図１に示した宣言情報登録部の動作を説明するフローチャートである。
【図９】図１に示した式情報登録部の動作を説明するフローチャートである。
【図１０】図１に示した他関数呼び出し検出部の動作を説明するフローチャートである。
【図１１】図１に示した関数呼び出し分類部の動作を説明するフローチャートである。
【図１２】図１に示した返却値サイズ判定部の動作を説明するフローチャートである。
【図１３】図１に示した中間コード生成部の動作を説明するフローチャートである。
【図１４】図１に示した中間コード生成部が生成する中間コードを説明するためのイメージ図である。
【図１５】図１に示した返却値情報テーブルの経過を説明する構成図である。
【図１６】図１に示した返却値情報テーブルの経過を説明する構成図である。
【図１７】図１に示した中間コード生成部の動作を説明するフローチャートである。
【図１８】従来の中間コード生成部が生成する中間コードを説明するためのイメージ図である。
【図１９】本発明の第二実施形態におけるコンパイル装置を説明するブロック図である。
【図２０】図１９に示した返却値情報テーブルの一例を説明する構成図である。
【図２１】図１９に示した中間コード生成部の動作を説明するフローチャートである。
【図２２】図１９に示した中間コード生成部が生成する中間コードを説明するためのイメージ図である。
【発明を実施するための形態】
【００１１】
以下に本発明の実施の形態を説明する。以下の図面の記載において、同一又は類似の部分には同一又は類似の符号で表している。但し、図面は模式的なものである。したがって、具体的な寸法などは以下の説明を照らし合わせて判断するべきものである。また、図面相互間においても互いの寸法の関係や比率が異なる部分が含まれていることは勿論である。なお、以下の説明において、図面の上側を「上」、下側を「下」、左側を「左」、右側を「右」という。
【００１２】
（第一実施形態）
図１乃至図１８は、本発明の第一実施形態を示すためのものである。図１は、本発明の第一実施形態におけるコンパイル装置を説明するブロック図である。図１に示すように、コンパイル装置１００は、Ｆｏｒｔｒａｎ言語で記述されたソースプログラムＳＰをオブジェクトプログラムＯＰにコンパイル（翻訳）するためのものである。コンパイル装置１００は、ソースプログラムＳＰに基づき中間ファイルＩＦを作成する中間ファイル作成部１０と、中間ファイルＩＦを最適化する最適化部２０と、最適化された中間ファイルＯＩＦに基づきオブジェクトプログラムＯＰを作成するオブジェクトプログラム作成部３０と、を備える。
【００１３】
図２は図１に示したソースプログラムの一例を説明する図である。コンパイル装置１００のコンパイル対象となるソースプログラムＳＰは、例えば図２に示すように、型宣言部ｓｐ１と、引用仕様宣言部ｓｐ２と、実行部ｓｐ３と、関数本体部（関数定義部）ｓｐ４と、を含んで構成される。
【００１４】
図１に示すコンパイル装置１００は、入出力手段として、メモリなどで構成される記憶装置４０に接続する。記憶装置４０は、入力情報となるソースプログラムＳＰと、中間情報となる中間ファイルＩＦ及び最適化中間ファイルＯＩＦと、出力情報となるオブジェクトプログラムＯＰと、を記憶するとともに、変数宣言テーブル４１、関数宣言テーブル４２、式情報テーブル４３、関数呼び出しテーブル４４、及び返却値情報テーブル４５を記憶する。
【００１５】
本実施形態では、ソースプログラムＳＰ、中間ファイルＩＦ、最適化された中間ファイルＯＩＦ、オブジェクトプログラムＯＰ、変数宣言テーブル４１、関数宣言テーブル４２、式情報テーブル４３、関数呼び出しテーブル４４、及び返却値情報テーブル４５を、記憶装置４０に記憶するようにしたが、これに限定されず、一部又は全部を内蔵の（内部に備える）記憶手段に記憶させるようにしてもよい。
【００１６】
図１に示す中間ファイル作成部１０は、宣言情報登録部１１と、式情報登録部１２と、他関数呼び出し検出部１３と、関数呼び出し分類部１４と、返却値サイズ判定部１５と、中間コード生成部１６と、を含んで構成される。
【００１７】
宣言情報登録部１１は、ソースプログラムＳＰに記述されている変数及び関数に関する情報を記憶装置４０に記憶させるためのものである。宣言情報登録部１１は、ソースプログラムＳＰを読み出し（参照し）つつ、ソースプログラムＳＰで使用される変数に関する情報を変数宣言テーブル４１に書き出すとともに、ソースプログラムＳＰで使用される関数に関する情報を関数宣言テーブル４２に書き出す。
【００１８】
図３は、図１に示した変数宣言テーブルの一例を説明する構成図である。変数宣言テーブル４１は、ソースプログラムＳＰで使用される変数に関する情報を格納するためのものである。変数情報テーブル４１の１つのレコード（行）は、ソースプログラムＳＰで使用される変数ごとに登録される。図３に示すように、変数情報テーブル４１は、変数名欄４１１と、型欄４１２と、次元欄４１３と、配列次元欄４１４と、を含んで構成される。
【００１９】
変数名欄４１１には、ソースプログラムＳＰで使用される変数の変数名が格納される。型欄４１２には、当該変数の型の情報、例えば、４バイト整数を表す「Ｉ４」、２バイト整数を表す「Ｉ２」、８バイト実数を表す「Ｒ８」などが格納される。変数名欄４１１に格納された変数が配列の場合、次元欄４１３には次元の情報、例えば次元数が格納され、配列次元欄４１４には各次元の情報、例えば次元ごとの上限値及び下限値が格納される。変数名欄４１１に格納された変数が配列ではない場合、次元欄４１３には例えば「０」が格納され、配列次元欄４１４には例えば「△」（スペース又はブランク）が格納される。
【００２０】
図４は、図１に示した関数宣言テーブルの一例を説明する構成図である。関数宣言テーブル４２は、ソースプログラムＳＰで使用される関数に関する情報を格納するためのものである。関数宣言テーブル４２の１つのレコード（行）は、ソースプログラムＳＰで使用される関数ごとに登録される。図４に示すように、関数宣言テーブル４２は、ＩＤ欄４２１と、関数名欄４２２と、他関数呼び出しの有無欄４２３と、戻り値サイズ欄４２４と、引数個数欄４２５と、引数欄４２６と、を含んで構成される。
【００２１】
ＩＤ欄４２１には、ソースプログラムＳＰで使用される関数を一意に識別する情報、例えば関数の出現順に「１」、「２」、「３」などの連続する数字が格納される。関数名欄４２２には、当該関数の関数名が格納される。他関数呼び出しの有無欄４２３には、当該関数が他の関数を呼び出しているか否かの情報、例えば、他の関数を呼び出している場合は「ＹＥＳ」、他の関数を呼び出していない場合は「ＮＯ」が格納される。戻り値サイズ欄４２４には、当該関数の戻り値のサイズが格納される。引数個数欄４２５には当該関数の引数の数が格納され、引数欄４２６には引数ごとに当該引数の変数名と型とが格納される。
【００２２】
図１に示す式情報登録部１２は、ソースプログラムＳＰに記述されている式に関する情報を記憶装置４０に記憶させるためのものである。宣言情報登録部１２は、ソースプログラムＳＰと、関数情報テーブル４２に登録された情報とを読み出し（参照し）つつ、ソースプログラムＳＰで使用される式の情報を式情報テーブル４３に書き出すとともに、ソースプログラムＳＰで使用される式における関数呼び出しの情報を関数呼び出しテーブル４４に書き出す。
【００２３】
図５は、図１に示した式情報テーブルの一例を説明する構成図である。式情報テーブル４３は、ソースプログラムＳＰで使用される式に関する情報を格納するためのものである。式情報テーブル４３の１つのレコード（行）は、ソースプログラムＳＰで使用される式ごとに登録される。図５に示すように、式情報テーブル４３は、ＩＤ欄４３１と、式欄４３２と、スコープ欄４３３と、参照関数の数欄４３４と、関数呼び出しテーブルＩＤ欄４３５と、を含んで構成される。
【００２４】
ＩＤ欄４３１には、ソースプログラムＳＰで使用される式を一意に識別する情報、例えば式の出現順に「１」、「２」、「３」などの連続する数字が格納される。式欄４３２には、ソースプログラムＳＰで使用される式そのものが格納される。スコープ欄４３３には、当該式が記述されるソースプログラムＳＰの位置（場所）、例えばソースプログラムＳＰの実行部ｓｐ３で記述される場合は「実行部」、例えばソースプログラムＳＰの関数本体部ｓｐ４で記述される場合は関数名（例えば「ｆｕｎ１」など）が格納される。参照関数の数欄４３４には、当該式が参照（使用）する関数の数が格納される。関数呼び出しテーブルＩＤ欄４３５には、当該式が参照（使用）する関数呼び出しごとに、後述する関数呼び出しテーブル４４のＩＤ欄４４１の情報が格納される。
【００２５】
図６は、図１に示した関数呼び出しテーブルの一例を説明する構成図である。関数呼び出しテーブル４４は、ソースプログラムＳＰで使用される式における関数呼び出しに関する情報を格納するためのものである。関数呼び出しテーブル４４の１つのレコード（行）は、ソースプログラムＳＰの式で関数呼び出しを使用する（関数を呼び出す）ごとに登録される。図６に示すように、関数呼び出しテーブル４４は、ＩＤ欄４４１と、式情報テーブルＩＤ欄４４２と、返却値情報テーブルＩＤ欄４４３と、関数名欄４４４と、他関数呼び出しの有無欄４４５と、戻り値サイズ欄４４６と、引数個数欄４４７と、引数欄４４８と、を含んで構成される。
【００２６】
ＩＤ欄４４１には、ソースプログラムＳＰで使用される関数呼び出しを一意に識別する情報、例えば関数呼び出しの出現順に「１」、「２」、「３」などの連続する数字が格納される。式情報テーブルＩＤ欄４４２には、当該関数呼び出しが記述されている式を一意に識別する情報、例えば式情報テーブル４３のＩＤ欄４３１の情報が格納される。返却値情報テーブルＩＤ欄４４３には、後述する返却値情報テーブル４５のＩＤ欄４５１の情報が格納される。関数名欄４４４には、当該関数呼び出しが呼び出す関数の関数名が格納される。他関数呼び出しの有無欄４４５には、当該関数呼び出しの関数が他の関数を呼び出しているか否かの情報、例えば、他の関数を呼び出している場合は「ＹＥＳ」、他の関数を呼び出していない場合は「ＮＯ」が格納される。返却値サイズ欄４４６には、当該関数呼び出しの返却値のサイズが格納される。引数個数欄４４７には当該関数呼び出しの引数の数が格納され、引数欄４４８には引数ごとに当該引数の変数名と型とが格納される。
【００２７】
図１に示す他関数呼び出し検出部１３は、ソースプログラムＳＰに記述されている関数呼び出しにおける他の関数呼び出しを検出するためのものである。他関数呼び出し検出部１３は、式情報テーブル４３と関数呼び出しテーブル４４とに登録された情報を参照しつつ（読み込みつつ）、検出した他の関数呼び出しに関する情報を式情報テーブル４３と関数呼び出しテーブル４４とに書き出す。
【００２８】
図１に示す関数呼び出しグループ分類部１４は、ソースプログラムＳＰに記述されている複数の関数呼び出しを所定のグループに分類するためのものである。関数呼び出し分類部１４は、式情報テーブル４３と関数呼び出しテーブル４４とに登録された情報を読み出し（参照し）つつ、分類したグループに関する情報を関数呼び出しテーブル４４と返却値情報テーブル４５とに書き出す。
【００２９】
図７は、図１に示した返却値情報テーブルの一例を説明する構成図である。返却値情報テーブル４５は、関数呼び出しの返却値に関する情報を格納するためのものである。返却値情報テーブル４５の１つのレコード（行）は、呼び出し前にサイズが不明である関数呼び出しの返却値ごとに登録される。図７に示すように、返却値情報テーブル４５は、ＩＤ欄４５１と、関数呼び出しテーブルＩＤ欄４５２と、変更欄４５３と、共用ＩＤ欄４５４と、領域欄４５５と、を含んで構成される。
【００３０】
ＩＤ欄４５１には、呼び出し前にサイズが不明である関数呼び出しの返却値を一意に識別する情報、例えば関数呼び出しの出現順に「１」、「２」、「３」などの連続する数字が格納される。関数呼び出しテーブルＩＤ欄４５２には、当該返却値を使用する関数呼び出しに対応する関数呼び出しテーブル４４のＩＤ欄４４１の情報が格納される。変更欄４５３には、当該返却値のサイズが変更されるか否かの情報、例えば、返却値のサイズが変更される場合は「ＹＥＳ」、返却値のサイズが変更されない場合は「ＮＯ」が格納される。共用ＩＤ欄４５４には、当該返却値を使用する関数呼び出しが属するグループにおいて共用（共有）する返却値記憶領域を一意に識別する情報、例えば返却値記憶領域ごとに「１」、「２」、「３」などの連続する数字が格納される。領域欄４５５には、当該返却値の返却値記憶領域の領域名が格納される。
【００３１】
図１に示す返却値サイズ判定部１５は、ソースプログラムＳＰに記述されている関数呼び出しの返却値のサイズが変更されるか否かを判定するためのものである。返却値サイズ判定部１５は、関数呼び出しテーブル４４に登録された情報を読み出し（参照し）つつ、返却値のサイズが変更されるか否かの情報を返却値情報テーブル４５に書き出す。
【００３２】
図１に示す中間コード生成部１６は、ソースプログラムＳＰに記述されたソースコードに対して中間コードを生成するためのものである。中間コード生成部１６は、関数情報テーブル４２に登録された情報と、式情報テーブル４３に登録された情報と、関数呼び出しテーブル４４に登録された情報と、戻り値情報テーブル４５に登録された情報と、を参照して（読み込んで）、中間コードを生成し、中間ファイルＩＦを書き出す。
【００３３】
次に、図８乃至図１８を参照しながらソースプログラムＳＰから中間ファイルＩＦを作成する動作について説明する。図８は図１に示した宣言情報登録部の動作を説明するフローチャートである。図８に示すように、宣言情報登録部１１は、ソースプログラムＳＰの型宣言部ｓｐ１を先頭から順に解析し、宣言されている変数ごとに、変数名欄４１１、型欄４１２、次元欄４１３、及び、配列次元欄４１４に情報を格納し、各変数を変数宣言テーブル４１に登録する（Ｓ１１１）。
【００３４】
＜具体例＞
具体的には、宣言情報登録部１１は、図２に示す型宣言部ｓｐ１で宣言されている変数「ｘ」、「ｙ」、「ｚ」、「ｗ」、「ｖ」、「ｕ」、「ｔ」、「ｊ１」、「ｋ１」、「ｊ２」、「ｋ２」、「ｊ３」、「ｋ３」、「ｊ４」、「ｋ４」、「ｊ５」、及び、「ｋ５」について、図３に示すように変数宣言情報テーブル４１に登録する。
【００３５】
次に、宣言情報登録部１１は、ソースプログラムＳＰの引用仕様宣言部ｓｐ２を先頭から順に解析し、宣言されている関数ごとに、ＩＤ欄４２１、関数名欄４２２、他関数呼び出しの有無欄４２３、戻り値サイズ欄４２４、引数個数欄４２５、及び、引数欄４２６に情報を格納し、各関数を関数宣言テーブル４２に登録する（Ｓ１１２）。
【００３６】
＜具体例＞
具体的には、宣言情報登録部１１は、図２に示す引用仕様宣言部ｓｐ２で宣言されている関数「ｆｕｎ１」、「ｆｕｎ２」、「ｆｕｎ３」、「ｆｕｎ４」、「ｆｕｎ５」について、図４に示すように関数情報テーブル４２に登録する。
【００３７】
図９は図１に示した式情報登録部の動作を説明するフローチャートである。図９に示すように、式情報登録部１２は、ソースプログラムＳＰの実行部ｓｐ３及び関数本体部ｓｐ４の式を先頭から順に解析し、出現する式ごとに、ＩＤ欄４３１、式欄４３２、スコープ欄４３３、及び、参照関数の数欄４３４に情報を格納し、各式を式情報テーブル４３に登録する（Ｓ１２１）。
【００３８】
＜具体例＞
具体的には、式情報登録部１２は、図２に示す実行部ｓｐ３の式（１）について、図５に示すように、ＩＤ欄４３１に「１」、式欄４３２に「ｘ（ｊ１：ｋ１）＝ｆｕｎ１（ｙ）＋ｆｕｎ１（ｗ）」、スコープ欄４３３に「実行部」を格納するとともに、当該式は「ｆｕｎ１（ｙ）」と「ｆｕｎ１（ｗ）」との２つの関数を参照しているので参照関数の数欄４３４に「２」を格納し、式情報テーブル４３に登録する。同様に、式情報登録部１２は、図２に示す実行部ｓｐ３の式（２）〜（６）と、関数本体部ｓｐ４の式（７）〜（１４）についても、図５に示すように式情報テーブル４３に登録する。
【００３９】
次に、式情報登録部１２は、式情報テーブル４３のレコードを先頭から順に読み出し、読み出したレコードの参照関数の数欄４３４が「０」か否か判定する（Ｓ１２２）。Ｓ１２２の判定の結果、参照関数の数欄４３４が「０」である場合、式情報登録部１２は何もしない。一方、Ｓ１２２の判定の結果、参照関数の数欄４３４が「０」でない場合、当該レコードに対応する式が関数呼び出しを含むものと考えられる。よって、式情報登録部１２は、当該レコードの式欄４３２に含まれる関数呼び出しごとに、関数呼び出しが出現した順に「１」から連続する数字をＩＤ欄４４１に、当該レコードのＩＤ欄４３１の情報を式情報テーブルＩＤ欄４４２に格納するとともに、当該関数呼び出しによって呼び出される関数の関数名を用いて関数宣言テーブル４２からレコードを読み出し、関数名欄４２２の情報を関数名欄４４４に、戻り値サイズ欄４２４の情報を戻り値サイズ欄４４６に、引数個数欄４２５の情報を引数個数欄４４７に、引数欄４２６の情報を引数欄４４８に、それぞれ格納して関数呼び出しを関数呼び出しテーブル４４に登録する（Ｓ１２３）。また、式情報登録部１２は、関数呼び出しテーブル４４に登録したレコードのＩＤ欄４４１の情報を、Ｓ１２２の処理で読み出したレコードの関数呼び出しテーブルＩＤ欄４３５に格納する（Ｓ１２４）。
【００４０】
＜具体例＞
具体的には、式情報登録部１２は、最初に、図５に示す式情報テーブル４３からＩＤ欄４３１が「１」のレコードを読み出し、参照関数の数欄４３４が「２」なので、式欄４３２に含まれる２つの関数呼び出しをそれぞれ関数呼び出しテーブル４４に登録する。すなわち、式情報登録部１２は、１番目の関数呼び出し「ｆｕｎ１（ｙ）」について、図６に示すように、ＩＤ欄４４１に「１」、式情報テーブルＩＤ欄４４３に「１」、関数名欄４４４に「ｆｕｎ１」を格納し、図４に示す関数宣言テーブル４２から関数名欄４２２が「ｆｕｎ１」のレコードを読み出し、戻り値サイズ欄４４６に「ｓｉｚｅ（ｙ）＊４」、引数個数欄４４７に「１」、引数欄４４８の第一引数フィールドの変数名に「ｙ」、型に「Ｉ４」を格納する。同様に、式情報登録部１２は、２番目の関数呼び出し「ｆｕｎ１（ｗ）」について、図６に示すように、ＩＤ欄４４１に「２」、式情報テーブルＩＤ欄４４３に「１」、関数名欄４４４に「ｆｕｎ１」を格納し、図４に示す関数宣言テーブル４２から関数名欄４２２が「ｆｕｎ１」のレコードを読み出し、戻り値サイズ欄４４６に「ｓｉｚｅ（ｗ）＊４」、引数個数欄４４７に「１」、引数欄４４８の第一引数フィールドの変数名に「ｗ」、型に「Ｉ４」を格納する。また、式情報登録部１２は、図５に示すように、ＩＤ欄４３１が「１」のレコードにおける２つの関数呼び出しテーブルＩＤ欄４３５に、「１」と「２」とをそれぞれ格納する。同様に、式情報登録部１２は、図５に示すＩＤ欄４３１が「２」から「１４」の各レコードについても、図６に示すように、関数呼び出しを関数呼び出しテーブル４４に登録する。
【００４１】
図１０は図１に示した他関数呼び出し検出部の動作を説明するフローチャートである。図１０に示すように、他関数呼び出し検出部１３は、関数呼び出しテーブル４４のレコードを先頭から順に読み出し（Ｓ１３１）、読み出したレコードの関数名欄４４４の情報とスコープ欄４３３の情報とが一致するレコードを、式情報テーブル４３の先頭から順に検索する（Ｓ１３２）。次に、他関数呼び出し検出部１３は、一致するレコードを検出したか否かを判定する（Ｓ１３３）。この場合、他関数呼び出し検出部１３は、式情報テーブル４３の最後のレコードまで検索した結果、該当するレコードが見つからなかった（存在しなかった）ときに、一致するレコードを検出しなったと判定する。Ｓ１３３の判定の結果、一致するレコードを検出した場合、検出したレコードの参照関数の数欄４３４が「０」か否か判定する（Ｓ１３４）。Ｓ１３４の判定の結果、参照関数の数欄４３４が「０」である場合、他関数呼び出し検出部１３は、式情報テーブル４３の次のレコードから順に、Ｓ１３１の処理で読み出したレコードの関数名欄４４４の情報とスコープ欄４３３の情報とが一致するレコードを再検索し（Ｓ１３５）、再度Ｓ１３３以降の処理を行う。一方、Ｓ１３４の判定の結果、参照関数の数欄４３４が「０」でない場合、他関数呼び出し検出部１３は、Ｓ１３１の処理で読み出したレコードの他関数呼び出しの有無欄４４５に「ＹＥＳ」を格納する（Ｓ１３６）。一方、Ｓ１３３の判定の結果、一致するレコードを式情報テーブル４３から検出しなかった場合、他関数呼び出し検出部１３は、Ｓ１３１の処理で読み出したレコードの他関数呼び出しの有無欄４４５に「ＮＯ」を格納する（Ｓ１３７）。
【００４２】
＜具体例＞
具体的には、他関数呼び出し検出部１３は、最初に図６に示すＩＤ欄４４１が「１」のレコードを読み出し、関数名欄４４４の「ｆｕｎ１」とスコープ欄４３３の情報とが一致するレコードを式情報テーブル４３の先頭から検索した結果、図５に示すＩＤ欄４３１が「７」のレコードを検出し、参照関数の数欄４３４が「０」なので、式情報テーブル４３のＩＤ欄４３１が「７」のレコードの次のレコードから関数名欄４４４の「ｆｕｎ１」とスコープ欄４３３の情報とが一致するレコードを再検索する。しかしながら、式情報テーブル４３一致するレコードは他に存在しないので、他関数呼び出し検出部１３は、図６に示すようにＩＤ欄４４１が「１」のレコードの他関数呼び出しの有無欄４４５に「ＮＯ」を格納する。同様に、他関数呼び出し検出部１３は、図６に示すＩＤ欄４４１が「２」から「８」の各レコードについても、他関数呼び出しの有無欄４４５に情報を格納する。この場合、ＩＤ欄４４１が「６」のレコードは、関数名欄４４４の「ｆｕｎ４」とスコープ欄４３３の情報とが一致するレコードを検索した結果、図５に示すＩＤ欄４３１が「１３」のレコードを検出し、参照関数の数欄４３４が「１」なので、図６に示すようにＩＤ欄４４１が「６」のレコードの他関数呼び出しの有無欄４４５に「ＹＥＳ」を格納する。
【００４３】
図１１は図１に示した関数呼び出し分類部の動作を説明するフローチャートである。図１１に示すように、関数呼び出し分類部１４は、関数呼び出しテーブル４４のレコードを先頭から順に読み出し（Ｓ１４１）、読み出したレコードの返却値サイズ欄４４６に格納されている情報が変数又は式で、かつ、対応する式情報テーブル４３のレコードのスコープ欄４３３が「実行部」であるか否かを判定する（Ｓ１４２）。Ｓ１４２の判定の結果、返却値サイズ欄４４６に格納されている情報が変数又は式で、かつ、対応する式情報テーブル４３のレコードのスコープ欄４３３が「実行部」である場合、当該レコードに対応する関数呼び出しの返却値のサイズは、関数呼び出し前に不明である（分からない）と考えられる。よって、関数呼び出し分類部１４は、読み出した順に「１」から連続する数字をＩＤ欄４５１に格納するとともに、関数呼び出しテーブルＩＤ欄４５２にＩＤ欄４４１の情報を、変更欄４５３にデフォルト値として「ＮＯ」を格納し、Ｓ１４１の処理で読み出したレコードに対応する関数呼び出しの返却値に関する情報を返却値情報テーブル４５に登録する（Ｓ１４３）。また、関数呼び出し分類部１４は、返却値情報テーブル４５に登録したレコードのＩＤ欄４５１の情報を、Ｓ１４１の処理で読み出したレコードの返却値情報テーブルＩＤ欄４４３に格納する（Ｓ１４４）。一方、Ｓ１４２の判定の結果、返却値サイズ欄４４６に格納されている情報が変数又は式で、かつ、対応する式情報テーブル４３のレコードのスコープ欄４３３が「実行部」ではない場合、すなわち、返却値サイズ欄４４６に格納されている情報が変数又は式でないか、対応する式情報テーブル４３のレコードのスコープ欄４３３が「実行部」でないか、の少なくとも一方である場合、関数呼び出し分類部１４は、Ｓ１４１の処理で読み出したレコードの返却値情報テーブルＩＤ欄４４３に「０」を格納する（Ｓ１４５）。
【００４４】
＜具体例＞
具体的には、関数呼び出し分類部１４は、図６に示すＩＤ欄４４１が「１」のレコードを読み出し、返却値サイズ欄４４６が「ｓｉｚｅ（ｙ）＊４」の式であり、かつ、式情報テーブルＩＤ欄４４２の「１」を用いて読み出した図５に示す式情報テーブル４３のＩＤ欄４３１が「１」のレコードのスコープ欄４３３が「実行部」なので、図７に示すように、ＩＤ欄４５１に「１」、関数呼び出しテーブルＩＤ欄４５２に「１」、変更欄４５３に「ＮＯ」を格納し、ＩＤ欄４４１が「１」のレコードを返却値情報テーブル４５に登録する。また、関数呼び出し分類部１４は、図６に示すように、ＩＤ欄４４１が「１」のレコードの返却値情報テーブルＩＤ欄４４３に「１」を格納する。
【００４５】
図１１に示すように、Ｓ１４４の処理の後、関数呼び出し分類部１４は、Ｓ１４１の処理で読み出した関数呼び出しテーブル４４のレコードの式情報テーブルＩＤ欄４４２の情報と、対応する関数呼び出しテーブル４４のレコードの式情報テーブルＩＤ欄４４２の情報とが一致するレコードを、返却値情報テーブル４５の先頭から登録済みのレコードまで検索する（Ｓ１４６）。なお、検索した結果、一致するレコードが複数存在する場合、関数呼び出し分類部１４は、一致する全てのレコードを検出する。次に、関数呼び出し分類部１４は、一致するレコードを検出したか否かを判定する（Ｓ１４７）。この場合、関数呼び出し分類部１４は、返却値情報テーブル４５の先頭から既に登録されているレコードまで検索した結果、該当するレコードが見つからなかった（存在しなかった）ときに、一致するレコードを検出しなったと判定する。Ｓ１４７の判定の結果、一致するレコードを検出した場合、Ｓ１４１の処理で読み出した関数呼び出しテーブル４４のレコードと、検出されたレコードとは、互いに同じ式で呼び出される（参照される）関数呼び出しであるから、同時に使用する関数呼び出しであると考えられる。よって、検出した１つ又は複数のレコードにおける共用ＩＤ欄４５４の情報の最大値に「１」を加えた数を、Ｓ１４３の処理で返却値情報テーブル４５に登録したレコードの共用ＩＤ欄４５４に格納する（Ｓ１４８）。一方、Ｓ１４７の判定の結果、一致するレコードを検出しなかった場合、Ｓ１４１の処理で読み出した関数呼び出しテーブル４４のレコードの関数呼び出しは、同じ式で呼び出される（参照される）関数呼び出しが現時点で存在しない、すなわち既に返却値情報テーブル４５に登録されているレコードの関数呼び出しと同時に使用しないと考えられる。よって、Ｓ１４３の処理で返却値情報テーブル４５に登録したレコードの共用ＩＤ欄４５４に「１」を格納する（Ｓ１４９）。
【００４６】
＜具体例＞
具体的には、関数呼び出し分類部１４は、図６に示すＩＤ欄４４１が「１」のレコードについて、返却値情報テーブル４５を検索した結果、既に登録されている行（レコード）が存在しないため、共用ＩＤ欄４５４に「１」を格納する。次に、前述したのと同様に、関数呼び出し分類部１４は、図１１に示すＳ１４１〜Ｓ１４５の処理により、図６に示すＩＤ欄４４１が「２」のレコードについても、図７に示すように、該当するレコードを返却値情報テーブル４５に登録する。続いて、関数呼び出し分類部１４は、図６に示すＩＤ欄４４１が「２」のレコードについて、返却値情報テーブル４５を検索した結果、図６に示すように、既に登録されているＩＤ欄４５１が「１」のレコードに対応する関数情報テーブル４４のレコードの式情報テーブルＩＤ欄４４２に「１」が格納されており、ＩＤ欄４４１が「２」のレコードの式情報テーブルＩＤ欄４４２の「１」と一致する。よって、関数呼び出し分類部１４は、図７に示すように、ＩＤ欄４５１が「１」のレコードの共用ＩＤ欄４５４に格納された情報に「１」を加えた「２」を、ＩＤ欄４５１が「２」のレコードの共用ＩＤ欄４５４に格納する。これにより、同時に使用する複数の関数呼び出しが相互に異なるグループに分けられる。次に、前述したのと同様に、関数呼び出し分類部１４は、図１１に示すＳ１４１〜Ｓ１４５の処理により、図６に示すＩＤ欄４４１が「３」のレコードについても、図７に示すように、該当するレコードを返却値情報テーブル４５に登録する。続いて、関数呼び出し分類部１４は、図６に示すＩＤ欄４４１が「３」のレコードについて、返却値情報テーブル４５を検索した結果、図６に示すように、既に登録されているＩＤ欄４５１が「１」と「２」との各レコードは、対応する関数情報テーブル４４の各レコードの式情報テーブルＩＤ欄４４２にともに「１」が格納されており、ＩＤ欄４４１が「３」のレコードの式情報テーブルＩＤ欄４４２の「３」と異なる。よって、関数呼び出し分類部１４は、図７に示すように、ＩＤ欄４５１が「３」のレコードの共用ＩＤ欄４５４に「１」を格納する。これにより、同時に使用しない複数の関数呼び出しが同じグループにまとめられる。
【００４７】
＜具体例＞
前述したのと同様に、関数呼び出し分類部１４は、図１１に示すＳ１４１〜Ｓ１４５の処理により、図６に示すＩＤ欄４４１が「４」から「８」の各レコードについても、図７に示すように、該当するレコードをそれぞれ返却値情報テーブル４５に登録する。この場合、ＩＤ欄４４１が「７」と「８」の各レコードについては、図５に示すように、対応する式情報テーブル４３のＩＤ欄がそれぞれ「１１」と「１３」であり、当該各レコードはスコープ欄４３３がそれぞれ「ｆｕｎ３」と「ｆｕｎ４」であって「実行部」ではないので、返却値情報テーブル４５には登録せず、図６に示すように、式情報テーブルＩＤ欄４４２にともに「０」を格納する。続いて、関数呼び出し分類部１４は、図１１に示すＳ１４６〜Ｓ１４９の処理により、同様に、図７に示すＩＤ欄４５１が「４」から「６」の各レコードについても、共用ＩＤ欄４５４にそれぞれ情報を格納する。
【００４８】
図１２は図１に示した返却値サイズ判定部の動作を説明するフローチャートである。図１２に示すように、返却値サイズ判定部１５は、共用ＩＤ欄４５４の情報が変数ａと一致するレコードを返却値情報テーブル４５の先頭から順に検索する（Ｓ１５１）。なお、変数ａは初期値として「１」が入力される(与えられる)ものとする。また、検索した結果、該当するレコードが複数存在する場合、返却値サイズ判定部１５は、最初のレコードを検出する。次に、返却値サイズ判定部１５は、一致するレコードを検出したか否かを判定する（Ｓ１５２）。この場合、返却値サイズ判定部１５は返却値情報テーブル４５の先頭から最後のレコードまで検索した結果、該当するレコードが見つからなかった（存在しなかった）ときに、レコードを検出しなったと判定する。Ｓ１５２の判定の結果、該当レコードを検出した場合、共用ＩＤ欄４５４の情報で分類（識別）される関数呼び出しのグループにおいて、当該グループの最初に実行される関数呼び出しの返却値を検出したものと考えられる。よって、返却値サイズ判定部１５は、検出したレコードの共用ＩＤ欄４５４の情報と、共用ＩＤ欄４５４の情報とが一致するレコードを、検出したレコードを起点として返却値情報テーブル４５の次のレコードから検索する（Ｓ１５３）。なお、検索した結果、一致するレコードが複数存在する場合、返却値サイズ判定部１５は、最初のレコードを検出する。次に、返却値サイズ判定部１５は、一致するレコードを検出したか否かを判定する（Ｓ１５４）。この場合、返却値サイズ判定部１５は返却値情報テーブル４５の最後のレコードまで検索した結果、該当するレコードが見つからなかった（存在しなかった）ときに、レコードを検出しなったと判定する。Ｓ１５４の判定の結果、一致するレコードを検出した場合、Ｓ１５１の処理で検出したレコードの返却値を使用する関数呼び出しと同じグループの属する関数呼び出しの返却値を検出したものと考えられる。よって、返却値サイズ判定部１５は、Ｓ１５３の処理で検出したレコードに対応する関数呼び出しテーブル４４のレコードである関数呼び出しと、Ｓ１５１の処理で検出したレコードに対応する関数呼び出しテーブル４４のレコードである関数呼び出しとの間で、Ｓ１５３の処理で検出したレコードに対応する関数呼び出しテーブル４４のレコードの返却値サイズ欄４４６の情報（サイズ）が、変更されるか否か（不変でないか否か）を判定する（Ｓ１５５）。これにより、同じグループに属する所定の関数呼び出しと、当該グループにおいて最初に実行される関数呼び出しとの間で、所定の関数呼び出しの返却値のサイズが変更されるか否かを判定することが可能となる。Ｓ１５５の判定の結果、返却値サイズ欄４４６の情報（サイズ）が変更される（不変ではない）場合、返却値サイズ判定部１５は、Ｓ１５３の処理で検出したレコードの変更欄４５３を「ＹＥＳ」に更新する（Ｓ１５６）。一方、Ｓ１５５の判定の結果、返却値サイズ欄４４６の情報（サイズ）が変更されていない（不変である）場合、返却値サイズ判定部１５は何もせず、すなわちＳ１５３の処理で検出したレコードの変更欄４５３は「ＮＯ」のままとする。次に、返却値サイズ判定部１５は、返却値情報���ーブル４５の次のレコードから、Ｓ１５１の処理で検出したレコードの共用ＩＤ欄４５４の情報と、共用ＩＤ欄４５４の情報とが一致するレコードを再検索し（Ｓ１５７）、再度Ｓ１５４以降の処理を行う。一方、Ｓ１５４の判定の結果、該当レコードを検出しなかった場合、返却値サイズ判定部１５は、変数ａをインクリメント（ａ＝＝ａ＋１）し（Ｓ１５８）、再度Ｓ１５１以降の処理を行う。一方、Ｓ１５２の判定の結果、該当レコードを検出しなかった場合、返却値サイズ判定部１５は処理を終了する。
【００４９】
＜具体例＞
具体的には、共用ＩＤ欄４５４が「１」について、返却値サイズ判定部１５は、図７に示すＩＤ欄４５１が「１」のレコードを起点とし、ＩＤ欄４５１が「３」のレコードは共用ＩＤ欄４５４に「１」が格納されているので、ＩＤ欄４５１が「３」のレコードを検出する。次に、返却値サイズ判定部１５は、検出したＩＤ欄４５１が「３」のレコードに対応する関数情報テーブル４４のレコードの返却値サイズ欄４４６の「（ｋ３−ｊ３＋１）＊４」が、ＩＤ欄４５１が「１」のレコードの関数呼び出しとＩＤ欄４５１が「３」のレコードの関数呼び出しとの間、より具体的にはＩＤ欄４５１が「１」のレコードに対応する式情報テーブル４３のレコードの式欄４３２の式と、ＩＤ欄４５１が「３」のレコードに対応する式情報テーブル４３のレコードの式欄４３２の式との間で、変数「ｋ３」及び「ｊ３」は変更されないので、図７に示すように、ＩＤ欄４５１が「３」のレコードの変更欄４５３を「ＮＯ」のままとする。続いて、返却値サイズ判定部１５は、ＩＤ欄４５１が「１」のレコードを起点としたまま、ＩＤ欄４５１が「４」のレコードは共用ＩＤ欄４５４に「１」が格納されているので、ＩＤ欄４５１が「４」のレコードを検出する。次に、返却値サイズ判定部１５は、検出したＩＤ欄４５１が「４」のレコードに対応する関数情報テーブル４４のレコードの返却値サイズ欄４４６の「（ｋ３−ｊ３＋１）＊４」が、今度は、ＩＤ欄４５１が「１」のレコードに対応する式情報テーブル４３のレコードの式欄４３２の式と、ＩＤ欄４５１が「４」のレコードに対応する式情報テーブル４３のレコードの式欄４３２の式との間の、式情報テーブル４３のＩＤ欄４３１が「３」の式欄４３２の式において、関数「ｆｕｎ２」内で変数「ｋ３」が変更される。よって、返却値サイズ判定部１５は、図７に示すように、ＩＤ欄４５１が「４」のレコードの変更欄４５３を「ＹＥＳ」に更新する。同様に、返却値サイズ判定部１５は、ＩＤ欄４５１が「５」と「６」の各レコードについても、図７に示すように、変更欄４５３を「ＮＯ」のままとする。
【００５０】
図１３は図１に示した中間コード生成部の動作を説明するフローチャートである。図１３に示すように、中間コード生成部１６は、式情報テーブル４３のレコードを先頭から順に読み出し（Ｓ１６１）、読み出したレコードのスコープ欄４３３が「実行部」か否かを判定する（Ｓ１６２）。Ｓ１６２の判定の結果、スコープ欄４３３が「実行部」の場合、中間コード生成部１６は、読み出したレコードの参照関数の数欄４３４が「０」以外か否かを判定する（Ｓ１６３）。Ｓ１６３の判定の結果、参照関数の数欄４３４が「０」以外の場合、中間コード生成部１６は、関数呼び出しテーブルＩＤ欄４３５の情報を用いて、関数呼び出しテーブル４４からレコードを読み出し（Ｓ１６４）、読み出したレコードの返却値情報テーブルＩＤ欄４４３が「０」以外か否か判定する（Ｓ１６５）。Ｓ１６５の判定の結果、返却値情報テーブルＩＤ欄４４３が「０」以外の場合、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの領域欄４５５が未登録（ブランク、又はスペース）か否か判定する（Ｓ１６６）。Ｓ１６６の判定の結果、領域欄４５５が未登録である場合、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの共有ＩＤ欄４５４の情報と共有ＩＤ欄４５４の情報とが一致し、かつ、変更欄４５３に「ＮＯ」が格納されているレコードを、返却値情報テーブル４５の先頭から全て検索する（Ｓ１６７）。次に、中間コード生成部１６は、該当するレコードを検出したか否かを判定する（Ｓ１６８）。この場合、中間コード生成部１６は返却値情報テーブル４５の先頭から最後のレコードまで検索した結果、該当するレコードが見つからなかった（存在しなかった）ときに、レコードを検出しなったと判定する。Ｓ１６８の判定の結果、該当するレコードを検出した場合、中間コード生成部１６は、検出した全てのレコードの対応する関数呼び出しテーブル４４のレコードとＳ１６４で読み出したレコードとにおいて、返却値サイズ欄４４６の情報（サイズ）における最大値を算出する中間コードを生成する（Ｓ１６９）。また、中間コード生成部１６は、割り付ける返却値記憶領域の所定の領域名を、Ｓ１６７の処理で検出した全てのレコードと、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードと、の領域欄４５５にそれぞれ格納するとともに（Ｓ１７０）、算出した最大値をサイズとし、領域欄４５５に格納した所定の領域名の返却値記憶領域を割り付ける中間コードを生成する（Ｓ１７１）。次に、中間コード生成部１６は、割り付けた返却値記憶領域を返却値として参照（使用）する、Ｓ１６４の処理で読み出した関数呼び出しテーブル４４のレコードの関数呼び出しの中間コードを生成する（Ｓ１７２）。なお、最大値を算出する中間コードと、返却値記憶領域を割り付ける中間コードは、関数呼び出しの中間コードの直前に追加（挿入）する。また、関数呼び出しテーブルＩＤ欄４３５に複数の情報が格納されている場合、Ｓ１６４の処理において、格納順に最初のレコードを読み出してＳ１６５〜Ｓ１７４の処理を行った後、次以降のレコードについて、同様にＳ１６４〜Ｓ１７４の処理を行うものとする。一方、Ｓ１６８の判定の結果、該当するレコードを検出しなかった場合、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの領域欄４５５にのみ、前述のＳ１７０の処理を行うとともに、Ｓ１６４で読み出したレコードの返却値サイズ欄４４６の情報をサイズとして、前述のＳ１７１の処理を行う。次に、中間コード生成部１６は、前述のＳ１７２の処理を行う。なお、返却値記憶領域を割り付ける中間コードは、関数呼び出しの中間コードの直前に追加（挿入）する。
【００５１】
＜具体例＞
図１４は図１に示した中間コード生成部が生成する中間コードを説明するためのイメージ図であり、図１５は図１に示した返却値情報テーブルの経過を説明する構成図である。具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「１」のレコードについて、スコープ欄４３３が「実行部」で、かつ、参照関数の数欄４３４が「２」なので、図６に示す関数呼び出しテーブル４４からＩＤ欄４４１が「１」のレコードを読み出す。図６に示すＩＤ欄４４１が「１」のレコードは、返却値情報テーブルＩＤ欄４４３が「１」であり、図７に示す返却値情報テーブル４５のＩＤ欄４５１が「１」レコードは領域欄４５５が未登録なので、中間コード生成部１６は、ＩＤ欄４５１が「１」レコードの共有ＩＤ欄４５４の「１」と共有ＩＤ欄４５４が一致し、かつ、変更欄４５４が「ＮＯ」である、図７に示すＩＤ欄４５１が「３」、「５」、及び「６」の各レコードを検出する。そして、中間コード生成部１６は、図１４のｏｃ１−１に示すように、ＩＤ欄４５１が「１」、「５」、及び「６」のレコードの返却値サイズ欄４４６の「ｓｉｚｅ（ｙ）＊４」と、ＩＤ欄４５１が「３」のレコードの返却値サイズ欄４４６の「（ｋ３−ｊ３＋１）＊４」とにおいて、最大値を算出する中間コードを生成し、算出した最大値をサイズとする領域名「ｒｅｔ＿ｖａｌｕｅ１」の返却値記憶領域の割り付ける中間コードを生成して、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ１」を返却値として参照（使用）する、ＩＤ欄４４１が「１」のレコードの関数呼び出しの中間コードを生成する。また、中間コード生成部１６は、図１５に示すように、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ１」を、ＩＤ欄４５１が「１」、「３」、「５」、及び「６」の各レコードの領域欄４５５にそれぞれ格納する。
【００５２】
＜具体例＞
図１６は図１に示した返却値情報テーブルの経過を説明する構成図である。次に、図５に示す式情報テーブル４３のＩＤ欄４３１が「１」のレコードは、関数呼び出しテーブルＩＤ欄４３５に複数の情報が格納されているので、中間コード生成部１６は、図６に示す関数呼び出しテーブル４４からＩＤ欄４４１が「２」のレコードを読み出す。図６に示すＩＤ欄４４１が「２」のレコードは、返却値情報テーブルＩＤ欄４４３が「２」であり、図７に示す返却値情報テーブル４５のＩＤ欄４５１が「２」レコードは領域欄４５５が未登録なので、中間コード生成部１６は、ＩＤ欄４５１が「１」レコードの共有ＩＤ欄４５４の「２」と共有ＩＤ欄４５４が一致し、かつ、変更欄４５４が「ＮＯ」であるレコードを検索する。しかし、共有ＩＤ欄４５４の「２」のレコードは他に存在しないので、中間コード生成部１６は、図１４のｏｃ１−２に示すように、ＩＤ欄４５１が「２」のレコードの返却値サイズ欄４４６の「ｓｉｚｅ（ｗ）＊４」をサイズとする領域名「ｒｅｔ＿ｖａｌｕｅ２」の返却値記憶領域の割り付ける中間コードを生成し、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ２」を返却値として参照（使用）する、ＩＤ欄４４１が「２」のレコードの関数呼び出しの中間コードを生成する。また、中間コード生成部１６は、図１６に示すように、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ２」を、ＩＤ欄４５１が「２」のレコードの領域欄４５５に格納する。
【００５３】
一方、Ｓ１６６の判定の結果、領域欄４５５が未登録ではない、すなわち登録済である場合に、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの変更欄４５３が「ＮＯ」か否かを判定する（Ｓ１７３）。Ｓ１７４の判定の結果、変更欄４５３が「ＮＯ」の場合、中間コード生成部１６は、領域欄４５５に格納されている領域名を返却値として、前述のＳ１７２の処理を行う。一方、Ｓ１７３の判定の結果、変更欄４５３が「ＮＯ」以外、すなわち「ＹＥＳ」の場合、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの領域欄４５５に格納されている領域名のサイズと、Ｓ１６４の処理で読み出したレコードの返却値サイズ欄４４６に格納されているサイズとを比較し、返却値サイズ欄４４６に格納されているサイズの方が大きいか否かを判定する（Ｓ１７４）。Ｓ１７４の判定の結果、返却値サイズ欄４４６に格納されているサイズの方が大きい場合、中間コード生成部１６は、返却値サイズ欄４４６に格納されているサイズを、領域欄４５５に格納されている領域名のサイズとして、前述のＳ１７１の処理を行う。次に、中間コード生成部１６は、前述のＳ１７２の処理を行う。一方、Ｓ１７４の判定の結果、返却値サイズ欄４４６に格納されているサイズの方が大きくない場合、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの領域欄４５５に格納されている領域名を返却値として参照（使用）して、前述のＳ１７２の処理を行う。
【００５４】
一方、Ｓ１６５の判定の結果、返却値情報テーブルＩＤ欄４４３が「０」の場合、Ｓ１６４の処理で読み出したレコードは、返却値サイズ欄４４６が変数でも式でもない、すなわち当該関数呼び出しの返却値のサイズは不明ではない（明らかである）、と考えられる。よって、中間コード生成部１６は、Ｓ１６４の処理で読み出したレコードの返却値サイズ欄４４６の情報をサイズとして前述のＳ１７１の処理を行う。次に、中間コード生成部１６は、前述のＳ１７２の処理を行う。
【００５５】
一方、Ｓ１６３の判定の結果、参照関数の数欄４３４が「０」の場合、中間コード生成部１６は、Ｓ１６１の処理で読み出したレコードの式欄４３２、すなわち実行部ｓｐ３の式に対する中間コードを生成する（Ｓ１７５）。
【００５６】
一方、Ｓ１６２の判定の結果、スコープ欄４３３が「実行部」でない、すなわちスコープ欄４３３に関数名が格納されている場合、Ｓ１６１の処理で読み出したレコ−ドの式は図２に示すソースプログラムＳＰの関数本体部ｓｐ４の最初の式である、と考えられる。よって、中間コード生成部１６は、図２に示すソースプログラムＳＰの実行部ｓｐ３の式に含まれる関数呼び出し対して、グループごとに割り付けた返却値記憶領域を開放する中間コードを生成し（Ｓ１７６）、実行部ｓｐ３の最後の式に対する中間コードの後に追加（挿入）する。
【００５７】
＜具体例＞
Ｓ１６３の判定の結果、参照関数の数欄４３４が「０」の場合、具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「２」のレコードについて、スコープ欄４３３が「実行部」だが、参照関数の数欄４３４が「０」なので、図１４に示すように、ＩＤ欄４３１が「２」のレコードの式欄４３２の式に対する中間コードを生成する。
【００５８】
＜具体例＞
また、Ｓ１６６の判定の結果、領域欄４５５が登録済である場合、具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「３」のレコードについて、スコープ欄４３３が「実行部」、かつ、参照関数の数欄４３４が「１」なので、図６に示す関数呼び出しテーブル４４からＩＤ欄４４１が「３」のレコードを読み出す。次に、中間コード生成部１６は、読み出したレコードの返却値情報テーブルＩＤ欄４４３が「０」以外、すなわち「３」なので、図１６に示す返却値情報テーブル４５のＩＤ欄が「３」のレコードを参照した結果、変更欄４５３は「ＮＯ」であるが、領域欄４５５に「ｒｅｔ＿ｖａｌｕｅ１」が格納されているので、図１４に示すように、「ｒｅｔ＿ｖａｌｕｅ１」を返却値として使用（参照）する、ＩＤ欄４４１が「３」のレコードの関数呼び出しの中間コードを生成する。
【００５９】
＜具体例＞
また、Ｓ１７４の判定の結果、変更欄４５３が「ＹＥＳ」の場合、具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「４」のレコードについて、スコープ欄４３３が「実行部」、かつ、参照関数の数欄４３４が「１」なので、図６に示す関数呼び出しテーブル４４からＩＤ欄４４１が「４」のレコードを読み出す。次に、中間コード生成部１６は、読み出したレコードの返却値情報テーブルＩＤ欄４４３が「０」以外、すなわち「４」なので、図１６に示す返却値情報テーブル４５のＩＤ欄４５１が「４」のレコードを参照した結果、変更欄４５３が「ＹＥＳ」なので、図１６に示すＩＤ欄４５１が「４」のレコードの領域欄４５５の「ｒｅｔ＿ｖａｌｕｅ１」のサイズと、図６に示すＩＤ欄４４１が「４」のレコードの返却値サイズ欄４４６の「（ｋ３−ｊ３＋１）＊４」とを比較し、ＩＤ欄４４１が「４」のレコードの返却値サイズ欄４４６のサイズの方が大きい場合、図１４のｏｃ１−３に示すように、現時点で割り当てられている領域名「ｒｅｔ＿ｖａｌｕｅ１」の返却値記憶領域を開放する中間コードと、「（ｋ３−ｊ３＋１）＊４」をサイズとする領域名「ｒｅｔ＿ｖａｌｕｅ１」の返却値記憶領域を再度割り付ける中間コードを生成する。そして、中間コード生成部１６は、領域名「ｒｅｔ＿ｖａｌｕｅ１」を返却値として使用（参照）する、ＩＤ欄４４１が「４」のレコードの関数呼び出しの中間コードを生成する。
【００６０】
＜具体例＞
また、図５に示す式情報テーブル４３のＩＤ欄４３１が「５」と「６」の各レコードについても、ＩＤ欄４３１が「３」のレコードと同様に、中間コード生成部１６は、図１４に示すように、領域名「ｒｅｔ＿ｖａｌｕｅ１」を返却値として使用（参照）する、ＩＤ欄４４１が「５」と「６」の各レコードの関数呼び出しの中間コードを生成する。さらに、ＩＤ欄４４１が「６」のレコードの関数呼び出しの中間コードを生成後、中間コード生成部１６は、図１４のｏｃ１−４に示すように、領域名「ｒｅｔ＿ｖａｌｕｅ１」及び「ｒｅｔ＿ｖａｌｕｅ２」を解放する中間コードを生成する。
【００６１】
図１７は、図１に示した中間コード生成部の動作を説明するフローチャートである。図１３に示すＳ１７６の処理の後、図１７に示すように、中間コード生成部１６は、Ｓ１６１の処理で読み出したレコ−ドのスコープ欄４３３の関数名と、関数名欄４２２の情報とが一致するレコードを関数宣言テーブル４２から検索し（Ｓ１７７）、検出したレコードの他関数呼び出しの有無欄４２３が「ＮＯ」か否かを判定する（Ｓ１７８）。他関数呼び出しの有無欄４２３が「ＮＯ」の場合、中間コード生成部１６は、Ｓ１６１の処理で読み出したレコードの式欄４３２、すなわち関数本体部ｓｐ４の式に対する中間コードを生成する（Ｓ１７９）。なお、当該中間コードは、従来のコンパイル装置（コンパイルプログラム）とは異なり、Ｓ１６１の処理で読み出したレコードのスコープ欄４３３に格納された関数の返却値記憶領域の割り付けを含まない。一方、Ｓ１７８の判定の結果、他関数呼び出しの有無欄４２３が「ＮＯ」でない、すなわち「ＹＥＳ」の場合、中間コード生成部１６は、関数呼び出しテーブルＩＤ欄４３５の情報を用いて、関数呼び出しテーブル４４からレコードを読み出し（Ｓ１８０）、返却値サイズ欄４４６に格納されている情報をサイズとし、所定の領域名を付けた返却値記憶領域を割り付ける中間コードを生成する（Ｓ１８１）。次に、中間コード生成部１６は、割り付けた返却値記憶領域を返却値として参照（使用）する、Ｓ１８０の処理で読み出した関数呼び出しテーブル４４のレコードの関数呼び出しの中間コードを生成する（Ｓ１８２）。なお、返却値記憶領域を割り付ける中間コードは、関数呼び出しの中間コードの直前に追加（挿入）する。次に、中間コード生成部１６は、Ｓ１８１の処理で割り付けた返却値記憶領域を開放する中間コードを生成する（Ｓ１８３）。Ｓ１７９の処理又はＳ１８３の処理の後、中間コード生成部１６は、式情報テーブル４３の最後のレコードか否かを判定する（Ｓ１８４）。Ｓ１８４の判定の結果、最後のレコードではない場合、中間コード生成部１６は、式情報テーブルの次のレコードを読み出し（Ｓ１８５）、Ｓ１８５の処理で読み出したレコードに対し、再度Ｓ１７７〜Ｓ１８４の処理を繰り返す。Ｓ１８４の判定の結果、最後のレコードではない場合、中間コード生成部１６は処理を終了する。
【００６２】
＜具体例＞
図１３に示すＳ１７６の処理の後、具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「７」のレコードについて、スコープ欄４３３が「ｆｕｎ１」なので、図４に示す関数名欄４２２が「ｆｕｎ１」であるＩＤ欄４２１が「１」のレコードを関数宣言テーブル４２から検出する。検出したレコードの他関数呼び出しの有無欄４２３が「ＮＯ」なので、中間コード生成部１６は、図１４のｏｃ１−５に示すように、スコープ欄４３３に格納された関数の返却値記憶領域の割り付けを含まない、式欄４３２の式自体の中間コードを生成する。
【００６３】
＜具体例＞
また、Ｓ１７８の判定の結果、他関数呼び出しの有無欄４２３が「ＹＥＳ」の場合、具体的には、中間コード生成部１６は、図５に示す式情報テーブル４３のＩＤ欄４３１が「１３」のレコードについて、スコープ欄４３３が「ｆｕｎ４」なので、図４に示す関数名欄４２２が「ｆｕｎ４」であるＩＤ欄４２１が「４」のレコードを関数宣言テーブル４２から検出する。検出したレコードの他関数呼び出しの有無欄４２３が「ＹＥＳ」なので、中間コード生成部１６は、図５に示す関数呼び出しテーブルＩＤ欄４３５の「８」を用いて、図６に示す関数呼び出しテーブル４４からＩＤ欄４４１が「８」のレコードを読み出す。そして、中間コード生成部１６は、図１４のｏｃ１−５に示すように、読み出した返却値サイズ欄４４６の「ｓｉｚｅ（ｐ）＊４」をサイズとする領域名「ｒｅｔ＿ｖａｌｕｅ４」の返却値記憶領域を割り付ける中間コードを生成し、割り付けた返却値記憶領域を返却値として参照（使用）する、ＩＤ欄４４１が「８」のレコードの関数呼び出しの中間コードを生成し、最後に、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ４」の返却値記憶領域を開放する中間コードを生成する。
【００６４】
図１８は従来の中間コード生成部が生成する中間コードを説明するためのイメージ図である。図１８に示すように、従来の中間コード生成部は、ソースプログラムＳＰの実行部ｓｐ３に対して、関数呼び出しごとに返却値記憶領域を割り付ける中間コードと当該返却値記憶域を解放する中間コードとを生成していた。また、従来の中間コード生成部は、ソースプログラムＳＰの関数本体部ｓｐ４に対して、関数ごとに、当該関数の返却値記憶領域を割り付ける中間コードを生成していた。
【００６５】
これに対し、図１に示す本実施形態の中間コード生成部１６は、図１４に示したように、図１８に示す従来の中間コードと比較して、返却値記憶領域を割り付ける中間コードと当該返却値記憶領域を開放する中間コードとを２つ又は３つずつ削減することができる。
【００６６】
このように、本実施形態によれば、共用ＩＤ欄４５４の情報で分類（識別）される関数呼び出しのグループにおいて、グループに属する全ての関数呼び出しが共用する返却値記憶領域を割り付けるコードと、当該返却値記憶領域を開放するコードとを生成する。これにより、同時に使用しない複数の関数呼び出しのグループにおいて、グループごとの返却値記憶領域を一括して（まとめて）割り付けて、一括して（まとめて）開放することが可能となるので、従来のように、関数呼び出しごとに呼び出された関数の中で返却値記憶領域を割り付けるコードと当該記憶領域を開放するコードとを生成する場合と比較して、返却値記憶領域の割り付けの回数と開放の回数とをともに削減することができる。これにより、オブジェクトプログラムＯＰの実行時間を短縮することができる。
【００６７】
また、本実施形態によれば、所定の関数呼び出しと当該関数呼び出しが属するグループにおいて最初に実行される関数呼び出しとの間で、当該関数呼び出しの返却値のサイズが変更されるか否かを判定する。また、当該グループに属する関数呼び出しのうち、返却値のサイズが不変であると判定された全ての関数呼び出しにおける返却値のサイズの最大値を、当該グループごとの返却値記憶領域のサイズとする。これにより、当該グループにおいてサイズが不変であると判定された全ての関数呼び出しの返却値を、割り付けた返却値記憶領域に記憶（保存）することができるので、返却値記憶領域を一括して割り付けた後、割り付け直す必要がなくなる。これにより、返却値記憶領域の割り付けの回数と開放の回数とを更に削減することができる。
【００６８】
また、本実施形態によれば、返却値のサイズが変更されると判定された関数呼び出しについて、当該関数呼び出しの返却値のサイズと当該関数呼び出しが属するグループごとの返却値記憶領域のサイズとを比較し、当該関数呼び出しの返却値のサイズの方が大きいときに、当該関数呼び出しの返却値のサイズをグループごとの返却値記憶領域のサイズとして、再度グループごとの返却値記憶領域を割り付けるコードと当該返却値記憶領域を開放するコードとを生成する。これにより、グループにおいて返却値のサイズが変更されると判定された関数呼び出しを含む場合であっても、変更された返却値のサイズがグループごとに割り当てた返却値記憶領域のサイズより大きいときのみ、変更された返却値のサイズで返却値記憶領域を割り付け直す。これにより、グループごとの返却値記憶領域を一括して割り付けた後、当該返却値記憶領域の割り付け及び開放をやり直す回数を最小限度に低減（抑制）することができる。
【００６９】
（第二実施形態）
図１９乃至図２２は、本発明の第二実施形態を示すためのものである。なお、特に記載がない限り、前述した第一実施形態と同一構成部分は同一符号をもって表し、その説明を省略する。また、図示しない構成部分は、前述した第一実施形態と同様とする。
【００７０】
第二実施形態と第一実施形態との相違点は、グループごとに適切なサイズの返却値記憶領域を割り付け（静的割り付け）、関数呼び出しに対する中間コードを生成する際に、当該関数呼び出しの返却値のサイズと比較して、必要に応じて新たに返却値記憶領域を割り付ける（動的割り付け）、ようにした点である。
【００７１】
図１９は、本発明の第二実施形態におけるコンパイル装置を説明するブロック図である。図１９に示すように、コンパイル装置１００の中間ファイル作成部１０Ａは、図１に示した第一実施形態の返却値サイズ判定部１５を含まない。また、中間ファイル作成部１０Ａは、図１に示した第一実施形態の中間コード生成部１６に代えて中間コード生成部１６Ａを含む。中間コード生成部１６Ａは、中間コード生成部１６と同様のものであるが、後述する中間コードの生成方法が異なる。さらに、記憶装置４０は、図１に示した第一実施形態の返却値情報テーブル４５に代えて、返却値情報テーブル４５Ａを記憶する。
【００７２】
図２０は、図１９に示した返却値情報テーブルの一例を説明する構成図である。図２０に示すように、返却値情報テーブル４５Ａは、図７に示した返却値情報テーブル４５と同様のものであるが、返却値情報テーブル４５と異なり、変更欄４５３が存在しない。
【００７３】
図２１は図１１９に示した中間コード生成部の動作を説明するフローチャートである。図２１に示すように、図１３に示したフローチャートと比較して、Ｓ１６１の処理の前にＳ１９１及びＳ１９２の処理を行う点と、Ｓ１６５の判定の結果、返却値情報テーブルＩＤ欄４４３が「０」以外の場合に、図１３に示したＳ１６６〜Ｓ１７２の処理に代えてＳ１９３〜Ｓ１９６の処理を行う点とが異なる。
【００７４】
すなわち、中間コード生成部１６Ａは、Ｓ１６１の処理で式情報テーブル４３のレコードを読み出す前に、あらかじめ返却情報テーブル４５Ａの全てのレコードを検索して共用ＩＤ欄４５４の最大値を取得し、共用ＩＤ欄４５４の番号ごとに、割り付ける返却値記憶領域の所定の領域名を、該当するレコードの領域欄４５５にそれぞれ格納するとともに（Ｓ１９１）、適切なサイズを返却値記憶領域のサイズとして、領域欄４５５に格納した所定の領域名の返却値記憶領域を、静的に割り付ける中間コードを生成する（Ｓ１９２）。なお、返却値記憶領域のサイズは、ソースプログラムＳＰに適したサイズをグループごとに決定する。
【００７５】
＜具体例＞
具体的には、中間コード生成部１６Ａは、図２０に示す返却情報テーブル４５Ａから共用ＩＤ欄４５４の最大値「２」を取得し、共用ＩＤ欄４５４が「１」の各レコードの領域欄４５５にそれぞれ「ｒｅｔ＿ｖａｌｕｅ１」を、共用ＩＤ欄４５４が「２」のレコードの領域欄４５５に「ｒｅｔ＿ｖａｌｕｅ２」を格納する。
【００７６】
また、中間コード生成部１６Ａは、Ｓ１６５の判定の結果、返却値情報テーブルＩＤ欄４４３が「０」以外の場合に、Ｓ１６４の処理で読み出したレコードの返却値サイズ欄４４６に格納されているサイズと、Ｓ１６４の処理で読み出したレコードに対応する返却値情報テーブル４５のレコードの領域欄４５５に格納されている領域名のサイズ、すなわちＳ１９２の処理で静的に割り付けた返却値記憶領域のサイズとを比較する中間コードを生成する（Ｓ１９３）。ここで、中間コード生成部１６Ａは、Ｓ１６４の処理で読み出したレコードの返却値サイズ欄４４６に格納されているサイズの方が大きい場合に備えて、以下のＳ１９４〜Ｓ１９６の処理を行う。すなわち、中間コード生成部１６Ａは、Ｓ１６４の処理で読み出したレコードの返却値サイズ欄４４６に格納されている情報をサイズとし、対応する返却値情報テーブル４５のレコードの領域欄４５５に格納した所定の領域名とは異なる、所定の領域名の返却値記憶領域を、動的に割り付ける中間コードを生成する（Ｓ１９４）。これにより、Ｓ１６４の処理で読み出したレコードの関数呼び出しの返却値が使用する返却値記憶領域を割り付けることができる。次に、中間コード生成部１６Ａは、Ｓ１９５の処理で割り付けた返却値記憶領域を返却値として参照（使用）する、Ｓ１６４の処理で読み出した関数呼び出しテーブル４４のレコードの関数呼び出しの中間コードを生成する（Ｓ１９５）。次に、中間コード生成部１６Ａは、Ｓ１９５の処理で割り付けた返却値記憶領域を動的に開放する中間コードを生成する（Ｓ１９６）。
【００７７】
＜具体例＞
図２２は、図１９に示した中間コード生成部が生成する中間コードを説明するためのイメージ図である。
具体的には、中間コード生成部１６Ａは、図５に示すＩＤ欄４３１が「１」のレコードについて、最初に、関数呼び出しテーブルＩＤ欄４３５が「１」に対応する図６に示す関数呼び出しテーブル４４のＩＤ欄４４１が「１」のレコードを読み出す。読み出したレコードは、返却値情報テーブルＩＤ欄４４２が「１」なので、中間コード生成部１６Ａは、図２２の（ｏｃ２−１）に示すように、返却値サイズ欄４４６の「ｓｉｚｅ（ｙ）＊４」と、対応する図２０に示す返却値情報テーブル４６のレコードの領域欄４５５の「ｒｅｔ＿ｖａｌｕｅ１」とを比較する中間コードを生成する。次に、中間コード生成部１６Ａは、図２２の（ｏｃ２−１）に示すように、返却値サイズ欄４４６の「ｓｉｚｅ（ｙ）＊４」をサイズとし、領域欄４５５の「ｒｅｔ＿ｖａｌｕｅ１」とは異なる領域名「ｒｅｔ＿ｖａｌｕｅ１＿ｄ１」の返却値記憶領域を動的に割り付ける中間コードを生成し、領域名「ｒｅｔ＿ｖａｌｕｅ１＿ｄ１」を使用（参照）する関数呼び出しの中間コードを生成する。続いて、中間コード生成部１６Ａは、関数呼び出しテーブルＩＤ欄４３５が「２」に対応する図６に示す関数呼び出しテーブル４４のＩＤ欄４４１が「２」のレコードを読み出し、同様に、比較する中間コードと、領域名「ｒｅｔ＿ｖａｌｕｅ１＿ｄ２」の返却値記憶領域を動的に割り付ける中間コードと、領域名「ｒｅｔ＿ｖａｌｕｅ１＿ｄ２」を使用（参照）する関数呼び出しの中間コードと、を生成する。さらに、中間コード生成部１６Ａは、図２２の（ｏｃ２−１）に示すように、割り付けた領域名「ｒｅｔ＿ｖａｌｕｅ１＿ｄ１」と「ｒｅｔ＿ｖａｌｕｅ１＿ｄ２」の返却値記憶領域を動的に開放する中間コードを、ＩＤ欄４３１が「１」のレコードの式に対する中間コードの最後に追加（挿入）する。なお、スコープ欄４３３が式のレコードについては、図１７に示した第一実施形態の処理と同様の処理を行い、図２２の（ｏｃ２−２）に示すように、中間コードを生成する。
【００７８】
図１９に示す本実施形態の中間コード生成部１６Ａは、図２２に示したように、図１８に示した従来の中間コードと比較して、返却値記憶領域を割り付ける中間コードと当該返却値記憶領域を開放する中間コードとを最大で２つずつ削減することができる。
【００７９】
このように、本実施形態によれば、関数呼び出しの返却値のサイズと当該関数呼び出しが属するグループごとの返却値記憶領域のサイズとを比較し、当該関数呼び出しの返却値のサイズの方が大きいときに、当該関数呼び出しの返却値のサイズで、当該関数呼び出しの返却値が使用する返却値記憶領域を動的に割り付けるコードと、当該返却値記憶領域を動的に開放するコードとを生成する。これにより、関数呼び出しの返却値のサイズが当該関数呼び出しの属するグループごとに割り当てた返却値記憶領域のサイズより大きいときのみ、当該関数呼び出しが使用する返却値記憶領域を動的に割り付ける。これにより、グループごとの返却値記憶領域を一括して割り付けた後、関数呼び出しが使用する返却値記憶領域を動的に割り付け及び開放する回数を最小限度に低減（抑制）することができる。
【００８０】
なお、前述の各実施形態の構成は、組み合わせたり或いは一部の構成部分を入れ替えたりしたりしてもよい。また、本発明の構成は前述の実施形態のみに限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加えてもよい。
【００８１】
前述の各実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
【００８２】
（付記１）ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイル装置であって、複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類部と、前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成部と、を備えることを特徴とするコンパイル装置。
【００８３】
（付記２）前記関数呼び出しと該関数呼び出しが属する前記グループにおいて最初に実行される関数呼び出しとの間で、該関数呼び出しの返却値のサイズが変更されるか否かを判定する返却値サイズ判定部、を更に備え、前記コード生成部は、前記グループに属する前記関数呼び出しのうち、前記返却値サイズ判定部により返却値のサイズが不変であると判定された全ての前記関数呼び出しにおける返却値のサイズの最大値を、前記所定のサイズとすることを特徴とする付記１に記載のコンパイル装置。
【００８４】
（付記３）前記コード生成部は、前記返却値サイズ判定部により前記返却値のサイズが変更されると判定された前記関数呼び出しについて、該関数呼び出しの返却値のサイズと該関数呼び出しが属する前記グループごとの前記返却値記憶領域のサイズとを比較し、該関数呼び出しの返却値のサイズの方が大きいときに、該関数呼び出しの返却値のサイズを前記所定のサイズとして、再度前記グループごとの前記返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成することを特徴とする付記２に記載のコンパイル装置。
【００８５】
（付記４）前記コード生成部は、前記関数呼び出しの返却値のサイズと該関数呼び出しが属する前記グループごとの前記返却値記憶領域のサイズとを比較し、該関数呼び出しの返却値のサイズの方が大きいときに、該関数呼び出しの返却値のサイズで、該関数呼び出しの返却値が使用する前記返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成することを特徴とする付記１に記載のコンパイル装置。
【００８６】
（付記５）ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイル方法であって、複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成ステップと、を備えることを特徴とするコンパイル方法。
【００８７】
（付記６）ソースプログラムの実行部に含まれる関数呼び出しの返却値を記憶する返却値記憶領域を割り付けるコードと該返却値記憶領域を開放するコードとを生成するコンパイルプログラムであって、複数の前記関数呼び出しのうち、同時に使用する複数の前記関数呼び出しを相互に異なるグループに分けるとともに、同時に使用しない複数の前記関数呼び出しを同じグループにまとめる関数呼び出し分類ステップと、前記グループごとに、該グループに属する全ての前記関数呼び出しが共用する所定のサイズの前記返却値記憶領域を割り付けるコードと、該返却値記憶領域を開放するコードとを生成するコード生成ステップと、を備えることを特徴とするコンパイルプログラム。
【符号の説明】
【００８８】
１０，１０Ａ…中間ファイル作成部、１４…関数呼び出し分類部、１５…返却値サイズ判定部、１６，１６Ａ…中間コード生成部、１００…コンパイル装置、ＳＰ…ソースプログラム、ＩＦ…中間ファイル、ＯＰ…オブジェクトプログラム
【図１】
0005458979.tif 000002
【図２】
0005458979.tif 000003
【図３】
0005458979.tif 000004
【図４】
0005458979.tif 000005
【図５】
0005458979.tif 000006
【図６】
0005458979.tif 000007
【図７】
0005458979.tif 000008
【図８】
0005458979.tif 000009
【図９】
0005458979.tif 000010
【図１０】
0005458979.tif 000011
【図１１】
0005458979.tif 000012
【図１２】
0005458979.tif 000013
【図１３】
0005458979.tif 000014
【図１４】
0005458979.tif 000015
【図１５】
0005458979.tif 000016
【図１６】
0005458979.tif 000017
【図１７】
0005458979.tif 000018
【図１８】
0005458979.tif 000019
【図１９】
0005458979.tif 000020
【図２０】
0005458979.tif 000021
【図２１】
0005458979.tif 000022
【図２２】
0005458979.tif 000023