(57)【要約】入力データを処理して結果を出力する第１プログラムに基づいて、並列処理が可能な第２プログラムを生成する。所定の処理が繰り返し実行されるループ処理を第１プログラムから抽出し、抽出されたループ処理のループ変数及び所定の処理で使用される処理変数を抽出し、処理変数が配列変数である場合には、ループ変数に対応するキーに基づいて処理変数に代入するデータを収集し、収集されたデータをキーに基づいて集約する処理を含む第４プログラムを生成し、第１プログラムに含まれるループ処理以外の処理と、第４プログラムを実行させるための処理と、を含む第５プログラムを生成し、第４プログラム及び第５プログラムを含むプログラムを、第２プログラムとして出力する。
2011090032.tif 000002
【特許請求の範囲】
【請求項１】
入力データを処理して結果を出力する第１プログラムに基づいて、並列処理が可能な第２プログラムを生成するプログラム生成装置において、前記第２プログラムを生成する並列処理プログラム生成方法であって、
前記プログラム生成装置は、前記並列処理プログラム生成方法を実行するプロセッサ、及び前記並列処理プログラム生成方法を実行するために必要な情報が記憶される記憶部を備え、
前記並列処理プログラム生成方法は、
前記プロセッサが、前記第１プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、
前記プロセッサが、前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記プロセッサが、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、
前記プロセッサが、前記収集されたデータを前記キーに基づいて集約する処理を含む第４プログラムを生成し、
前記プロセッサが、前記第１プログラムに含まれる前記ループ処理以外の処理と、前記第４プログラムを実行させるための処理と、を含む第５プログラムを生成し、
前記プロセッサが、前記第４プログラム及び前記第５プログラムを含むプログラムを、前記第２プログラムとして出力することを特徴とする並列処理プログラム生成方法。
【請求項２】
請求項１に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータを収集する処理は、
前記ループ変数に基づいて前記処理変数に対応するキーを生成するステップと、
前記処理変数に代入されたデータを前記生成されたキーに対応させて出力する処理を含む第３プログラムを生成するステップとを含み、
前記第４プログラムは、前記第３プログラムによって出力されたデータを前記生成されたキーに基づいて集約する処理を含み、
前記第２プログラムは、前記第３プログラムをさらに含むことを特徴とする並列処理プログラム生成方法。
【請求項３】
請求項２に記載の並列処理プログラム生成方法であって、
前記ループ処理に複数のループ変数が含まれている場合には、前記プロセッサが、前記各ループ変数の組合せに対応するイタレーション情報を生成し、
前記キーは、前記イタレーション情報に基づいて生成されることを特徴とする並列処理プログラム生成方法。
【請求項４】
請求項３に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の変数名と前記処理変数の配列の添字との対応を示すオペランド識別子を生成し、
前記第３プログラムによって出力されるデータは、当該データに対応するオペランド識別子とともに出力され、
前記第４プログラムは、前記オペランド識別子に基づいて、前記集約されたデータに対して前記所定の処理を実行する処理をさらに含むことを特徴とする並列処理プログラム生成方法。
【請求項５】
請求項４に記載の並列処理プログラム生成方法であって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第３プログラムは、前記入力データを前記入力変数に格納する処理をさらに含み、
前記第４プログラムは、前記所定の処理の実行結果を前記結果変数に格納する処理をさらに含むことを特徴とする並列処理プログラム生成方法。
【請求項６】
請求項５に記載の並列処理プログラム生成方法であって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記プロセッサが、前記所定の処理の実行結果が格納された結果変数を入力変数とする、第３プログラム及び第４プログラムをさらに生成し、
前記第５プログラムは、前記入力データを入力変数とする第３プログラム及び第４プログラムと、前記結果変数を入力変数とする第３プログラム及び第４プログラムとを含むことを特徴とする並列処理プログラム生成方法。
【請求項７】
請求項１に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータを収集する処理は、前記処理変数に代入するデータが格納された順序が前記所定の処理を実行する順序と異なる場合には、前記ループ変数に基づいて、前記処理変数に代入するデータを前記所定の処理を実行する順序で並び替えるステップを含み、
前記第４プログラムは、前記処理変数に代入するデータを前記並び替えられた順序で集約する処理を含むことを特徴とする並列処理プログラム生成方法。
【請求項８】
請求項７に記載の並列処理プログラム生成方法であって、
前記ループ処理に複数のループ変数が含まれている場合には、前記プロセッサが、配列添字と制御変数との対応情報を生成し、
前記処理変数に代入するデータは、前記配列添字と制御変数との対応情報に基づいて並び替えられることを特徴とする並列処理プログラム生成方法。
【請求項９】
請求項８に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の変数名と前記処理変数の配列の添字との対応を示すデータ格納ファイル情報を生成し、
前記第４プログラムは、前記データ格納ファイル情報に基づいて、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成方法。
【請求項１０】
請求項９に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータは、前記配列変数ごとのファイルに格納され、
前記ファイルは、前記処理変数が複数回参照される場合に、当該複数回参照される処理変数の配列の添字に対応するデータが格納されたマスターファイルを含み、
前記並列処理プログラム生成方法は、
前記マスターファイルに格納されたデータの格納位置と、前記マスターファイル以外のファイルに格納されたデータの格納位置との対応を含むマッチング情報を生成し、
前記第４プログラムは、前記マッチング情報に基づいて、前記処理変数に代入するデータを前記ファイルから取得し、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成方法。
【請求項１１】
請求項１０に記載の並列処理プログラム生成方法であって、
前記マッチング情報は、前記マスターファイルに格納されたデータを、複数回連続して利用するか、順次新たにデータを読み出して利用するかを示す情報を含むことを特徴とする並列処理プログラム生成方法。
【請求項１２】
請求項１１に記載の並列処理プログラム生成方法であって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第４プログラムは、前記入力データを前記入力変数に格納する処理と、前記所定の処理の実行結果を前記結果変数に格納する処理と、をさらに含むことを特徴とする並列処理プログラム生成方法。
【請求項１３】
請求項１２に記載の並列処理プログラム生成方法であって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記プロセッサが、前記所定の処理の実行結果が格納された結果変数を入力変数とする第４プログラムをさらに生成し、
前記第５プログラムは、前記入力データを入力変数とする第４プログラムと、前記結果変数を入力変数とする第４プログラムとを含むことを特徴とする並列処理プログラム生成方法。
【請求項１４】
請求項１３に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の配列添字と前記ループ変数との対応情報を生成し、前記対応情報に基づいて、前記結果変数に格納されたデータを格納する領域を特定し、
前記結果変数を入力変数とする前記第４プログラムは、前記特定された領域に格納された結果変数に格納されたデータを処理することによって前記ループ処理の結果を導出する処理をさらに含むことを特徴とする並列処理プログラム生成方法。
【請求項１５】
請求項１に記載の並列処理プログラム生成方法であって、
前記ループ処理は、密多重ループである場合に前記第１プログラムから抽出されることを特徴とする並列処理プログラム生成方法。
【請求項１６】
入力データを処理して結果を出力する第１プログラムに基づいて、並列処理が可能な第２プログラムを生成するプログラム生成装置に実行させるプログラムであって、
前記第１プログラムから、所定の処理が繰り返し実行されるループ処理を抽出する手順と、
前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出する手順と、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集する手順と、
前記収集されたデータを前記キーに基づいて集約する処理を含む第４プログラムを生成する手順と、
前記第１プログラムに含まれる前記ループ処理以外の処理と、前記第４プログラムを実行させるための処理と、を含む第５プログラムを生成する手順と、
前記第４プログラム及び前記第５プログラムを含むプログラムを、前記第２プログラムとして出力する手順と、を含むことを特徴とする並列処理プログラム生成プログラム。
【請求項１７】
請求項１６に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータを収集する手順は、
前記ループ変数に基づいて前記処理変数に対応するキーを生成する手順と、
前記処理変数に代入されたデータを前記生成されたキーに対応させて出力する処理を含む第３プログラムを生成する手順とを含み、
前記第４プログラムは、前記第３プログラムによって出力されたデータを前記生成されたキーに基づいて集約する処理を含み、
前記第２プログラムは、前記第３プログラムをさらに含むことを特徴とする並列処理プログラム生成プログラム。
【請求項１８】
請求項１７に記載の並列処理プログラム生成プログラムであって、
前記ループ処理に複数のループ変数が含まれている場合には、前記各ループ変数の組合せに対応するイタレーション情報を生成する手順をさらに含み、
前記キーは、前記イタレーション情報に基づいて生成されることを特徴とする並列処理プログラム生成プログラム。
【請求項１９】
請求項１８に記載の並列処理プログラム生成プログラムであって、
前記処理変数の変数名と前記処理変数の配列の添字との対応を示すオペランド識別子を生成する手順をさらに含み、
前記第３プログラムによって出力されるデータは、当該データに対応するオペランド識別子とともに出力され、
前記第４プログラムは、前記オペランド識別子に基づいて、前記集約されたデータに対して前記所定の処理を実行する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２０】
請求項１９に記載の並列処理プログラム生成プログラムであって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第３プログラムは、前記入力データを前記入力変数に格納する処理をさらに含み、
前記第４プログラムは、前記所定の処理の実行結果を前記結果変数に格納する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２１】
請求項２０に記載の並列処理プログラム生成プログラムであって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記所定の処理の実行結果が格納された結果変数を入力変数とする、第３プログラム及び第４プログラムをさらに生成する手順をさらに含み、
前記第５プログラムは、前記入力データを入力変数とする第３プログラム及び第４プログラムと、前記結果変数を入力変数とする第３プログラム及び第４プログラムとを含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２２】
請求項１６に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータを収集する手順は、前記処理変数に代入するデータが格納された順序が前記所定の処理を実行する順序と異なる場合には、前記ループ変数に基づいて、前記処理変数に代入するデータを前記所定の処理を実行する順序で並び替える手順を含み、
前記第４プログラムは、前記処理変数に代入するデータを前記並び替えられた順序で集約する処理を含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２３】
請求項２２に記載の並列処理プログラム生成プログラムであって、
前記ループ処理に複数のループ変数が含まれている場合には、配列添字と制御変数との対応情報を生成する手順をさらに含み、
前記処理変数に代入するデータは、前記配列添字と制御変数との対応情報に基づいて並び替えられることを特徴とする並列処理プログラム生成プログラム。
【請求項２４】
請求項２３に記載の並列処理プログラム生成プログラムであって、
前記処理変数の変数名と前記処理変数の配列の添字との対応を示すデータ格納ファイル情報を生成する手順をさらに含み、
前記第４プログラムは、前記データ格納ファイル情報に基づいて、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２５】
請求項２４に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータは、前記配列変数ごとのファイルに格納され、
前記ファイルは、前記処理変数が複数回参照される場合に、当該複数回参照される処理変数の配列の添字に対応するデータが格納されたマスターファイルを含み、
前記並列処理プログラム生成プログラムは、
前記マスターファイルに格納されたデータの格納位置と、前記マスターファイル以外のファイルに格納されたデータの格納位置との対応を含むマッチング情報を生成する手順をさらに含み、
前記第４プログラムは、前記マッチング情報に基づいて、前記処理変数に代入するデータを前記ファイルから取得し、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２６】
請求項２５に記載の並列処理プログラム生成プログラムであって、
前記マッチング情報は、前記マスターファイルに格納されたデータを、複数回連続して利用するか、順次新たにデータを読み出して利用するかを示す情報を含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２７】
請求項２６に記載の並列処理プログラム生成プログラムであって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第４プログラムは、前記入力データを前記入力変数に格納する処理と、前記所定の処理の実行結果を前記結果変数に格納する処理と、をさらに含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２８】
請求項２７に記載の並列処理プログラム生成プログラムであって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記所定の処理の実行結果が格納された結果変数を入力変数とする第４プログラムをさらに生成する手順を、さらに含み、
前記第５プログラムは、前記入力データを入力変数とする第４プログラムと、前記結果変数を入力変数とする第４プログラムとを含むことを特徴とする並列処理プログラム生成プログラム。
【請求項２９】
請求項２８に記載の並列処理プログラム生成プログラムであって、
前記処理変数の配列添字と前記ループ変数との対応情報を生成し、前記対応情報に基づいて、前記結果変数に格納されたデータを格納する領域を特定する手順をさらに含み、
前記結果変数を入力変数とする前記第４プログラムは、前記特定された領域に格納された結果変数に格納されたデータを処理することによって前記ループ処理の結果を導出する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。
【請求項３０】
請求項１６に記載の並列処理プログラム生成プログラムであって、
前記ループ処理を抽出する手順は、前記ループ処理が密多重ループである場合に前記第１プログラムから当該ループ処理を抽出することを特徴とする並列処理プログラム生成プログラム。
【請求項３１】
プロセッサ及び記憶部を備え、入力データを処理して結果を出力する第１プログラムに基づいて、並列処理が可能な第２プログラムを生成するプログラム生成装置であって、
前記プロセッサは、
前記第１プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、
前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、
前記収集されたデータを前記キーに基づいて集約する処理を含む第４プログラムを生成し、
前記第１プログラムに含まれる前記ループ処理以外の処理と、前記第４プログラムを実行させるための処理と、を含む第５プログラムを生成し、
前記第４プログラム及び前記第５プログラムを含むプログラムを、前記第２プログラムとして出力することを特徴とするプログラム生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列処理プログラムの生成方法に関し、特に、既存のプログラムから並列処理に適したプログラムを生成する技術に関する。
【背景技術】
【０００２】
近年、大規模なデータ処理の要求が高まり、複数の計算機資源によって分散並列処理を行う技術が提案されている。分散並列処理を実行する場合、例えば、処理対象のデータを分割して各計算機資源に割り当て、各計算機資源が割り当てられたデータを処理する。【０００３】
また、新しい分散並列処理プログラミングモデルとしてＭａｐＲｅｄｕｃｅが注目されている。ＭａｐＲｅｄｕｃｅはＧｏｏｇｌｅ（登録商標）社が提唱したプログラミングモデルであり、Ｍａｐ処理、Ｒｅｄｕｃｅ処理の２フェーズを含む。【０００４】
Ｍａｐ処理は、入力データに基づいて（Ｋｅｙ，Ｖａｌｕｅ）形式の中間データを生成する。その後、ＭａｐＲｅｄｕｃｅ実行基盤によってＫｅｙ毎に中間データを集約し、（Ｋｅｙ，Ｖａｌｕｅのリスト）ペアを生成する。Ｒｅｄｕｃｅ処理では、Ｋｅｙ毎にＶａｌｕｅのリストを処理し、処理結果を出力する。なお、ＭａｐＲｅｄｕｃｅでは、Ｍａｐ処理とＲｅｄｕｃｅ処理に対応する処理内容を開発者が記述する必要がある。ＭａｐＲｅｄｕｃｅの詳細については、非特許文献１に記載されている。【０００５】
ＭａｐＲｅｄｕｃｅの代表的な実行基盤としてはオープンソースソフトウェアのＨａｄｏｏｐが存在する。Ｈａｄｏｏｐは、Ｊａｖａ（登録商標、以下同じ）によって実装されているため、Ｍａｐ処理及びＲｅｄｕｃｅ処理もＪａｖａを用いて記述するのが一般的である。この場合、Ｈａｄｏｏｐ用のＪａｖａのインターフェイスを多数利用する必要がある。【０００６】
また、Ｊａｖａ以外の言語を使用する技術としては、標準入出力を介してデータをやり取りするＨａｄｏｏｐ  Ｓｔｒｅａｍｉｎｇと呼ばれる技術が開発されている。Ｈａｄｏｏｐ  Ｓｔｒｅａｍｉｎｇでは、Ｐｅｒｌ、Ｐｙｔｈｏｎなど、標準入出力をサポートする任意の言語によってＭａｐ処理とＲｅｄｕｃｅ処理を記述することが可能となる。Ｈａｄｏｏｐ及びＨａｄｏｏｐ  Ｓｔｒｅａｍｉｎｇの詳細については、非特許文献２の３２ページから３６ページに記載されている。【０００７】
さらに、アプリケーションプログラミングと実行モデルのギャップを少なくするため、高位のプログラム記述からＭａｐＲｅｄｕｃｅによる低位の実行モデルに変換する技術が開示されている。例えば、Ｈａｄｏｏｐに対応する技術として、Ｐｉｇ  Ｌａｔｉｎが提案されている。Ｐｉｇ  Ｌａｔｉｎでは、データ処理プログラムをＭａｐＲｅｄｕｃｅに自動的に変換する。Ｐｉｇを用いることによってＭａｐＲｅｄｕｃｅを意識せずに並列処理プログラムを開発することが可能となる。Ｐｉｇの詳細については非特許文献２の３０１ページから３４１ページに記載されている。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】J.Dean and S.Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, In Proceedings of Operating Systems Design and Implementation 2004, pp137-150, 2004.
【非特許文献２】Tom White, Hadoop: The Definitive Guide, O'Reilly, pp32-36, pp301-341, 2009.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
前述のように、ＭａｐＲｅｄｕｃｅに対応するプログラムを記述するためには、アプリケーションモデルをＭａｐＲｅｄｕｃｅに対応するモデルに変換しなければならず、また、ＭａｐＲｅｄｕｃｅに対応したプログラムの記述方法も複雑である。また、非特許文献２に開示されているように、高位のプログラム記述から自動的にＭａｐＲｅｄｕｃｅモデルに対応したプログラムに変換する技術も提案されているが、既存のアプリケーションプログラムを再度専用の言語を使用して記述し直す必要がある。すなわち、既存プログラムに基づいて、自動的又は容易にＭａｐＲｅｄｕｃｅに対応したプログラムを生成することは困難であった。【００１０】
本発明の目的は、既存言語で記述されたプログラムに含まれる所定形式の処理（例えば、ループ処理）を、分散並列処理を実行可能なプログラム（コード）に変換する技術を提供することにある。
【課題を解決するための手段】
【００１１】
本発明の代表的な一形態では、入力データを処理して結果を出力する第１プログラムに基づいて、並列処理が可能な第２プログラムを生成するプログラム生成装置において、前記第２プログラムを生成する並列処理プログラム生成方法であって、前記プログラム生成装置は、前記並列処理プログラム生成方法を実行するプロセッサ、及び前記並列処理プログラム生成方法を実行するために必要な情報が記憶される記憶部を備え、前記並列処理プログラム生成方法は、前記プロセッサが、前記第１プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、前記プロセッサが、前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記プロセッサが、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、前記プロセッサが、前記収集されたデータを前記キーに基づいて集約する処理を含む第４プログラムを生成し、前記プロセッサが、前記第１プログラムに含まれる前記ループ処理以外の処理と、前記第４プログラムを実行させるための処理と、を含む第５プログラムを生成し、前記プロセッサが、前記第４プログラム及び前記第５プログラムを含むプログラムを、前記第２プログラムとして出力する。
【発明の効果】
【００１２】
本発明の一形態によれば、既存言語で記述されたプログラムに基づいて分散並列処理を実行可能なプログラムを生成することが可能になるため、システム開発の生産性を向上させることができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１の実施の形態の並列処理プログラム生成方法が実行される計算機の構成を示すブロック図である。
【図２】本発明の第１の実施の形態のコンパイラの構成、及びソースプログラムからオブジェクトプログラムを生成する過程の概要を説明する図である。
【図３】本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ情報の構成を示す図である。
【図４】本発明の第１の実施の形態のソースプログラムを分散処理に適したオブジェクトプログラムに変換する分散処理プログラム変換方法の手順を示すフローチャートである。
【図５】本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ解析部によるＭａｐＲｅｄｕｃｅ解析処理の手順を示すフローチャートである。
【図６】本発明の第１の実施の形態のコード生成部によるコード生成処理の手順を示すフローチャートである。
【図７】本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理の一例を示す図である。
【図８】本発明の第１の実施の形態のループ表の一例を示す図である。
【図９】本発明の第１の実施の形態の配列表の一例を示す図である。
【図１０】本発明の第１の実施の形態の結果変数登録表の一例を示す図である。
【図１１】本発明の第１の実施の形態の結果変数登録表を生成するための結果変数登録表生成処理の手順を示すフローチャートである。
【図１２】本発明の第１の実施の形態のオペランド識別子登録表の一例を示す図である。
【図１３】本発明の第１の実施の形態のオペランド識別子登録表を生成するためのオペランド識別子登録表生成処理の手順を示すフローチャートである。
【図１４】本発明の第１の実施の形態のイタレーション対応表の一例を示す図である。
【図１５】本発明の第１の実施の形態のイタレーション対応表を生成するためのイタレーション対応表生成処理の手順を示すフローチャートである。
【図１６】本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅコード生成処理の手順を示すフローチャートである。
【図１７】本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅプログラムのテンプレートの一例を示す図である。
【図１８】本発明の第１の実施の形態のＭａｐ１コード生成処理の手順を示すフローチャートである。
【図１９】本発明の第１の実施の形態のＭａｐ１コード生成処理によって生成されたＭａｐ１コードの一例を示す図である。
【図２０】本発明の第１の実施の形態のＲｅｄｕｃｅ１コード生成処理の手順を示すフローチャートである。
【図２１】本発明の第１の実施の形態のＲｅｄｕｃｅ１コード生成処理によって生成されたＲｅｄｕｃｅ１コードの一例を示す図である。
【図２２】本発明の第１の実施の形態のＭａｐ２コードの一例を示す図である。
【図２３】本発明の第１の実施の形態のＲｅｄｕｃｅ２コード生成処理の手順を示すフローチャートである。
【図２４】本発明の第１の実施の形態のＲｅｄｕｃｅ２コード生成処理によって生成されたＲｅｄｕｃｅ２コードの一例を示す図である。
【図２５】本発明の第２の実施の形態のＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理の一例を示す図である。
【図２６】本発明の第２の実施の形態のＭａｐ１コードの一例を示す図である。
【図２７】本発明の第２の実施の形態のＲｅｄｕｃｅ１コードの一例を示す図である。
【図２８Ａ】本発明の第３の実施の形態の入力ファイル形式の一例を示す図である。
【図２８Ｂ】本発明の第３の実施の形態の入力ファイル形式の一例を示す図である。
【図２８Ｃ】本発明の第３の実施の形態の入力ファイル形式の一例を示す図である。
【図２９Ａ】本発明の第３の実施の形態の分散バッチ処理コードが実現する処理の一例を示す図である。
【図２９Ｂ】本発明の第３の実施の形態の分散バッチ処理コードが実現する処理の一例を示す図である。
【図３０】本発明の第３の実施の形態の分散バッチ処理コードが実現する分散処理の一例を示す図である。
【図３１】本発明の第３の実施の形態の分散バッチ処理情報の一例を示す図である。
【図３２】本発明の第３の実施の形態の分散バッチ処理解析部による分散バッチ処理解析処理の手順を示すフローチャートである。
【図３３】本発明の第３の実施の形態の結果変数登録表の一例を示す図である。
【図３４】本発明の第３の実施の形態の配列添字＿制御変数対応表の一例を示す図である。
【図３５】本発明の第３の実施の形態のファイル対応表の一例を示す図である。
【図３６】本発明の第３の実施の形態のソート表の一例を示す図である。
【図３７】本発明の第３の実施の形態のマスターファイルマッチング表の一例を示す図である。
【図３８】本発明の第３の実施の形態のマスターファイルマッチング表の一例を示す図である。
【図３９】本発明の第３の実施の形態の結果変数登録表を生成するための結果変数登録表生成処理の手順を示すフローチャートである。
【図４０】本発明の第３の実施の形態の配列添字＿制御変数対応表を生成するための配列添字＿制御変数対応表生成処理の手順を示すフローチャートである。
【図４１】本発明の第３の実施の形態のファイル対応表を生成するためのファイル対応表生成処理の手順を示すフローチャートである。
【図４２】本発明の第３の実施の形態のソート表を生成するためのソート表生成処理の手順を示すフローチャートである。
【図４３】本発明の第３の実施の形態のマスターファイルマッチング表を生成するためのマスターファイルマッチング表エントリー追加処理の手順を示すフローチャートである。
【図４４】本発明の第３の実施の形態のマスターファイルマッチング表を生成するためのマスターファイルマッチング表対応フィールド部生成処理の手順を示すフローチャートである。
【図４５】本発明の第３の実施の形態の分散バッチ処理コード生成処理の手順を示すフローチャートである。
【図４６】本発明の第３の実施の形態の分散バッチ処理コードのうち演算コード生成処理の手順を示すフローチャートである。
【図４７】本発明の第３の実施の形態の演算コード生成処理のうちマスターファイルマッチング表に従うファイルの読み方を行うコード生成処理の手順を示すフローチャートである。
【図４８】本発明の第３の実施の形態の分散バッチ処理コード生成処理のうち集約コード生成処理の手順を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、図面を用いて本発明の実施の形態について説明する。以下に述べる実施の形態は、複数の計算機による分散並列処理に適したプログラムに既存のプログラムを変換するための技術である。
【００１５】
（第１の実施の形態）
本発明の第１の実施の形態及び第２の実施の形態では、並列処理プログラムを生成する具体的な方法として、既存のプログラムからＭａｐＲｅｄｕｃｅモデルを適用したプログラムを生成する実施形態について説明する。
【００１６】
また、第１の実施の形態及び第２の実施の形態では、ＭａｐＲｅｄｕｃｅモデルを適用したプログラムの実行基盤をＨａｄｏｏｐとする。Ｈａｄｏｏｐを実行基盤とすることによって、複数の計算機による分散並列処理を容易に実行することが可能となる。さらに、Ｈａｄｏｏｐは、分散並列処理を実行する計算機の増減に容易に対応できる。そのため、一部の計算機に障害が発生した場合に、他の計算機に再処理させるなどの障害対応が可能となっている。
【００１７】
本発明の第１の実施の形態の並列処理プログラム生成方法では、変換対象のソースプログラム（第１プログラム）に含まれる並列化可能箇所を抽出し、当該抽出箇所にＭａｐＲｅｄｕｃｅモデルを適用したプログラム（第３プログラム、第４プログラム）を生成する。さらに、生成されたプログラムを呼び出すためのプログラム（第５プログラム）を生成する。以下、本発明の第１の実施の形態における並列処理プログラム生成方法について説明する。
【００１８】
図１は、本発明の第１の実施の形態の並列処理プログラム生成方法が実行される計算機（並列処理プログラム生成装置）１００の構成を示すブロック図である。
【００１９】
本発明の第１の実施の形態の計算機１００は、ＣＰＵ（プロセッサ）１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４及び外部記憶装置１０５を備える。ＣＰＵ１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４及び外部記憶装置１０５は、内部バスを介して相互に接続される。
【００２０】
ＣＰＵ１０１は、主記憶装置１０４に記憶されたプログラムを実行することによって、並列処理プログラムの生成などの各種処理を実行する。
【００２１】
ディスプレイ装置１０２は、ＣＰＵ１０１によって実行された処理の結果、例えば、並列処理プログラム生成方法の実行結果（終了メッセージ、エラーメッセージなど）を表示する出力装置である。
【００２２】
キーボード１０３は、実行される処理の対象を指定したり、ディスプレイ装置１０２に表示する内容を選択したりする入力装置である。なお、入力装置として、キーボード１０３の他にマウスなどを備えるようにしてもよい。
【００２３】
主記憶装置１０４は、ＣＰＵ１０１によって実行されるプログラム及び当該プログラムを実行するために必要なデータを記憶する。主記憶装置１０４に記憶されるプログラムは外部記憶装置１０５に格納されたプログラムがロードされたものであってもよい。主記憶装置１０４に記憶されたプログラム及びデータについては後述する。なお、主記憶装置１０４は、揮発性の記憶媒体であってもよいし、不揮発性の記憶媒体であってもよい。
【００２４】
外部記憶装置１０５は、プログラム及びデータを格納する。外部記憶装置１０５は、不揮発性の記憶媒体によって構成される。外部記憶装置１０５には、並列処理プログラム生成方法を実行するために主記憶装置１０４にロードされるプログラムを格納するようにしてもよい。
【００２５】
以上が、本発明の第１の実施の形態の並列処理プログラム生成方法を実行する計算機１００のハードウェア構成である。続いて、主記憶装置１０４に記憶されるプログラム及びデータと、外部記憶装置１０５に格納されるプログラム及びデータとについて説明する。
【００２６】
主記憶装置１０４には、コンパイラ１０８、中間コード１０９、ループ表１１０、配列表１１１、及びＭａｐＲｅｄｕｃｅ情報１１２が記憶される。
【００２７】
コンパイラ１０８は、既存のプログラム（第１プログラム）の入力を受け付けて、ＭａｐＲｅｄｕｃｅモデルに対応したプログラム（第３プログラム、第４プログラム）を含む変換後のプログラム（第２プログラム）を出力する並列処理プログラム生成方法を実現するためのプログラムである。
【００２８】
中間コード１０９は、コンパイラ１０８によってソースプログラムを変換する際に一時的に出力されるデータである。ＣＰＵ１０１は、中間コード１０９をさらに処理することによって、最終的な結果（オブジェクトプログラム１０７）を出力する。
【００２９】
ループ表１１０、配列表１１１及びＭａｐＲｅｄｕｃｅ情報１１２は、ソースプログラム１０６を変換するために利用されるデータであり、中間コード１０９と同様に、ソースプログラムを変換する際に一時的に生成及び出力される。
【００３０】
ループ表１１０は、コンパイラ１０８によってソースプログラム１０６からループ処理を抽出した結果を格納する。ループ表１１０の詳細については、図８にて後述する。
【００３１】
配列表１１１は、抽出されたループ処理で演算される配列変数を抽出した結果を格納する。配列表１１１の詳細については、図９にて後述する。
【００３２】
ＭａｐＲｅｄｕｃｅ情報１１２は、ループ表１１０及び配列表１１１に基づいてソースプログラム１０６を解析した結果を格納する。ＭａｐＲｅｄｕｃｅ情報１１２には、さらに、結果変数登録表３０２、オペランド識別子登録表３０３及びイタレーション対応表３０４を含む。ＭａｐＲｅｄｕｃｅ情報１１２の詳細については、図３にて後述する。
【００３３】
外部記憶装置１０５には、並列処理プログラム生成方法を適用するソースプログラム１０６（第１プログラム）及びソースプログラム１０６に基づいて生成されたオブジェクトプログラム１０７（第２プログラム）が格納される。
【００３４】
オブジェクトプログラム１０７には、ＭａｐＲｅｄｕｃｅモデルが適用されたＭａｐＲｅｄｕｃｅプログラム１１３（第３プログラム、第４プログラム）と、ＭａｐＲｅｄｕｃｅプログラム１１３を呼び出すための処理を含む変換後のソースプログラム１１４（第５プログラム）とが含まれる。
【００３５】
図２は、本発明の第１の実施の形態のコンパイラ１０８の構成、及びソースプログラム１０６からオブジェクトプログラム１０７を生成する過程の概要を説明する図である。
【００３６】
前述のように、本発明の第１の実施の形態では、ＣＰＵ１０１がコンパイラ１０８を実行することによって、ソースプログラム１０６に基づいてオブジェクトプログラム１０７を生成する。図２では、ソースプログラム１０６に基づいてオブジェクトプログラム１０７を生成する手順の概要について説明する。
【００３７】
コンパイラ１０８の構成について説明すると、コンパイラ１０８は、構文解析部２０１、ＭａｐＲｅｄｕｃｅ解析部２０２及びコード生成部２０３を含む。前述のように、コンパイラ１０８はプログラムであり、構文解析部２０１、ＭａｐＲｅｄｕｃｅ解析部２０２及びコード生成部２０３も同様にプログラムである。以下、処理の主体は本来ならばこれらのプログラムを実行するＣＰＵ１０１であるが、図２の説明では理解しやすくするために各プログラムを主体として各処理を説明する。
【００３８】
まず、構文解析部２０１は、入力されたソースプログラム１０６を解析することによって、ループ処理に対応する記述を抽出し、中間コード１０９、ループ表１１０及び配列表１１１を生成する。構文解析部２０１による処理の詳細については、図４以降の図を参照しながら説明する。
【００３９】
中間コード１０９は、ループ処理及びループ処理内で実行される処理に対応するコードが抽出されたものである。ループ表１１０及び配列表１１１を生成する構文解析部２０１の処理については、図７に示した中間コード１０９（ループ処理）を例として、図８及び図９を参照しながら説明する。
【００４０】
続いて、ＭａｐＲｅｄｕｃｅ解析部２０２は、構文解析部２０１によって生成された中間コード１０９、ループ表１１０及び配列表１１１に基づいて、ループ処理をＭａｐＲｅｄｕｃｅ処理に変換するために必要な情報を解析し、ＭａｐＲｅｄｕｃｅ情報１１２を生成する。ＭａｐＲｅｄｕｃｅ情報１１２の構成については、図３にて説明する。なお、ＭａｐＲｅｄｕｃｅ解析部２０２による処理の詳細については、図１１から図１５を参照しながら説明する。
【００４１】
最後に、コード生成部２０３は、ＭａｐＲｅｄｕｃｅ解析部２０２によって生成されたＭａｐＲｅｄｕｃｅ情報１１２に基づいて、オブジェクトプログラム１０７を生成する。オブジェクトプログラム１０７には、前述のように、ＭａｐＲｅｄｕｃｅ処理に変換されたＭａｐＲｅｄｕｃｅプログラム１１３及びＭａｐＲｅｄｕｃｅプログラム１１３の呼び出し部を含む変換後のソースプログラム１１４が含まれる。
【００４２】
なお、図２にて説明した手順については、図４に示したフローチャートを参照しながらさらに詳細を説明する。
【００４３】
図３は、本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ情報１１２の構成を示す図である。
【００４４】
ＭａｐＲｅｄｕｃｅ情報１１２は、結果変数登録表３０２、オペランド識別子登録表３０３及びイタレーション対応表３０４を含む。また、結果変数登録表３０２、オペランド識別子登録表３０３及びイタレーション対応表３０４は、構文解析部２０１によって抽出されたループ処理ごとに生成される。
【００４５】
結果変数登録表３０２には、ループにおける演算結果を格納する変数の情報が格納される。結果変数登録表３０２の詳細については図１０にて説明する。また、結果変数登録表３０２を生成する手順については、図１１にて説明する。
【００４６】
オペランド識別子登録表３０３には、値及び変数を識別するオペランドに関する情報が格納される。例えば、ループ処理内で配列変数が使用されている場合、当該配列変数の添字がオペランドに対応する。複数のループが入れ子になっている場合には、複数の変数の組がオペランドになる。オペランド識別子登録表３０３の詳細については図１２にて説明する。また、オペランド識別子登録表３０３を生成する手順については、図１３にて説明する。
【００４７】
イタレーション対応表３０４には、ループ処理によって繰り返される１回分の処理（イタレーション）に関する情報が格納される。イタレーション対応表３０４の詳細については図１４にて説明する。また、イタレーション対応表３０４を生成する手順については、図１５にて説明する。
【００４８】
図４は、本発明の第１の実施の形態のソースプログラム１０６を分散処理に適したオブジェクトプログラム１０７に変換する分散処理プログラム変換方法の手順を示すフローチャートである。
【００４９】
図４に示すフローチャートは、図２に示した手順に対応し、コンパイラ１０８に含まれる各構成（構文解析部２０１、ＭａｐＲｅｄｕｃｅ解析部２０２及びコード生成部２０３）による処理を実行する手順を示している。
【００５０】
ＣＰＵ１０１は、コンパイラ１０８が実行されると、構文解析部２０１によって構文解析処理を実行する（ステップ４０１）。構文解析処理では、まず、ソースプログラム１０６の入力が受け付けられる。
【００５１】
構文解析処理において、ＣＰＵ１０１は、さらに、入力されたソースプログラム１０６を解析し、ループ処理に対応する記述を抽出する。ループ処理を実行する構文としては、例えば、ｆｏｒ文（他に、ｗｈｉｌｅ文など）がある。ソースプログラム１０６がテキストファイル形式で入力されていれば、検索キーとして"ｆｏｒ"を設定して文字検索を実行する。対象外の構文が抽出されてしまう場合には、さらに検索条件を追加して検索結果を絞り込めばよい。
【００５２】
ＣＰＵ１０１は、さらに、抽出されたループ処理の構造を解析し（ループ解析）、中間コード１０９、ループ表１１０及び配列表１１１を生成する。中間コード１０９は、ループ及びループ処理内で実行される処理に対応するコードが抽出されたものである。構文解析処理及びループ解析処理に関しては、従来技術を利用する。ループ表１１０の一例については図８、配列表１１１の一例について図９に示す。
【００５３】
ＣＰＵ１０１は、構文解析処理の終了後、ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理に対し、ＭａｐＲｅｄｕｃｅ解析処理を実行する（ステップ４０２〜４０４）。
【００５４】
ＣＰＵ１０１は、まず、ＭａｐＲｅｄｕｃｅ解析処理が実行されていないループ処理が存在するか否かを判定する（ステップ４０２）。ＭａｐＲｅｄｕｃｅ解析処理が実行されていないループ処理が存在する場合には（ステップ４０２の結果が「Ｙｅｓ」）、処理対象のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能であるか否かを判定する（ステップ４０３）。
【００５５】
本発明の第１の実施の形態では、密多重ループの最外側ループに該当し、データ依存条件を満たす場合に、当該ループ処理をＭａｐＲｅｄｕｃｅ処理に変換可能と判定する。密多重ループとは、すべてのループが直接の入れ子関係となるループであって、外側ループと内側ループとの間に実行文が存在しないループ（若しくはこれと等価な構造を有する多重ループ）である。
【００５６】
また、各イタレーション間のデータ依存がない場合、又はデータ依存が足しこみ型の依存の場合にデータ依存条件を満たすとしている。足しこみ型のデータ依存とは、例えば、ｉ，ｊをループ制御変数とする二重ループにおいてｓｕｍ［ｉ］＝ｓｕｍ［ｉ］＋ａ［ｉ，ｊ］（ｆｏｒ  ｉ，ｊ  ｓｕｍ［ｉ］＋＝ａ［ｉ，ｊ］としても同じ）を計算するように、演算結果の次元がループのネスト数よりも小さくなる場合である。なお、足しこみ演算子は加算（「＋」）の他に、減算（「−」）、乗算（「＊」）などの場合も適用可能であるが、本発明の第１の実施の形態では、加算（「＋」）の例について説明する。また、ループ処理で最大値若しくは最小値を取得する場合などについても適用可能である。
【００５７】
また、ｓｕｍ［ｉ］を「足しこみ変数」、代入文の右辺から足しこみ変数を除いたコードを「右辺コード」とする。前述の例では、右辺コードは「ａ［ｉ，ｊ］」となる。
【００５８】
なお、複数のループ処理が並列して入れ子となっている場合には、並列しているループ処理ごとに密多重ループとなるようにループ処理を分割することによって、ＭａｐＲｅｄｕｃｅ処理に変換可能な形式に変換してもよい。
【００５９】
ＣＰＵ１０１は、処理対象のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能である場合には（ステップ４０３の結果が「Ｙｅｓ」）、処理対象のループ処理に対し、ＭａｐＲｅｄｕｃｅ解析処理を実行する（ステップ４０４）。ＭａｐＲｅｄｕｃｅ解析処理が実行されると、当該ループ処理に対応するＭａｐＲｅｄｕｃｅ情報１１２が生成される。なお、ＭａｐＲｅｄｕｃｅ解析処理については概要を図５に示し、さらに詳細については図１０から図１５を参照しながら説明する。
【００６０】
ＣＰＵ１０１は、処理対象のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能でない場合には（ステップ４０３の結果が「Ｎｏ」）、ステップ４０２の処理によって未処理のループ処理が残っているか否かを判定する。
【００６１】
ＣＰＵ１０１は、すべてのループ処理に対して、ステップ４０３の処理が実行された場合には（ステップ４０２の結果が「Ｎｏ」）、ＭａｐＲｅｄｕｃｅ解析処理が実行されたループ処理に対応するオブジェクトプログラム１０７を生成する。
【００６２】
ＣＰＵ１０１は、コード生成処理が実行されていないＭａｐＲｅｄｕｃｅ情報１１２が存在するか否かを判定する（ステップ４０５）。すなわち、すべてのＭａｐＲｅｄｕｃｅ処理に変換対象のループ処理について、オブジェクトプログラム１０７が生成されたか否かを判定する。すべてのＭａｐＲｅｄｕｃｅ情報１１２についてコード生成処理が実行された場合には（ステップ４０５の結果が「Ｎｏ」）、本処理を終了する。
【００６３】
ＣＰＵ１０１は、コード生成処理が実行されていないＭａｐＲｅｄｕｃｅ情報１１２が存在する場合には（ステップ４０５の結果が「Ｙｅｓ」）、未処理のＭａｐＲｅｄｕｃｅ情報１１２に基づいて、コード生成部２０３によってコード生成処理を実行する（ステップ４０６）。コード生成処理では、ＭａｐＲｅｄｕｃｅ情報１１２に基づいて、オブジェクトプログラム１０７（ＭａｐＲｅｄｕｃｅプログラム１１３と変換後のソースプログラム１１４）を生成する。なお、コード生成処理については概要を図６に示し、さらに詳細については図１６から図２４を参照しながら説明する。
【００６４】
図５は、本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ解析部２０２によるＭａｐＲｅｄｕｃｅ解析処理４０４の手順を示すフローチャートである。
【００６５】
ＭａｐＲｅｄｕｃｅ解析処理４０４は、結果変数登録表生成処理５０１、オペランド識別子登録表生成処理５０２及びイタレーション対応表生成処理５０３を含む。また、結果変数登録表生成処理５０１、オペランド識別子登録表生成処理５０２、イタレーション対応表生成処理５０３の順で実行される。
【００６６】
結果変数登録表生成処理５０１は、前述のように、結果変数及び結果変数に関する情報を抽出し、図１０に示す結果変数登録表３０２を生成する処理である。結果変数登録表生成処理５０１の詳細な手順については、図１１にて説明する。
【００６７】
オペランド識別子登録表生成処理５０２は、前述のように、値及び変数を識別するオペランドに関する情報を抽出し、図１２に示すオペランド識別子登録表３０３を生成する処理である。オペランド識別子登録表生成処理５０２の詳細な手順については、図１３にて説明する。
【００６８】
イタレーション対応表生成処理５０３は、前述のように、ループ処理によって繰り返される１回分の処理に関する情報を抽出し、図１４に示すイタレーション対応表３０４を生成する処理である。イタレーション対応表生成処理５０３の詳細な手順については、図１５にて説明する。
【００６９】
図６は、本発明の第１の実施の形態のコード生成部２０３によるコード生成処理４０６の手順を示すフローチャートである。
【００７０】
コード生成処理４０６は、ＭａｐＲｅｄｕｃｅコード生成処理６０１、及びＭａｐＲｅｄｕｃｅ呼び出しコード生成処理６０２を含む。また、ＭａｐＲｅｄｕｃｅコード生成処理６０１、ＭａｐＲｅｄｕｃｅ呼び出しコード生成処理６０２の順で実行される。
【００７１】
ＭａｐＲｅｄｕｃｅコード生成処理６０１は、ＭａｐＲｅｄｕｃｅ解析処理４０４によって生成されたＭａｐＲｅｄｕｃｅ情報１１２に基づいて、ループ毎にＭａｐＲｅｄｕｃｅプログラム１１３を生成する。ＭａｐＲｅｄｕｃｅコード生成処理６０１の詳細については、図１６、図１８、図２０、図２３にて説明する。また、生成されたＭａｐＲｅｄｕｃｅプログラム１１３については、図１９、図２１、図２２、図２４にて説明する。
【００７２】
ＭａｐＲｅｄｕｃｅ呼び出しコード生成処理６０２は、ＭａｐＲｅｄｕｃｅコード生成処理６０１で生成されたＭａｐＲｅｄｕｃｅプログラム１１３を呼び出すためのコード（プログラム）を生成する。そして、ＭａｐＲｅｄｕｃｅ処理に変換する対象以外のソースプログラム１０６に、ＭａｐＲｅｄｕｃｅプログラム１１３を呼び出すためのコードを挿入し、変換後のソースプログラム１１４を生成する。
【００７３】
以降、ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理の例を図７に示し、図７に示したループ処理をＭａｐＲｅｄｕｃｅ処理に変換する過程を説明する。
【００７４】
図７は、本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理７００を示す図である。
【００７５】
ループ処理７００は、図４に示した構文解析処理４０１によって、ソースプログラム１０６から抽出されたものである。
【００７６】
ループ処理７００は、最外層から順に制御変数をＩ１、Ｉ２、Ｉ３とする三重のループを構成しており、最外層と中層、中層と最内層の間に実行文が存在しない密多重ループとなっている。また、ループ処理の最内層には、足しこみ演算（ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］）が記述されている。なお、ループ処理７００の足しこみ演算に含まれる配列の添字は行優先順（最も右側が連続次元）となっている。
【００７７】
以下、ループ処理７００に対して構文解析処理４０１を実行することによって生成されたループ表１１０を図８に、配列表１１１を図９に示し、各表について説明する。
【００７８】
図８は、本発明の第１の実施の形態のループ表１１０の一例を示す図である。
【００７９】
ループ表１１０は、ループ番号８０１、制御変数８０２、制御変数下限値８０３、制御変数上限値８０４、制御変数増分値８０５、及び子ループ８０６を含む。また、ループ表１１０は、前述のように、所定の条件を満たしたＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理ごとに生成される。また、所定の条件を満たすループ処理が密多重ループである場合には、入れ子となったループごとにエントリーがループ表１１０に生成される。図７に示したループ処理７００は三重ループであるため、ループ表１１０には、各ループに対応する３つのエントリーが含まれている。
【００８０】
ループ番号８０１は、ループを識別するための番号である。ループ番号８０１は、各ループが識別可能であればよい。例えば、ループ表１１０では、最外層から昇順に番号が割り当てられており、最外層のループ処理にループ番号「１」が設定されている。
【００８１】
制御変数８０２は、ループ処理におけるカウンタ変数である制御変数（ループ変数）を格納する。ループ番号が「１」の場合には、制御変数「Ｉ１」が格納される。
【００８２】
制御変数下限値８０３は、制御変数８０２の下限値である。制御変数上限値８０４は、制御変数８０２の上限値である。ループ処理７００を参照すると、最外層のループ処理は、「ｆｏｒ  Ｉ１＝０．．９９」となっているため、制御変数下限値８０３には「０」が設定され、制御変数上限値８０４には「９９」が設定される。
【００８３】
制御変数増分値８０５は、制御変数８０２を制御変数下限値８０３から制御変数上限値８０４まで変化させるための増分値である。制御変数下限値８０３よりも制御変数上限値８０４の値の方が小さい場合には、制御変数増分値８０５に負の値が設定される。なお、制御変数が整数であり、増分値が１の場合には、プログラムの仕様上、増分値の指定を省略することが可能な場合がある。ループ処理７００では、増分値の指定が省略されており、制御変数増分値８０５増分値は１となっている。
【００８４】
子ループ８０６は、入れ子となっているループ（子ループ）のループ番号である。子ループがさらに多重ループとなっている場合には、子ループのうち、最外層のループ処理のループ番号８０１が格納される。例えば、ループ処理７００のように、三重ループであれば、最外層のループであるループ番号が「１」のループでは、子ループの値に「２」が設定される。
【００８５】
図９は、本発明の第１の実施の形態の配列表１１１の一例を示す図である。
【００８６】
配列表１１１は、ループ処理内で演算される数式の右辺コードに含まれる配列変数に関する情報を格納する。配列表１１１は、前述のように、ループ処理毎に生成される。
【００８７】
配列表１１１は、配列名９０１、型９０２、次元数９０３、次元９０４、及びサイズ９０５を含む。
【００８８】
配列名９０１は、配列変数の変数名を格納し、例えば、添字部分を除いた変数が格納される。同じ配列変数が複数回使用されている場合であっても１つのエントリーのみが作成される。ループ処理７００では、ループ内の数式の右辺コードが「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となっている。したがって、配列変数ａ［Ｉ１，Ｉ２，Ｉ３］、ａ［Ｉ２，Ｉ３，Ｉ１］、及びｂ［Ｉ１，Ｉ２］が対象となり、配列名９０１は"ａ"及び"ｂ"となる。
【００８９】
型９０２は、配列変数のデータ型が格納される。型９０２は、ソースプログラム１０６に定義されている各配列変数の宣言文を抽出すればよい。
【００９０】
次元数９０３は、配列変数の添字の次元数である。例えば、ａ［Ｉ１，Ｉ２，Ｉ３］であれば、３となる。
【００９１】
サイズ９０５は、次元９０４に対応する制御変数の値の範囲である。対応するループ処理の制御変数下限値８０３、制御変数上限値８０４、及び制御変数増分値８０５に基づいて設定される。なお、複数種類の制御変数が設定される場合には最大範囲が設定される。
【００９２】
以上が構文解析処理４０１によって生成されるループ表１１０及び配列表１１１についての説明である。以下、生成されたループ表１１０及び配列表１１１に基づいて実行されるＭａｐＲｅｄｕｃｅ解析処理４０４について説明する。
【００９３】
ＭａｐＲｅｄｕｃｅ解析処理４０４では、生成されたループ表１１０及び配列表１１１に基づいて、結果変数登録表３０２、オペランド識別子登録表３０３及びイタレーション対応表３０４に必要な情報を登録する。すなわち、ＭａｐＲｅｄｕｃｅ解析処理４０４は、図５にて説明したように、結果変数登録表生成処理５０１、オペランド識別子登録表生成処理５０２及びイタレーション対応表生成処理５０３によって構成される。ＭａｐＲｅｄｕｃｅ解析処理４０４は、ループ処理をＭａｐＲｅｄｕｃｅ処理に変換するために必要な情報を生成するポイントとなる処理である。
【００９４】
本発明の第１の実施の形態では、ループ処理によって繰り返される１回分の処理、すなわち、イタレーションごとにデータを収集して演算する。足しこみ演算を行うループ処理の場合、さらに１イタレーションごとの演算結果を結果変数に足しこむ。なお、本発明の第１の実施の形態の対象となるループ処理では、前述のように、密多重ループである必要があり、対象となる演算は、最内層のループ内で処理される演算処理となる。図７に示したループ処理７００では、最内層のループ内で処理される足しこみ演算（ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］）が解析の対象となる。なお、最内層のループ内で処理される演算をループ実行文とする。
【００９５】
以下、ＭａｐＲｅｄｕｃｅ解析処理４０４について、図１０から図１５を参照しながら詳細に説明する。
【００９６】
まず、結果変数登録表３０２について図１０を参照しながら説明し、結果変数登録表３０２を生成する結果変数登録表生成処理５０１について図１１を参照しながら説明する。
【００９７】
図１０は、本発明の第１の実施の形態の結果変数登録表３０２の一例を示す図である。
【００９８】
結果変数登録表３０２は、ループ実行文において計算結果を代入している変数（結果変数）と演算の種類などを表す情報を登録する。結果変数登録表３０２は、変数名１００１、添字式１００２及び足しこみ１００３を含む。
【００９９】
本発明の第１の実施の形態では、ループ実行文において足しこみ演算がなされるか否かに基づいてＭａｐＲｅｄｕｃｅ処理を２回実行するか、若しくは１回実行するかを決定する（図１６のステップ１６０１）。また、コード生成処理４０６において、結果変数登録表３０２を参照して、利用するＭａｐＲｅｄｕｃｅテンプレートを選択したり、Ｒｅｄｕｃｅ処理における結果を出力するコードを生成したりする（図２０のステップ２００６及びステップ２００８）。
【０１００】
変数名１００１は、ループ実行文において、演算結果を代入する結果変数の変数名である。変数名１００１は、Ｒｅｄｕｃｅ処理を生成する場合に、１イタレーションの結果を代入する変数を設定するためなどに使用される（図２０のステップ２００１）。
【０１０１】
添字式１００２は、結果変数を特定する情報が格納される。具体的には、結果変数が配列変数の場合には配列変数の添字が登録される。また、結果変数がスカラーの場合には任意の定数（例えば「１」）を登録する。
【０１０２】
足しこみ１００３は、ループ実行文が足しこみ型であれば「ＹＥＳ」、足しこみ型でなければ「ＮＯ」を登録する。
【０１０３】
ループ処理７００では、ループ実行文が足しこみ型であるため、足しこみ１００３には「ＹＥＳ」が設定される。また、足しこみ結果を代入する変数が「ｓｕｍ［ｉ］」となっているため、「ｓｕｍ」が変数名１００１に登録され、「Ｉ１」が添字式１００２に登録される。
【０１０４】
図１１は、本発明の第１の実施の形態の結果変数登録表３０２を生成するための結果変数登録表生成処理５０１の手順を示すフローチャートである。
【０１０５】
ＣＰＵ１０１は、結果変数登録表生成処理５０１を開始すると、まず、未処理のループ実行文が存在するか否かを判定する（ステップ１１０１）。未処理のループ実行文が存在しない場合、すなわち、すべてのループ実行文について、ステップ１１０２以降の処理を実行した場合には（ステップ１１０１の結果が「Ｎｏ」）、結果変数登録表生成処理５０１を終了する。
【０１０６】
ＣＰＵ１０１は、未処理のループ実行文が存在する場合には（ステップ１１０１の結果が「Ｙｅｓ」）、処理対象のループ実行文が代入文であるか否かを判定する（ステップ１１０２）。処理対象のループ実行文が代入文でない場合には（ステップ１１０２の結果が「Ｎｏ」）、ＭａｐＲｅｄｕｃｅ処理に変換できないため、ステップ１１０１の処理に戻る。
【０１０７】
ＣＰＵ１０１は、処理対象のループ実行文が代入文である場合には（ステップ１１０２の結果が「Ｙｅｓ」）、代入文の左辺変数の変数名を結果変数登録表３０２の変数名１００１に登録する（ステップ１１０３）。
【０１０８】
ＣＰＵ１０１は、左辺変数がスカラー値であるか否かを判定する（ステップ１１０４）。左辺変数がスカラー値でない場合、すなわち、左辺変数が配列変数の場合には（ステップ１１０４の結果が「Ｎｏ」）、結果変数登録表３０２の添字式１００２に配列変数の添字を登録する（ステップ１１０５）。左辺変数がスカラー値の場合には（ステップ１１０４の結果が「Ｙｅｓ」）、結果変数登録表３０２の添字式１００２に任意の定数（例えば「１」）を登録する（ステップ１１０６）。
【０１０９】
ＣＰＵ１０１は、ループ実行文の代入文が足しこみ型か否かを判定する（ステップ１１０７）。足しこみ型でない場合には（ステップ１１０７の結果が「Ｎｏ」）、結果変数登録表３０２の足しこみ１００３に「ＮＯ」を設定する（ステップ１１０８）。一方、足しこみ型の場合には（ステップ１１０７の結果が「Ｙｅｓ」）、結果変数登録表３０２の足しこみ１００３に「ＹＥＳ」を設定する（ステップ１１０９）。
【０１１０】
以上の処理が終了すると、ステップ１１０１の処理に戻り、未処理のループ実行文が存在しなくなるまで本処理を実行する。
【０１１１】
ここで、図７に示したループ処理７００に対し、図１１に示した結果変数登録表生成処理５０１を適用する手順について説明する。
【０１１２】
ループ処理７００では、前述のように、ループ実行文は「ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となる。
【０１１３】
結果変数登録表生成処理５０１が実行され、最初にステップ１１０１の処理が実行されると、未処理のループ実行文が存在するため（ステップ１１０１の結果が「Ｙｅｓ」）、ループ実行文が代入文であるか否かが判定される（ステップ１１０２）。
【０１１４】
ループ実行文は、ｓｕｍ［Ｉ１］に、ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］を加算して代入する代入文であるため（ステップ１１０２の結果が「Ｙｅｓ」）、結果変数登録表３０２の変数名１００１に「ｓｕｍ」を登録する（ステップ１１０３）。
【０１１５】
さらに、ＣＰＵ１０１は、結果変数がスカラー値であるか否かを判定する（ステップ１１０３）。結果変数ｓｕｍ［Ｉ１］は、配列変数であり、スカラー値でないため（ステップ１１０３の結果が「Ｎｏ」）、結果変数登録表３０２の添字式１００２に「［Ｉ１］」を登録する（ステップ１１０５）。
【０１１６】
ＣＰＵ１０１は、ループ実行文に複合代入演算子「＋＝」が含まれているため（ステップ１１０７の結果が「Ｙｅｓ」）、足しこみ型であると判定し、結果変数登録表３０２の足しこみ１００３に「ＹＥＳ」を登録する。そして、ステップ１１０１の処理に戻るが、ループ実行文が存在しないため（ステップ１１０２の結果が「Ｎｏ」）、本処理を終了する。
【０１１７】
以上のように、結果変数登録表３０２を参照すると、図７のループ処理を解析した結果、変数名１００１の値から変数「ｓｕｍ」に１イタレーションの演算結果を代入することがわかる。さらに、足しこみ１００３の値から代入文が足しこみ演算であることがわかり、添字式１００２から制御変数「Ｉ１」について足しこみ演算を行えばよいことがわかる。
【０１１８】
次に、オペランド識別子登録表３０３について図１２を参照しながら説明する。さらに、オペランド識別子登録表３０３を生成するオペランド識別子登録表生成処理５０２について図１３を参照しながら説明する。
【０１１９】
図１２は、本発明の第１の実施の形態のオペランド識別子登録表３０３の一例を示す図である。
【０１２０】
本発明の第１の実施の形態では、コード生成処理４０６において、イタレーションごとにデータを収集して演算するコードが生成される。そのため、各データにループ実行文に含まれる配列変数に対応する識別子（オペランド識別子）を割り当てる必要がある。特に、ａ［Ｉ１，Ｉ２，Ｉ３］とａ［Ｉ２，Ｉ３，Ｉ１］のように同じ配列名で添字の構成が異なる場合には変数毎に識別子を付与しなければ識別することができない。オペランド識別子登録表３０３には、配列を特定するための情報（配列参照）が格納される。
【０１２１】
オペランド識別子登録表３０３は、配列名１２０１、配列参照形式１２０２、及びオペランド識別子１２０３を含む。オペランド識別子登録表３０３は、ループ処理ごとに生成される。
【０１２２】
配列名１２０１は、ループ実行文の右辺コードに含まれる配列変数の変数名である。配列参照形式１２０２は、添字を含む配列変数に対応する。オペランド識別子１２０３は、配列参照形式１２０２と対応し、配列参照形式１２０２を識別する識別子である。
【０１２３】
オペランド識別子登録表３０３は、ＭａｐＲｅｄｕｃｅ解析処理４０４に含まれるオペランド識別子登録表生成処理５０２よって生成され、イタレーション対応表３０４を生成するイタレーション対応表生成処理５０３及びコード生成処理４０６の実行時に参照される。
【０１２４】
図１３は、本発明の第１の実施の形態のオペランド識別子登録表３０３を生成するためのオペランド識別子登録表生成処理５０２の手順を示すフローチャートである。本処理は、結果変数登録表３０２に登録された結果変数の右辺コードの各項について、オペランド識別子登録表３０３のエントリーを生成する。
【０１２５】
ＣＰＵ１０１は、オペランド識別子登録表生成処理５０２を開始すると、まず、未処理の配列参照が存在するか否かを判定する（ステップ１３０１）。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には（ステップ１３０１の結果が「Ｎｏ」）、オペランド識別子登録表生成処理５０２を終了する。
【０１２６】
ＣＰＵ１０１は、配列名が結果変数登録表３０２の変数名１００１に登録済であって、かつ、足しこみ１００３の値が「ＹＥＳ」であるか否かを判定する（ステップ１３０２）。配列名が結果変数登録表３０２の変数名１００１に登録済であって、かつ、足しこみ１００３の値が「ＹＥＳ」の場合には（ステップ１３０２の結果が「Ｙｅｓ」）、処理対象の配列変数は結果変数と同一であり、オペランド識別子を割り当てる必要がないため、次の変数について処理を実行するためにステップ１３０１の処理に戻る。
【０１２７】
ＣＰＵ１０１は、配列名が結果変数登録表３０２の変数名１００１に登録済でない、又は、足しこみ１００３の値が「ＮＯ」の場合には（ステップ１３０２の結果が「Ｎｏ」）、同じ配列参照形式が既に登録済みであるか否かを判定する（ステップ１３０３）。前述のように、同じ配列名であっても添字式の構成が異なれば値が異なるため、配列名及び添字式が含まれる配列参照形式ごとにオペランド識別子を割り当てる。
【０１２８】
ＣＰＵ１０１は、同じ配列参照形式が既に登録済みである場合には（ステップ１３０３の結果が「Ｙｅｓ」）、オペランド識別子を割り当てる必要がないため、次の変数について処理を実行するためにステップ１３０１の処理に戻る。
【０１２９】
一方、ＣＰＵ１０１は、同じ配列参照形式が登録済みでない場合には（ステップ１３０３の結果が「Ｎｏ」）、オペランド識別子登録表３０３に新しいオペランド識別子を割り当てる（ステップ１３０４）。新しいオペランド識別子は、登録済みのオペランド識別子と重複しないように生成される。
【０１３０】
最後に、ＣＰＵ１０１は、オペランド識別子登録表３０３の配列名１２０１、配列参照形式１２０２及びオペランド識別子１２０３に、配列参照から取得された配列名及び配列参照形式、ステップ１３０４の処理で割り当てられたオペランド識別子を登録する（ステップ１３０５）。その後、残りの配列参照を処理するためにステップ１３０１の処理に戻る。
【０１３１】
ここで、図７に示したループ処理７００に対し、図１３に示したオペランド識別子登録表生成処理５０２を適用する手順について説明する。
【０１３２】
ループ処理７００では、前述のように、ループ実行文は「ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となっており、処理対象となる右辺コードは、「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となる。
【０１３３】
オペランド識別子登録表生成処理５０２が実行され、最初にステップ１３０１の処理が実行されると、未処理の配列参照が存在するため（ステップ１３０１の結果が「Ｙｅｓ」）、ステップ１３０２の処理を実行する。
【０１３４】
最初に処理対象となる配列参照は「ａ［Ｉ１，Ｉ２，Ｉ３］」である。配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」は、結果変数登録表３０２に登録されていないため（ステップ１３０２の結果が「Ｎｏ」）、当該配列参照がオペランド識別子登録表３０３に登録済みであるか否かを判定する（ステップ１３０３）。そして、オペランド識別子登録表３０３にはエントリーが登録されていないため（ステップ１３０３の結果が「Ｎｏ」）、新しくオペランド識別子を生成する（ステップ１３０４）。このとき、生成されるオペランド識別子は「ＩＤ１」となっているが、前述のように重複しなければ任意である。
【０１３５】
さらに、ＣＰＵ１０１は、配列名１２０１として「ａ」、配列参照形式１２０２として「ａ［Ｉ１，Ｉ２，Ｉ３］」、オペランド識別子１２０３として「ＩＤ１」をオペランド識別子登録表３０３に登録する（ステップ１３０５）。
【０１３６】
配列参照ａ［Ｉ２，Ｉ３，Ｉ１］、ｂ［Ｉ１，Ｉ２］についても同様の手順でオペランド識別子「ＩＤ２」、「ＩＤ３」を割り当て、オペランド識別子登録表３０３に対応するエントリーを登録する。
【０１３７】
オペランド識別子登録表生成処理５０２の結果、配列参照ａ［Ｉ１，Ｉ２，Ｉ３］とオペランド識別子ＩＤ１、配列参照ａ［Ｉ２，Ｉ３，Ｉ１］とオペランド識別子ＩＤ２、配列参照ｂ［Ｉ１，Ｉ２］とオペランド識別子ＩＤ３を対応させることができる。
【０１３８】
続いて、イタレーション対応表３０４について図１４を参照しながら説明する。さらに、イタレーション対応表３０４を生成するイタレーション対応表生成処理５０３について図１５を参照しながら説明する。
【０１３９】
図１４は、本発明の第１の実施の形態のイタレーション対応表３０４の一例を示す図である。
【０１４０】
イタレーションとは、ループ処理で繰り返される１回分の処理である。イタレーションは、ループ変数によって特定可能であり、多重ループであれば、複数のループ変数によって特定される。
【０１４１】
イタレーション対応表３０４には、入力データを参照するイタレーションがオペランド識別子ごとに登録される。イタレーション対応表３０４は、配列名１４０１、入力データ１４０２、オペランド識別子１４０３、及びイタレーション１４０４を含む。イタレーション対応表３０４は、オペランド識別子登録表３０３の各エントリーに基づいて生成される。イタレーション対応表３０４は、ループ処理毎に生成される。
【０１４２】
イタレーション対応表３０４は、イタレーションごとにデータを収集及び演算するコード（プログラム）を生成する際に参照される。具体的には、後述するＭａｐ処理のコード（プログラム）を生成する処理（図１８のステップ１８０６）において、イタレーション対応表３０４に基づいて、入力データに対してオペランド識別子及びイタレーションを設定するコードが生成される。
【０１４３】
配列名１４０１は、入力データが格納される配列変数の変数名である。入力データ１４０２は、入力されたデータを示す情報が格納される。配列変数の場合には添字とともに指定される。
【０１４４】
オペランド識別子１４０３は、オペランド識別子登録表３０３に格納されており、配列名１４０１に対応するオペランド識別子である。イタレーション１４０４は、イタレーションを識別する情報である。
【０１４５】
例えば、オペランド識別子１４０３が「ＩＤ２」の場合、入力データａ［Ｊ１，Ｊ２，Ｊ３］を処理するイタレーション１４０４は、（Ｊ３，Ｊ１，Ｊ２）となる。オペランド識別子１４０３が「ＩＤ２」の配列参照形式がａ［Ｉ２，Ｉ３，Ｉ１］であることからイタレーション１４０４を特定することができる。イタレーション１４０４を設定するための処理の詳細については、図１５にて後述する。
【０１４６】
図１５は、本発明の第１の実施の形態のイタレーション対応表３０４を生成するためのイタレーション対応表生成処理５０３の手順を示すフローチャートである。本処理は、オペランド識別子登録表３０３に登録されたオペランド識別子ごとにイタレーション対応表３０４のエントリーを生成する。
【０１４７】
イタレーション対応表生成処理５０３では、処理対象となるループ処理のループネスト数をｍとする。ループネスト数ｍは、ループ表１１０に基づいて取得することができる。
【０１４８】
ＣＰＵ１０１は、イタレーション対応表生成処理５０３を開始すると、まず、オペランド識別子登録表３０３に未処理のオペランド識別子が存在するか否かを判定する（ステップ１５０１）。未処理のオペランド識別子が存在しない場合には（ステップ１５０１の結果が「Ｎｏ」）、イタレーション対応表生成処理５０３を終了する。
【０１４９】
ＣＰＵ１０１は、未処理のオペランド識別子が存在する場合には（ステップ１５０１の結果が「Ｎｏ」）、未処理のオペランド識別子に対応するエントリーを取得する（ステップ１５０２）。さらに、取得されたエントリーの配列名１４０１がイタレーション対応表３０４に登録済みか否かを判定する（ステップ１５０３）。配列名が既に登録されている場合には（ステップ１５０３の結果が「Ｙｅｓ」）、ステップ１５０６以降の処理を実行する。
【０１５０】
ＣＰＵ１０１は、未処理のオペランド識別子が存在しない場合には（ステップ１５０１の結果が「Ｎｏ」）、イタレーション対応表３０４に新しいエントリーを作成し、オペランド識別子登録表３０３の配列名１２０１の値を配列名１４０１に登録する（ステップ１５０４）。
【０１５１】
さらに、ＣＰＵ１０１は、配列の次元数をｎとして、イタレーション対応表３０４の入力データ１４０２の添字を［Ｊ１，Ｊ２，…Ｊｎ−１，Ｊｎ］として登録する（ステップ１５０５）。なお、配列の次元数は、図９に示した配列表１１１の次元数９０３から取得することができる。
【０１５２】
以降の処理では、添字が［Ｊ１，Ｊ２，…Ｊｎ−１，Ｊｎ］の配列を利用するループ処理のイタレーションを取得する。例えば、データ「ａ［Ｊ１，Ｊ２，Ｊ３］」をオペランド識別子「ＩＤ１」の配列参照形式として使用する場合には、イタレーション「（Ｊ１，Ｊ２，Ｊ３）」が取得される。以下、イタレーションを取得する手順について説明する。
【０１５３】
ＣＰＵ１０１は、配列参照形式の添字を［σ（Ｉ１，Ｉ２，…，Ｉｍ）］とする（ステップ１５０６）。配列参照形式が「ａ［Ｉ１，Ｉ２，Ｉ３］」の場合には、［σ（Ｉ１，Ｉ２，…，Ｉｍ）］は［Ｉ１，Ｉ２，Ｉ３］となる。また、配列参照形式がｂ［Ｉ１，Ｉ２］の場合には、［σ（Ｉ１，Ｉ２，…，Ｉｍ）］は［Ｉ１，Ｉ２］となる。なお、Ｉｋはループの制御変数であり、Ｉ１は最外側の制御変数を表す。
【０１５４】
さらに、ＣＰＵ１０１は、Ｉｋ（１＜＝ｉ＜＝ｍ）について、［σ（Ｉ１，Ｉ２，…，Ｉｍ）］＝［Ｊ１，Ｊ２，…Ｊｎ−１，Ｊｎ］の解を求める（ステップ１５０７）。例えば、配列参照形式がａ［Ｉ２，Ｉ３，Ｉ１］の場合には、［Ｉ２，Ｉ３，Ｉ１］＝［Ｊ１，Ｊ２，Ｊ３］を解くことになる。この場合、「Ｉ１＝Ｊ３，Ｉ２＝Ｊ１，Ｉ３＝Ｊ２」が解となる。同様に、配列参照形式がｂ［Ｉ１，Ｉ２］の場合には、［Ｉ１，Ｉ２］＝［Ｊ１，Ｊ２］を解いて「Ｉ１＝Ｊ１，Ｉ２＝Ｊ２」が解となる。
【０１５５】
ＣＰＵ１０１は、イタレーション１４０４のｋ次元目にステップ１５０７の処理で求められたＩｋを設定する（ステップ１５０８）。
【０１５６】
さらに、ＣＰＵ１０１は、Ｉｋ（１＜＝ｋ＜＝ｍ）について、ステップ１５０８の処理で設定されなかったＩｋにループ表１１０に格納された制御変数下限値８０３と制御変数上限値８０４に基づいて制御変数の範囲をセットする（ステップ１５０９）。例えば、配列参照形式がｂ［Ｉ１，Ｉ２］の場合には、「Ｉ１＝Ｊ１，Ｉ２＝Ｊ２」については設定されたが、Ｉ３については設定されていないため、ループ表１１０を参照し、「Ｉ３」の制御変数の範囲「０：９９」をセットする。ｂ［Ｊ１，Ｊ２］のデータは、ループ処理において、制御変数Ｉ１でＪ１、Ｉ２でＪ２、Ｉ３では０から９９のそれぞれの場合で使用されるためである。ステップ１５０８及びステップ１５０９の処理によって、入力データを参照するイタレーションを設定することができる。
【０１５７】
最後に、ＣＰＵ１０１は、オペランド識別子１４０３と、ステップ１５０８及びステップ１５０９の処理で設定されたイタレーションをイタレーション１４０４に登録する（ステップ１５１０）。そして、ステップ１５０１の処理に戻り、オペランド識別子登録表３０３に未処理のエントリーが存在しなくなるまで本処理を繰り返す。
【０１５８】
ここで、図７に示したループ処理７００に対し、図１５に示したイタレーション対応表生成処理５０３を適用する手順について説明する。
【０１５９】
まず、対象となるループ処理のループネスト数ｍは、ループ表１１０を参照すると、「３」であることがわかる。
【０１６０】
イタレーション対応表生成処理５０３が実行され、最初にステップ１５０１の処理が実行されると、オペランド識別子登録表３０３に未処理のエントリーが存在するため（ステップ１５０１の結果が「Ｙｅｓ」）、オペランド識別子登録表３０３の未処理のエントリーを取得する（ステップ１５０２）。また、取得されたエントリーから配列名「ａ」、配列参照形式「ａ［Ｉ１，Ｉ２，Ｉ３］」、オペランド識別子「ＩＤ１」を取得する。
【０１６１】
このとき、イタレーション対応表３０４に配列名「ａ」が未登録であるため（ステップ１５０３の結果が「Ｎｏ」）、ＣＰＵ１０１は、イタレーション対応表３０４に新しいエントリーを作成し、配列名１２０１に配列名「ａ」を登録する（ステップ１５０４）。さらに、配列名「ａ」の次元数ｎは、配列表１１１の次元数９０３に「３」が設定されているため、「ｎ＝３」となる。したがって、入力データ１４０２の添字を［Ｊ１，Ｊ２，Ｊ３］として登録する（ステップ１５０５）。
【０１６２】
ＣＰＵ１０１は、配列参照形式ａ［Ｉ１，Ｉ２，Ｉ３］の添字を［σ（Ｉ１，Ｉ２，Ｉ３）］（つまり、σ（Ｉ１，Ｉ２，Ｉ３）＝［Ｉ１，Ｉ２，Ｉ３］）とし（ステップ１５０６）、Ｉｋ（１＜＝ｋ＜＝３）について、［σ（Ｉ１，Ｉ２，Ｉ３）］＝［Ｊ１，Ｊ２，Ｊ３］の解（（つまり、［Ｉ１，Ｉ２，Ｉ３］＝［Ｊ１，Ｊ２，Ｊ３］の解）を求める（ステップ１５０７）。この結果、「Ｉ１＝Ｊ１、Ｉ２＝Ｊ２、Ｉ３＝Ｊ３」が解となり、イタレーションとして（Ｊ１，Ｊ２，Ｊ３）をセットする（ステップ１５０８）。
【０１６３】
さらに、配列名「ａ」の場合には未設定のＩｋ（１＜＝ｋ＜＝３）は存在しないため（ステップ１５０９）、オペランド識別子１４０３に「ＩＤ１」、イタレーション１４０４に「（Ｊ１，Ｊ２，Ｊ３）」を登録する（ステップ１５１０）。その後、ステップ１５０１の処理に戻る。
【０１６４】
次のループでは、ステップ１５０１の処理で、オペランド識別子登録表３０３に未処理のエントリーが存在すると判定されるため、当該未処理のエントリーが取得される（ステップ１５０２）。具体的には、配列名「ａ」、配列参照形式「ａ［Ｉ２，Ｉ３，Ｉ１］」、オペランド識別子「ＩＤ２」が取得される。
【０１６５】
このとき、配列「ａ」はイタレーション対応表３０４に登録済であるため（ステップ１５０３の結果が「Ｙｅｓ」）と判定し、参照形式ａ［Ｉ２，Ｉ３，Ｉ１］の添字を［σ（Ｉ１，Ｉ２，Ｉ３）］（つまり、σ（Ｉ１，Ｉ２，Ｉ３）＝［Ｉ２，Ｉ３，Ｉ１］）とする（ステップ１５０６）。そして、Ｉｋについて、［σ（Ｉ１，Ｉ２，Ｉ３）］＝［Ｊ１，Ｊ２，Ｊ３］の解として（つまり、［Ｉ２，Ｉ３，Ｉ１］＝［Ｊ１，Ｊ２，Ｊ３］の解として）「Ｉ１＝Ｊ３、Ｉ２＝Ｊ１、Ｉ３＝Ｊ２」が得られる（ステップ１５０７）。
【０１６６】
ＣＰＵ１０１は、ステップ１５０７の処理の結果に基づいて、（Ｊ３，Ｊ１，Ｊ２）をイタレーションとしてセットする（ステップ１５０８）。また、未設定のＩｋ（１＜＝ｋ＜＝３）は存在しないため（ステップ１５０９）、オペランド識別子１４０３に「ＩＤ２」、イタレーション１４０４に（Ｊ３，Ｊ１，Ｊ２）を登録する（ステップ１５１０）。
【０１６７】
次のループでは、ステップ１５０１の処理で、オペランド識別子登録表３０３に未処理のエントリーが存在すると判定されるため、当該未処理のエントリーが取得される（ステップ１５０２）。具体的には、配列名「ｂ」、配列参照形式「ｂ［Ｉ１，Ｉ２］」、オペランド識別子「ＩＤ３」が取得される。
【０１６８】
このとき、イタレーション対応表３０４に配列名「ｂ」が未登録であるため（ステップ１５０３の結果が「Ｎｏ」）、ＣＰＵ１０１は、イタレーション対応表３０４に新しいエントリーを作成し、配列名１２０１に配列名「ｂ」を登録する（ステップ１５０４）。さらに、配列名「ｂ」の次元数ｎは、配列表１１１の次元数９０３に「２」が設定されているため、「ｎ＝２」となる。したがって、入力データ１４０２の添字を［Ｊ１，Ｊ２］として登録する（ステップ１５０５）。
【０１６９】
ＣＰＵ１０１は、配列参照形式ｂ［Ｉ１，Ｉ２］の添字を［σ（Ｉ１，Ｉ２，Ｉ３）］とし（ステップ１５０６）、（つまり、σ（Ｉ１，Ｉ２，Ｉ３）＝［Ｉ１，Ｉ２］とし）Ｉｋについて、［σ（Ｉ１，Ｉ２，Ｉ３）］＝［Ｊ１，Ｊ２］の解を求める（ステップ１５０７）(つまり、［Ｉ１，Ｉ２］＝［Ｊ１，Ｊ２］の解を求める)。
【０１７０】
ＣＰＵ１０１は、ステップ１５０７の処理の結果、「Ｉ１＝Ｊ１、Ｉ２＝Ｊ２、Ｉ３＝−（該当無し）」が解となり、イタレーションとして（Ｊ１，Ｊ２，−）をセットする（ステップ１５０８）。また、ｋ＝３の場合にＩｋが未設定になるため、「Ｉ３」には、ループ表１１０の「Ｉ３」の制御変数範囲「０：９９」がセットされる（ステップ１５０９）。最後に、オペランド識別子１４０３に「ＩＤ３」、イタレーション１４０４に（Ｊ１，Ｊ２，０：９９）を登録する（ステップ１５１０）。
【０１７１】
その後、ステップ１５０１の処理に戻るが、オペランド識別子登録表３０３に未処理のエントリーが存在しなくなるため、本処理を終了する。
【０１７２】
以上の処理の結果、入力データ１４０２がａ［Ｊ１，Ｊ２，Ｊ３］の場合には、オペランド識別子１４０３にはＩＤ１及びＩＤ２が対応する。さらに、各オペランド識別子１４０３に対応するイタレーション１４０４について（Ｊ１，Ｊ２，Ｊ３）及び（Ｊ３，Ｊ１，Ｊ２）で、ａ［Ｊ１，Ｊ２，Ｊ３］が参照されることがわかる。
【０１７３】
また、入力データ１４０２がｂ［Ｊ１，Ｊ２］の場合には、オペランド識別子１４０３にはＩＤ３が対応する。さらに、イタレーション１４０４に格納された（Ｊ１，Ｊ２，０：９９）においてｂ［Ｊ１，Ｊ２］が参照される。イタレーション対応表３０４は、後述するＭａｐ処理のコードを生成する際に参照される。
【０１７４】
以上がＭａｐＲｅｄｕｃｅ解析処理４０４の説明である。続いて、ＭａｐＲｅｄｕｃｅ解析処理４０４によって生成された結果変数登録表３０２、オペランド識別子登録表３０３及びイタレーション対応表３０４に基づいて、ソースプログラム１０６からオブジェクトプログラム１０７を生成する手順について説明する。
【０１７５】
図１６は、本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅコード生成処理６０１の手順を示すフローチャートである。ＭａｐＲｅｄｕｃｅコード生成処理６０１は、結果変数登録表３０２のエントリーごとに実行される。
【０１７６】
ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅコード生成処理６０１を実行すると、結果変数登録表３０２から処理対象のエントリーを取得し、足しこみ１００３の値が「ＹＥＳ」であるか否かを判定する（ステップ１６０１）。
【０１７７】
ＣＰＵ１０１は、処理対象のエントリーの足しこみ１００３の値が「ＹＥＳ」の場合には（ステップ１６０１の結果が「Ｙｅｓ」）、ＭａｐＲｅｄｕｃｅ処理を２回実行するためのテンプレートを選択する（ステップ１６０３）。足しこみを行う場合には、１回目のＭａｐ処理において１イタレーション分の演算を行い、２回目のＭａｐ処理で各イタレーション結果を集計するためである。
【０１７８】
そして、ＣＰＵ１０１は、１回目のＭａｐ処理のコードを生成するＭａｐ１コード生成処理を実行する（ステップ１６０６）。Ｍａｐ１コード生成処理の詳細については、図１８にて説明する。また、Ｍａｐ１コード生成処理によって生成されるＭａｐ処理１のコードを図１９に示す。
【０１７９】
続いて、ＣＰＵ１０１は、１回目のＲｅｄｕｃｅ処理のコードを生成するＲｅｄｕｃｅ１コード生成処理を実行する（ステップ１６０７）。Ｒｅｄｕｃｅ１コード生成処理の詳細については、図２０にて説明する。また、Ｒｅｄｕｃｅ１コード生成処理によって生成されるＲｅｄｕｃｅ処理１のコード（プログラム）を図２１に示す。
【０１８０】
さらに、ＣＰＵ１０１は、２回目のＭａｐ処理のコードを生成するＭａｐ２コード生成処理を実行する（ステップ１６０８）。Ｍａｐ２コード生成処理の詳細については、図２２にて説明する。また、Ｍａｐ２コード生成処理によって生成されるＭａｐ処理２のコード（プログラム）を図２３に示す。
【０１８１】
続いて、ＣＰＵ１０１は、２回目のＲｅｄｕｃｅ処理のコードを生成するＲｅｄｕｃｅ２コード生成処理を実行する（ステップ１６０９）。Ｒｅｄｕｃｅ２コード生成処理の詳細については、図２４にて説明する。また、Ｒｅｄｕｃｅ２コード生成処理によって生成されるＲｅｄｕｃｅ処理２のコードを図２５に示す。
【０１８２】
一方、ＣＰＵ１０１は、処理対象のエントリーの足しこみ１００３の値が「ＹＥＳ」でない場合には（ステップ１６０１の結果が「Ｎｏ」）、ＭａｐＲｅｄｕｃｅ処理を１回実行するためのテンプレートを選択する（ステップ１６０２）。
【０１８３】
ＣＰＵ１０１は、Ｍａｐ処理のコードを生成するＭａｐ１コード生成処理を実行し（ステップ１６０４）、さらに、Ｒｅｄｕｃｅ処理のコードを生成するＲｅｄｕｃｅ１コード生成処理を実行する（ステップ１６０５）。なお、ステップ１６０４のＭａｐ１コード生成処理と、ステップ１６０６のＭａｐ１コード生成処理とは同じ処理でよい。ステップ１６０５のＲｅｄｕｃｅ１コード生成処理も同様にステップ１６０７のＲｅｄｕｃｅ１コード生成処理と同じ処理でよい。
【０１８４】
ＣＰＵ１０１は、ステップ１６０５又はステップ１６０９の処理が終了すると、生成されたＭａｐ処理及びＲｅｄｕｃｅ処理を実行するための出力コードを生成する（ステップ１６１０）。具体的には、生成されたＭａｐ処理及びＲｅｄｕｃｅ処理に依存しない処理が定義されたテンプレートをあらかじめ用意し、用意されたテンプレートに対してＭａｐ処理及びＲｅｄｕｃｅ処理に依存する処理を追加する。
【０１８５】
図１７は、本発明の第１の実施の形態のＭａｐＲｅｄｕｃｅプログラムのテンプレートの一例を示す図である。
【０１８６】
図１７に示したＭａｐＲｅｄｕｃｅプログラムのテンプレートの例では、実行基盤Ｈａｄｏｏｐ上で利用するためにＪａｖａ言語で記述したプログラムを示しているが、他の開発言語又は実行基盤向けにＭａｐＲｅｄｕｃｅコードを生成する場合であっても同様に適用することができる。
【０１８７】
本発明の第１の実施の形態ではＪａｖａ言語でコード（プログラム）が生成されるため、クラスモジュールを作成するためのテンプレートが定義される。なお、クラス名は、「ＯｕｔＣｌａｓｓ」となっている。
【０１８８】
ＭａｐＲｅｄｕｃｅプログラムのテンプレートには、生成されたＭａｐＲｅｄｕｃｅ処理に対応するクラスが定義され、ソースプログラム１０６に依存するＭａｐＲｅｄｕｃｅ処理記述部分１７０１が含まれる。図１７に示すＭａｐＲｅｄｕｃｅ処理記述部分１７０１は、ＭａｐＲｅｄｕｃｅ処理を２回実行する場合を示しており、ＭａｐＲｅｄｕｃｅ処理を１回のみ実行する場合（図１６のステップ１６０２）には、Ｍａｐ２クラス及びＲｅｄｕｃｅ２クラスの定義は不要である。なお、ＭａｐＲｅｄｕｃｅ処理記述部分１７０１に定義されるクラスについては、図１８から図２４にクラスを定義するコードを生成する手順及び生成されたクラス定義の例を示す。
【０１８９】
また、ＭａｐＲｅｄｕｃｅプログラムのテンプレートに定義されているＯｕｔＣｌａｓｓには、ｒｕｎメソッド及びｍａｉｎメソッドが定義される。ｒｕｎメソッドは、生成元となるソースプログラム１０６に依存する処理を含む。一方、Ｍａｉｎメソッドは、ｒｕｎメソッドを実行するためのメソッドであり、生成元となるソースプログラム１０６には依存しない。
【０１９０】
図１７に示すＯｕｔＣｌａｓｓのｒｕｎメソッドには、１回目のＭａｐＲｅｄｕｃｅ処理を実行するブロックと、２回目のＭａｐＲｅｄｕｃｅ処理を実行するブロック１７０２とが含まれている。ＭａｐＲｅｄｕｃｅ処理を１回だけ実行する場合には２回目のＭａｐＲｅｄｕｃｅ処理を実行するブロック１７０２の記述は不要である。
【０１９１】
以下、ＭａｐＲｅｄｕｃｅモデルが適用されたコード（クラス定義）を生成する手順について説明する。まず、一般的なＭａｐ処理とＲｅｄｕｃｅ処理について説明する。
【０１９２】
Ｍａｐ処理では、入力されたデータを処理し、キー（Ｋｅｙ）及び値（Ｖａｌｕｅ）を組として、（Ｋｅｙ，Ｖａｌｕｅ）形式でデータを出力する。
【０１９３】
Ｒｅｄｕｃｅ処理の前の処理で、Ｍａｐ処理で出力されたＶａｌｕｅの値をＫｅｙごとにｌｉｓｔ（Ｖａｌｕｅ）とし、（Ｋｅｙ，ｌｉｓｔ（Ｖａｌｕｅ））形式のデータをＲｅｄｕｃｅ処理への入力とする。そして、Ｋｅｙごとにｌｉｓｔ（Ｖａｌｕｅ）の値を処理し、処理結果を出力する。
【０１９４】
本発明の第１の実施の形態では、前述のように、ソースプログラム１０６に含まれるループ処理に対して、ＭａｐＲｅｄｕｃｅモデルに対応したコードを生成する。
【０１９５】
ループ実行文において配列変数を結果変数に足しこむ演算を実行する場合について説明すると、１回目のＭａｐ処理で、入力データを参照するイタレーションとオペランドの情報（オペランド識別子）を、入力データに付与する。１回目のＲｅｄｕｃｅ処理では、イタレーションごとに収集したデータに対し、オペランド識別子に基づいてループ実行文に記述された１回分の演算を行う。
【０１９６】
２回目のＭａｐ処理では、Ｒｅｄｕｃｅ処理の結果をそのまま出力するｉｄｅｎｔｉｔｙ  Ｍａｐパターンを適用する。そして、２回目のＲｅｄｕｃｅ処理ではイタレーションごとの計算結果である１回目のＲｅｄｕｃｅ処理の結果のリストを処理し、足しこみ結果を出力する。
【０１９７】
ループ実行文が足しこみ型の演算でない場合には、イタレーションごとの演算結果に対してさらに足しこみ演算を行う必要がないため、１回目のＭａｐ処理及びＲｅｄｕｃｅ処理によって結果を算出することが可能となる。
【０１９８】
Ｍａｐ処理及びＲｅｄｕｃｅ処理の入出力は、（Ｋｅｙ，Ｖａｌｕｅ）形式であり、以降、Ｋｅｙ及びＶａｌｕｅに設定する内容について説明する。
【０１９９】
また、本発明の第１の実施の形態において、入力データは「１  １０００  改行  ２  １５００  …」のように、１データが「インデックス（Ｋｅｙ）  データ」のようにタブ区切りでファイルに登録されている。なお、データの入力は、タブ区切りでデータが登録されているファイルを利用する方法に限定されず、別の形式で登録されたファイルを利用してもよいし、他のシステムから入力されたデータを利用してもよく、その他の方法を利用してもよい。
【０２００】
さらに、結果については、例えば、配列の要素が「ｓｕｍ［１］＝１００」である場合には、（Ｋｅｙ：１，Ｖａｌｕｅ：１００）のように（Ｋｅｙ：配列の添字，Ｖａｌｕｅ：配列要素）の形式でファイルに出力する。また、変数がスカラーで、「ｓｕｍ＝１００」である場合には、（Ｋｅｙ：１，Ｖａｌｕｅ：１００）のように（Ｋｅｙ：任意の定数，Ｖａｌｕｅ：変数の値）の形式でファイルに出力する。
【０２０１】
続いて、Ｍａｐ処理及びＲｅｄｕｃｅ処理を記述したコードを生成するための詳細な手順について説明する。
【０２０２】
まず、１回目のＭａｐ処理（Ｍａｐ１処理）を生成するための手順について説明する。Ｍａｐ１処理では、入力データを参照するイタレーションと対応するオペランドの情報を付与する。具体的に説明すると、Ｍａｐ１処理では（Ｋｅｙ：データのインデックス，Ｖａｌｕｅ：データ）の形式でデータが入力され、（Ｋｅｙ：イタレーション，Ｖａｌｕｅ：＜オペランド識別子，データ＞）の形式で出力するコードを生成する。出力Ｋｅｙのイタレーション、出力側のＶａｌｕｅのオペランド識別子は、イタレーション対応表３０４に基づいて付与される。
【０２０３】
図１４に示したイタレーション対応表３０４では、配列「ａ」については１のデータに対し、２種類のオペランド識別子「ＩＤ１」「ＩＤ２」が設定されている。また、配列「ｂ」については１のデータに対して、１種類のオペランド識別子「ＩＤ３」が設定されている。
【０２０４】
したがって、オペランド識別子「ＩＤ１」「ＩＤ２」に対応する各ＶａｌｕｅにＫｅｙ「（Ｊ１，Ｊ２，Ｊ３）」「（Ｊ３，Ｊ１，Ｊ２）」を割り当てて出力し、さらに、オペランド識別子「ＩＤ３」に対応するＶａｌｕｅに１００種類のＫｅｙ「（Ｊ１，Ｊ２，０：９９）」を設定して出力するコードを生成する。
【０２０５】
以下、図１８にＭａｐ処理（Ｍａｐ１処理）を生成する手順を示し、本手順を図７のループ処理７００に適用して生成されたプログラムの例を図１９に示す。
【０２０６】
図１８は、本発明の第１の実施の形態のＭａｐ１コード生成処理１６０６の手順を示すフローチャートである。なお、Ｍａｐ１コード生成処理１６０４も同様である。
【０２０７】
ＣＰＵ１０１は、まず、イタレーション対応表３０４に未処理の配列名を含むエントリーが存在するか否かを判定する（ステップ１８０１）。未処理のエントリーが存在しない場合には（ステップ１８０１の結果が「Ｎｏ」）、本処理を終了する。
【０２０８】
ＣＰＵ１０１は、イタレーション対応表３０４に未処理のエントリーが存在する場合には（ステップ１８０１の結果が「Ｙｅｓ」）、当該エントリーを取得する（ステップ１８０２）。
【０２０９】
本発明の第１の実施の形態では、前述のように、入力データはファイルに格納されており、ファイルからデータを読み出すことによってデータが入力される。ＣＰＵ１０１は、入力データを受け付けるために、ｍａｐメソッドの対象となる入力データが格納されたファイル名がイタレーション対応表３０４の「配列名」に対応するファイル名か否かを判定する条件ブロックを含むコードを生成する（ステップ１８０３）。
【０２１０】
具体的には、ｍａｐメソッド対象ファイル名が変数「ｆｉｌｅｎａｍｅ」に格納され、配列名「ａ」のデータがファイル「Ａｄａｔａ」に格納されている場合、入力されたファイルが「Ａｄａｔａ」であるか否かを判定するブロック「ｉｆ（ｆｉｌｅｎａｍｅ．ｅｑｕａｌｓ（"Ａｄａｔａ"））｛  ｝」を生成する（図１９の条件ブロック１９０１）。そして、Ａｄａｔａを参照するイタレーションとオペランドの情報を付与するために必要な処理を、生成されたブロックの内部に生成する。
【０２１１】
ＣＰＵ１０１は、ｍａｐメソッドのＫｅｙの引数（データのインデックス）をイタレーション対応表３０４の入力データの添字式に変換するコードを生成する（ステップ１８０４）。すなわち、ｍａｐメソッドの入力データが格納される配列変数の各添字を算出するコードを生成する。
【０２１２】
ＣＰＵ１０１は、ステップ１８０２の処理で取得されたエントリーのイタレーション１４０４を参照し、未処理のイタレーションが残っているか否かを判定する（ステップ１８０５）。未処理のイタレーションが残っていない場合には（ステップ１８０５の結果が「Ｎｏ」）、ステップ１８０１の処理に戻り、次のエントリーに対して処理を実行する。
【０２１３】
ＣＰＵ１０１は、未処理のイタレーションが残っている場合には（ステップ１８０５の結果が「Ｙｅｓ」）、処理対象のイタレーションに対し、Ｋｅｙに「イタレーション」、Ｖａｌｕｅに「オペランド識別子とデータ」を設定するコードを生成する（ステップ１８０６）。すなわち、データに対し、Ｋｅｙにイタレーションの情報、Ｖａｌｕｅにオペランドの情報を付与している。
【０２１４】
その後、ＣＰＵ１０１は、ステップ１８０５の処理に戻り、未処理のイタレーションが存在しなくなるまで、ステップ１８０６の処理を実行する。そして、未処理のイタレーションが存在しなくなった場合には、ステップ１８０１の処理に戻り、未処理のエントリーが存在しなくなるまで次のエントリーを処理する。
【０２１５】
図１９は、本発明の第１の実施の形態のＭａｐ１コード生成処理１６０６によって生成されたＭａｐ１コードの一例を示す図である。
【０２１６】
ここでは、図７のループ処理７００に対し、図１８のフローチャートに示した手順を適用して、Ｍａｐ１コードを生成する過程を説明する。
【０２１７】
Ｍａｐ１コードには、ｃｏｎｆｉｇｕｒｅメソッドと、ｍａｐメソッドが含まれる。ｃｏｎｆｉｇｕｒｅメソッドは、入力データが格納されたファイル名などを設定するメソッドであり、所定の内容が記述される。したがって、ここではｍａｐメソッドを生成する過程について説明する。
【０２１８】
まず、ｍａｐメソッドの引数について説明すると、ｍａｐメソッドの第一引数は入力側のＫｅｙ「ｉｎｄｅｘ」、第二引数は入力値「ｄａｔａ」、第三引数は出力データ「ｏｕｔｐｕｔ」である。出力データ「ｏｕｔｐｕｔ」は、ＯｕｔｐｕｔＣｏｌｌｅｃｔｏｒ型であり、第一引数はＫｅｙ、第二引数はＶａｌｕｅとなっている。
【０２１９】
Ｍａｐ１コード生成処理１６０６が開始され、最初にステップ１８０１の処理が実行されると、イタレーション対応表３０４には未処理の配列名１４０１を含むエントリーが存在する（ステップ１８０１の結果が「Ｙｅｓ」）。そこで、ＣＰＵ１０１は、まず、「配列名」が「ａ」のエントリーを取得する（ステップ１８０２）。
【０２２０】
続いて、ＣＰＵ１０１は、ｍａｐメソッド対象ファイル名が格納された変数「ｆｉｌｅｎａｍｅ」が配列名「ａ」に対応するファイル名「Ａｄａｔａ」であるか否かを判定する条件ブロック１９０１を生成する（ステップ１８０３）。なお、ステップ１８０３の処理では、条件ブロック１９０１の内部で実行される処理については生成しない。
【０２２１】
次に、ＣＰＵ１０１は、ｍａｐメソッドのＫｅｙの引数（データのインデックス）を配列の添字式に変換するコードを生成する（ステップ１８０４）。図９の配列表１１１を参照すると、配列「ａ」は「３次元」であり、各次元のサイズは「１００」であることから、Ｋｅｙの引数の１００２の位を１次元目（Ｊ１）、１００の位を２次元目（Ｊ２）、１の位を３次元目（Ｊ３）に設定するコード１９０２を生成する。
【０２２２】
さらに、ＣＰＵ１０１は、イタレーション対応表３０４の配列名「ａ」のエントリーについて、イタレーション１４０４を参照する。そして、イタレーション「（Ｊ１，Ｊ２，Ｊ３）」が未処理であるため（ステップ１８０５の結果が「Ｙｅｓ」）、Ｋｅｙを「（Ｊ１，Ｊ２，Ｊ３）」に、Ｖａｌｕｅを「＜ＩＤ１，ｄａｔａ＞」に設定して出力するコード１９０３を生成する（ステップ１８０６）。コード１９０３におけるｃｏｌｌｅｃｔメソッドは、第一引数をＫｅｙ、第二引数をＶａｌｕｅとしてＭａｐ処理後の結果を収集する。Ｖａｌｕｅには、配列名１４０１が「ａ」、かつ、イタレーション１４０４が「（Ｊ１，Ｊ２，Ｊ３）」に対応するオペランド識別子１４０３（「ＩＤ１」）と、入力されたデータ「ｄａｔａ」とが設定される。
【０２２３】
さらに、イタレーション対応表３０４の配列名が「ａ」のイタレーション１４０４には、未処理のイタレーション「（Ｊ３，Ｊ１，Ｊ２）」が存在するため（ステップ１８０５の結果が「Ｙｅｓ」）、出力データを生成するコードを生成する（ステップ１８０６）。具体的には、Ｋｅｙを「（Ｊ３，Ｊ１，Ｊ２）」に、Ｖａｌｕｅを「＜ＩＤ２，ｄａｔａ＞」に設定して出力するコード１９０４を生成する。Ｖａｌｕｅには、配列名１４０１が「ａ」、かつ、イタレーション１４０４が「（Ｊ３，Ｊ１，Ｊ２）」に対応するオペランド識別子１４０３（「ＩＤ２」）と、入力されたデータ「ｄａｔａ」とが設定される。
【０２２４】
その後、イタレーション対応表３０４の配列名「ａ」について、未処理のエントリーは存在しないため、ステップ１８０１の処理に戻る。
【０２２５】
さらに、イタレーション対応表３０４を参照すると、「配列名」が「ｂ」のエントリーが未処理であるため（ステップ１８０１の結果が「Ｙｅｓ」）、当該エントリーを取得し（ステップ１８０２）、対応するコードを生成する。
【０２２６】
ＣＰＵ１０１は、ｍａｐメソッド対象ファイル名が格納された変数「ｆｉｌｅｎａｍｅ」が配列名「ｂ」に対応するファイル名「Ｂｄａｔａ」であるかを判定する条件ブロック１９０５を生成する（ステップ１８０３）。なお、本発明の第１の実施の形態では、ファイルが「Ａｄａｔａ」「Ｂｄａｔａ」の２種類であるため、ファイル名「Ａｄａｔａ」の条件ブロック１９０１に対してファイル名「Ｂｄａｔａ」用の条件ブロック１９０５は、「Ａｄａｔａ」以外のファイルが選択される、ｅｌｓｅ文を使用している。
【０２２７】
次に、ＣＰＵ１０１は、配列「ａ」の場合と同様に、ｍａｐメソッドのＫｅｙの引数を配列の添字式に変換するコードを生成する（ステップ１８０４）。図９の配列表１１１を参照すると、配列「ｂ」は「２次元」であり、各次元のサイズは「１００」であることから、Ｋｅｙの引数の１００の位を１次元目（Ｊ１）、１の位を２次元目（Ｊ２）に設定するコード１９０６を生成する。
【０２２８】
さらに、ＣＰＵ１０１は、イタレーション対応表３０４の配列名「ｂ」のエントリーのイタレーション１４０４を参照し、Ｋｅｙを「（Ｊ１，Ｊ２，０：９９）」に、Ｖａｌｕｅを「＜ＩＤ３，ｄａｔａ＞」に設定して出力するコード１９０７を生成する（ステップ１８０６）。「０：９９」のように、イタレーションに範囲指定型が含まれる場合には、ｆｏｒ文などを利用して（Ｋｅｙ，Ｖａｌｕｅ）を設定する。また、Ｖａｌｕｅには、配列名１４０１が「ｂ」、かつ、イタレーション１４０４が「（Ｊ１，Ｊ２，０：９９）」に対応するオペランド識別子１４０３（「ＩＤ３」）が設定されている。
【０２２９】
その後、未処理のイタレーション及び他の配列が存在しないため、本処理を終了する。
【０２３０】
以上が、Ｍａｐ処理（Ｍａｐ１処理）を生成するための手順及び生成されたＭａｐ１処理のコードについての説明である。続いて、イタレーションごとに収集したデータに対して、ループ実行文１回分の処理を行うＲｅｄｕｃｅ１処理について説明する。
【０２３１】
Ｒｅｄｕｃｅ１処理では、Ｍａｐ１処理の出力結果である（Ｋｅｙ：イタレーション，Ｖａｌｕｅ：ｌｉｓｔ（＜オペランド識別子，データ＞））を入力として、（Ｋｅｙ：結果変数登録表３０２の「添字式」，Ｖａｌｕｅ：１回分のイタレーション結果）を出力するコードを生成する。入力されたＶａｌｕｅには＜オペランド識別子，データ＞のペアのリストが入力されているため、ループ実行文を構成する各オペランドについて、オペランド識別子に基づいて入力側のＶａｌｕｅに格納されたデータを対応付けることが可能となる。そして、ループ実行文にしたがって１イタレーションの結果を演算し、演算結果を出力側のＶａｌｕｅとして出力することができる。このとき、出力側のＫｅｙには、結果変数登録表３０２に基づいて最終的に足しこみを行う添字式が設定される。複数のエントリーが結果変数登録表３０２に含まれている場合には、出力側のＫｅｙに添字式の情報に加え、変数名の情報を設定することによって識別可能に構成することができる。
【０２３２】
以下、図２０にＲｅｄｕｃｅ処理（Ｒｅｄｕｃｅ１処理）のコードを生成するための手順を示し、図２１に図７に示したループ処理７００を対象とした具体例を説明する。
【０２３３】
図２０は、本発明の第１の実施の形態のＲｅｄｕｃｅ１コード生成処理１６０７の手順を示すフローチャートである。なお、Ｒｅｄｕｃｅ１コード生成処理１６０５にも同様である。
【０２３４】
ＣＰＵ１０１は、まず、結果変数登録表３０２にエントリーされた変数名１００１に対応する結果設定用の変数を用意する（ステップ２００１）。なお、ステップ２００１の処理で用意された変数を「結果変数」とする。
【０２３５】
さらに、ＣＰＵ１０１は、オペランド識別子登録表３０３に登録されたオペランド識別子に対応するオペランド設定用の変数を用意する（ステップ２００２）。なお、ステップ２００２の処理で用意された変数を「オペランド変数」とする。オペランド変数は、Ｒｅｄｕｃｅ１処理で入力されたリスト形式のデータを格納するために用意される。
【０２３６】
ＣＰＵ１０１は、Ｍａｐ１コード生成処理１６０６のステップ１８０６の処理でＶａｌｕｅとして設定され、Ｒｅｄｕｃｅ１処理の引数として入力された（＜オペランド識別子，データ＞）形式で要素が設定されているリストから、オペランド識別子に基づいてデータを抽出し、オペランド変数に設定するコードを生成する（ステップ２００３）。
【０２３７】
続いて、ＣＰＵ１０１は、１イタレーション分の演算を行うコードを生成する（ステップ２００４）。具体的には、右辺コードの各オペランドをオペランド変数に置換し、結果変数に代入するコードを生成する。なお、オペランド変数には、ステップ２００３の処理で対応するデータを設定するためのコードが生成されているため、ステップ２００４の処理で１イタレーションの演算結果を結果変数に代入するコードを生成されることになる。
【０２３８】
さらに、ＣＰＵ１０１は、結果変数登録表３０２に複数のエントリーが含まれているか否かを判定する（ステップ２００５）。
【０２３９】
ＣＰＵ１０１は、結果変数登録表３０２に複数のエントリーが含まれていない場合（ステップ２００５の結果が「Ｙｅｓ」）、すなわち、結果変数登録表３０２に１つの結果変数のみが含まれている場合には、Ｋｅｙに結果変数登録表３０２の添字式、Ｖａｌｕｅに結果変数を設定して出力するコードを生成する（ステップ２００６）。すなわち、Ｋｅｙに、最終的に足しこみを行う添字式、Ｖａｌｕｅに１イタレーションの結果を設定して出力するコードを生成する。
【０２４０】
一方、ＣＰＵ１０１は、結果変数登録表３０２に複数のエントリーが含まれている場合には（ステップ２００５の結果が「Ｙｅｓ」）、未処理の結果変数が存在するか否かを判定する（ステップ２００７）。存在しない場合には（ステップ２００７の結果が「Ｎｏ」）、本処理を終了する。
【０２４１】
ＣＰＵ１０１は、未処理の結果変数が存在する場合には（ステップ２００７の結果が「Ｙｅｓ」）、結果変数登録表３０２の変数名に「＿」及び添字式を付加してＫｅｙを生成し、Ｖａｌｕｅに結果変数を設定して出力するコードを生成する（ステップ２００８）。すなわち、Ｋｅｙに、足しこみを行う変数名及び添字式、Ｖａｌｕｅに１イタレーションの結果を設定して出力するコードを生成している。ステップ２００６の処理と相違する点としては、複数の結果変数（すなわち、ループ実行文）があり、変数ごとに足しこみを行う必要があるため、Ｋｅｙに変数の名前をさらに付与している。結果変数の数だけステップ２００８の処理を繰り返す。
【０２４２】
図２１は、本発明の第１の実施の形態のＲｅｄｕｃｅ１コード生成処理１６０７によって生成されたＲｅｄｕｃｅ１コードの一例を示す図である。
【０２４３】
ここでは、図７のループ処理７００に対し、図２１に示したフローチャートを適用して、Ｒｅｄｕｃｅ１コードを生成する過程を説明する。
【０２４４】
Ｒｅｄｕｃｅ１コードには、ｒｅｄｕｃｅメソッドが含まれる。ｒｅｄｕｃｅメソッドの引数について説明すると、ｒｅｄｕｃｅメソッドの第一引数はイタレーションを示し、Ｋｅｙに対応する変数「（Ｊ１，Ｊ２，Ｊ３）」、第二引数はイタレーションに対応するデータが格納された入力値「ｖａｌｕｅｓ」、第三引数は出力データ「ｏｕｔｐｕｔ」である。
【０２４５】
Ｒｅｄｕｃｅ１コード生成処理１６０７が開始されると、ＣＰＵ１０１は、まず、結果変数登録表３０２に結果変数「ｓｕｍ」が登録されているため、変数「ｓｕｍ」を定義するコード２１０１を生成する（ステップ２００１）。
【０２４６】
続いて、ＣＰＵ１０１は、オペランド識別子登録表３０３に３種類のオペランド識別子「ＩＤ１」「ＩＤ２」「ＩＤ３」が登録されているため、オペランド識別子に対応するオペランド変数「Ａ＿ｉ＿ｊ＿ｋ」「Ａ＿ｊ＿ｋ＿ｉ」「Ｂ＿ｉ＿ｊ」を定義するコード２１０２を生成する（ステップ２００２）。
【０２４７】
さらに、ＣＰＵ１０１は、ｒｅｄｕｃｅメソッドの引数であるリスト形式の入力値（ｖａｌｕｅｓ）から取得した＜オペランド識別子，データ＞に対し、オペランド識別子がＩＤ１からＩＤ３のそれぞれの場合について、ステップ２００２の処理で定義されたオペランド変数Ａ＿ｉ＿ｊ＿ｋ、Ａ＿ｊ＿ｋ＿ｉ、Ｂ＿ｉ＿ｊにＶａｌｕｅを設定するコード２１０３を生成する（ステップ２００３）。
【０２４８】
具体的には、＜オペランド識別子，データ＞のオペランド識別子が「ＩＤ１」の場合にはデータを「Ａ＿ｉ＿ｊ＿ｋ」に代入し、オペランド識別子が「ＩＤ２」の場合にはデータを「Ａ＿ｊ＿ｋ＿ｉ」に代入し、オペランド識別子が「ＩＤ３」の場合にはデータを「Ｂ＿ｉ＿ｊ」に代入するコード２１０３を生成する。
【０２４９】
ＣＰＵ１０１は、右辺コードの各オペランドをオペランド変数「Ａ＿ｉ＿ｊ＿ｋ」「Ａ＿ｊ＿ｋ＿ｉ」「Ｂ＿ｉ＿ｊ」に置換し、結果変数「ｓｕｍ」に代入するコード２１０４を生成する（ステップ２００４）。
【０２５０】
ＣＰＵ１０１は、結果変数登録表３０２のエントリー数が１であるため（ステップ２００５の結果が「Ｎｏ」、Ｋｅｙに結果変数登録表３０２の添字式を設定し、Ｖａｌｕｅに結果変数「ｓｕｍ」を設定して出力するコード２１０５を生成する（ステップ２００６）。すわなち、Ｋｅｙに最終的に足しこみを行う添字、Ｖａｌｕｅに１イタレーションの結果を設定して出力するコードを生成する。
【０２５１】
以上が、１回目のＭａｐＲｅｄｕｃｅ処理のコードを生成する手順の説明である。なお、ＭａｐＲｅｄｕｃｅ処理が１回のみ実行される場合であっても、ＭａｐＲｅｄｕｃｅ処理が２回実行される場合であってもここまでの処理は同様に処理される。２回目のＭａｐＲｅｄｕｃｅ処理が不要な場合には、この段階で対象のループ処理の結果を取得することができる。
【０２５２】
続いて、２回目のＭａｐＲｅｄｕｃｅ処理のコードを生成する手順について説明する。
【０２５３】
本発明の第１の実施の形態では、２回目のＭａｐ処理（Ｍａｐ２処理）は、１回目のＲｅｄｕｃｅ処理で出力された（Ｋｅｙ，Ｖａｌｕｅ）を入力とし、そのまま出力するコードが生成される。Ｍａｐ２コード生成処理１６０８では、入力されたコードをそのまま出力すればよく、例えば、あらかじめ用意されたテンプレートを出力すればよいため、コード生成する手順については省略する。図２２にＭａｐ２処理のコード（Ｍａｐ２コード）の一例を示す。
【０２５４】
図２２は、本発明の第１の実施の形態のＭａｐ２コードの一例を示す図である。
【０２５５】
Ｍａｐ２コードには、ｍａｐメソッドのみが含まれる。ｍａｐ２コードにおけるｍａｐメソッドの引数は、ｍａｐ１コードにおけるｍａｐメソッドと同様に、第一引数は入力側のＫｅｙ「ｉ」、第二引数は入力値「ｓｕｍ」、第三引数は出力データ「ｏｕｔｐｕｔ」である。
【０２５６】
ｍａｐメソッドの処理は、出力変数ｏｕｔｐｕｔに対し、入力側のＫｅｙである第一引数「ｉ」を出力Ｋｅｙとし、入力値「ｓｕｍ」を出力値としてそのまま設定している。Ｈａｄｏｏｐでは、Ｒｅｄｕｃｅ処理を実行する場合には、Ｍａｐ処理を省略することができないため、図２２に示すような処理が定義される。
【０２５７】
続いて、Ｒｅｄｕｃｅ２処理について説明する。Ｒｅｄｕｃｅ２処理では、１回目のＭａｐＲｅｄｕｃｅ処理でイタレーションごとに収集（演算）されたデータを足しこむ処理を実行する。
【０２５８】
具体的には、Ｒｅｄｕｃｅ２処理では、（Ｋｅｙ：結果変数登録表の添字式，Ｖａｌｕｅ：ｌｉｓｔ（Ｒｅｄｕｃｅ１処理によって演算された１イタレーションごとの結果）が入力され、（Ｋｅｙ：結果変数登録表の添字式，Ｖａｌｕｅ：足しこみ結果）を出力するコードを生成する。すなわち、添字ごとにＲｅｄｕｃｅ１処理によって出力された１イタレーションごとの演算結果の足しこみを行い、（結果変数の添字式，足しこみ結果）の形式で処理結果を出力するコードを生成する。結果変数登録表３０２に複数のエントリーがある場合には、添字式に加えて変数名の情報も含むＫｅｙを生成する。
【０２５９】
以下、図２３にＲｅｄｕｃｅ処理（Ｒｅｄｕｃｅ２処理）を生成するための手順を示し、図２４にＲｅｄｕｃｅ２処理によって生成されたＲｅｄｕｃｅ２コードの具体例について説明する。
【０２６０】
図２３は、本発明の第１の実施の形態のＲｅｄｕｃｅ２コード生成処理１６０９の手順を示すフローチャートである。
【０２６１】
ＣＰＵ１０１は、まず、Ｒｅｄｕｃｅ２処理の引数として入力されたリスト形式の入力値から、リストに含まれる各値をループ処理などによって取得し、取得された値の足しこみを行うためのコードを生成する（ステップ２３０１）。
【０２６２】
次に、ＣＰＵ１０１は、ｒｅｄｕｃｅメソッドの引数である入力側のＫｅｙの値を、出力結果のＫｅｙとして設定し、Ｖａｌｕｅに足しこみ結果を設定して出力するコードを生成する（ステップ２３０２）。なお、Ｋｅｙは、結果変数登録表３０２の添字式、又は結果変数登録表３０２の変数名に「＿」及び添字式を付加したものである。前者の場合には添字ごとに、後者の場合には変数名及び添字の組み合わせごとにリスト形式の入力値に格納された値の足しこみが行われる。
【０２６３】
図２４は、本発明の第１の実施の形態のＲｅｄｕｃｅ２コード生成処理１６０９によって生成されたＲｅｄｕｃｅ２コードの一例を示す図である。
【０２６４】
ここでは、図７のループ処理７００に対し、図２３に示したフローチャートの手順を適用して、Ｒｅｄｕｃｅ２コードを生成する過程を説明する。
【０２６５】
Ｒｅｄｕｃｅ１コードには、ｒｅｄｕｃｅメソッドが含まれる。ｒｅｄｕｃｅメソッドの引数について説明すると、ｒｅｄｕｃｅメソッドの第一引数は各イタレーションを識別するインデックス（ｋｅｙ）「ｉ」、第二引数はＭａｐＲｅｄｕｃｅ処理１による結果が格納されたリスト形式の入力値「ｖａｌｕｅ」、第三引数は出力データ「ｏｕｔｐｕｔ」である。
【０２６６】
まず、ＣＰＵ１０１は、入力されたリスト形式の入力値「ｖａｌｕｅ」から値を取り出し、足しこみを行うコード２４０１を生成する（ステップ２３０１）。
【０２６７】
次に、ＣＰＵ１０１は、Ｋｅｙにｒｅｄｕｃｅメソッドの引数であるインデックス「ｉ」、Ｖａｌｕｅに足しこみ結果を設定して出力するコード２４０２を生成する（ステップ２３０２）。図７に示したループ処理では、入力側のＫｅｙには結果変数登録表３０２の「添字式」が設定されている。
【０２６８】
以上示した各手順を実行することによって、所定の条件を満たすループ処理を実行するプログラムを、分散並列処理に適したＭａｐＲｅｄｕｃｅ処理を実行するプログラムに変換することができる。
【０２６９】
本発明の第１の実施の形態によれば、そのままでは複数の計算機で分散並列処理を実行することが困難なループ処理をソースコードから抽出し、分散並列処理に適したＭａｐＲｅｄｕｃｅ処理に変換することができる。したがって、多重ループのようなボトルネックになりやすい処理を複数の計算機資源を用いて分散して処理することによって、業務を効率的に行うことが可能となる。
【０２７０】
また、本発明の第１の実施の形態によれば、ソースプログラムを入力すると、所定の条件に適合するループ処理を抽出し、自動的にＭａｐＲｅｄｕｃｅ処理に変換することが可能となる。したがって、特別な言語でソースプログラムを記述し直すなどの手間を必要とせずに、容易に分散並列処理に適したプログラムに既存のプログラムを変換することが可能となる。
【０２７１】
なお、本発明の第１の実施の形態によって生成されたプログラムを、複数の計算機上で並列処理する場合だけでなく、例えば、複数のコアを備えたマルチコアプロセッサが搭載された計算機上で実行させることによって並列処理を実行することが可能となり、処理性能を向上させることができる。
【０２７２】
また、本発明の第１の実施の形態では、Ｊａｖａ言語によって記述されたプログラムを対象としているが、本発明は開発言語及び実行基盤を限定せずに適用することが可能である。
【０２７３】
以上のように、本発明の第１の実施の形態によれば、既存のプログラム（第１プログラム）に含まれるループ処理を、データにキーを付与した中間データを生成する処理（第３プログラム、Ｍａｐ処理）及びキーごとに中間データを集約する処理（第４プログラム、Ｒｅｄｕｃｅ処理）に変換することによって、並列処理に適したプログラム（第２プログラム）を生成することができる。したがって、既存言語で記述されたプログラムに基づいて分散並列処理を実行可能なプログラムを生成することが可能になるため、システムの開発効率を向上させることができる。
【０２７４】
（第２の実施の形態）
本発明の第１の実施の形態では、１回目のＭａｐ処理において、配列の１要素分のデータを入力データとし、当該データを使用するイタレーションとオペランドの情報を付与し、１回目のＲｅｄｕｃｅ処理において１イタレーション分の演算を行うコードを生成する手順について説明した。
【０２７５】
第２の実施の形態では、ループ処理に含まれるループ実行文で配列を連続アクセスする場合、すなわち、ループ実行文でアクセスされる配列変数の添字が同じ場合に、配列の複数要素をベクトルとして扱う。この場合、Ｍａｐ処理で入力されたベクトルデータに対してＫｅｙ及びオペランド識別子を付与し、Ｒｅｄｕｃｅ処理でＫｅｙごとに複数イタレーションを実行することが可能となる。
【０２７６】
以下、ループ実行文において配列に連続アクセスする場合について説明する。なお、第１の実施の形態と共通の構成については説明を省略し、相違する構成についてのみ説明する。
【０２７７】
図２５は、本発明の第２の実施の形態のＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理２５００の一例を示す図である。
【０２７８】
図２５に示したループ処理２５００は、ループ実行文において配列に連続アクセスする例であり、２種類の配列ａ、ｂの各要素の積の総和を計算するループ処理である。
【０２７９】
Ｍａｐ１処理については、ステップ１８０６の処理を除いて第１の実施の形態のＭａｐ１コードを生成する手順（図１８）と同じである。ステップ１８０６の処理では、Ｖａｌｕｅのデータがベクトルデータとなる。
【０２８０】
第１の実施の形態では、Ｒｅｄｕｃｅ１コード生成処理１６０７のステップ２００４の処理において、１イタレーションの演算結果を結果変数に代入するコードを生成していたが、第２の実施の形態では、データがベクトルであるため、複数のイタレーションを実行するために足しこみ演算子を利用する。図２５に示すループ処理では、「＋＝」を利用している。すなわち、データのベクトル化が可能な場合には、Ｒｅｄｕｃｅ１処理で、Ｋｅｙごとに部分和を計算するコードを生成する。
【０２８１】
以下、図２６にＭａｐ１コード、図２７にＲｅｄｕｃｅ１コードの例を示し、第２の実施の形態について説明する。
【０２８２】
図２６は、本発明の第２の実施の形態のＭａｐ１コードの一例を示す図である。
【０２８３】
図２６に示すＭａｐ１コードでは、１つのＫｅｙに対して、ベクトル型のデータをＶａｌｕｅとしてｍａｐメソッドに入力するため、ｍａｐメソッドの第二引数の型はベクトル型の「ＶｅｃＤａｔａ」となっている。
【０２８４】
また、図１９に示した第１の実施の形態と同様に、配列名に対応するファイル名ごとに条件ブロック（ブロック２６０１及びブロック２６０４）を生成し、それぞれオペランド識別子を割り当てる。
【０２８５】
コード２６０２及びコード２６０５を生成する処理は、図１８に示したステップ１８０４の処理に対応し、データのインデックスを配列の添字式に変換している。なお、１次元配列の演算の場合には、ｍａｐメソッドの入力側のＫｅｙ（インデックス）をそのままｍａｐメソッドで入力されたＫｅｙを出力とすればよいため、コード２６０２及びコード２６０５を省略することができる。
【０２８６】
コード２６０３では、Ｋｅｙに「Ｊ１」、Ｖａｌｕｅに「＜ＩＤ１，ｄａｔａ＞」を設定して出力しているが、「ｄａｔａ」はｍａｐメソッドの第二引数で型がベクトル型に設定されているため、ベクトルデータに対してオペランド識別子「ＩＤ１」を付与したことになる。コード２６０６についても、ベクトルデータに対してオペランド識別子「ＩＤ２」が付与されている。
【０２８７】
図２７は、本発明の第２の実施の形態のＲｅｄｕｃｅ１コードの一例を示す図である。
【０２８８】
図２７に示すＲｅｄｕｃｅ１コードでは、第１の実施の形態（図２１）と同様に、コード２７０１に結果変数を定義し、コード２７０２及びコード２７０３にオペランド変数を定義する。
【０２８９】
第２の実施の形態では、配列ａ、ｂのデータをそれぞれベクトルとして扱っているので、２種類Ｖｅｃｔｏｒクラスのオブジェクト「ＶｅｃＡ」、「ＶｅｃＢ」が定義される。
【０２９０】
コード２７０４は、図２０のステップ２００３の処理に対応し、オペランド識別子が「ＩＤ１」の場合にはベクトルデータを「ＶｅｃＡ」に設定し、オペランド識別子が「ＩＤ２」の場合にはベクトルデータを「ＶｅｃＢ」に設定する。
【０２９１】
コード２７０５は、図２０のステップ２００４の処理に対応し、ＶｅｃＡ、ＶｅｃＢに格納されたデータをそれぞれ取得し、取得されたデータに対してイタレーションごとの演算を実行し、結果変数に値を足しこむ。
【０２９２】
コード２７０６は、図２０のステップ２００６の処理に対応し、Ｋｅｙに結果変数登録表３０２の添字式（図２５の例では結果変数がスカラーであるため添字式は定数「１」となっている）、Ｖａｌｕｅに部分和を設定して出力する。
【０２９３】
本発明の第２の実施の形態によれば、データをベクトル化してＫｅｙを付与することによって、Ｒｅｄｕｃｅ１処理でＫｅｙごとに収集したベクトルのリストを利用して部分和を計算するコードを生成することが可能となる。したがって、Ｍａｐ処理で１データごとにＫｅｙを設定する第１の実施の形態と比較し、Ｍａｐ処理後のキーの数を減らすことが可能となり、Ｒｅｄｕｃｅ処理前にキーが等しいデータを収集する過程で生じる通信オーバーヘッドを削減することができる。
【０２９４】
（第３の実施の形態）
本発明の第３の実施の形態では、データを格納するファイルを分割し、分割されたファイルごとに処理を行う分散バッチ処理モデルを適用したプログラムを生成する例について説明する。第１の実施の形態ではＭａｐＲｅｄｕｃｅモデルを適用したプログラム（第３プログラム、第４プログラム）を作成していたが、第３の実施の形態では分散バッチ処理モデルを適用したプログラム（第４プログラムに対応）を作成する。
【０２９５】
第１の実施の形態と第３の実施の形態では、データを集約する方法に違いがあるが、ソースプログラムからループ処理を抽出して解析した後、プログラムを生成するといった基本的な流れは同じである。したがって、第１の実施の形態における図１、図２、図４、図６については、ＭａｐＲｅｄｕｃｅ関連処理を分散バッチ処理に変更することによって、第３の実施の形態に適用することが可能である。また、図７、図８、図９についても同様に適用可能である。第３の実施の形態では、第１の実施の形態と共通して適用可能な図面については、説明を省略する。
【０２９６】
最初に、第３の実施の形態で生成されるプログラムによって実行される分散バッチ処理の流れについて説明する。
【０２９７】
第３の実施の形態では、まず、ループ実行文の配列参照形式を解析し、ファイルに格納されているデータがループ処理におけるアクセス順序と一致するか否かを判定する。そして、ループ処理におけるデータのアクセス順序がファイルの格納順序に一致しない場合には、アクセス順序に対応するようにデータを並べ替えたファイルを作成する。その後、実行基盤によって、ファイルを分割する。
【０２９８】
このとき、ファイルには使用する順にデータが並んで格納されているため、ループ実行中にはシーケンシャルにファイルをアクセスすることが可能となる。したがって、データを格納するファイルを分割して分割ファイルを作成することによって、分割ファイルごとにループ実行文を並列して処理することが可能となる。すなわち、複数の計算機にそれぞれ分割ファイルを配布し、各計算機でループ実行文を処理することが可能となる。
【０２９９】
また、配列の次元が異なる場合、ループ処理で複数回参照するデータを格納しているファイルにアクセスする場合には、当該ファイルをマスターファイルとして設定し、各分割ファイルから参照できるようにする。
【０３００】
以下、本発明の第３の実施の形態における並列処理プログラム生成方法について説明する。
【０３０１】
図２８Ａは、本発明の第３の実施の形態のデータを格納するファイル形式の一例を示す図である。
【０３０２】
データを格納するファイルのファイル２８０１は、フィールドとして、次元数分存在する各配列次元の添字２８０２、２８０３、...、及び添字に対応するデータ２８０４を含む。添字を表すフィールド（２８０２、２８０３）は、右側のフィールドほど高次元（連続次元）とする。以下、一次元目添字のフィールドを［１］、二次元目添字のフィールドを［２］のように表す。
【０３０３】
図２８Ｂに示すファイル２８０５は、３次元配列ａに設定されるデータを格納するファイルの一例である。例えば、配列ａ［１，１，２］に格納されるデータは、１次元目添字［１］２８０６に「１」、２次元目添字［２］２８０７に「１」、３次元目添字［３］２８０８に「２」が設定され、データ２８０９には「ａ［１，１，２］の要素」、すなわち、実際に格納されるデータが格納される。
【０３０４】
また、図２８Ｃに示すファイル２８１０は、２次元配列ｂに設定されるデータを格納するファイルの一例である。なお、図２８Ａに示したファイル形式は一例であり、添字とデータとの関係が判別可能であれば他の形式でもよい。
【０３０５】
図２９Ａ及び図２９Ｂは、本発明の第３の実施の形態における並列処理プログラムによる処理の流れを説明する図である。なお、図２９Ａ及び図２９Ｂでは、図７に示した第１の実施の形態のループ処理７００を用いて説明する。
【０３０６】
前述のように、ループ処理７００では、ａ及びｂの２種類のデータが処理される。配列参照形式ａ［Ｉ１，Ｉ２，Ｉ３］（７０１）及び配列参照形式ｂ［Ｉ１，Ｉ２］（７０３）については、ファイルに格納されている順序（シーケンシャル）でデータにアクセスする。一方、配列参照形式ａ［Ｉ２，Ｉ３，Ｉ１］（７０２）については、ファイルに格納されている順序ではなく、ファイル内でデータのアクセス位置が前後し、シーケンシャルにはならない。
【０３０７】
そこで、第３の実施の形態では、配列参照形式ａ［Ｉ２，Ｉ３，Ｉ１］（７０２）に対応してファイルａ（２９０２）に格納されたデータをソートし、ファイルａ'（２９０５）を作成する前処理を実行する。具体的には、優先度を［３］、［１］、［２］の順でソートし（２９０４）、この結果、配列参照形式ａ［Ｉ２，Ｉ３，Ｉ１］（７０２）についてのデータのアクセス順序がファイル内のデータの格納順序になる。なお、ソートの優先順位決定方法については、図４０及び図４２にて後述する。
【０３０８】
ファイルａをソートし、ファイルａ'を作成すると、ファイルａ、ａ'、ｂのデータをそれぞれ順次読み出すことによって、ループ１回分の計算（ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］）を実行することができる。次のループを実行する場合には、各ファイルにおいて読み出されたデータの次の格納位置（又は同じ位置）のデータを読み出して処理すればよい。
【０３０９】
さらに、ファイルａに新たなフィールド２９０６を追加し、ループ処理の結果を一時的に書き込む。ループ処理７００では、Ｉ１が等しい結果の足し込み（集約）を行っているため、制御変数Ｉ１が対応しているａのフィールド［１］について、足し込みを行う。なお、ループ処理の結果を書き込むファイル及びファイルの形式については一例であり、図２９Ｂに示した形式に限定されない。
【０３１０】
図２９Ａ及び図２９Ｂで説明した処理の流れのうち分散処理部分について、図３０を参照しながら説明する。図３０は、本発明の第３の実施の形態における並列処理プログラムによる処理において分散処理部分の詳細を説明する図である。なお、図３０では、ファイルに格納されたデータのソートが終了し、実行基盤によってファイルが分割済の状態とする。
【０３１１】
ファイルａ及びファイルａ'は、分散処理を実行するジョブに対応するように分割される。ファイル３００１及びファイル３００３は、ともにファイルａを分割した分割ファイルである。同様に、ファイル３００２及びファイル３００４は、ともにファイルａ'を分割した分割ファイルである。各ジョブは、対応する分割ファイルの先頭からデータを順次取得し、ループ実行文を処理する。
【０３１２】
ファイル３００５は、マスターファイルとしたファイルｂである。ファイルｂのサイズはファイルａ及びファイルａ'よりも小さく、また、次元も異なるために１つのデータが複数回利用されるため、各ジョブで共通してアクセスされるマスターファイルとしている。詳細については図４１、図４３及び図４４で説明する。
【０３１３】
Ｊｏｂ１（３００８）及びＪｏｂ２（３００９）は、並列して処理されるプロセスを示している。Ｊｏｂ１はファイルａの先頭部分（［１］＝０、［２］＝０、［３］＝０）に格納されたデータを処理する。一方、Ｊｏｂ２は配列ａの添字［１］が１、［２］が２、［３］が３のデータを含むデータを処理する。なお、ファイルａでは、［１］はＩ１、［２］はＩ２、［３］はＩ３に対応する。
【０３１４】
図３０を参照すると、Ｊｏｂ１（３００８）は、ファイルａの分割ファイル３００１の先頭の［１］［２］が（０，０）であるため、マスターファイルであるファイルｂ（３００５）の［１］［２］が（０，０）であるデータを参照する。また、ファイルａ'の分割ファイル３００２についても添字の優先度を［３］、［１］、［２］としてソート済であり、マスターファイルもソート済であるため、いずれのファイルも格納順にアクセスすればよい。ただし、ファイル３００１の［１］［２］のように同じ値が連続する場合には、［１］又は［２］の値に変更があった時点でマスターファイルにおける次の値にアクセスする。マスターファイルのアクセス方法については図３７及び図３８で説明する。
【０３１５】
また、Ｊｏｂ２についても同様に、ファイルａの分割ファイル３００３で［１］［２］が（１，２）であるデータとマスターファイルであるファイルｂ（３００５）の［１］［２］が（１，２）であるデータにアクセスする。ファイルａの分割ファイル３００３とファイルａ'の分割ファイル３００４とをそれぞれファイルの先頭からデータを読み出すことで、ループ実行文を１回分処理するために必要なデータの組合せを取得することが可能となる。
【０３１６】
以上のように、各ジョブで分割ファイル及びマスターファイルから取得した各データを利用してループ実行文ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］を処理する。処理結果は、フィールド数が最大の分割ファイル（ジョブ１の場合は分割ファイル３００１、ジョブ２の場合は分割ファイル３００３）に新たなフィールドを追加し（（ジョブ１の場合はフィールド３００６、ジョブ２の場合はフィールド３００７）、当該追加されたフィールドに格納される。処理結果は、各ジョブにおいて、対応する分割ファイルごとに書き込まれる。
【０３１７】
続いて、上記した並列分散処理を実現させるためのプログラムの作成手順について説明する。
【０３１８】
図３１は、本発明の第３の実施の形態の分散バッチ処理情報３１０１の構成を示す図である。分散バッチ処理情報３１０１は、第１の実施の形態におけるＭａｐＲｅｄｕｃｅ情報１１２（図１）に相当する。また、第１の実施の形態におけるＭａｐＲｅｄｕｃｅ解析部２０２（図２）に相当する機能として、第３の実施の形態では、分散バッチ処理解析部が備えられている。分散バッチ処理解析部は、分散バッチ処理を行うためのプログラムを作成するために必要な情報を分散バッチ処理情報３１０１に登録する。
【０３１９】
分散バッチ処理情報３１０１は、結果変数登録表３１０２、配列添字＿制御変数対応表３１０３、ファイル対応表３１０４、ソート表３１０５及びマスターファイルマッチング表３１０６を含む。また、結果変数登録表３１０２、配列添字＿制御変数対応表３１０３、ファイル対応表３１０４、ソート表３１０５及びマスターファイルマッチング表３１０６は、構文解析部２０１によって抽出されたループ処理ごとに生成される。
【０３２０】
以下、分散バッチ処理情報３１０１及び分散バッチ処理情報３１０１を生成する分散バッチ処理解析部について図３２から図４４を参照しながら説明する。分散バッチ処理解析処理は、第１の実施の形態におけるＭａｐＲｅｄｕｃｅ解析処理（図４のステップ４０４）に相当する処理である。
【０３２１】
図３２は、本発明の第３の実施の形態の分散バッチ処理解析部による分散バッチ処理解析処理の手順を示すフローチャートである。
【０３２２】
ＣＰＵ１０１は、分散バッチ処理解析処理を開始すると、まず、結果変数登録表生成処理を実行する（３２０１）。結果変数登録表３１０２には、ループ内で演算される結果が格納される変数の情報が格納される。結果変数登録表３１０２の詳細については図３３にて説明し、さらに、ステップ３２０１の結果変数登録表３１０２を生成する手順については、図３９にて説明する。
【０３２３】
また、結果変数登録表生成処理３２０１では、後述するように、配列添字＿制御変数対応表３１０３及びファイル対応表３１０４をさらに作成する。また、ファイル対応表３１０４を作成する際に、ソート表３１０５及びマスターファイルマッチング表３１０６を作成する。
【０３２４】
配列添字＿制御変数対応表３１０３には、制御変数が制御している配列参照形式の次元に関する情報が格納される。配列添字＿制御変数対応表３１０３の詳細については図３４にて説明し、さらに、配列添字＿制御変数対応表３１０３を生成する手順については、図４０にて説明する。
【０３２５】
ファイル対応表３１０４には、配列要素がいずれのファイルに格納されているか、当該ファイルはソートが必要か、分割ファイルとするべきかマスターファイルとするべきかを示す情報が格納される。ファイル対応表３１０４の詳細については図３５にて説明し、さらに、ファイル対応表３１０４を生成する手順については、図４１にて説明する。
【０３２６】
ソート表３１０５には、ソートが必要なファイルに対応するレコードのみが格納され、ソートキーの情報が格納される。ソートが不要なファイルについてはレコードが格納されない。ソート表３１０５の詳細については図３６にて説明し、さらに、ソート表３１０５を生成する手順については、図４２にて説明する。
【０３２７】
ＣＰＵ１０１は、結果変数登録表生成処理の実行後、マスターファイルマッチング表３１０６の各フィールドにデータを設定するマスターファイルマッチング表対応フィールド部生成処理を実行する（３２０２）。
【０３２８】
マスターファイルマッチング表３１０６には、マスターファイルとして配置されるファイルに対応するレコードのみが格納され、分割ファイルとのマッチング情報及びマスターファイルの読み方の情報が格納される。マスターファイルマッチング表３１０６の詳細については図３７、図３８にて説明し、さらに、マスターファイルマッチング表３１０６を生成する手順については、図４３及び図４４にて説明する。マスターファイルマッチング表３１０６は、ファイル対応表作成時に生成されるが、マスターファイルマッチング表対応フィールド部生成処理３２０２の実行時にマスターファイルマッチング表３１０６の設定が完了する。
【０３２９】
以下、各構成について、図３３から図４４を参照しながら説明する。
【０３３０】
図３３は、本発明の第３の実施の形態の結果変数登録表３１０２の一例を示す図である。
【０３３１】
結果変数登録表３１０２は、ループ実行文において計算結果を代入している変数（結果変数）と演算の種類などを表す情報を登録する。本発明の第３の実施の形態では、ループ実行文において集約（足しこみ演算）がなされるか否かに基づいて分散処理後のデータに対して集約を行うか否かを決定する（図４５のステップ４５０８）。また、集約の有無によらず、１イタレーションの結果を格納するべきファイルを決定する際、結果変数登録表３１０２を参照する（図４６のステップ４６０４）。
【０３３２】
結果変数登録表３１０２は、変数名３３０１、添字式３３０２、集約３３０３、実行文番号３３０４、元ファイルＩＤ３３０５、ファイルＩＤ３３０６及び集約フィールド３３０７を含む。
【０３３３】
変数名３３０１は、ループ実行文において、演算結果を代入する結果変数の変数名である。変数名３３０１は、分散バッチ処理の１イタレーションの結果を代入する変数を設定するためなどに使用される（図４６のステップ４６０１）。
【０３３４】
添字式３３０２は、結果変数が配列変数の場合には配列変数の添字が登録される。
【０３３５】
集約３３０３は、ループ実行文が集約（足しこみ）型であれば「ＴＲＵＥ」、集約型でなければ「ＦＡＬＳＥ」を登録する。
【０３３６】
例えば、ループ処理７００では、ループ実行文が集約（足しこみ）型であるため、集約３３０３には「ＴＲＵＥ」が設定される。また、集約結果を代入する変数が「ｓｕｍ［ｉ］」となっているため、「ｓｕｍ」が変数名３３０１に登録され、「Ｉ１」が添字式３３０２に登録される。なお、集約は、加算（足しこみ）だけでなく、減算又は乗算などであってもよい。
【０３３７】
実行文番号３３０４は、ループ実行文が複数存在する場合に、各ループ実行文を識別するための番号である。具体的には、複数のループ実行文のうち何番目の処理対象であるかを実行文番号３３０４に登録する。マスターファイルを使用する場合に、分割ファイルとマスターファイルとを対応づけるために使用する。ただし、ループ実行文が１つのみの場合は実行文番号３３０４の情報を使用せずに、マスターファイルとの対応をとることが可能である。
【０３３８】
元ファイルＩＤ３３０５は、１イタレーションの結果を格納するファイル名を登録する。
【０３３９】
ファイルＩＤ３３０６は、集約を行った結果を格納するファイル名を登録する。集約を行わない場合は、元ファイルＩＤ３３０５と同じファイル名を登録する。
【０３４０】
図３９は、本発明の第３の実施の形態の結果変数登録表３１０２を生成するための結果変数登録表生成処理３２０１の手順を示すフローチャートである。
【０３４１】
前述のように、結果変数登録表３１０２を生成する過程で（ステップ３９０４からステップ３９１１及びステップ３９１４からステップ３９１９）、配列添字＿制御変数対応表３１０３（ステップ３９１２）、ファイル対応表３１０４（ステップ３９１３）を生成する。配列添字＿制御変数対応表３１０３及びファイル対応表３１０４の詳細と生成手順については図３４、図３５及び図４０、図４１にて説明する。
【０３４２】
以下、結果変数登録表生成処理３２０１の手順について図３９を参照しながら説明する。
【０３４３】
ＣＰＵ１０１は、結果変数登録表生成処理３２０１を開始すると、まず、処理中のループ実行文を識別するための変数ｉに０を設定する（ステップ３９０１）。
【０３４４】
ＣＰＵ１０１は、未処理のループ実行文が存在するか否かを判定する（ステップ３９０２）。未処理のループ実行文が存在しない場合、すなわち、すべてのループ実行文について、ステップ３９０３以降の処理を実行した場合には（ステップ３９０２の結果が「Ｎｏ」）、結果変数登録表生成処理３２０１を終了する。
【０３４５】
ＣＰＵ１０１は、未処理のループ実行文が存在する場合には（ステップ３９０２の結果が「Ｙｅｓ」）、処理対象のループ実行文が代入文であるか否かを判定する（ステップ３９０３）。処理対象のループ実行文が代入文でない場合には（ステップ３９０３の結果が「Ｎｏ」）、分散バッチ処理に変換する対象ではないため、以降の処理をスキップし、ステップ３９０２の処理に戻る。
【０３４６】
ＣＰＵ１０１は、処理対象のループ実行文が代入文である場合には（ステップ３９０３の結果が「Ｙｅｓ」）、変数ｉの値を１加算（インクリメント）し、結果変数登録表３１０２の実行文番号３３０４にｉを登録する（ステップ３９０４）。
【０３４７】
ＣＰＵ１０１は、代入文の左辺変数の変数名を結果変数登録表３１０２の変数名３３０１に登録する（ステップ３９０５）。
【０３４８】
ＣＰＵ１０１は、左辺変数がスカラー値であるか否かを判定する（ステップ３９０６）。左辺変数がスカラー値でない場合、すなわち、左辺変数が配列変数の場合には（ステップ３９０６の結果が「Ｎｏ」）、結果変数登録表３１０２の添字式３３０２に配列変数の添字を登録する（ステップ３９０７）。左辺変数がスカラー値の場合には（ステップ３９０６の結果が「Ｙｅｓ」）、結果変数登録表３１０２の添字式３３０２に「ＮＵＬＬ」を登録する（ステップ３９０８）。
【０３４９】
ＣＰＵ１０１は、ループ実行文の代入文が集約型か否かを判定する（ステップ３９０９）。集約型でない場合には（ステップ３９０９の結果が「Ｎｏ」）、結果変数登録表３１０２の集約３３０３に「ＦＡＬＳＥ」を登録する（ステップ３９１０）。一方、集約型の場合には（ステップ３９０９の結果が「Ｙｅｓ」）、結果変数登録表３１０２の集約３３０３に「ＴＲＵＥ」を設定する（ステップ３９１１）。
【０３５０】
ＣＰＵ１０１は、代入文の右辺の配列参照形式について、配列添字＿制御変数対応表３１０３を生成する（ステップ３９１２）。
【０３５１】
ＣＰＵ１０１は、代入文の右辺の配列参照形式について、ファイル対応表３１０４を生成する（ステップ３９１３）。
【０３５２】
ＣＰＵ１０１は、ファイル対応表３１０４の実行文番号３５０３がｉのエントリーのうち、配列の次元数が最大のエントリーを選択する。そして、選択されたエントリーのファイルＩＤ３５０５を、結果変数登録表３１０２の元ファイルＩＤ３３０５に登録する（ステップ３９１４）。なお、配列の次元数が最大のエントリーはファイル対応表３１０４の配列名３５０１及び配列表１１１に基づいて取得することができる。
【０３５３】
ＣＰＵ１０１は、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」であるか否かを判定する（ステップ３９１５）。集約３３０３が「ＴＲＵＥ」でない場合には（ステップ３９１５の結果が「Ｎｏ」）、結果変数登録表３１０２の元ファイルＩＤ３３０５を結果変数登録表３１０２のファイルＩＤ３３０６に登録する（ステップ３９１６）。さらに、結果変数登録表３１０２の集約フィールド３３０７に「ＮＵＬＬ」を登録する（ステップ３９１７）。
【０３５４】
一方、集約３３０３が「ＴＲＵＥ」の場合には、ＣＰＵ１０１は、新規ファイル名を結果変数登録表３１０２のファイルＩＤ３３０６に登録する（ステップ３９１８）。さらに、ステップ３９１４の処理で選択されたファイル対応表３１０４のファイルＩＤ３５０５の配列参照形式３５０２と等しい配列参照形式３４０１を有するエントリーを配列添字＿制御変数対応表３１０３から取得する。そして、結果変数登録表３１０２の添字式３３０２と等しい制御変数を取得し、取得された制御変数に登録された値（配列の次元）を結果変数登録表３１０２の集約フィールド３３０７に登録する（ステップ３９１９）。
【０３５５】
以上の処理が終了すると、ステップ３９０２の処理に戻り、未処理のループ実行文が存在しなくなるまで本処理を継続する。
【０３５６】
ここで、図７に示したループ処理７００に対し、図３９に示した結果変数登録表生成処理３２０１を適用する場合について説明する。
【０３５７】
ループ処理７００では、前述のように、ループ実行文は「ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となる。
【０３５８】
ＣＰＵ１０１は、結果変数登録表生成処理３２０１を開始すると、まず、変数ｉに０を設定する（ステップ３９０１）。
【０３５９】
ＣＰＵ１０１は、未処理のループ実行文が存在するか否かを判定する（ステップ３９０２）。このとき、未処理のループ実行文が存在するため（ステップ３９０２の結果が「Ｙｅｓ」）、ループ実行文が代入文であるか否かを判定する（ステップ３９０３）。ループ実行文は、ｓｕｍ［Ｉ１］に、ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］を加算して代入する代入文であるため（ステップ３９０３の結果が「Ｙｅｓ」）、ｉを１インクリメントして１とし、結果変数登録表３１０２の実行文番号３３０４に「１」を登録する（ステップ３９０４）。さらに、ＣＰＵ１０１は、結果変数登録表３１０２の変数名３３０１に「ｓｕｍ」を登録する（ステップ３９０５）。
【０３６０】
ＣＰＵ１０１は、結果変数がスカラー値であるか否かを判定する（ステップ３９０６）。結果変数ｓｕｍ［Ｉ１］は、配列変数であり、スカラー値でないため（ステップ３９０６の結果が「Ｎｏ」）、結果変数登録表３１０２の添字式３３０２に「［Ｉ１］」を登録する（ステップ３９０７）。
【０３６１】
ＣＰＵ１０１は、ループ実行文に複合代入演算子「＋＝」が含まれているため（ステップ３９０９の結果が「Ｙｅｓ」）、集約型であると判定し、結果変数登録表３１０２の集約３３０３に「ＴＲＵＥ」を登録する。
【０３６２】
ＣＰＵ１０１は、代入文の右辺「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」に対し、配列添字＿制御変数対応表３１０３を生成する（ステップ３９１２）。ステップ３９１２の処理によって、図３４に示す配列添字＿制御変数対応表３１０３が生成される。
【０３６３】
ＣＰＵ１０１は、代入文の右辺「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」に対し、ファイル対応表３１０４を生成する（ステップ３９１３）。ステップ３９１３の処理によって、図３５のファイル対応表３１０４が生成される。
【０３６４】
ＣＰＵ１０１は、ファイル対応表３１０４の実行文番号３５０３が「１」のエントリーのうち、配列の次元数が最大、かつ、ファイル対応表３１０４のソート３５０６が「ＦＡＬＳＥ」である、代入文右辺のａ［Ｉ１，Ｉ２，Ｉ３］に対応するエントリーのファイルＩＤ３５０５「ＩＤ１」を、結果変数登録表３１０２の元ファイルＩＤ３３０５に登録する（ステップ３９１４）。
【０３６５】
ＣＰＵ１０１は、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」であるか否かを判定する（ステップ３９１５）。結果変数登録表３１０２の集約３３０３には、ステップ３９１１の処理で「ＴＲＵＥ」が登録されているため、新規ファイル名「ＩＤ４」を結果変数登録表３１０２のファイルＩＤ３５０５に登録する（ステップ３９１８）。
【０３６６】
さらに、ＣＰＵ１０１は、ステップ３９１４の処理で選択したファイル対応表３１０４のファイルＩＤ３５０５「ＩＤ１」に対応するファイル対応表３１０４の配列参照形式３５０２「ａ［Ｉ１，Ｉ２，Ｉ３］」のエントリーを、配列添字＿制御変数対応表３１０３から取得し、結果変数登録表３１０２の添字式３３０２「［Ｉ１］」と等しい制御変数「Ｉ１」に登録されている「１」を、結果変数登録表３１０２の集約フィールド３３０７に登録する（ステップ３９１９）。
【０３６７】
そして、ＣＰＵ１０１は、ステップ３９０２の処理に戻り、ループ実行文が存在しないため（ステップ３９０２の結果が「Ｎｏ」）、本処理を終了する。
【０３６８】
以上のように、結果変数登録表３１０２を参照すると、図７に示したループ処理を解析した結果、変数名３３０１の値によって変数「ｓｕｍ」に１イタレーションの演算結果を代入することを把握することが可能となり、元ファイルＩＤ３３０５の値によって１イタレーションの演算結果はファイル名「ＩＤ１」に格納すればよいことがわかる。
【０３６９】
さらに、集約３３０３の値によってループ実行文（代入文）が集約（足しこみ）演算であることを把握することが可能となり、元ファイルＩＤ３３０５の値と集約フィールド３３０７の値によってファイル「ＩＤ１」をフィールド［１］について集約（足しこみ）演算を行えばよいことがわかる。また、ファイルＩＤ３３０６の値から集約の結果は「ＩＤ４」に格納すればよいことがわかる。
【０３７０】
次に、配列添字＿制御変数対応表３１０３について図３４を参照しながら説明し、配列添字＿制御変数対応表３１０３を生成する配列添字＿制御変数対応表生成処理３９１２について図４０を参照しながら説明する。
【０３７１】
図３４は、本発明の第３の実施の形態の配列添字＿制御変数対応表３１０３の一例を示す図である。
【０３７２】
配列添字＿制御変数対応表３１０３は、制御変数が配列参照形式のいずれの次元を制御しているかを示す情報を登録する。配列添字＿制御変数対応表３１０３に格納された情報は、ファイルのソートが必要か否かを判定する処理（図４１のステップ４１１１）、及び、前述した結果変数登録表３１０２の集約フィールド３３０７を決定する処理（図３９のステップ３９１９）で参照される。
【０３７３】
配列添字＿制御変数対応表３１０３は、配列参照形式３４０１及び制御変数（３４０２、３４０３、...）を含む。制御変数についてはループの外側から順にフィールドが生成される。ループ処理７００のように、制御変数が３つある場合は、図３４に示すように制御変数１「Ｉ１」３４０２、制御変数２「Ｉ２」３４０３、制御変数３「Ｉ３」３４０４の３つのフィールドを生成する。
【０３７４】
ループ処理７００に含まれる配列参照形式「ａ［Ｉ２，Ｉ３，Ｉ１］」の場合、「ａ［Ｉ２，Ｉ３，Ｉ１］」が配列添字＿制御変数対応表３１０３の配列参照形式３４０１に登録される。添字Ｉ１は、配列ａの３次元目を制御しているため、添字Ｉ１に対応するフィールド３４０２に「３」を登録する。また、添字Ｉ２は、配列ａの１次元目を制御しているため、添字Ｉ２に対応するフィールド３４０３に「１」を登録する。最後に、添字Ｉ３は、配列ａの２次元目を制御しているため、添字Ｉ３に対応するフィールド３４０４に「２」を登録する。
【０３７５】
図４０は、本発明の第３の実施の形態の配列添字＿制御変数対応表３１０３を生成するための配列添字＿制御変数対応表生成処理３９１２の手順を示すフローチャートである。本処理は、結果変数登録表３１０２に登録された結果変数の右辺コードの各配列参照形式について、添字の次元と制御変数との対応を取得し、配列添字＿制御変数対応表３１０３のエントリーを生成する。
【０３７６】
ＣＰＵ１０１は、配列添字＿制御変数対応表生成処理３９１２を開始すると、まず、変数ｉに１を設定する（ステップ４００１）。変数ｉは、ループ表１１０のエントリーを順に参照するために使用される。
【０３７７】
ＣＰＵ１０１は、未処理の配列参照が存在するか否かを判定する（ステップ４００２）。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には（ステップ４００２の結果が「Ｎｏ」）、配列添字＿制御変数対応表生成処理３９１２を終了する。
【０３７８】
ＣＰＵ１０１は、配列名が結果変数登録表３１０２の変数名３３０１に登録済であって、かつ、集約３３０３の値が「ＴＲＵＥ」であるか否かを判定する（ステップ４００３）。配列名が結果変数登録表３１０２の変数名３３０１に登録済であって、かつ、集約３３０３の値が「ＴＲＵＥ」の場合には（ステップ４００３の結果が「Ｙｅｓ」）、処理対象の配列変数は結果変数と同一であるため、次の変数を処理するためにステップ４００２の処理に戻る。例えば、ループ実行文に複合代入演算子「＋＝」が含まれておらず、右辺コードに結果変数が含まれる場合である。
【０３７９】
ＣＰＵ１０１は、配列名が結果変数登録表３１０２の変数名３３０１に登録済でない、又は、集約３３０３の値が「ＦＡＬＳＥ」の場合には（ステップ４００３の結果が「Ｎｏ」）、同じ配列参照形式が既に登録済みであるか否かを判定する（ステップ４００４Ａ）。
【０３８０】
ＣＰＵ１０１は、同じ配列参照形式が既に登録済みである場合には（ステップ４００４Ａの結果が「Ｙｅｓ」）、次の変数について処理を実行するためにステップ４００２の処理に戻る。
【０３８１】
一方、ＣＰＵ１０１は、同じ配列参照形式が登録済みでない場合には（ステップ４００４Ａの結果が「Ｎｏ」）、配列参照形式を配列添字＿制御変数対応表３１０３の配列参照形式３４０１に登録し（ステップ４００４Ｂ）、ループ表１１０のループ番号８０１が変数ｉの値と一致するエントリーを取得する（ステップ４００５）。
【０３８２】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が変数ｉの値と一致するエントリーの制御変数８０２、すなわち、制御変数Ｉiによって制御される配列参照形式の次元が存在するか否かを判定する（ステップ４００６）。
【０３８３】
ＣＰＵ１０１は、制御変数Ｉiによって制御される配列参照形式の次元が存在する場合には（ステップ４００６の結果が「Ｙｅｓ」）、配列添字＿制御変数対応表３１０３の制御変数Ｉiに対応するフィールド（３４０２、３４０３、...）に、制御変数８０２によって制御される次元を登録する（ステップ４００７）。
【０３８４】
一方、ＣＰＵ１０１は、制御変数Ｉiによって制御される配列参照形式の次元が存在しない場合には（ステップ４００６の結果が「Ｎｏ」）、配列添字＿制御変数対応表３１０３の制御変数Ｉiに対応するフィールド（３４０２、３４０３、...）に、「ＮＵＬＬ」を登録する（ステップ４００８）。
【０３８５】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が変数ｉの値と一致するエントリーの子ループ８０６を参照し、子ループが存在するか否かを判定する（ステップ４００９）。変数ｉの値に対応するループに子ループが存在する場合には（ステップ４００９の結果が「Ｙｅｓ」）、変数ｉを１インクリメント（加算）する（ステップ４０１０）。さらに、ステップ４００５の処理に戻り、加算後の変数ｉについて、すなわち、次の制御変数について同様の処理を実行する。
【０３８６】
一方、ＣＰＵ１０１は、変数ｉの値に対応するループに子ループが存在しない場合には（ステップ４００９の結果が「Ｎｏ」）、ステップ４００２の処理に戻り、次の配列参照形式について同様の処理を実行する。そして、未処理の配列参照形式が存在しなくなるまで本処理を継続する。
【０３８７】
ここで、図７に示したループ処理７００に対し、図４０に示した配列添字＿制御変数対応表生成処理３９１２を適用する手順について説明する。
【０３８８】
前述のように、ループ処理７００に含まれるループ実行文は「ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となっている。したがって、処理対象となる右辺コードは、「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となる。
【０３８９】
ＣＰＵ１０１は、配列添字＿制御変数対応表生成処理３９１２を開始すると、変数ｉに１を設定する（ステップ４００１）。さらに、ＣＰＵ１０１は、未処理の配列参照が存在するか否かを判定する（ステップ４００２）。このとき、未処理の配列参照が存在するため（ステップ４００２の結果が「Ｙｅｓ」）、ステップ４００３の処理を実行する。
【０３９０】
ここで、最初に処理対象となる配列参照は「ａ［Ｉ１，Ｉ２，Ｉ３］」である。配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」は、結果変数登録表３１０２に登録されていないため（ステップ４００３の結果が「Ｎｏ」）、当該配列参照が配列添字＿制御変数対応表３１０３に登録済みであるか否かを判定する（ステップ４００４Ａ）。そして、配列添字＿制御変数対応表３１０３にエントリーが登録されていないため（ステップ４００４Ａの結果が「Ｎｏ」）、ループ表１１０のループ番号８０１が「１」のエントリーを取得する（ステップ４００５）。
【０３９１】
ＣＰＵ１０１は、配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」に対し、ステップ４００５の処理で取得したエントリーの制御変数８０２「Ｉ１」によって制御される次元が存在するか否かを判定する（ステップ４００６）。制御変数「Ｉ１」は配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」の１次元目を制御しているため、配列添字＿制御変数対応表３１０３の制御変数「Ｉ１」に対応するフィールド３４０２に「１」を登録する（ステップ４００７）。
【０３９２】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が「１」のエントリーの子ループ８０６に子ループの番号が登録されているか否かを判定する（ステップ４００９）。ループ表１１０のループ番号８０１が「１」のエントリーの子ループ８０６には「２」が登録されているため（ステップ４００９の結果が「Ｙｅｓ」）、変数ｉの値を１インクリメントすることで２に設定し（ステップ４０１０）、ステップ４００５の処理に戻る。
【０３９３】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が「２」のエントリーを取得する（ステップ４００５）。
【０３９４】
ＣＰＵ１０１は、配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」に対し、ステップ４００５の処理で取得したエントリーの制御変数８０２「Ｉ２」によって制御される次元が存在するか否かを判定する（ステップ４００６）。制御変数８０２「Ｉ２」は配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」の２次元目を制御しているため、配列添字＿制御変数対応表３１０３の配列添字＿制御変数対応表３１０３の制御変数「Ｉ２」に対応するフィールド３４０３に「２」を登録する（ステップ４００７）。
【０３９５】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が「２」のエントリーの子ループ８０６に子ループの番号が登録されているか否かを判定する（ステップ４００９）。ループ表１１０のループ番号８０１が「２」のエントリーの子ループ８０６には「３」が登録されているため（ステップ４００９の結果が「Ｙｅｓ」）、変数ｉの値を１インクリメントすることで３に設定し（ステップ４０１０）、ステップ４００５の処理に戻る。
【０３９６】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が「３」のエントリーを取得する（ステップ４００５）。
【０３９７】
ＣＰＵ１０１は、配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」に対し、ステップ４００５の処理で取得したエントリーの制御変数８０２「Ｉ３」によって制御される次元が存在するか否かを判定する（ステップ４００６）。制御変数８０２「Ｉ３」は配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」の３次元目を制御しているため、配列添字＿制御変数対応表３１０３の配列添字＿制御変数対応表３１０３の制御変数「Ｉ３」に対応するフィールド３４０４に「３」を登録する（ステップ４００７）。
【０３９８】
ＣＰＵ１０１は、ループ表１１０のループ番号８０１が「３」のエントリーの子ループ８０６に子ループの番号が登録されているか否かを判定する（ステップ４００９）。ループ表１１０のループ番号８０１が「３」のエントリーの子ループ８０６には子ループの番号が登録されていないため（ステップ４００９の結果が「Ｎｏ」）、ステップ４００２の処理に戻る。
【０３９９】
以降、処理対象である配列参照「ａ［Ｉ２，Ｉ３，Ｉ１］」及び「ｂ［Ｉ１，Ｉ２］」についても同様の処理を実行する。
【０４００】
ａ［Ｉ２，Ｉ３，Ｉ１］については、制御変数Ｉ１が制御している次元は「３」、制御変数Ｉ２が制御している次元は「１」、制御変数Ｉ３が制御している次元は「２」である。したがって、配列添字＿制御変数対応表３１０３の制御変数Ｉ１に対応するフィールド３４０２、制御変数Ｉ２に対応するフィールド３４０３、制御変数Ｉ３に対応するフィールド３４０４にはそれぞれ「３」「１」「２」が登録される。
【０４０１】
一方、配列参照ｂ［Ｉ１，Ｉ２］については、制御変数Ｉ１が制御している次元は「１」、制御変数Ｉ２が制御している次元は「２」、制御変数Ｉ３が制御している次元は存在しない。したがって、配列添字＿制御変数対応表３１０３の制御変数Ｉ１に対応するフィールド３４０２、制御変数Ｉ２に対応するフィールド３４０３、制御変数Ｉ３に対応するフィールド３４０４にはそれぞれ「１」「２」「ＮＵＬＬ」が登録される。
【０４０２】
以上の処理によって設定された配列添字＿制御変数対応表３１０３の情報は、分割ファイルに格納されたデータをソートする必要があるか否かを判定する処理（図４１のステップ４１１１）、マスターファイルを利用する必要があるか否かを判定する処理（図４１のステップ４１１５）で参照される。
【０４０３】
続いて、ファイル対応表３１０４について図３５を参照しながら説明し、ファイル対応表３１０４を生成するファイル対応表生成処理３９１３について図４１を参照しながら説明する。
【０４０４】
ファイル対応表３１０４には、配列要素がいずれのファイルに格納されているか、配列要素が格納されたファイルにソートが必要か否か、配列要素が格納されたファイルを分割ファイルとするべきかマスターファイルとするべきかを示す情報を登録する。
【０４０５】
ファイル対応表３１０４は、配列名３５０１、配列参照形式３５０２、実行文番号３５０３、元ファイルＩＤ３５０４、ファイルＩＤ３５０５、ソート３５０６、及び配置３５０７を含む。
【０４０６】
配列名３５０１は、ループ実行文の右辺コードに含まれる配列変数の変数名である。配列参照形式３５０２は、添字を含む配列変数に対応する。
【０４０７】
実行文番号３５０３は、ループ実行文のうち何番目の処理対象であるかを示す。元ファイルＩＤ３５０４は、配列名３５０１が格納されているファイル名を示す。
【０４０８】
ソート３５０６は、元ファイルＩＤ３５０４のソートが必要か否かを示す。ソートが必要な場合は「ＴＲＵＥ」、ソートが不要な場合は「ＦＡＬＳＥ」である。
【０４０９】
ファイルＩＤ３５０５は、ソート３５０６において値が「ＴＲＵＥ」の場合にはソート後のファイル名が登録され、ソート３５０６において値が「ＦＡＬＳＥ」の場合には元ファイルＩＤ３５０４と同じファイル名が登録される。
【０４１０】
配置３５０７は、ファイルＩＤ３５０５を分割ファイルとする場合には、「分割」、ファイルＩＤ３５０５をマスターファイルとする場合には、「マスター」を登録する。
【０４１１】
上述のファイル対応表３１０４に格納された情報は、分散バッチ処理を実行する前にソートが必要か否かを判定する処理、演算を行うために利用するファイルを取得する処理、マスターファイルとのマッチングが必要か否かを判定する処理を実行する際に参照される。
【０４１２】
図４１は、本発明の第３の実施の形態のファイル対応表３１０４を生成するためのファイル対応表生成処理３９１３の手順を示すフローチャートである。本処理は、結果変数登録表３１０２に登録された結果変数の右辺コードの各項について、ファイル対応表３１０４のエントリーを生成する。
【０４１３】
本処理は、結果変数登録表３１０２に登録された結果変数の右辺コードの各配列参照形式について、ファイルとの対応を登録したファイル対応表３１０４のエントリーを生成する。
【０４１４】
ＣＰＵ１０１は、結果変数登録表生成処理３２０１のステップ３９０４（図３９）の処理で設定した変数ｉの値を取得し、準備する（ステップ４１０１）。変数ｉに格納された値は、結果変数登録表３１０２の実行文番号３３０４に対応する。
【０４１５】
ＣＰＵ１０１は、未処理の配列参照が存在するか否かを判定する（ステップ４１０２）。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には（ステップ４１０２の結果が「Ｎｏ」）、ファイル対応表生成処理３９１３を終了する。
【０４１６】
一方、ＣＰＵ１０１は、未処理の配列参照が存在する場合には（ステップ４１０２の結果が「Ｙｅｓ」）、配列名が結果変数登録表３１０２の変数名３３０１に登録済であって、かつ、集約３３０３の値が「ＴＲＵＥ」であるか否かを判定する（ステップ４１０３）。配列名が結果変数登録表３１０２の変数名３３０１に登録済であって、かつ、集約３３０３の値が「ＴＲＵＥ」の場合には（ステップ４１０３の結果が「Ｙｅｓ」）、次の変数について処理を実行するためにステップ４１０２の処理に戻る。
【０４１７】
一方、ＣＰＵ１０１は、配列名が結果変数登録表３１０２の変数名３３０１に登録済でない、又は、集約３３０３の値が「ＦＡＬＳＥ」の場合には（ステップ４１０３の結果が「Ｎｏ」）、同じ配列参照形式が既に登録済みであるか否かを判定する（ステップ４１０４）。
【０４１８】
ＣＰＵ１０１は、同じ配列参照形式が既に登録済みである場合には（ステップ４１０４の結果が「Ｙｅｓ」）、実行文番号３５０３がステップ４１０１の処理で準備された変数ｉの値と等しいか否かを判定する（ステップ４１０７）。実行文番号３５０３が変数ｉの値と等しい場合には（ステップ４１０７の結果が「Ｙｅｓ」）、ファイルとの対応が既に登録済であるため、ステップ４１０２の処理に戻る。
【０４１９】
一方、ＣＰＵ１０１は、実行文番号３５０３が変数ｉの値と異なる場合には（ステップ４１０７の結果が「Ｎｏ」）、実行文番号３５０３に変数ｉの値を追加する（ステップ４１０８）。
【０４２０】
さらに、ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」であるか否かを判定する（ステップ４１０９）。ファイル対応表３１０４の配置３５０７が「マスター」でない場合には（ステップ４１０９の結果が「Ｎｏ」）、ステップ４１０２の処理に戻る。
【０４２１】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」である場合には（ステップ４１０９の結果が「Ｙｅｓ」）、マスターファイルマッチング表３１０６の実行文番号に変数ｉの値に対応するエントリーを追加する（ステップ４１１０）。これらの処理は、ループ実行文ごとに使用されるファイルを対応させるために実行される。
【０４２２】
一方、ＣＰＵ１０１は、同じ配列参照形式が登録済みでない場合には（ステップ４１０４の結果が「Ｎｏ」）、当該配列参照の「配列名」及び「配列参照形式」をファイル対応表３１０３の配列名３５０１、配列参照形式３５０２にそれぞれ登録し、実行文番号３５０３に変数ｉの値を登録する（ステップ４１０５）。
【０４２３】
ＣＰＵ１０１は、当該配列要素を格納しているファイル名を、ファイル対応表３１０４の元ファイルＩＤ３５０４に登録する（ステップ４１０６）。
【０４２４】
ＣＰＵ１０１は、配列要素を格納しているファイルに格納されているデータをソートする必要があるか否かを判定する（ステップ４１１１）。ここで、ソートの必要があるか否かを判定するためには、前述した配列添字＿制御変数対応表３１０３を参照すればよい。配列添字＿制御変数対応表３１０３のうち、当該配列参照形式のエントリーについて、制御変数がループの内側になるにつれて、登録されている値（次元）が単調に増加している場合には、配列の連続次元を連続的にアクセスすることになるため、ソートは不要と判定することができる。
【０４２５】
ＣＰＵ１０１は、ソートが必要な場合には（ステップ４１１１の結果が「Ｙｅｓ」）、ファイル対応表３１０４のファイルＩＤ３５０５に新規ファイル名を登録し、ソート３５０６に「ＴＲＵＥ」を登録する（ステップ４１１２）。さらに、ＣＰＵ１０１は、ソート表３１０５を生成する（ステップ４１１３）。ソート表生成処理４１１３の詳細については、図４２を参照しながら後述する。
【０４２６】
一方、ＣＰＵ１０１は、ソートが不要な場合には（ステップ４１１１の結果が「Ｎｏ」）、ファイル対応表３１０４の元ファイルＩＤ３５０４をファイルＩＤ３５０５に登録し、ソート３５０６に「ＦＡＬＳＥ」を登録する（ステップ４１１４）。
【０４２７】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、当該配列参照のエントリーの制御変数に対応するフィールドに「ＮＵＬＬ」が設定されているか否かを判定する（ステップ４１１５）。
【０４２８】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、当該配列参照のエントリーの制御変数に対応するフィールドに「ＮＵＬＬ」が設定されている場合には（ステップ４１１５の結果が「Ｙｅｓ」）、ファイル対応表３１０４の配置３５０７に「マスター」を登録する（ステップ４１１６）。さらに、ＣＰＵ１０１は、マスターファイルマッチング表３１０６に新規エントリーを追加する（ステップ４１１７）。
【０４２９】
一方、ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、当該配列参照のエントリーの制御変数に対応するフィールドに「ＮＵＬＬ」が設定されていない場合には（ステップ４１１５の結果が「Ｎｏ」）、ファイル対応表３１０４の配置３５０７に「分割」を登録する（ステップ４１１８）。
【０４３０】
上述したファイル対応表３１０４の配置３５０７の選択では、以下のような判断を行っている。配列添字＿制御変数対応表３１０３において制御変数に対応するフィールドに「ＮＵＬＬ」が設定されている場合は、他の配列よりも配列のサイズが小さく、１つのデータが複数回利用されている。そこで、同じデータを繰り返しアクセスするファイルについては、分割せずにマスターファイルとして配置する。
【０４３１】
その後、ＣＰＵ１０１は、ステップ４１０２を実行し、未処理の配列参照形式が存在しなくなるまで本処理を実行する。
【０４３２】
ここで、図７に示したループ処理７００に対し、図４１に示したファイル対応表生成処理３９１３を適用する手順について説明する。
【０４３３】
ループ処理７００では、前述のように、ループ実行文が「ｓｕｍ［Ｉ１］＋＝ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となっており、処理対象となる右辺コードは、「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」となっている。
【０４３４】
ＣＰＵ１０１は、ファイル対応表生成処理３９１３を開始すると、結果変数登録表生成処理３２０１のステップ３９０４の処理で設定された変数ｉの値（「１」）を取得及び準備する（ステップ４１０１）。
【０４３５】
ＣＰＵ１０１は、未処理の配列参照が存在するため（ステップ４１０２の結果が「Ｙｅｓ」）、ステップ４１０３の処理を実行する。
【０４３６】
最初に処理対象となる配列参照は「ａ［Ｉ１，Ｉ２，Ｉ３］」である。配列参照「ａ［Ｉ１，Ｉ２，Ｉ３］」は、結果変数登録表３１０２に登録されていないため（ステップ４１０３の結果が「Ｎｏ」）、当該配列参照がファイル対応表３１０４に登録済みであるか否かを判定する（ステップ４１０４）。そして、ファイル対応表３１０４に対応するエントリーが登録されていないため（ステップ４１０４の結果が「Ｎｏ」）、ＣＰＵ１０１は、配列名３５０１として「ａ」、配列参照形式３５０２として「ａ［Ｉ１，Ｉ２，Ｉ３］」を登録し、実行文番号３５０３として「１」をファイル対応表３１０４へ登録する（ステップ４１０５）。
【０４３７】
ＣＰＵ１０１は、配列名３５０１「ａ」を格納しているファイル名「ＩＤ１」を元ファイルＩＤ３５０４に登録する（ステップ４１０６）。
【０４３８】
ＣＰＵ１０１は、元ファイルＩＤ３５０４「ＩＤ１」に対してソートが必要であるか否かを判定する（ステップ４１１１）。配列添字＿制御変数対応表３１０３の配列参照形式３４０１が「ａ［Ｉ１，Ｉ２，Ｉ３］」のエントリーを参照すると、制御変数が「Ｉ１→Ｉ２→Ｉ３」と内側のループになるにつれて、エントリーされている値（次元）が「１→２→３」と単調に増加しているため、ソートは不要と判定する（ステップ４１１１の結果が「Ｎｏ」）。
【０４３９】
ＣＰＵ１０１は、ファイル対応表３１０４の元ファイルＩＤ３５０４「ＩＤ１」をファイルＩＤ３５０５に登録し、ソート３５０６に「ＦＡＬＳＥ」を登録する（ステップ４１１４）。
【０４４０】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、配列参照形式がａ［Ｉ１，Ｉ２，Ｉ３］のエントリーの制御変数に対応するフィールドに「ＮＵＬＬ」が設定されていないため（ステップ４１１５の結果が「Ｎｏ」））、ファイル対応表３１０４の配置３５０７に「分割」を登録する（ステップ４１１８）。
【０４４１】
その後、ステップ４１０２の処理に戻り、配列参照ａ［Ｉ２，Ｉ３，Ｉ１］、ｂ［Ｉ１，Ｉ２］についても同様の処理を実行し、図３５に示したファイル対応表３１０４を得ることができる。
【０４４２】
図３５に示したファイル対応表３１０４に基づいて、以下の事項を把握することができる。配列参照形式３５０２「ａ［Ｉ１，Ｉ２，Ｉ３］」ついては、ソート３５０６が「ＦＡＬＳＥ」となっているため、元ファイルＩＤ３５０４に登録されているファイル「ＩＤ１」をソートせずに使用可能である。また、配置３５０７が「分割」となっているため、対応する配列の要素を格納するファイルを分割ファイルとして配置する。
【０４４３】
また、配列参照形式３５０２「ａ［Ｉ２，Ｉ３，Ｉ１］」については、ソート３５０６が「ＴＲＵＥ」、かつ、配置３５０７が「分割」となっているため、元ファイルＩＤ３５０４に登録されたファイル「ＩＤ１」をソート後、ファイルＩＤ３５０５「ＩＤ２」に格納し、分割ファイルとして配置する。
【０４４４】
配列参照形式３５０２「ｂ［Ｉ１，Ｉ２］」については、ソート３５０６が「ＦＡＬＳＥ」となっているため、元ファイルＩＤ３５０４に登録されたファイル「ＩＤ３」をソートせずに使用し、配置３５０７が「マスター」となっているため、マスターファイルとして配置する。
【０４４５】
ファイル対応表３１０４に格納された情報は、コード生成時の演算コード生成処理（図４５のステップ４５０５）において参照される。
【０４４６】
続いて、ソート表３１０５について図３６を参照しながら説明し、ソート表３１０５を生成するソート表生成処理４１１３について図４２を参照しながら説明する。
【０４４７】
ソート表３１０５には、ソートが必要なファイルに対応するエントリーのみが含まれ、ソートキーの優先順序及びソート後のファイル名を登録する。
【０４４８】
ソート表３１０５は、ファイルＩＤ３６０１及びキーが含まれる。キーは、ソートの対象となる制御変数に対応し、図３６に示すソート表３１０５には、第１キー３６０２、第２キー３６０３、第３キー３６０４が含まれる。制御変数の数だけキーに対応するフィールドが生成される。
【０４４９】
ファイルＩＤ３６０１には、ソート後のファイル名が登録される。
【０４５０】
キー（第１キー３６０２、第２キー３６０３、第３キー３６０４）には、ソートキーとするフィールド番号が登録される。ソートキーとしては、第１キー３６０２が最も優先度が高く、第２キー３６０３、第３キー３６０４の順で優先度が高くなる。若い番号が付与されたフィールド名のキーほど優先度が高く設定される。
【０４５１】
図４２は、本発明の第３の実施の形態のソート表３１０５を生成するためのソート表生成処理４１１３の手順を示すフローチャートである。
【０４５２】
なお、ソート表生成処理４１１３は、ファイル対応表３１０４の生成時に、対応するファイルのソートが必要と判定された場合（ステップ４１１１の結果が「Ｙｅｓ」）に実行される。
【０４５３】
ＣＰＵ１０１は、ソート表生成処理４１１３を開始すると、ファイル対応表３１０４を参照し、ファイル対応表生成処理３９１３で処理対象のエントリーに含まれるファイルＩＤ３５０５の値をソート表３１０５のファイルＩＤ３６０１に登録する（ステップ４２０１）。
【０４５４】
ＣＰＵ１０１は、ファイル対応表生成処理３９１３で処理対象のエントリーに含まれる配列参照形式３５０２を配列添字＿制御変数対応表３１０３から取得し、制御変数に対応する値を順にソート表３１０５の各キーに対応するフィールドに登録する（ステップ４２０２）。
【０４５５】
つまり、ソートが必要なファイルが存在する場合には、配列添字＿制御変数対応表３１０３に登録された値の列をそのままソートキーとして利用すればよい。
【０４５６】
ここで、図７に示したループ処理７００に対し、図４２に示したソート表生成処理４１１２を適用する手順について説明する。
【０４５７】
まず、ファイル対応表生成処理３９１３において、右辺コード、「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」のうち、「ａ［Ｉ２，Ｉ３，Ｉ１］」にソートが必要と判定される（ステップ４１１１の結果が「Ｙｅｓ」）。以下、「ａ［Ｉ２，Ｉ３，Ｉ１］」についてソート表３１０５を生成する手順について説明する。
【０４５８】
ＣＰＵ１０１は、ファイル対応表３１０４を参照し、配列参照形式３５０２「ａ［Ｉ２，Ｉ３，Ｉ１］」のファイルＩＤ３５０５「ＩＤ２」を、ソート表３１０５のファイルＩＤ３６０１に登録する（ステップ４２０１）。
【０４５９】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３から配列参照形式３４０１が「ａ［Ｉ２，Ｉ３，Ｉ１］」のエントリーを取得し、制御変数１「Ｉ１」３４０２、制御変数２「Ｉ２」３４０３、制御変数３「Ｉ３」３４０４に登録された「３」「１」「２」を、ソート表３１０５の、第１キー３６０２、第２キー３６０３、第３キー３６０４にそれぞれ登録する（ステップ４２０２）。
【０４６０】
ソート表３１０５及びファイル対応表３１０４によって、「ａ［Ｉ２，Ｉ３，Ｉ１］」にデータを格納するためのファイルは、ファイル「ＩＤ１」をフィールドの優先度が第３、第１、第２の順でソートし、ソート後のファイル名を「ＩＤ２」として格納すればよいことがわかる。
【０４６１】
続いて、マスターファイルマッチング表３１０６について図３７及び図３８を参照しながら説明し、マスターファイルマッチング表３１０６を生成するマスターファイルマッチング表エントリー追加処理（図４１のステップ４１１７）及びマスターファイルマッチング表対応フィールド部生成処理３２０２について、図４３及び図４４を参照しながら説明する。
【０４６２】
マスターファイルマッチング表３１０６には、分割ファイルの先頭位置とマスターファイルの読み出し開始位置との対応が登録される。
【０４６３】
図３７は、本発明の第３の実施の形態のマスターファイルマッチング表３１０６の一例を示す図である。
【０４６４】
マスターファイルマッチング表３１０６は、ファイルＩＤ３７０１、マッチングキー３７０２及び読み方３７０３を含む。
【０４６５】
ファイルＩＤ３７０１には、マスターファイルとして配置されたファイル名が登録される。
【０４６６】
マッチングキー３７０２は、実行文番号３７０４及び対応フィールド３７０５を含む。実行文番号３７０４には処理対象となるループ実行文の番号が登録される。対応フィールド３７０５には、分割ファイルの先頭位置と、マスターファイルの読み出し開始位置との対応が登録される。対応フィールド３７０５は、演算コード生成処理時（図４５のステップ４５０５）に参照される。
【０４６７】
対応フィールド３７０５は、分割３７０６及びマスター３７０７を含む。分割３７０６にはマッチング対象の分割ファイルのフィールドが登録される。また、マスター３７０７には、マッチング対象のマスターファイルのフィールドを登録する。
【０４６８】
図３７に示すマスターファイルマッチング表３１０６では、分割３７０６に「ＩＤ１［１］［２］」、マスター３７０７に「ＩＤ３［１］［２］」が登録されているため、分割ファイル「ＩＤ１」の先頭の第１フィールド及び第２フィールドがマスターファイル「ＩＤ３」の第１フィールド及び第２フィールドに対応していることがわかる。
【０４６９】
読み方３７０３には、分割ファイルの先頭とマスターファイルを対応させた後、マスターファイルに格納されたデータの読み出し方法を示す情報が登録される。
【０４７０】
図３７に示すマスターファイルマッチング表３１０６の読み方３７０３には、「１ｄａｔａ」が登録されているため、最初にマッチングしたマスターファイルの１つのデータを、分割ファイル「ＩＤ１」の第１フィールド又は第２フィールドの値に変化があるまで連続して取得し続けることを表している。
【０４７１】
具体的には、ループ処理７００において、最内側ループ制御変数であるＩ３が変化しても、配列参照形式ｂ［Ｉ１，Ｉ２］（７０３）の値は変化せず、制御変数Ｉ２が次の値に変化するまで同じ値で演算される。このような場合には読み方３７０３に「１ｄａｔａ」を設定する。
【０４７２】
また、読み方３７０３には、「１ｄａｔａ」の他に「ｓｅｑｕｅｎｃｅ」が設定される。図３８は、読み方３７０３が「ｓｅｑｕｅｎｃｅ」の場合を示す例である。読み方３７０３が「ｓｅｑｕｅｎｃｅ」の場合には、マスターファイルマッチング表３１０６の対応フィールド３７０５を参照して分割ファイルの先頭位置とマスターファイルの読み出し開始位置を対応させた後、各ファイルに格納されたデータを所定の範囲で順次読み出すことを表している。
【０４７３】
具体的には、ループ処理７００において、配列参照形式ｂ［Ｉ１，Ｉ２］（７０３）を「ｂ［Ｉ２，Ｉ３］」に変更した場合、最内側ループ制御変数であるＩ３が変化するとともに、ｂ［Ｉ２，Ｉ３］に格納するデータを読み出す位置も変化する。このような場合には読み方３７０３に「ｓｅｑｕｅｎｃｅ」を設定する。
【０４７４】
また、配列参照形式ｂ［Ｉ１，Ｉ２］（７０３）を「ｂ［Ｉ１，Ｉ３］」に変更すると、Ｉ１の値が変更されるまで所定の範囲のデータが読み出され、Ｉ１の値が変化すると、次の範囲のデータが読み出される。この場合も読み方３７０３に「ｓｅｑｕｅｎｃｅ」を設定する。
【０４７５】
読み方３７０３が「１ｄａｔａ」の場合、Ｉ１やＩ２の値に変化があるまで、つまり、分割ファイルの［１］や［２］のフィールドの値に変化があるまで、マスターファイルの同じデータを使用し続ける。また、読み方３７０３が「ｓｅｑｕｅｎｃｅ」の場合、Ｉ３が上限値に達するまで、つまり、分割ファイルのフィールド［３］が上限値に達するまでは必ず、連続してシーケンシャルにマスターファイルのデータを使用する。
【０４７６】
Ｉ１やＩ２が変化するのはＩ３が上限値に達する時であることに着目すると、ファイルの分割単位を最内側制御変数の上限値とすれば、各分割ファイルの［３］の値は０から９９になり、［１］、［２］の値は一定値となる。その結果、各分割ファイルに対応させるべきマスターファイルの所定範囲のデータは一か所となる。
【０４７７】
従って、マスターファイルマッチング表３１０６の対応フィールド３７０５を利用して、分割ファイルの先頭と、マスターファイルとの１回のマッチングで済むため処理を効率化できる。
【０４７８】
Ｉ１，Ｉ２，Ｉ３のループで、Ｉ３の上限値が極端に小さい場合は、Ｉ３の上限値でファイルを分割すると分割ファイル数が多くなってしまうため、他の閾値でファイルを分割する必要がある。従って一般的には、分割ファイルの先頭及び分割ファイルのフィールドの値が上限値に達した時に、再度マスターファイルマッチング表３１０６の対応フィールド３７０５を利用してマッチングし直す。
【０４７９】
図４３は、本発明の第３の実施の形態のマスターファイルマッチング表３１０６を生成するためのマスターファイルマッチング表エントリー追加処理の手順を示すフローチャートである。マスターファイルマッチング表エントリー追加処理は、図４１のステップ４１１７で実行される。
【０４８０】
なお、マスターファイルマッチング表エントリー追加処理（図４１のステップ４１１７）は、ファイル対応表３１０４生成時に、マスターに配置するべきファイルが存在する場合（図４１のステップ４１１５の結果が「Ｙｅｓ」）、具体的には配列参照について、配列添字＿制御変数対応表３１０３で「ＮＵＬＬ」が存在する場合に実行される。
【０４８１】
ＣＰＵ１０１は、マスターファイルマッチング表エントリー追加処理（図４１のステップ４１１７）を開始すると、結果変数登録表生成処理３２０１のステップ３９０４（図３９）の処理で設定した変数ｉの値を取得し、準備する（ステップ４３０１）。変数ｉに格納された値は、結果変数登録表３１０２の実行文番号３３０４に対応する。
【０４８２】
ＣＰＵ１０１は、ファイル対応表３１０４のファイルＩＤ３５０５を、マスターファイルマッチング表３１０６のファイルＩＤ３７０１に登録する（ステップ４３０２）。
【０４８３】
ＣＰＵ１０１は、変数ｉに格納された値を、マッチングキー３７０２の実行文番号３７０４に登録する（ステップ４３０３）。
【０４８４】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３の最内側制御変数に対応する値が「ＮＵＬＬ」であるか否かを判定する（ステップ４３０４）。配列添字＿制御変数対応表３１０３の最内側制御変数に対応する値が「ＮＵＬＬ」である場合には（ステップ４３０４の結果が「Ｙｅｓ」）、マスターファイルマッチング表３１０６の読み方３７０３に「１ｄａｔａ」を登録する（ステップ４３０５）。
【０４８５】
一方、ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３の最内側制御変数に対応する値が「ＮＵＬＬ」でない場合には（ステップ４３０４の結果が「Ｎｏ」）、マスターファイルマッチング表３１０６の読み方３７０３に「ｓｅｑｕｅｎｃｅ」を登録する（ステップ４３０６）。
【０４８６】
ここで、図７に示したループ処理７００に対し、図４３に示したマスターファイルマッチング表エントリー追加処理（図４１のステップ４１１７）を適用する手順について説明する。
【０４８７】
まず、ファイル対応表生成処理３９１３において、右辺コード、「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」のうち、「ｂ［Ｉ１，Ｉ２］」のみが、配列添字＿制御変数対応表３１０３で制御変数３「Ｉ３」３４０４が「ＮＵＬＬ」であるため、マスターに配置されるデータと判定される（図４１のステップ４１１５の結果が「Ｙｅｓ」）。
【０４８８】
以下、「ｂ［Ｉ１，Ｉ２］」についてマスターファイルマッチング表エントリー追加処理（図４１のステップ４１１７）手順を説明する。
【０４８９】
ＣＰＵ１０１は、結果変数登録表生成処理３２０１のステップ３９０４（図３９）の処理で設定された変数ｉの値「１」を取得し、準備する（ステップ４３０１）。
【０４９０】
ＣＰＵ１０１は、ファイル対応表３１０４のファイルＩＤ３５０５「ＩＤ３」をマスターファイルマッチング表３１０６のファイルＩＤ３７０１に登録する（ステップ４３０２）。
【０４９１】
ＣＰＵ１０１は、変数ｉの値「１」を、マッチングキー３７０２の実行文番号３７０４に登録する（ステップ４３０３）。
【０４９２】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３のエントリー「ｂ［Ｉ１，Ｉ２］」の最内側制御変数「Ｉ３」３４０４に対応する値が「ＮＵＬＬ」であるか否かを判定する（ステップ４３０４）。配列添字＿制御変数対応表３１０３のエントリー「ｂ［Ｉ１，Ｉ２］」の最内側制御変数「Ｉ３」３４０４に対応する値が「ＮＵＬＬ」であるため（ステップ４３０４の結果が「Ｙｅｓ」）、マスターファイルマッチング表３１０６の読み方３７０３に「１ｄａｔａ」を登録する（ステップ４３０５）。
【０４９３】
続いて、以上の手順によって作成されたマスターファイルマッチング表３１０６のエントリーの未設定のフィールドの値を設定するための対応フィールド部生成処理３２０２について説明する。
【０４９４】
図４４は、本発明の第３の実施の形態のマスターファイルマッチング表３１０６を生成するための対応フィールド部生成処理３２０２の手順を示すフローチャートである。
【０４９５】
ＣＰＵ１０１は、マスターファイルマッチング表対応フィールド部生成処理３２０２を開始すると、まず、マスターファイルマッチング表３１０６に未処理のエントリーが存在するか否かを判定する（ステップ４４０１）。マスターファイルマッチング表３１０６に未処理のエントリーが存在しない場合には（ステップ４４０１の結果が「Ｎｏ」）、処理を終了する。
【０４９６】
一方、ＣＰＵ１０１は、マスターファイルマッチング表３１０６に未処理のエントリーが存在する場合には（ステップ４４０１の結果が「Ｙｅｓ」）、マスターファイルマッチング表３１０６のファイルＩＤ３７０１に対応する配列参照形式３５０２をファイル対応表３１０４から取得する（ステップ４４０２）。
【０４９７】
ＣＰＵ１０１は、処理対象のマスターファイルマッチング表３１０６の実行文番号３７０４に対応するエントリーを結果変数登録表３１０２から取得する。そして、取得されたエントリーに含まれる元ファイルＩＤ３３０５に対応する配列参照形式３５０２をファイル対応表３１０４から取得する（ステップ４４０３）。
【０４９８】
その後、ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３を参照し、ステップ４４０２の処理とステップ４４０３の処理で取得されたエントリーを比較する（ステップ４４０４）。
【０４９９】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、同じ制御変数が制御している次元（フィールド）の対応を、マッチングキー３７０２の対応フィールド３７０５に登録する（ステップ４５０５）。具体的には、分割３７０６に分割ファイル名とフィールド、マスター３７０７にマスターファイル名とフィールドを登録する。
【０５００】
例えば、配列添字＿制御変数対応表３１０３において、「ａ［Ｉ１，Ｉ２，Ｉ３］」と「ｂ［Ｉ１，Ｉ２］」のエントリーを比較すると、制御変数「Ｉ１」３４０２、「Ｉ２」３４０３によって制御されるフィールドは、「ａ［Ｉ１，Ｉ２，Ｉ３］」が［１］［２］、「ｂ［Ｉ１，Ｉ２］」が［１］［２］となる。また、「ａ［Ｉ１，Ｉ２，Ｉ３］」に対応するファイル名は「ＩＤ１」、「ｂ［Ｉ１，Ｉ２］」に対応するファイル名は「ＩＤ３」であるため、分割に「ＩＤ１［１］［２］」、マスターに「ＩＤ３［１］［２］」を登録する（ステップ４４０５）。
【０５０１】
ここで、図７に示したループ処理７００に対し、図４４に示したマスターファイルマッチング表対応フィールド部生成処理３２０２を適用する手順について説明する。
【０５０２】
ＣＰＵ１０１は、マスターファイルマッチング表対応フィールド部生成処理３２０２を開始すると、まず、マスターファイルマッチング表３１０６に未処理のエントリーが存在するため（ステップ４４０１の結果が「Ｙｅｓ」）、ステップ４４０２の処理を実行する。
【０５０３】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６のファイルＩＤ３７０１「ＩＤ３」に対応する配列参照形式３５０２「ｂ［Ｉ１，Ｉ２］」をファイル対応表３１０４から取得する（ステップ４４０２）。
【０５０４】
ＣＰＵ１０１は、処理対象のマスターファイルマッチング表３１０６の実行文番号３７０４「１」のエントリーを結果変数登録表３１０２から取得し、元ファイルＩＤ３３０５「ＩＤ１」に対応する配列参照形式「ａ［Ｉ１，Ｉ２，Ｉ３］」をファイル対応表３１０４から取得する（ステップ４４０３）。
【０５０５】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３で、配列参照形式「ａ［Ｉ１，Ｉ２，Ｉ３］」と配列参照形式「ｂ［Ｉ１，Ｉ２］」とを比較する（ステップ４４０４）。
【０５０６】
ＣＰＵ１０１は、配列添字＿制御変数対応表３１０３において、制御変数「Ｉ１」３４０２、「Ｉ２」３４０３によって制御されるフィールドが、「ａ［Ｉ１，Ｉ２，Ｉ３］」の［１］［２］、「ｂ［Ｉ１，Ｉ２］」の［１］［２］に対応しているため、分割３７０６に「ＩＤ１［１］［２］」、マスター３７０７に「ＩＤ３［１］［２］」を登録する（ステップ４４０５）。
【０５０７】
その後、ステップ４４０１の処理に戻り、マスターファイルマッチング表３１０６に未処理のエントリーは存在しないため、処理を終了する。
【０５０８】
以上が、分散バッチ処理解析（第１の実施の形態のＭａｐＲｅｄｕｃｅ解析処理４０４に相当）の説明である。続いて、分散バッチ処理解析によって生成された、結果変数登録表３１０２、配列添字＿制御変数対応表３１０３、ファイル対応表３１０４、ソート表３１０５、及びマスターファイルマッチング表３１０６に基づいて、ソースプログラム１０６からオブジェクトプログラム１０７１を生成する手順について説明する。
【０５０９】
図４５は、本発明の第３の実施の形態の分散バッチ処理コード生成処理（第１の実施の形態におけるＭａｐＲｅｄｕｃｅコード生成処理６０１に相当）の手順を示すフローチャートである。分散バッチ処理コード生成処理は、ファイル対応表３１０４のエントリーごとに実行される。
【０５１０】
ＣＰＵ１０１は、分散バッチ処理コード生成処理を開始すると、ファイル対応表３１０４に未処理のエントリーが存在するか否かを判定する（ステップ４５０１）。未処理のエントリーが存在しない場合には（ステップ４５０１の結果が「Ｎｏ」）、ステップ４５０５の処理を実行する。一方、未処理のエントリーが存在する場合には（ステップ４５０１の結果が「Ｙｅｓ」）、該当するエントリーを取得する（ステップ４５０２）。
【０５１１】
ＣＰＵ１０１は、ファイル対応表３１０４のソート３５０６が「ＴＲＵＥ」であるか否かを判定する（ステップ４５０３）。ファイル対応表３１０４のソート３５０６が「ＴＲＵＥ」でない場合には（ステップ４５０３の結果が「Ｎｏ」）、ステップ４５０１の処理を実行する。一方、ファイル対応表３１０４のソート３５０６が「ＴＲＵＥ」の場合には（ステップ４５０３の結果が「Ｙｅｓ」）、ソート表３１０５に登録されたソートキーを設定し、ソート指示を出力する（ステップ４５０４）。そして、ステップ４５０１の処理に戻り、さらに未処理のエントリーを処理する。
【０５１２】
ステップ４５０１から４５０４までの処理は、演算コード生成処理（ステップ４５０５）を実行する前に、必要に応じてファイルに格納されたデータをソートする処理である。ファイルに格納されたデータをソートする処理が終了すると、ＣＰＵ１０１は、演算用コード生成処理を実行する（ステップ４５０５）。演算用コード生成処理４５０５については、図４６を参照しながら後述する。演算用コード生成処理４５０５が実行されると、ループ処理のイタレーション１回分の演算結果を算出するためのコードが生成される。
【０５１３】
ループ処理のイタレーション１回分を実行した後、さらに演算結果の集約が必要な場合には、演算結果を集約するためのコードを生成する（ステップ４５０６から４５０９）。集約が必要であるか否か、また、どのように演算結果を集約するかについては前述した結果変数登録表３１０２に基づいて決定することが可能である。
【０５１４】
ＣＰＵ１０１は、結果変数登録表３１０２に未処理のエントリーが存在するか否かを判定する（ステップ４５０６）。未処理のエントリーが存在しない場合には（ステップ４５０６の結果が「Ｎｏ」）、本処理を終了する。
【０５１５】
ＣＰＵ１０１は、未処理のエントリーが存在する場合には（ステップ４５０６の結果が「Ｙｅｓ」）、該当するエントリーを取得し（ステップ４５０７）、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」であるか否かを判定する（ステップ４５０８）。
【０５１６】
ＣＰＵ１０１は、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」でない場合には（ステップ４５０８の結果が「Ｎｏ」）、ステップ４５０６の処理に戻り、次のエントリーに対して処理を継続する。
【０５１７】
ＣＰＵ１０１は、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」である場合には（ステップ４５０８の結果が「Ｙｅｓ」）、集約コード生成処理を実行し（ステップ４５０９）、ステップ４５０６の処理に戻る。集約コード生成処理４５０９の詳細については、図４８を参照しながら後述する。
【０５１８】
その後、ＣＰＵ１０１は、結果変数登録表３１０２に未処理のエントリーが存在しなくなるまで本処理を実行する。
【０５１９】
以上説明した分散バッチ処理コード生成処理によって、ソートが必要なファイルをソートした後、ループ処理のイタレーション１回分の演算を実行し、集約が必要な場合には演算結果を集約するためのコードが生成される。
【０５２０】
続いて、分散バッチ処理コード生成処理の手順に含まれる演算コード生成処理（図４５のステップ４５０５）について説明する。演算コード生成処理では、ループ処理のイタレーション１回分の演算を実行するためのコードを生成する。
【０５２１】
図４６は、本発明の第３の実施の形態の演算コード生成処理の手順を示すフローチャートである。
【０５２２】
ＣＰＵ１０１は、演算コード生成処理を開始すると、まず、結果変数登録表３１０２にエントリーされた変数名３３０１に対応する結果設定用の変数を準備する（ステップ４６０１）。なお、ステップ４６０１の処理で準備された変数を「結果変数」とする。
【０５２３】
さらに、ＣＰＵ１０１は、ファイル対応表３１０４に登録された配列参照形式３５０２に対応するオペランド設定用の変数を準備する（ステップ４６０２）。なお、ステップ４６０２の処理で準備された変数を「オペランド変数」とする。オペランド変数は、入力対象のデータを格納するための変数である。
【０５２４】
ＣＰＵ１０１は、ファイル対応表３１０４のファイルＩＤ３５０５に登録されているすべてのファイルを入力ファイルとしてオープンするコードを生成する（ステップ４６０３）。ループ実行文に含まれる配列参照形式は、ファイル対応表３１０４のファイルＩＤ３５０５と１対１に対応しているためである。
【０５２５】
ＣＰＵ１０１は、結果変数登録表３１０２の元ファイルＩＤ３３０５に登録されているすべてのファイルを出力ファイルとしてオープンするコードを生成する（ステップ４６０４）。
【０５２６】
続く処理では、マスターに配置されているファイルが存在する場合に、分割ファイルからの読み出し開始位置を指定するためのコードを生成する。なお、マスターに配置されているファイルが存在するか否かは、ファイル対応表３１０４を参照すれば判定することができる。
【０５２７】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するか否かを判定する（ステップ４６０５）。ファイル対応表３１０４に未処理のエントリーが存在しない場合には（ステップ４６０５の結果が「Ｎｏ」）、ステップ４６０９の処理を実行する。
【０５２８】
ファイル対応表３１０４に未処理のエントリーが存在する場合には（ステップ４６０５の結果が「Ｙｅｓ」）、ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」であるか否かを判定する（ステップ４６０７）。
【０５２９】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」でない場合には（ステップ４６０７の結果が「Ｎｏ」）、ステップ４６０５の処理に戻り、ファイル対応表３１０４の次のエントリーに対して処理を継続する。
【０５３０】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」の場合には（ステップ４６０７の結果が「Ｙｅｓ」）、マスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成し（ステップ４６０８）、ステップ４６０５の処理に戻る。なお、マスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成する処理４６０８については、図４７を参照しながら後述する。
【０５３１】
ＣＰＵ１０１は、ファイル対応表３１０４のすべてのエントリーに対し、マスターファイルが存在するか否かを判定した後、オープンされたすべての入力ファイルに対し、データ２８０４をオペランド変数に設定するコードを生成する（ステップ４６０９）。
【０５３２】
続いて、ＣＰＵ１０１は、１イタレーション分の演算を実行するコードを生成する（ステップ４６１０）。具体的には、右辺コードの各オペランドをオペランド変数に置換し、結果変数に代入するコードを生成する。なお、オペランド変数には、ステップ４６０２の処理で対応するデータを設定するためのコードが生成されているため、ステップ４６１０の処理では、１イタレーションの演算結果を結果変数に代入するコードを生成したことになる。
【０５３３】
さらに、ＣＰＵ１０１は、オープンした出力用ファイルの変数名フィールド（図３０に示した例では、フィールド３００６、フィールド３００７に該当）に結果変数の値を出力するコードを生成する（ステップ４６１１）。なお、結果変数にはステップ４６１０の処理で１イタレーションの演算結果が代入されていたため、ステップ４６１１の処理では、１イタレーションの演算結果がファイルに出力されたことになる。
【０５３４】
続いて、演算コード生成処理（図４５のステップ４５０５、図４６）の手順に含まれるマスターファイルマッチング表３１０６の読み方３７０３に基づいてデータを取得するコードを生成する処理（図４６のステップ４６０８）について説明する。本処理では、マスターファイルに格納されたデータの読み出し開始位置を設定するコードを生成する。
【０５３５】
図４７は、本発明の第３の実施の形態のマスターファイルマッチング表３１０６の読み方３７０３に基づいてデータを取得するコードを生成する処理の手順を示すフローチャートである。
【０５３６】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３に基づいてデータを取得するコードを生成する処理を開始すると、まず、マスターファイルマッチング表３１０６の対応フィールド３７０５の分割３７０６に登録されているフィールドと、マスター３７０７に登録されているフィールドの値が等しい位置を、マスターファイルの読み出し開始位置とするコードを生成する（ステップ４７０１）。
【０５３７】
続いて、ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３が「１ｄａｔａ」であるか否かを判定する（ステップ４７０２）。なお、マスターファイルマッチング表３１０６の読み方３７０３には、前述のように、「１ｄａｔａ」及び「ｓｅｑｕｅｎｃｅ」が含まれる。
【０５３８】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３が「１ｄａｔａ」である場合には（ステップ４７０２の結果が「Ｙｅｓ」）、配列添字＿制御変数対応表３１０３を参照して、分割３７０６に登録されているフィールドのうち、ループ処理の内側ループ制御変数に対応するフィールドの値が変化した場合に、マスターファイル３７０１に格納されたデータの次の値を取得するコードを生成する（ステップ４７０３）。その後、本処理を終了する。なお、前述したように、分割ファイルが最内側ループ制御変数の上限値で分割されている場合には、最内側ループ制御変数以外に対応する分割ファイルのフィールドの値は一定値であるため、フィールドの値の変化は調べず、ステップ４７０１でマッチングさせたデータの取得のみ行えばよい。
【０５３９】
一方、ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３が「１ｄａｔａ」でない場合には（ステップ４７０２の結果が「Ｎｏ」）、すなわち、マスターファイルマッチング表３１０６の読み方３７０３が「ｓｅｑｕｅｎｃｅ」である場合には、ステップ４７０４以降の処理を実行する。
【０５４０】
ＣＰＵ１０１は、マスターファイルから次に取得するデータの読み出し位置を特定するコードを生成する（ステップ４７０４）。具体的には、分割３７０６に登録されているフィールドのうち、内側のループ制御変数に対応するフィールドの値がループ制御変数の上限値８０４に達した場合に、分割ファイルの次のエントリーを読み出す際、マスターファイルの"次のエントリー"からデータを読み出すか、ループ制御変数の下限値８０３に対応するエントリーへ戻ってデータを読み出すかを決定するコードを生成する。なお、前述したように、分割ファイルが最内側ループ制御変数の上限値で分割されている場合には、分割ファイルの終わりが最内側ループ制御変数の上限値に対応しているため、次に取得するデータの読み出し位置の特定（ステップ４７０４）は不要となる。
【０５４１】
最後に、ＣＰＵ１０１は、ステップ４７０４の処理で特定されたデータの読み出し位置から再びマスターファイルを順次に読み出すコードを生成する（ステップ４７０５）。
【０５４２】
続いて、分散バッチ処理コード生成処理に含まれる集約コード生成処理（図４５のステップ４５０９）について説明する。集約コード生成処理では、ループ処理の１イタレーションの結果を集約する必要がある場合に集約用のコードを生成する。
【０５４３】
図４８は、本発明の第３の実施の形態の集約コード生成処理の手順を示すフローチャートである。
【０５４４】
ＣＰＵ１０１は、集約コード生成処理を開始すると、まず、ファイルをオープンするコードが未生成であるか否かを判定する（ステップ４８０１）。ファイルをオープンするコードが未生成でない場合には（ステップ４８０１の結果が「Ｎｏ」）、ステップ４８０４の処理を実行する。
【０５４５】
ＣＰＵ１０１は、ファイルをオープンするコードが未生成である場合には（ステップ４８０１の結果が「Ｙｅｓ」）、結果変数登録表３１０２の元ファイルＩＤ３３０５を入力ファイルとしてオープンするコードを生成する（ステップ４８０２）。前述のように、結果変数登録表３１０２の元ファイルＩＤは、１イタレーションの結果が格納されるファイルである。さらに、ＣＰＵ１０１は、結果変数登録表３１０２のファイルＩＤ３３０６を出力ファイルとしてオープンするコードを生成する（ステップ４８０３）。
【０５４６】
続いて、ＣＰＵ１０１は、結果変数登録表３１０２の添字式３３０２が「ＦＡＬＳＥ」であるか否かを判定する（ステップ４８０４）。結果変数登録表３１０２の添字式３３０２が「ＦＡＬＳＥ」である場合には（ステップ４８０４の結果が「Ｙｅｓ」）、結果変数登録表３１０２の元ファイルＩＤ３３０５に登録されたファイルの「変数名」のフィールドの値をすべて集約するコードを生成する（ステップ４８０７）。さらに、ＣＰＵ１０１は、変数名及び集約結果の２つの値を出力ファイルに追記するコードを生成する（ステップ４８０８）。
【０５４７】
一方、ＣＰＵ１０１は、結果変数登録表３１０２の添字式３３０２が「ＦＡＬＳＥ」でない場合には（ステップ４８０４の結果が「Ｎｏ」）、結果変数登録表３１０２の集約フィールド３３０７の値をキーとして、元ファイルＩＤ３３０５に登録されたファイルの「変数名」のフィールドの値を集約するコードを生成する（ステップ４８０５）。さらに、ＣＰＵ１０１は、変数名、集約フィールドの値及び集約結果の３つの値を、出力ファイルに追記するコードを生成する（ステップ４８０６）。
【０５４８】
なお、ステップ４８０６及びステップ４８０８で値が追記される出力ファイルは、ステップ４８０３の処理でオープンするコードが生成された出力ファイルと同じである。
【０５４９】
ここで、図７に示したループ処理７００に対し、図４５に示した分散バッチ処理コード生成処理を適用する手順について説明する。
【０５５０】
ＣＰＵ１０１は、分散バッチ処理コード生成処理を開始すると、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４５０１の結果が「Ｙｅｓ」）、先頭の「ａ［Ｉ１，Ｉ２，Ｉ３］」のエントリーを取得する（ステップ４５０２）。
【０５５１】
ＣＰＵ１０１は、ファイル対応表３１０４のソート３５０６が「ＦＡＬＳＥ」であるため、ステップ４５０１の処理に戻る（ステップ４５０３）。
【０５５２】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４５０１の結果が「Ｙｅｓ」）、次の「ａ［Ｉ２，Ｉ３，Ｉ１］」のエントリーを取得する（ステップ４５０２）。
【０５５３】
ＣＰＵ１０１は、ファイル対応表３１０４のソート３５０６が「ＴＲＵＥ」であるため、ソート表３１０５のファイルＩＤ３６０１が「ＩＤ２」のソートキー「３」「１」「２」を設定し、元ファイルＩＤ３５０４「ＩＤ１」をファイルＩＤ３５０５「ＩＤ２」に変換するソート指示を出力する（ステップ４５０４）。そして、ステップ４５０１の処理に戻る。
【０５５４】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４５０１の結果が「Ｙｅｓ」）、次の「ｂ［Ｉ１，Ｉ２］」のエントリーを取得する（ステップ４５０２）。
【０５５５】
ＣＰＵ１０１は、ファイル対応表３１０４のソート３５０６が「ＦＡＬＳＥ」であるため、ステップ４５０１の処理に戻る（ステップ４５０３）。
【０５５６】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在しないため（ステップ４５０１の結果が「Ｎｏ」）、ステップ４５０５の処理を実行する。なお、ステップ４５０５の演算コード生成処理は、図４６を参照しながら説明する。
【０５５７】
ＣＰＵ１０１は、演算コード生成処理を開始すると、まず、結果変数登録表３１０２に変数名３３０１「ｓｕｍ」が登録されているため、変数「ｓｕｍ」を定義するコードを生成する（ステップ４６０１）。
【０５５８】
続いて、ＣＰＵ１０１は、ファイル対応表３１０４に３種類の配列参照形式３５０２「ａ［Ｉ１，Ｉ２，Ｉ３］」、「ａ［Ｉ２，Ｉ３，Ｉ１］」、「ｂ［Ｉ１，Ｉ２］」が登録されているため、これらに対応するオペランド設定用変数（オペランド変数）を定義するコードを生成する（ステップ４６０２）。
【０５５９】
ＣＰＵ１０１は、ファイル対応表３１０４のファイルＩＤ３６０１に登録されている、「ＩＤ１」、「ＩＤ２」、「ＩＤ３」を入力ファイルとしてオープンするコードを生成する（ステップ４６０３）。
【０５６０】
ＣＰＵ１０１は、結果変数登録表３１０２の元ファイルＩＤ３３０５に登録されている「ＩＤ１」を出力ファイルとしてオープンするコードを生成する（ステップ４６０４）。
【０５６１】
続いて、ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４６０５の結果が「Ｙｅｓ」）、先頭の「ａ［Ｉ１，Ｉ２，Ｉ３］」のエントリーを取得する（ステップ４６０６）。
【０５６２】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「分割」のため、ステップ４６０５の処理に戻る（ステップ４６０７）。
【０５６３】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４６０５の結果が「Ｙｅｓ」）、次の「ａ［Ｉ２，Ｉ３，Ｉ１］」のエントリーを取得する（ステップ４６０６）。
【０５６４】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「分割」のため、ステップ４６０５の処理に戻る（ステップ４６０７）。
【０５６５】
ＣＰＵ１０１は、ファイル対応表３１０４に未処理のエントリーが存在するため（ステップ４６０５の結果が「Ｙｅｓ」）、次の「ｂ［Ｉ１，Ｉ２］」のエントリーを取得する（ステップ４６０６）。
【０５６６】
ＣＰＵ１０１は、ファイル対応表３１０４の配置３５０７が「マスター」のため、マスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成する処理を実行する（ステップ４６０８）。
【０５６７】
マスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成する処理４６０８については、図４７を参照しながら説明する。
【０５６８】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成する処理４６０８を開始すると、まず、マスターファイルマッチング表３１０６の対応フィールド３７０５に、分割３７０６「ＩＤ１［１］［２］」及びマスター３７０７「ＩＤ３［１］［２］」が登録されているため、分割ファイル「ＩＤ１」の先頭の第１フィールド、第２フィールドと等しい「ＩＤ３」の第１フィールド、第２フィールドの位置をマスターファイル「ＩＤ３」の読み出し開始位置とするコードを生成する（ステップ４７０１）。
【０５６９】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６の読み方３７０３に「１ｄａｔａ」が登録されているため（ステップ４７０２の結果が「Ｙｅｓ」）、ステップ４７０３の処理を実行する。
【０５７０】
ＣＰＵ１０１は、マスターファイルマッチング表３１０６の分割３７０６「ＩＤ１［１］［２］」について、配列添字＿制御変数対応表３１０３を参照すると、ＩＤ１と「ａ［Ｉ１，Ｉ２，Ｉ３］」が対応していることから、フィールド［１］及び［２］は制御変数「Ｉ１」３４０２「Ｉ２」３４０３にそれぞれ対応していると判断することができる。この場合、内側のループに対応する制御変数は「Ｉ２」となる。そこで、制御変数「Ｉ２」に対応するＩＤ１のフィールド［２］の値が変化する時に、マスターファイル「ＩＤ３」の次のエントリーに対応するデータを読む出すコードを生成する（ステップ４７０３）。
【０５７１】
以上、演算コード生成処理４５０５に含まれるマスターファイルマッチング表３１０６の読み方３７０３に基づいて、ファイルからデータを取得するコードを生成する処理について説明した。以下、図４６の演算コード生成処理４５０５のフローチャートの説明を再開する。
【０５７２】
ＣＰＵ１０１は、ファイルに未処理のエントリーが存在しないため（ステップ４６０５の結果が「Ｎｏ」）、各ファイル名「ＩＤ１」、「ＩＤ２」、「ＩＤ３」の「データ」フィールドのデータをオペランド変数に設定するコードを生成する（ステップ４６０９）。
【０５７３】
ＣＰＵ１０１は、右辺コード「ａ［Ｉ１，Ｉ２，Ｉ３］＋ａ［Ｉ２，Ｉ３，Ｉ１］＊ｂ［Ｉ１，Ｉ２］」のオペランド部をステップ４６０２の処理で定義されたオペランド変数に置換し、ステップ４６０１の処理で定義された結果変数「ｓｕｍ」に代入するコードを生成する（ステップ４６１０）。
【０５７４】
ＣＰＵ１０１は、出力ファイル「ＩＤ１」の「変数名」フィールドに結果変数（ループ処理における１イタレーションの結果）を出力するコードを生成する（ステップ４６１１）。
【０５７５】
以上、分散バッチ処理コード生成処理に含まれる演算コード生成処理４５０５について説明した。以下、図４５に示した分散バッチ処理コード生成処理のフローチャートの説明を再開する。
【０５７６】
ＣＰＵ１０１は、結果変数登録表３１０２に未処理のエントリーが存在するため（ステップ４５０６の結果が「Ｙｅｓ」）、変数名３３０１が「ｓｕｍ」のエントリーを取得する（ステップ４５０７）。
【０５７７】
ＣＰＵ１０１は、結果変数登録表３１０２の集約３３０３が「ＴＲＵＥ」であるため、集約コード生成処理を実行する（ステップ４５０９）。集約コード生成処理４５０９については、図４８を参照しながら説明する。
【０５７８】
ＣＰＵ１０１は、集約コード生成処理４５０９を開始すると、まず、結果変数登録表３１０２の元ファイルＩＤに登録されている「ＩＤ１」をオープンするコードが未生成であるか否かを判定する（ステップ４８０１）。
【０５７９】
ＣＰＵ１０１は、結果変数登録表３１０２の元ファイルＩＤに登録されている「ＩＤ１」をオープンするコードが未生成であるため（ステップ４８０１の結果が「Ｙｅｓ」）、「ＩＤ１」を入力ファイルとしてオープンするコードを生成する（ステップ４８０２）。
【０５８０】
さらに、ＣＰＵ１０１は、結果変数登録表３１０２のファイルＩＤ「ＩＤ４」を出力ファイルとしてオープンするコードを生成する（ステップ４８０３）。
【０５８１】
ＣＰＵ１０１は、結果変数登録表３１０２の添字式３３０２に「Ｉ１」が登録されているため（ステップ４８０４の結果が「Ｎｏ」）、結果変数登録表３１０２の集約フィールド３３０７に登録されているフィールド「１」をキーとして、入力ファイル「ＩＤ１」の「変数名」フィールドの値を集約するコードを生成する（ステップ４８０５）。
【０５８２】
ＣＰＵ１０１は、（ｓｕｍ，ＩＤ１の１番目のフィールドの値，集約結果）を出力ファイル「ＩＤ４」に追記するコードを生成する（ステップ４８０６）。つまり、出力ファイル「ＩＤ４」には、（ｓｕｍ，０，［１］の値が０の場合の集約結果）、（ｓｕｍ，１，［１］の値が１の場合の集約結果）、（ｓｕｍ，２，［１］の値が２の場合の集約結果）、...のように演算結果が出力される。
【０５８３】
以上のように、本発明の第３の実施の形態によれば、所定の条件を満たすループ処理を実行するプログラムを、分散バッチ処理に適したプログラムに変換することができ、第１の実施の形態と同様に、システムの開発効率を向上させることができる。
【０５８４】
また、本発明の第３の実施の形態によれば、分割ファイルごとにマスターファイルの読むべき範囲が特定できるため、分散されて実行される各処理を効率化することが可能となり、さらなる性能の向上を期待することができる。
【０５８５】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
【産業上の利用可能性】
【０５８６】
本発明は、所定の構造のループ処理を有するプログラムを含むアプリケーションに利用可能である。
【図１】
2011090032.tif 000003
【図２】
2011090032.tif 000004
【図３】
2011090032.tif 000005
【図４】
2011090032.tif 000006
【図５】
2011090032.tif 000007
【図６】
2011090032.tif 000008
【図７】
2011090032.tif 000009
【図８】
2011090032.tif 000010
【図９】
2011090032.tif 000011
【図１０】
2011090032.tif 000012
【図１１】
2011090032.tif 000013
【図１２】
2011090032.tif 000014
【図１３】
2011090032.tif 000015
【図１４】
2011090032.tif 000016
【図１５】
2011090032.tif 000017
【図１６】
2011090032.tif 000018
【図１７】
2011090032.tif 000019
【図１８】
2011090032.tif 000020
【図１９】
2011090032.tif 000021
【図２０】
2011090032.tif 000022
【図２１】
2011090032.tif 000023
【図２２】
2011090032.tif 000024
【図２３】
2011090032.tif 000025
【図２４】
2011090032.tif 000026
【図２５】
2011090032.tif 000027
【図２６】
2011090032.tif 000028
【図２７】
2011090032.tif 000029
【図２８Ａ】
2011090032.tif 000030
【図２８Ｂ】
2011090032.tif 000031
【図２８Ｃ】
2011090032.tif 000032
【図２９Ａ】
2011090032.tif 000033
【図２９Ｂ】
2011090032.tif 000034
【図３０】
2011090032.tif 000035
【図３１】
2011090032.tif 000036
【図３２】
2011090032.tif 000037
【図３３】
2011090032.tif 000038
【図３４】
2011090032.tif 000039
【図３５】
2011090032.tif 000040
【図３６】
2011090032.tif 000041
【図３７】
2011090032.tif 000042
【図３８】
2011090032.tif 000043
【図３９】
2011090032.tif 000044
【図４０】
2011090032.tif 000045
【図４１】
2011090032.tif 000046
【図４２】
2011090032.tif 000047
【図４３】
2011090032.tif 000048
【図４４】
2011090032.tif 000049
【図４５】
2011090032.tif 000050
【図４６】
2011090032.tif 000051
【図４７】
2011090032.tif 000052
【図４８】
2011090032.tif 000053
【国際調査報告】
2011090032.tif 000054
2011090032.tif 000055
2011090032.tif 000056