(57)【要約】【課題】同一の不連続配列に別々の作業配列を割り当てることをなくし、高速に実行できるオブジェクトプログラムを生成するコンパイル装置等を提供する。【解決手段】本実施形態に係るコンパイル装置１０は、ソースファイル２１から中間コード２６を生成する中間コード生成手段３１を備え、この中間コード生成手段３１は、ソースファイル２１に含まれる配列宣言についての情報を抽出する型宣言解析部４１と、抽出された配列宣言によって定義される配列が連続か不連続かを判断し、配列が不連続である場合にその配列に含まれる実引数を抽出する不連続配列実引数検出部４５と、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出する同一変数名検出部４６と、ソースファイルから中間コードを生成し、その際に検出された同一の実引数には同一の作業配列を割り当てる中間コード割当部４９とを備える。【選択図】図１
2010250683.tif 000002
【特許請求の範囲】
【請求項１】
与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置であって、
前記ソースファイルから中間コードを生成する中間コード生成手段を備え、
前記中間コード生成手段が、
前記ソースファイルに含まれる配列宣言についての情報を抽出する型宣言解析部と、
抽出された前記配列宣言によって定義される配列が連続か不連続かを判断し、前記配列が不連続である場合にその配列に含まれる実引数を抽出する不連続配列実引数検出部と、
前記実引数と同一の実引数が前記ソースファイル内で既に使われていればこれを検出する同一変数名検出部と、
前記ソースファイルから中間コードを生成し、その際に検出された前記同一の実引数には同一の作業配列を割り当てる中間コード割当部と
を備えることを特徴とするコンパイル装置。
【請求項２】
前記中間コード生成手段が、前記同一変数名検出部によって検出された前記同一の実引数が、前記実引数に係る先行する手続によって変更される可能性があるか否かを判断する検出変数変更検査部を備え、
前記中間コード割当部が、前記同一の実引数が前記先行する手続によって変更される可能性がない場合に前記同一の実引数には同一の作業配列を割り当てることを特徴とする、請求項１に記載のコンパイル装置。
【請求項３】
前記中間コード生成手段が、前記同一変数名検出部によって検出された前記同一の実引数が、前記オブジェクトプログラムの実行中に変更される可能性があるか否かを判断する同一配列検出部を備え、
前記中間コード割当部が、前記同一の実引数が前記オブジェクトプログラムの実行中に変更される可能性がない場合に前記同一の実引数には同一の作業配列を割り当てることを特徴とする、請求項１に記載のコンパイル装置。
【請求項４】
前記ソースファイルがフォートランによって記述されていることを特徴とする、請求項１に記載のコンパイル装置。
【請求項５】
与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置にあって、前記ソースファイルから前記オブジェクトプログラムを生成する方法であって、
前記ソースファイルに含まれる配列宣言についての情報を抽出し、
抽出された前記配列宣言によって定義される配列が連続か不連続かを判断し、
前記配列が不連続である場合にその配列に含まれる実引数を抽出し、
前記実引数と同一の実引数が前記ソースファイル内で既に使われていればこれを検出し、
検出された前記同一の実引数には同一の作業配列を割り当てつつ前記ソースファイルから中間コードを生成し、
前記中間コードから前記オブジェクトプログラムを生成する
ことを特徴とするコンパイル方法。
【請求項６】
与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置にあって、
コンピュータに、
前記ソースファイルに含まれる配列宣言についての情報を抽出する手順と、
抽出された前記配列宣言によって定義される配列が連続か不連続かを判断する手順と、
前記配列が不連続である場合にその配列に含まれる実引数を抽出する手順と、
前記実引数と同一の実引数が前記ソースファイル内で既に使われていればこれを検出する手順と、
検出された前記同一の実引数には同一の作業配列を割り当てつつ前記ソースファイルから中間コードを生成する手順と、
前記中間コードから前記オブジェクトプログラムを生成する手順と
を実行させることを特徴とするコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム言語によって記述されたソースファイルを実行可能形式に変換するコンパイル装置に関し、特にそのコンパイルによって生成される実行可能形式ファイルの実行速度の高速化に関する。
【背景技術】
【０００２】
フォートラン（FORTRAN）は、主に科学技術向けの用途に多く使用されるプログラム言語の一つである。フォートランでは、サブルーチンや関数などの手続の引数が配列のときに実引数と仮引数を結合する場合、実引数である配列は連続である必要がある。連続とは、配列の全体あるいはある部分の開始要素から終了要素まで隙間なく参照されていることを意味する。
【０００３】
例えば、「ＩＮＴＥＧＥＲ，ＤＩＭＥＮＳＩＯＮ（１０）：：Ａ」と宣言されている配列Ａに対し、「Ａ（２：８：１）」という参照がある場合を考える。「Ａ（２：８：１）」の「（２：８：１）」は添字三つ組と呼ばれるフォートランの配列の添字を記述する方法で、「２」を下限、「８」を上限、「１」を刻み幅と呼ぶ。「Ａ（２：８：１）」は、添字が２から８まで刻み幅「１」で配列Ａの要素Ａ（２）、Ａ（３）、…、Ａ（８）を参照することを示す。Ａ（２）、Ａ（３）、…、Ａ（８）は隙間なく参照されるので、Ａ（２：８：１）は連続である。
【０００４】
次に、「Ａ（２：８：３）」という参照がある場合を考える。「Ａ（２：８：３）」は、刻み幅が「３」なので、配列Ａの要素Ａ（２）、Ａ（５）、Ａ（８）が参照される。Ａ（３）、Ａ（４）、Ａ（６）、Ａ（７）は参照されず、そこが隙間となるため、Ａ（２：８：３）は不連続である。
【０００５】
２次元以上の配列の場合は、各次元の刻み幅が１、各次元の下限と宣言が一致し、最上位以外の次元の上限が宣言と同じであるときもしくはすべての次元の上限が宣言と同じであるときに連続である。
【０００６】
例えば、「ＩＮＴＥＧＥＲ，ＤＩＭＥＮＳＩＯＮ（５，５）：：Ｂ」と宣言されている配列Ｂは、Ｂ（１，１）、Ｂ（２，１）、…、Ｂ（５，１）、Ｂ（１，２）、Ｂ（２，２）、…、Ｂ（５，２）、Ｂ（１，３）、…、Ｂ（５，５）の順で配置される。「Ｂ（１：５：１，１：２：１）」の参照の場合は、配列Ｂの要素Ｂ（１，１）、Ｂ（２，１）、…、Ｂ（５，１）、Ｂ（１，２）、Ｂ（２，２）、…、Ｂ（５，２）が参照される。これらは、隙間なく参照されているので、連続である。
【０００７】
これに対して「Ｂ（１：３：１，１：２：１）」は、Ｂ（１，１）、Ｂ（２，１）、Ｂ（３，１）、Ｂ（２，１）、Ｂ（２，２）、Ｂ（３，２）と参照されるが、Ｂ（４，１）、Ｂ（５，１）は参照されないので、Ｂ（１：３：１，１：２：１）は不連続である。
【０００８】
不連続な配列が手続の実引数に指定された場合は、ソースファイルから中間コードを生成する際、手続呼び出しの直前に一時的な領域（作業配列）に参照される配列要素をコピーし、連続となるよう並べ換え、呼び出した手続にその作業配列を渡す方法が用いられている。図１０は、フォートランによって記述されたソースファイル２２１の例を示す説明図である。図１１は、図１０に示したソースファイル２２１から生成された中間コード２２６の例を示す説明図である。ＷＡ１〜ＷＡ４までの４つの作業配列が使用されている。
【０００９】
これに関連する技術文献として、次の特許文献がある。特許文献１には、手続きに呼び出された実引数の配列が連続した領域にあるか否かを判定し、連続した領域にあれば最適化を行うという最適化コードの生成方法が記載されている。特許文献２には、部分配列が連続した領域を指定しているか否かを判定し、連続した領域を指定していれば作業領域への複写や書き戻しを行わないという最適化コードの生成方法が記載されている。特許文献３には、部分配列のメモリ領域が連続であるか不連続であるかを判定し、判定できない場合には複数のメモリ割り付けを連結したコードを生成するという実引数の最適化方法が記載されている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平０７−０３６７０９号公報
【特許文献２】特開平１０−３３３９１５号公報
【特許文献３】特開平１１−１８４７１０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
サブルーチンや関数などの手続の実引数が配列で不連続であるときで、複数の手続で同じ不連続な配列を実引数として参照している場合でも、手続の呼び出しに同様の配列が同じ添字で現れるごとに、実引数を作業配列にコピーしていた。このため、同一の作業配列が利用できる場合であっても、別々の作業配列がコピーされることとなり、その結果として生成されたオブジェクトプログラムの実行時間が長くなる。
【００１２】
特許文献３に記載の技術では、実引数が同じであってもそれぞれ作業配列にコピーされるため、同じコピー処理が２回以上実行されているので、この問題を解決していない。同様に特許文献１および２にも、この問題を解決しうる構成は記載されていない。
【００１３】
本発明の目的は、同一の不連続配列に別々の作業配列を割り当てることをなくし、高速に実行できるオブジェクトプログラムを生成することを可能とするコンパイル装置、コンパイル方法およびそのプログラムを提供することにある。
【課題を解決するための手段】
【００１４】
上記目的を達成するため、本発明に係るコンパイル装置は、与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置であって、ソースファイルから中間コードを生成する中間コード生成手段を備え、中間コード生成手段が、ソースファイルに含まれる配列宣言についての情報を抽出する型宣言解析部と、抽出された配列宣言によって定義される配列が連続か不連続かを判断し、配列が不連続である場合にその配列に含まれる実引数を抽出する不連続配列実引数検出部と、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出する同一変数名検出部と、ソースファイルから中間コードを生成し、その際に検出された同一の実引数には同一の作業配列を割り当てる中間コード割当部とを備えることを特徴とする。
【００１５】
上記目的を達成するため、本発明に係るコンパイル方法は、与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置にあって、ソースファイルからオブジェクトプログラムを生成する方法であって、ソースファイルに含まれる配列宣言についての情報を抽出し、抽出された配列宣言によって定義される配列が連続か不連続かを判断し、配列が不連続である場合にその配列に含まれる実引数を抽出し、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出し、検出された同一の実引数には同一の作業配列を割り当てつつソースファイルから中間コードを生成し、中間コードからオブジェクトプログラムを生成することを特徴とする。
【００１６】
上記目的を達成するため、本発明に係るコンパイルプログラムは、与えられたソースファイルから実行可能形式のオブジェクトプログラムを生成するコンパイル装置にあって、コンピュータに、ソースファイルに含まれる配列宣言についての情報を抽出する手順と、抽出された配列宣言によって定義される配列が連続か不連続かを判断する手順と、配列が不連続である場合にその配列に含まれる実引数を抽出する手順と、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出する手順と、検出された同一の実引数には同一の作業配列を割り当てつつソースファイルから中間コードを生成する手順と、中間コードからオブジェクトプログラムを生成する手順とを実行させることを特徴とする。
【発明の効果】
【００１７】
本発明は、上述したように、不連続配列の実引数を抽出して同じ不連続配列であるか否かを判断するように構成したので、同一の不連続配列であるか否かを有効に検出できる。これによって、同一の不連続配列に別々の作業配列を割り当てることをなくし、高速に実行できるオブジェクトプログラムを生成することが可能であるという、優れた特徴を持つコンパイル装置、コンパイル方法およびそのプログラムを提供することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明に係るコンパイル装置の構成を示す説明図である
【図２】図１で示したＣＰＵで実行される各機能部および各データの処理の流れを示す説明図である。
【図３】図１〜２で示した中間コード生成手段の動作を示すフローチャートである。
【図４】図１〜２で示したソースファイルの例を示す説明図である。
【図５】図２で示した型宣言テーブルの例を示す表である。
【図６】図２で示した手続テーブルの例を示す表である。
【図７】図２で示した手続呼び出しテーブルの例を示す表である。
【図８】図２で示した不連続配列実引数テーブルの例を示す表である。
【図９】図２で示した中間コードの例を示す説明図である。
【図１０】フォートランによって記述されたソースファイルの例を示す説明図である。
【図１１】図１０に示したソースファイルから生成された中間コードの例を示す説明図である。
【発明を実施するための形態】
【００１９】
（第１の実施形態）
以下、本発明の第１の実施形態の構成について添付図１〜２に基づいて説明する。
最初に、本実施形態の基本的な内容について説明し、その後でより具体的な内容について説明する。
本実施形態に係るコンパイル装置１０は、与えられたソースファイル２１から実行可能形式のオブジェクトプログラム２８を生成するコンパイル装置であり、ソースファイル２１から中間コード２６を生成する中間コード生成手段３１を備える。この中間コード生成手段３１は、ソースファイル２１に含まれる配列宣言についての情報を抽出する型宣言解析部４１と、抽出された配列宣言によって定義される配列が連続か不連続かを判断し、配列が不連続である場合にその配列に含まれる実引数を抽出する不連続配列実引数検出部４５と、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出する同一変数名検出部４６と、ソースファイルから中間コードを生成し、その際に検出された同一の実引数には同一の作業配列を割り当てる中間コード割当部４９とを備える。
【００２０】
中間コード生成手段３１はさらに、同一変数名検出部４６によって検出された同一の実引数が、実引数に係る先行する手続によって変更される可能性があるか否かを判断する検出変数変更検査部４７を備え、中間コード割当部４９は同一の実引数が先行する手続によって変更される可能性がない場合に同一の実引数には同一の作業配列を割り当てる。
【００２１】
また、中間コード生成手段３１は、同一変数名検出部４６によって検出された同一の実引数が、オブジェクトプログラムの実行中に変更される可能性があるか否かを判断する同一配列検出部４８を備え、中間コード割当部４９は同一の実引数がオブジェクトプログラムの実行中に変更される可能性がない場合に同一の実引数には同一の作業配列を割り当てる。
【００２２】
そして、ソースファイル２１は、フォートランによって記述されている。
【００２３】
以上の構成を備えることにより、コンパイル装置１０は同一の不連続配列に別々の作業配列を割り当てることをなくすことができる。
以下、これをより詳細に説明する。
【００２４】
図１は、本発明に係るコンパイル装置１０の構成を示す説明図である。コンパイル装置１０は、一般的なコンピュータ装置であり、コンピュータプログラムを実行する主体であるＣＰＵ（Central Processing Unit）１１と、ＣＰＵ１１が実行するコンピュータプログラムおよびそれらのプログラムが処理する各種データファイルが記憶されているＨＤＤ（Hard Disk Drive）１２と、ＣＰＵ１１がＨＤＤ１２から読み込んだプログラムが一時的に記憶されるＲＡＭ（Random Access Memory）１３と、ユーザのプログラミングを入力する入力装置１４と、プログラムの実行結果を表示するディスプレイ１５とを備える。
【００２５】
ＣＰＵ１１では、ＨＤＤ１２に記憶されたソースファイル２１をＣＰＵ１１にて実行可能な形式のオブジェクトプログラム２８に変換するコンパイラ３０が、コンピュータプログラムとして実行される。コンパイラ３０は、中間コード生成手段３１、最適化手段３２、コード生成手段３３といった各機能部からなる。
【００２６】
中間コード生成手段３１は、ソースファイル２１から中間コード２６を生成する。最適化手段３２は、中間コード２６を最適化して最適化済み中間コード２７を生成する。コード生成手段３３は、最適化済み中間コード２７から最終的にコンパイルされた実行可能形式のオブジェクトプログラム２８を生成する。なお、最適化手段３２およびコード生成手段３３については公知技術がそのまま利用できるので、本明細書では中間コード生成手段３１についてのみ、以後に詳しく説明する。
【００２７】
図２は、図１で示したＣＰＵ１１で実行される各機能部および各データの処理の流れを示す説明図である。中間コード生成手段３１は、後述の型宣言解析部４１、引用仕様宣言解析部４２、手続本体解析部４３、手続呼び出し検出部４４、不連続配列実引数検出部４５、同一変数名検出部４６、検出変数変更検査部４７、同一配列検出部４８、中間コード割当部４９、といった各機能部を含む。
【００２８】
ＨＤＤ１２には、前述のソースファイル２１、オブジェクトプログラム２８が、ＲＡＭ１３には、後述の型宣言テーブル２２、手続テーブル２３、手続呼び出しテーブル２４、不連続配列実引数テーブル２５が、各々中間コード生成手段３１の備える各手段によって記憶され、参照される。
【００２９】
型宣言解析部４１は、ソースファイル２１中にある配列宣言の情報を型宣言テーブル２２に登録する。引用仕様宣言解析部４２は、ソースファイル２１中の引用仕様宣言（フォートランの言語仕様において、手続の引数と返却値の型、引数と返却値が配列の場合は次元数などを宣言する）を解析し、宣言されている手続の情報を手続テーブル２３に登録する。
【００３０】
手続本体解析部４３は、仮引数がその手続内で変更される可能性があるか検査し、変更の可能性を手続テーブル２３に登録する。手続呼び出し検出部４４は、プログラムから手続呼び出しを実行される順に検出し、検出した手続の情報を手続呼び出しテーブル２４に登録する。
【００３１】
不連続配列実引数検出部４５は、手続呼び出しテーブル２４に登録された実引数である配列が連続か不連続かを判断し、配列が不連続であるとき、その配列を不連続配列実引数テーブル２５に登録する。同一変数名検出部４６は、不連続配列実引数テーブル２５の各行に登録されている実引数と同じ先行する実引数を検索し、検出した実引数の情報を不連続配列実引数テーブル２５に登録する。
【００３２】
検出変数変更検査部４７は、同一変数名検出部４６で検出した同じ実引数が、先行する手続で変更されるか検査し、変更の可能性を不連続配列実引数テーブル２５に情報を登録する。同一配列検出部４８は、同一変数名検出部４６で検出した同じ実引数が、二つの参照式の間の式で変更されるか検査し、変更の可能性の有無についての情報を不連続配列実引数テーブル２５に登録する。
【００３３】
中間コード割当部４９は、ソースファイル２１の先頭から中間コード２６を生成する。同一変数名検出手段で検出した同じ実引数が変更されないと判断できるときは、同じ作業配列を参照する中間コード２６を生成する。そうでないときは、別の作業配列を参照する中間コード２６を生成する。
【００３４】
図３は、図１〜２で示した中間コード生成手段３１の動作を示すフローチャートである。図４は、図１〜２で示したソースファイル２１の例を示す説明図である。ソースファイル２１は、フォートランによって記述されており、型宣言２１ａと、引用仕様宣言２１ｂと、実行部２１ｃと、手続本体２１ｄといった各部分を含む。ちなみにソースファイル２１は、背景技術の欄で説明した図１０のソースファイル２２１と同一である。
【００３５】
図５は、図２で示した型宣言テーブル２２の例を示す表である。型宣言解析部４１は、図４に示したソースファイル２１の中の配列ｘ，ｙ，ｚ，ｗ，ａについて、各々の配列名カラム２２ａと、引数の位置ごとの下限カラム２２ｂ、上限カラム２２ｃを型宣言テーブル２２に登録する（図３：ステップＳ１０１）。
【００３６】
図６は、図２で示した手続テーブル２３の例を示す表である。引用仕様宣言解析部４２は、まずソースファイル２１内の引用仕様宣言２１ｂを解析する。引用仕様宣言２１ｂとは、フォートランの言語仕様において、手続の引数と返却値の型、引数と返却値が配列の場合は次元数などを宣言するものである。この引用仕様宣言２１ｂには、手続名、仮引数の位置（何番目の引数か）、仮引数にＩＮＴＥＮＴ（ＩＮ）（フォートランの言語仕様において、引数が手続内で変更されないことを示す）が指定されているか否かなどが含まれる。
【００３７】
引用仕様宣言解析部４２は、この引用仕様宣言２１ｂを解析し、手続きごとに割り振られる手続き呼び出しＩＤカラム２３ａ、手続名カラム２３ｂ、仮引数の位置カラム２３ｃ、ＩＮＴＥＮＴ（ＩＮ）が指定されていか否かを示すＩＮＴＥＮＴ（ＩＮ）カラム２３ｄなどについて、手続テーブル２３に登録する（図３：ステップＳ１０２）。
【００３８】
手続本体解析部４３は、仮引数がその手続内で変更される可能性があるか検査し、変更の可能性を手続テーブル２３の変更カラム２３ｅに登録する。具体的には、ソースファイル２１の手続本体２１ｄ（サブルーチンや関数の本体部分）から、手続テーブル２３のＩＮＴＥＮＴ（ＩＮ）カラム２３ｄにＮＯが登録されている仮引数を検出し、手続内で変更されるか検査し、変更される可能性がある場合は手続宣言テーブルの変更カラム２３ｅにＹＥＳ、そうでない場合はＮＯを登録する。ＩＮＴＥＮＴ（ＩＮ）カラム２３ｄにＹＥＳが登録されている場合は、変更カラム２３ｅにＮＯを登録する（図３：ステップＳ１０３）。
【００３９】
図７は、図２で示した手続呼び出しテーブル２４の例を示す表である。手続呼び出し検出部４４は、ソースファイル２１から手続呼び出しを実行される順に検出し、検出した手続の情報を手続呼び出しテーブル２４に登録する（図３：ステップＳ１０４）。具体的には手続呼び出しテーブル２４は、ソースファイル２１から手続呼び出しを実行される順に検出し、実行される順番に手続呼び出しに手続呼び出し検出部４４が付加する一意のＩＤである手続呼び出しＩＤカラム２４ａ、手続名カラム２４ｂ、実引数の位置２４ｃとその実引数名２４ｄ、実引数が配列の場合は次元ごとの配列範囲（下限、上限、刻み幅）２４ｅとからなる。
【００４０】
不連続配列実引数検出部４５は、手続呼び出しテーブル２４に登録された実引数である配列が連続か不連続かを判断し、配列が不連続であるとき、その配列を不連続配列実引数テーブル２５に登録する（図３：ステップＳ１０５〜１０６）。具体的には、手続呼び出しテーブル２４に登録された実引数である配列ごとにその配列範囲と型宣言テーブル２２を調べ、配列が連続か不連続かを判断する。配列が不連続であるとき、その配列を不連続配列実引数テーブル２５に登録する。
【００４１】
図８は、図２で示した不連続配列実引数テーブル２５の例を示す表である。不連続配列実引数検出部４５は、不連続配列実引数テーブル２５に、手続呼び出しテーブル２４に登録されている手続呼び出しＩＤカラム２４ａ、手続名カラム２４ｂ、実引数名カラム２４ｄ、実引数の位置カラム２４ｃ、配列範囲カラム２４ｅを登録する。
【００４２】
また不連続配列実引数テーブル２５には、これらに対応するデータを記録する配列要素変更カラム２５ａ、添字変更カラム２５ｂ、検出式手続呼び出しＩＤカラム２５ｃ、検出式引数位置カラム２５ｄ、作業配列カラム２５ｅも存在するが、配列要素変更カラム２５ａおよび添字変更カラム２５ｂの初期値は「ＮＯ」、検出式手続呼び出しＩＤカラム２５ｃおよび検出式引数位置カラム２５ｄの初期値は「０」、作業配列カラム２５ｅの初期値は「Ｎｕｌｌ」である。
【００４３】
同一変数名検出部４６は、不連続配列実引数テーブル２５の各行に登録されている実引数と同じ先行する実引数を検索し、検出した実引数の情報を不連続配列実引数テーブル２５に登録する（図３：ステップＳ１０７）。具体的には、不連続配列実引数テーブル２５の各行を起点とし、手続呼び出しＩＤカラム２４ａの若い方に向かって、実引数名カラム２４ｄ、配列範囲カラム２４ｅ（下限、上限、刻み幅）が同じものを検索する。同じものが見つかったとき、起点となった行の検出式手続呼び出しＩＤカラム２５ｃおよび検出式引数位置カラム２５ｄに検出した手続呼び出しＩＤと引数位置を登録する。
【００４４】
検出変数変更検査部４７は、同一変数名検出部４６で検出した同じ実引数が、先行する手続で変更されるか検査し、変更の可能性を不連続配列実引数テーブル２５に情報を登録する（図３：ステップＳ１０８〜１０９）。具体的には、不連続配列実引数テーブル２５に登録された各行の検出式手続呼び出しＩＤカラム２５ｃおよび検出式引数位置カラム２５ｄに登録された手続呼び出しＩＤ２４ａを不連続配列実引数テーブル２５より検出し、検出したＩＤの不連続配列実引数テーブル２５に登録されている手続名２４ｂと一致する手続名を手続テーブル２３より検出する。不連続配列テーブル２５に登録されている位置と手続テーブル２３より、実引数がその手続で変更されるか否かを検査する。
【００４５】
検出変数変更検査部４７は、手続テーブル２３のＩＮＴＥＮＴ（ＩＮ）カラム２３ｄがＮＯで、かつ変更カラム２３ｅがＹＥＳのとき、検出式引数位置カラム２５ｄに登録されている引数は検出式手続呼び出しＩＤカラム２５ｃの手続で変更されていると判断し、検出式手続呼び出しＩＤカラム２５ｃに登録されている手続呼び出しＩＤの不連続実引数配列テーブル２５の配列要素変更カラム２５ａにＹＥＳを登録する。
【００４６】
次に検出変数変更検査部４７は、不連続配列実引数テーブル２５の同行の配列範囲カラム２４ｅに登録された下限、上限、刻み幅が、検出式手続呼び出しＩＤカラム２５ｃおよび検出式引数位置カラム２５ｄに登録されている手続呼び出しＩＤに対応する手続呼び出しの実引数であるか否かを調べる。
【００４７】
実引数の場合、検出式手続呼び出しＩＤカラム２５ｃに登録されている手続呼び出しＩＤに対応する行を不連続配列実引数テーブル２５より得て、その行から呼び出している手続名を得る。手続名に対応する実引数の手続テーブル２３を調べ、対応する引数のＩＮＴＥＮＴ（ＩＮ）カラム２３ｄがＮＯで、かつ変更カラム２３ｅがＹＥＳのとき検出変数変更検査部４７は下限、上限、刻み幅に対応する引数が変更されると判断し、不連続配列実引数テーブル２５の添字変更カラム２５ｂにＹＥＳを登録する。
【００４８】
同一配列検出部４８は、同一変数名検出部４６で検出した同じ実引数が、二つの参照式の間の式で変更されるか検査し、変更の可能性を不連続配列実引数テーブル２５に情報を登録する（図３：ステップＳ１１０〜１１１）。具体的には、不連続配列実引数テーブル２５の各行ごとに、その手続呼び出しＩＤカラム２４ａの手続呼び出しから、その行の検出式手続呼び出しＩＤカラム２５ｃに登録された手続呼び出しＩＤに対応する手続呼び出しの間で、実行されるソースファイル２１内の式を調べる。その間で、当該行の実引数名カラム２４ｄに登録された配列、配列範囲カラム２４ｅに登録された変数が変更されると判断したとき、同一配列検出部４８は同行の配列要素変更カラム２５ａを「ＹＥＳ」、添字変更カラム２５ｂを「ＹＥＳ」とする。
【００４９】
図９は、図２で示した中間コード２６の例を示す説明図である。中間コード割当部４９は、ソースファイル２１の先頭から中間コード２６を生成する（図３：ステップＳ１１２）。その際、不連続配列実引数テーブル２５に登録されている手続呼び出しＩＤに対応する手続呼び出しの中間コードを生成するとき、不連続配列実引数テーブル２５の対応する手続呼び出しＩＤの手続呼び出しＩＤカラム２４ａが０のときは作業配列を生成し、生成した作業配列を参照する中間コードを生成し、不連続配列実引数テーブルの作業配列カラム２５ｅに生成した作業配列名を登録する。
【００５０】
不連続配列実引数テーブル２５の対応する手続呼び出しＩＤの手続呼び出しＩＤカラム２４ａが０でないときは、不連続配列実引数テーブル２５の手続呼び出しＩＤカラム２４ａに該当する配列要素変更カラム２５ａ、添字変更カラム２５ｂおよび作業配列カラム２５ｅを調べる。配列要素変更カラム２５ａ、添字変更カラム２５ｂのいずれか一方または両方がＹＥＳのときは、作業配列を生成し、生成した作業配列を参照する中間コードを生成する。生成した作業配列は、不連続配列実引数テーブル２５の中間コードを生成している手続の手続呼び出しＩＤの作業配列カラム２５ｅに登録する。配列要素変更カラム２５ａ、添字変更カラム２５ｂが両方ともＮＯの場合は、作業配列カラム２５ｅに登録されている作業配列を参照するよう、中間コード２６を生成する。
【００５１】
図４で示したソースファイル２１に、本実施形態を適用した場合の動作について説明する。ソースファイル２１の型宣言には、ソースファイル２１はフォートランによって作成されており、配列ｘ，ｙ，ｚ，ｗ，ａ、変数ｎ１，ｎ２，ｍ１，ｍ２，ｍ３と、関数ｆｕｎ１，ｆｕｎ２，ｆｕｎ３，ｆｕｎ４が宣言されている。型宣言解析部４１は、
配列ｘ、ｙ、ｚ、ｗ、ａについて、型宣言テーブル２２に登録する。
【００５２】
引用仕様宣言解析部４２は、ソースファイル２１で宣言されているｆｕｎの３つの引数すべてにＩＮＴＥＮＴ（ＩＮ）が指定されているので、手続テーブル２３の手続名カラム２３ｂは「ｆｕｎ」、仮引数の位置カラム２３ｃ「１」のＩＮＴＥＮＴ（ＩＮ）カラム２３ｄカラムにＹＥＳ、仮引数の位置カラム２３ｃ「２」のＩＮＴＥＮＴ（ＩＮ）カラム２３ｄカラムにＹＥＳ、仮引数の位置カラム２３ｃ「３」ＩＮＴＥＮＴ（ＩＮ）カラム２３ｄカラムにＹＥＳを登録する。同様に、ｆｕｎ２、ｆｕｎ３、ｆｕｎ４も登録する。
【００５３】
手続本体解析部４３は、ソースファイル２１の手続本体を解析し、手続テーブル２３のｆｕｎ２、ｆｕｎ３、ｆｕｎ４の引数が手続き内で変更されるか調べる。ｆｕｎ３の位置２と３の引数が変更されるので手続宣言テーブルの変更カラム２３ｅにＹＥＳを登録する。それ以外はＮＯを登録する。ｆｕｎの引数はＩＮＴＥＮＴ（ＩＮ）カラム２３ｄがＹＥＳなので、手続宣言テーブル２３の変更カラム２３ｅカラムにＮＯを登録する。
【００５４】
手続呼び出し検出部４４は、ソースファイル２１の実行部からまずｆｕｎを検出し、１番目の実引数ａと各次元の下限、上限、刻み幅の（１：ｍ１：１）、（１：ｍ２＋ｍ３：１）を手続呼び出しテーブル２４に登録する。同様に、ｆｕｎ２、ｆｕｎ３、ｆｕｎ４を手続呼び出しテーブルに登録する。
【００５５】
不連続配列実引数検出部４５において、手続呼び出しテーブル２４に登録されている手続呼び出しＩＤカラム２４ａ＝「１」の実引数で配列であるａの下限、上限を型宣言テーブル２２に登録されている下限、上限と一致するか検査し、一致しないことがわかるので実引数名２４ｄ＝「ａ」に対応する手続呼び出しＩＤ２４ａ、手続名２４ｂ、実引数位置２４ｃ、実引数名２４ｄ、配列範囲（下限、上限、刻み幅）２４ｅを不連続配列実引数テーブル２５に登録する。
【００５６】
その際、不連続配列実引数テーブル２５の配列要素変更カラム２５ａおよび添字変更カラム２５ｂは「ＮＯ」で初期化し、検出式手続呼び出しＩＤカラム２５ｃおよび検出式引数位置カラム２５ｄは「０」で初期化し、作業配列カラム２５ｅは「ＮＵＬＬ」で初期化する。同様に、ｆｕｎ２、ｆｕｎ３、ｆｕｎ４の実引数を不連続配列実引数テーブルに登録する。
【００５７】
同一変数名検出部４６は、不連続配列実引数テーブル２５に登録された手続呼び出しＩＤカラム２４ａ＝「２」を起点に手続呼び出しＩＤの若い方に向かって手続呼び出しＩＤ＝「２」と同じ実引数名２４ｄ、配列範囲（下限、上限、刻み幅）２４ｅの手続呼び出しＩＤを検索して手続呼び出しＩＤ＝「１」を検出し、手続呼び出しＩＤ＝「２」の検出式手続呼び出しＩＤカラム２５ｃに「１」、検出式引数位置カラム２５ｄに「１」を各々登録する。同様に、手続呼び出しＩＤ３、ＩＤ４についても登録する。
【００５８】
検出変数変更検査部４７は、不連続配列実引数テーブル２５に登録された、手続き呼び出しＩＤ＝「２」の検出式引数位置カラム２５ｄである手続呼び出しＩＤ＝「１」を、不連続配列実引数テーブル２５より検出する。手続呼び出しＩＤ＝「１」の手続名ｆｕｎを手続テーブル２３より検出し、不連続配列実引数テーブル２５の位置と同じ位置の引数がｆｕｎで変更されるか検査する。手続テーブル２３では、位置＝「１」の引数は、ＩＮＴＥＮＴ（ＩＮ）カラム２３ｄがＹＥＳなので、ｆｕｎの中で変更されない。従って、手続き呼び出しＩＤカラム２３ａ＝「１」の変更カラム２３ｅに「ＮＯ」を登録する。
【００５９】
続いて検出変数変更検査部４７は、手続呼び出しＩＤ＝「２」を手続呼び出しテーブル２４より検出し、不連続配列実引数テーブル２５に登録されている配列範囲（下限、上限、刻み幅）２４ｅが手続呼び出しテーブル２４で参照されるか検査する。ここでは上限のｍ１、ｍ２、ｍ３が参照されているので、手続呼び出しテーブル２４に登録されている手続名「ｆｕｎ」を手続名カラム２４ｂより検出し、ｍ１、ｍ２、ｍ３に対応する引数がこの手続名「ｆｕｎ」の中で変更されるか検査する。ｍ１、ｍ２、ｍ３に対応する引数はＩＮＴＥＮＴ（ＩＮ）カラム２３ｄがＹＥＳなので、ｆｕｎの中で変更されない。従って、添字変更カラム２５ｂにＮＯを登録する。同様に、手続呼び出しＩＤ３、ＩＤ４の配列要素変更カラム２５ａと添字変更カラム２５ｂを登録する。
【００６０】
同一配列検出部４８は、不連続配列実引数テーブル２５に登録された手続呼び出しＩＤ＝「２」とこのＩＤ＝「２」の「検出式」である手続呼び出しＩＤ＝「１」の間で、不連続配列実引数に実引数として登録されている配列ａ、ｍ１、ｍ２、ｍ３が変更されるか検査する。検査の結果、変更されないので配列要素変更カラム２５ａおよび添字変更カラム２５ｂは変更しない。同様に、手続呼び出しＩＤ＝「３」と「４」についても検査する。
【００６１】
中間コード割当部４９は、ソースファイル２１の先頭から中間コード２６を生成する。不連続配列実引数テーブル２５に登録されている手続呼び出しＩＤ＝「１」の中間コードを生成するときに、ＩＤ＝「１」の不連続配列実引数テーブル２５の検出式のＩＤが０なので、作業配列ＷＡ１を生成し、ＷＡ１を参照する中間コードを生成する。ＷＡ１は、不連続配列実引数テーブル２５の作業配列カラム２５ｅに登録する。次にＩＤ２の不連続配列実引数テーブル２５の検出式手続呼び出しＩＤカラム２５ｃが１なので、ＩＤ＝「１」の作業配列カラム２５ｅに登録されているＷＡ１を参照する中間コードを生成し、ＩＤ＝「２」の作業配列カラム２５ｅにＷＡ１を登録する。同様に、残りの式の中間コードを生成する。
【００６２】
本実施形態を図４で示したソースファイル２１に適用した結果、図９に示した中間コード２６が生成された。背景技術の欄で説明した図１１で示した（図４で示したソースファイル２１と同一の、図１０のソースファイル２２１から生成された）中間コード２２６では、ＷＡ１〜ＷＡ４という４つの作業配列が使用されていたのに対し、本実施形態で生成された中間コード２６は、同一の処理に対してＷＡ１およびＷＡ２という２つの作業配列だけで済んでいる。即ち、本実施形態によって、作業配列を割り付ける式と作業配列に実引数をコピーする式とを各々半減することに成功している。
【００６３】
（第１の実施形態の全体的な動作）
次に、上記の実施形態の全体的な動作について説明する。本発明に係るコンパイル方法は、与えられたソースファイル２１から実行可能形式のオブジェクトプログラム２８を生成するコンパイル装置１０にあって、ソースファイルからオブジェクトプログラムを生成する方法であって、ソースファイルに含まれる配列宣言についての情報を抽出し（図３：ステップＳ１０１〜１０４）、抽出された配列宣言によって定義される配列が連続か不連続かを判断し（図３：ステップＳ１０５）、
配列が不連続である場合にその配列に含まれる実引数を抽出し（図３：ステップＳ１０６）、実引数と同一の実引数がソースファイル内で既に使われていればこれを検出し（図３：ステップＳ１０７）、検出された同一の実引数には同一の作業配列を割り当てつつソースファイルから中間コードを生成し、中間コードからオブジェクトプログラムを生成する。
【００６４】
ここで、上記各動作ステップについては、これをコンピュータで実行可能にプログラム化し、これらを前記各ステップを直接実行する主体である印刷装置１０に実行させるようにしてもよい。
この構成および動作により、本実施形態は以下のような効果を奏する。
【００６５】
本実施形態によって得られる効果は、最終的に生成されるオブジェクトプログラムの実行時間の短縮である。その理由は、複数の手続呼び出しの不連続な部分配列実引数の配列名、添字、要素の値が同じであると判断できるときに、二番目以降の部分配列実引数を作業配列にコピーしないため、このコピーを省略した分、プログラムの実行時間が短縮されるためである。
【００６６】
これまで本発明について図面に示した特定の実施形態をもって説明してきたが、本発明は図面に示した実施形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができる。
【産業上の利用可能性】
【００６７】
ソースファイルからオブジェクトプログラムを生成するコンパイル装置に適用できる。特にフォートランによって記述されたソースファイルをコンパイルするコンパイル装置に適している。
【符号の説明】
【００６８】
１０  コンパイル装置
１１  ＣＰＵ
１２  ＨＤＤ
１３  ＲＡＭ
１４  入力装置
１５  ディスプレイ
２１、２２１  ソースファイル
２２  型宣言テーブル
２３  手続テーブル
２４  手続呼び出しテーブル
２５  不連続配列実引数テーブル
２６、２２６  中間コード
２７  最適化済み中間コード
２８  オブジェクトプログラム
３０  コンパイラ
３１  中間コード生成手段
３２  最適化手段
３３  コード生成手段
４１  型宣言解析部
４２  引用仕様宣言解析部
４３  手続本体解析部
４４  手続呼び出し検出部
４５  不連続配列実引数検出部
４６  同一変数名検出部
４７  検出変数変更検査部
４８  同一配列検出部
４９  中間コード割当部
【図１】
2010250683.tif 000003
【図２】
2010250683.tif 000004
【図３】
2010250683.tif 000005
【図４】
2010250683.tif 000006
【図５】
2010250683.tif 000007
【図６】
2010250683.tif 000008
【図７】
2010250683.tif 000009
【図８】
2010250683.tif 000010
【図９】
2010250683.tif 000011
【図１０】
2010250683.tif 000012
【図１１】
2010250683.tif 000013