(57)【要約】【課題】  ループアンローリング適用済みのソースコードから、ループを構成するパターンとその繰り返しパラメータを機械的に算出する。【解決手段】  ソースコードからアンロールされたループを１行ずつ読み出す。読み出した行とパターン管理テーブルのパターンとを比較する。読み出した行がパターンに該当しない場合、その行を新たなパターンとしてパターン管理テーブルに格納する。該当する場合、パターンに該当するものとして行番号をパターン管理テーブルに格納する。【選択図】  図１
2019191925.tif 000002
【特許請求の範囲】
【請求項１】
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、
前記パターン管理テーブルを格納する記憶装置である記憶手段と、
前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段とを備え、
前記行比較手段は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
ソースコード処理システム。
【請求項２】
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
請求項１に記載のソースコード処理システム。
【請求項３】
始点指示及び終点指示として予め定められた文字列に基づいて、前記ソースコード内における前記アンロールされたループのはじまり及び終わりを検出し、
前記始点指示及び終点指示の少なくとも一方は、前記予め定められた文字列の一部として、前記ソースコードを記述するコンピュータ言語によって定められた文字列を含む
請求項１または請求項２に記載のソースコード処理システム。
【請求項４】
前記終点指示として、ｆｏｒ文の終わりを示す終わり括弧を用いる、請求項３に記載のソースコード処理システム。
【請求項５】
前記パターンをなす文は、
アンロールされる前のループで用いられるインデックスと、
前記アンロールされたループにおいて、前記インデックスに加算して用いられるサブインデックスとを含む、
請求項１乃至請求項４のいずれか一項に記載のソースコード処理システム。
【請求項６】
前記アンロールされたループが、前記インデックスを含む文が記述された第１の行と、前記第１の行の直後に続き、前記インデックスを含まない第２の行を含むとき、前記行比較手段は、前記第１の行を第１のパターンとして前記パターン管理テーブルに格納した後、前記第２の行を前記第１のパターンに結合する、請求項５に記載のソースコード処理システム。
【請求項７】
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較段階と、
前記パターン管理テーブルを記憶装置に格納する記憶段階と、
前記記憶装置に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定段階とを、コンピュータを用いて行う方法であって、
前記行比較段階は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
ソースコード処理方法。
【請求項８】
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
請求項７に記載のソースコード処理方法。
【請求項９】
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、
前記パターン管理テーブルを格納する記憶装置である記憶手段と、
前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段として、コンピュータを機能させるためのプログラムであって、
前記行比較手段は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
プログラム。
【請求項１０】
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
請求項９に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの高速化の一手法であるループアンローリングに関し、特に、アンロールされた後のループを含むソースコードから、アンロールされる前のループを機械的に求める手法に関する。
【背景技術】
【０００２】
コンピュータのプログラミングを行う者、即ちプログラマは、プログラミング言語を用いてソースコードを記述する。オブジェクトコードの実行速度を高速化するための一手法にループアンローリングがある。
【０００３】
ループアンローリングを行う前のソースコードでは、ひとつのループ文の中に、一乃至複数の関数、演算等からなるひとつのループ本体が記述される。このソースコードをコンパイルして生成したオブジェクトコードをコンピュータにて実行すると、ループ文では次のような処理が行われる。 
（Ｌ１）インデックスに基づいてループ本体が１回実行される（ループ本体処理）。 
（Ｌ２）インデックスに所定の差分が加算或いは減算される（インデックス処理）。 
（Ｌ３）ループの継続条件が成り立つか否かの判定が行われる（継続判定処理）。継続条件が成り立つ場合はループ本体が再び実行される。継続条件が成り立たない場合はループ文が終了する。
【０００４】
このソースコードをループアンローリングしたものをコンパイルして生成したオブジェクトコードをコンピュータにて実行すると、ループ文では次のような処理が行われる。 
（Ｕ１）ループ本体処理及びインデックス処理がＮ回繰り返し実行される。Ｎは自然数である。Ｎをループアンローリングの段数と呼ぶ。 
（Ｕ２）継続判定が実行される。
【０００５】
ループアンローリングを行う前のソースコードによれば、ループ本体が１回実行される毎に、継続判定が１回実行される。これに対して、ループアンローリングを行った後のソースコードによれば、ループ本体がＮ回実行される毎に継続判定が１回実行される。このため、特に、ループ本体を繰り返し実行する総数が大きいとき、ループアンローリングによってオブジェクトコードの実行速度を高速化することができる。
【０００６】
例えば、ループを記述するための典型的な文であるｆｏｒ文を用いて、アンロールしていないループを記述すると次のようになる。 
int x;
for （x = 0; x < 100; x++）｛
delete (x);
｝
ここで、文字列”for”の後の丸括弧”(“に記述された”X = 0”は、インデックスの初期化に関する記述であり、インデックスｘの初期値が０であることを示す。次の記述”x < 100”は、継続条件であり、インデックスｘが１００未満であるという条件である。次の記述”x++”は、インデックス処理に関する記述であり、ループ本体処理を１回実行する毎にインデックスｘに１を加算することを示す。波括弧｛｝の中の記述”delete (x)”はループ本体処理である。記述”delete (x)”はインデックスｘで指定される要素を削除することを示している。
【０００７】
アンロールしていないループでは、ループ本体処理を１回実行する毎に、継続判定処理を行う。つまり、この例では、１００回のループ本体処理delete(x)に対して、継続条件x<100の成否判定を１００回行う。
【０００８】
このようなループをアンロールすると、例えば次のようになる。 
int x;
for （x = 0; x < 100; x += 5）｛
delete (x);
delete (x+1);
delete (x+2);
delete (x+3);
delete (x+4);
｝
このループでは、文字列”for”の後の丸括弧()内に、インデックスの更新に関して”x += 5”と記述されている。ループ本体処理delete(x)はアンロールされた結果、delete (x)、delete (x+1)、delete (x+2)、delete (x+3)、delete (x+4)の５つが記述されている。ループアンローリング前には１行で記述されていたdelete(x)が、インデックスｘに対してインデックス処理を行いながら５行に展開（アンロール）されている。ここでは５段のアンロールを行っている。
【０００９】
ループアンローリングに関連して、例えば、特許文献１には、ソースコード内に記述されたループを複数の命令群にアンローリングすることが記載されている。
【００１０】
また、特許文献２には、ループアンローリングを行う旨の指示、ループアンローリングを行わない旨の指示、ループが繰り返される最低回数の保証、ループが偶数回繰り返される旨の保証、及び、ループが奇数回繰り返される旨の保証に関するオプション及びプラグマに従って最適化処理を行うループアンローリング部が記載されている。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１１−１９７９８２号公報
【特許文献２】特開２００６−１１４０６９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
プログラミングの高速化手法に通じたプログラマは、このようなループアンローリング手法を適用したソースコードを作成することがある。また、特許文献１、２に記載のシステムは、ソースコードに対してループアンローリングを適用して出力する。これらとは逆に、ループアンローリングを適用したソースコードから、ループアンローリングを未適用のソースコードを生成したいという要望がある。
【００１３】
例えば、ここに、プログラミングの高速化手法に通じたプログラマが作成した、ループアンローリング手法を適用したソースコードがあるとする。このソースコードを見本として、他のプログラマが別のソースコードを作成する場合を考える。ループアンローリングを適用する際の最適な段数は、オブジェクトコードの実行環境等によって異なる。このため、ループアンローリング手法を適用済みのソースコードから、別のソースコードを作成する際には、生成するオブジェクトコードの実行環境に応じて、段数を変更可能であることが望まれる。
【００１４】
本発明はこのような状況を鑑みてなされたものであり、本発明が解決しようとする課題は、ループアンローリング手法を適用済みのソースコードから、ループアンローリング手法を適用しないソースコードを含む、任意の段数のループアンローリング手法を適用したソースコードへの変更を可能とする、パターンとその繰り返しパラメータを機械的に算出する手法を提供することにある。
【課題を解決するための手段】
【００１５】
上述の課題を解決するため、本発明は、その一態様として、入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、前記パターン管理テーブルを格納する記憶装置である記憶手段と、前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段とを備え、前記行比較手段は、前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、ソースコード処理システムを提供する。
【００１６】
また、本発明は、他の一態様として、入力されたソースコードに基づいてパターン管理テーブルを更新する行比較段階と、前記パターン管理テーブルを記憶装置に格納する記憶段階と、前記記憶装置に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定段階とを、コンピュータを用いて行う方法であって、前記行比較段階は、前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、ソースコード処理方法を提供する。
【００１７】
また、本発明は、他の一態様として、入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、前記パターン管理テーブルを格納する記憶装置である記憶手段と、前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段として、コンピュータを機能させるためのプログラムであって、前記行比較手段は、前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、プログラムを提供する。
【発明の効果】
【００１８】
本発明によれば、ループアンローリング手法を適用済みのソースコードから、ループアンローリング手法を適用しないソースコードを含む、任意の段数のループアンローリング手法を適用したソースコードへの変更を可能とする、パターンとその繰り返しパラメータを機械的に算出することができる。
【図面の簡単な説明】
【００１９】
【図１】本発明の一実施の形態であるソースコード処理システムのブロック図である。
【図２】第１の実施の形態において、ソースコード処理システムに入力されるソースコードについて説明するための図である。
【図３】第１の実施の形態において、ソースコード処理システムが出力する繰り返しパラメータについて説明するための図である。
【図４】ソースコード処理システムの行比較部の動作を説明するためのフローチャートである。
【図５】パターン管理テーブルの構造を説明するための図である。
【図６】第１の実施の形態において、パターン管理テーブルにパターンを追加した状態を説明するための図である。
【図７】第１の実施の形態において、パターン管理テーブルに、同じパターンの行を初めて追加したときの状態を説明するための図である。
【図８】第１の実施の形態において、パターン管理テーブルに、同じパターンの行を２回追加したときの状態を説明するための図である。
【図９】第１の実施の形態において、パターン管理テーブルに、同じパターンの行を３回追加したときの状態を説明するための図である。
【図１０】ソースコード処理システムのぱためーた決定部の動作を説明するためのフローチャートである。
【図１１】第２の実施の形態において、ソースコード処理システムに入力されるソースコードについて説明するための図である。
【図１２】第２の実施の形態において、パターン管理テーブルにグループ１のパターンを追加した状態を説明するための図である。
【図１３】第２の実施の形態において、パターン管理テーブルにグループ２のパターンを追加した状態を説明するための図である。
【図１４】第２の実施の形態において、パターン管理テーブルのグループ１に同じパターンの行を初めて追加した状態を説明するための図である。
【図１５】第２の実施の形態において、パターン管理テーブルのグループ２に同じパターンの行を初めて追加した状態を説明するための図である。
【図１６】第２の実施の形態において、ソースコード処理システムが出力する繰り返しパラメータについて説明するための図である。
【図１７】第３の実施の形態において、ソースコード処理システムに入力されるソースコードについて説明するための図である。
【図１８】第３の実施の形態において、パターン管理テーブルにパターンを追加した状態を説明するための図である。
【図１９】第３の実施の形態において、パターン管理テーブルに、同じパターンの行を初めて追加したときの状態を説明するための図である。
【図２０】第３の実施の形態において、パターン管理テーブルに、同じパターンの行を２回追加したときの状態を説明するための図である。
【図２１】第３の実施の形態において、パターン管理テーブルに、同じパターンの行を３回追加したときの状態を説明するための図である。
【図２２】第３の実施の形態において、ソースコード処理システムが出力する繰り返しパラメータについて説明するための図である。
【図２３】第４の実施の形態において、ソースコード処理システムに入力されるソースコードについて説明するための図である。
【図２４】第４の実施の形態において、パターン管理テーブルにパターンを追加した状態を説明するための図である。
【図２５】第４の実施の形態において、パターン管理テーブルにインデックスを含まない行を追加した状態を説明するための図である。
【図２６】第４の実施の形態において、パターン管理テーブルに同じパターンの行を初めて追加した状態を説明するための図である。
【図２７】第４の実施の形態において、パターン管理テーブルにインデックスを含まない行であって、既に格納されている行を追加した状態を説明するための図である。
【図２８】第４の実施の形態において、ソースコード処理システムが出力する繰り返しパラメータについて説明するための図である。
【発明を実施するための形態】
【００２０】
（第１の実施の形態）
本発明の第１の実施の形態であるソースコード処理システム１について説明する。
【００２１】
ソースコード処理システム１は、デスクトップコンピュータ、ラップトップコンピュータ、ワークステーション等のコンピュータ、コンピュータのオペレーティングシステム（ＯＳ）、ＯＳ上で動作するソースコード処理プログラムの組み合わせとして実装されるシステムである。ソースコード処理システム１は、プログラミング言語で記述されたソースコードに含まれる繰り返し、即ち、ループに対して処理を行うシステムである。
【００２２】
図１を参照すると、ソースコード処理システム１は、入力されたソースコード２のループに関する繰り返しパラメータ３を出力する。繰り返しパラメータ３は、ループに含まれるパターン、インデックス、インデックスの初期値、繰り返し回数、差分からなる。ソースコード処理システム１は、行比較部４、パターン管理テーブル５、パラメータ決定部６を備える。
【００２３】
行比較部４は、入力されたソースコード２から、パターン管理テーブル５に格納する値を求める処理を行う処理装置を備える。パターン管理テーブル５は、行比較部４が求めた値を格納するテーブルである。パターン管理テーブル５は、例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の外部記憶装置を備える。パラメータ決定部６は、パターン管理テーブル５に格納されている値から、繰り返しパラメータ３を求める処理を行う処理装置を備える。
【００２４】
図２のソースコード２Ａを参照してソースコード２について説明する。ソースコード２Ａはソースコード２の一例である。コンピュータをプログラムする者、即ち、プログラマが、プログラミング言語を用いてソースコード２Ａを記述する。ソースコード処理システム１を用いて繰り返しパラメータ３を生成する場合、プログラマ等は、ソースコード２Ａに含まれるループ１１の直前に始点指示部１２を記述する。始点指示１２は、後述する行比較部４に対して、処理対象となるループ１１の開始を指示するために記述される所定の文字列である。ソースコード２Ａでは、始点指示１２は、冒頭に”//!”を記載したコメント”//! unrooled loop”として記載されている。冒頭の”//!”については、ソースコード２Ａを記述するコンピュータ言語によって規定される。
【００２５】
図３の繰り返しパラメータ３Ａを参照して繰り返しパラメータ３について説明する。繰り返しパラメータ３Ａは、繰り返しパラメータ３の一例であり、ソースコード２Ａを入力したときソースコード処理システム１が出力する繰り返しパラメータ３である。
【００２６】
行１３はループ１１に含まれるパターンを示す。行１４は行１３に示すパターンのサブインデックスを示す。行１５は行１４に示すサブインデックスのレンジを示す。サブインデックスのレンジ１５は、初期値１５Ａ、サブインデックスの繰り返し回数１５Ｂ、サブインデックスの差分１５Ｃからなる。図３の例では、初期値１５Ａは０であり、繰り返し回数１５Ｂは４であり、差分１５Ｃは１である。初期値１５Ａはループ１１の初期値である。繰り返し回数１５Ｂはループ１１の終了値である。
【００２７】
ここで、繰り返しパラメータ３について更に説明する。アンロール前のループにおいて、インデックスｉに応じて定められる文が１行だけ記載されているものとする。ｆｏｒ文の場合、アンロール前のループを１回実行する毎に、その行の文がその時点のインデックスｉに基づいて実行された後、インデックスｉに１が加算されて、継続条件が判定される。
【００２８】
このとき、そのループをアンロールすると、例えば図２の行Ｌ１−Ｌ４のように、同じ文に対応するＮ行が記述される。ここでＮは自然数である。これらＮ行の文は、アンロール前のループの文のインデックスを、ｉ＋０、ｉ＋１、ｉ＋２、…、ｉ＋Ｎ−１とそれぞれ置換したものである。
【００２９】
アンロール後のループを１回実行すると、ループの内部でインデックスｉがｉ＋０からｉ＋Ｎ−１まで進む。ｆｏｒ文の場合、ループを１回実行した後に適用されるインデックスｉの更新が記述される。このインデックスｉの更新として、ループを１回実行する毎にインデックスｉにＮを加算する旨を記述する。これにより、次の（１）−（３）：
（１）インデックスｉからインデックスｉ＋Ｎ−１までの文を実行する。 
（２）ループの継続条件を判定する。 
（３）継続条件を満たす場合、インデックスｉ＋Ｎからインデックスｉ＋２Ｎ−１の文を実行する。 
というように実行される。その結果、アンロール後のループを１回実行したときのループ内部におけるインデックスｉの増加と、そのループを次回実行するときのインデックスｉとを整合させることができる。
【００３０】
アンロール後のループの各行の文のインデックスｉ＋０、ｉ＋１、ｉ＋２、…、ｉ＋Ｎ−１において、インデックスｉに加算される値を、サブインデックスと呼ぶものとする。アンロール後のループは、文のインデックスｉを、インデックスｉとサブインデックス＄ｊの和ｉ＋＄ｊと置換したものとみなすことができる。サブインデックス＄ｊは、初期値０≦サブインデックス＄ｊ≦終了値Ｎの整数である。サブインデックス＄ｊは、初期値０から所定の差分Ｄずつ終了値Ｎまで増加する。差分Ｄは整数である。
【００３１】
繰り返しパラメータ３とは、アンロール後のループを、サブインデックスを用いて表すときに用いるパラメータ群である。
【００３２】
行１３、或いは、パターン１３は、アンロール前のループの文のインデックスｉを、インデックスｉとサブインデックス＄ｊの和ｉ＋＄ｊに置換したものである。
【００３３】
行１４、或いは、サブインデックス１４は、サブインデックスとして用いる変数を示している。
【００３４】
行１５、或いは、レンジ１５は、サブインデックス１４の範囲に関するパラメータである。初期値１５Ａはサブインデックス１４の初期値である。繰り返し回数１５Ｂは上述のＮに相当する。繰り返し回数１５Ｂはアンロール後のループにおいて文を繰り返す回数Ｎを示す。また、サブインデックス１４の終了値Ｎ−１に対応する。差分１５Ｃは、互いにサブインデックスの値が互いに隣り合う行の間における、サブインデックスの値の差分である。例えば図２のソースコード２Ａでは、行Ｌ１、Ｌ２、Ｌ３、Ｌ４のサブインデックスは、それぞれ、０、１、２、３なので、図３の繰り返しパラメータ３Ａに示すように、差分１５Ｃは１である。
【００３５】
次に、図４を参照して、ソースコード処理システム１にソースコード２Ａを入力したときの行比較部４の動作について説明する。動作を開始する時点では、パターン管理テーブル５は空である。
【００３６】
行比較部４は、読み出した行に始点指示１２を検出するまで、ソースコード２Ａを１行ずつ読み出す（ステップＳ１、Ｓ２）。行比較部４は、始点指示１２を検出すると、その次の行からループ１１が始まると認識する。ここで、説明の都合上、ループ１１の各行を先頭から順にＬ０、Ｌ１、Ｌ２、…、Ｌｎ（ｎは自然数）と記すものとする。以下、Ｌ０、Ｌ１、Ｌ２、…、Ｌｎを行番号と呼ぶ。即ち、行比較部４は、始点指示１２を検出した後、Ｌ０を読み出す。
【００３７】
行比較部４は、始点指示１２を検出すると、次の行Ｌ０を読み出し（ステップＳ３）て、行Ｌ０がｆｏｒ文であるか否かを判定する（ステップＳ４）。ｆｏｒ文である場合、行比較部４は、行Ｌ０からインデックスの増分を抽出する（ステップＳ５）。
【００３８】
本明細書において、ｆｏｒ文の構文は次の通りである。 
for (インデックスの初期化; ループの継続条件; インデックスの更新)
「初期化」には、インデックスとして用いる変数の宣言と、インデックスの初期値が記述される。「ループの継続条件」には、条件が真であればループを実行し、偽であればループを終了する条件が記述される。「インデックスの更新」には、ループを１回実行したときにインデックスを更新する式が記述される。以下、この式をインデックス更新式と呼ぶ。行比較部４は、インデックス更新式からインデックスの増分を抽出する。ソースコード２Ａの場合、インデックスｉの増分は４である。
【００３９】
次に、行比較部４はソースコード２Ａから行Ｌ１を読み出す（ステップＳ３）。行Ｌ１はｆｏｒ文ではないので、ステップＳ４で「いいえ」に進んだ後、行Ｌ１が終わり波括弧“｝”であるか否かを判定する（ステップＳ６）。行Ｌ１は終わり波括弧ではないので、ここでは「いいえ」に進む。
【００４０】
次に、行比較部４は行Ｌ１が後述する終点指示であるか否かを判定する（ステップＳ７）。終点指示は、始点指示１２と一対をなす指示であり、ソースコード２を作成するプログラマ等が、ループの始点と終点を示すためにソースコード２に記載する。ただし、ｆｏｒ文の場合には、終わり波括弧“｝”にてループの終わりを検出可能なため、ソースコード２Ａでは終点指示が省略されている。行Ｌ１は終点指示ではないので、ここでは「いいえ」に進む。
【００４１】
次に、行比較部４は、行Ｌ１に当てはまるパターンがパターン管理テーブル５に格納されているか否かを判定する（ステップＳ８）。上述のように、動作の開始時点でパターン管理テーブル５は空なので、「いいえ」に進む。
【００４２】
次に、行比較部４は、行Ｌ１をパターンとしてパターン管理テーブル５に格納する（ステップＳ９）。
【００４３】
図５を参照してパターン管理テーブル５の構造について説明する。パターン管理テーブル５は、列５Ａ、５Ｂ、５Ｃを有する。列５Ａはグループに付与される番号（自然数）を格納する列である。列５Ｂは、同じ行の列５Ａが示すグループのパターンを格納する。列５Ｃは、同じ行の列５Ｂのパターンの読み出した、ループ１１内での行番号と差分を格納する。差分とは、行比較部４が読み出し済みの行のうち、行比較部４が今回読み出した行とパターンが同じものの中で最初の行と、今回読み出した行との間における、変数の差分である。
【００４４】
図６を参照して、行比較部４が、図５のパターン管理テーブル５に、Ｌ１を追加した状態について説明する。パターン管理テーブル５の最初の行の列５Ａに、行比較部４が１番目に追加したグループであることを示す数字１を格納している。同じ行の列５Ｂに、ソースコード２ＡのＬ１をそのまま格納している。同じ行の列５Ｃに、読み出し元となった行を示すＬ１と差分＋０を格納している。ここでは、パターン”s += a[i] * b[i]”を初めてパターン管理テーブル５に追加したため、差分を取るべき行が存在しないので、差分として０を格納している。
【００４５】
次に、行比較部４は、ステップＳ３に戻り、次の行Ｌ２を読み出す（ステップＳ３）。今、パターン管理テーブル５は空ではない。この場合、行比較部４は、ステップＳ８において、読み出した行と、パターン管理テーブル５に格納済みの各パターンとの差分を抽出する。行比較部４は、抽出した差分が、「＋定数」或いは「−定数」の形式（以下、これらの形式を定数形式と呼ぶ）に当てはまるか否かを判定する。
【００４６】
即ち、パターン管理テーブル５に格納されているパターンと、比較対象とする行とを比較したとき、パターンの文のインデックスを、インデックスと定数の和と置換したものが、行の文と一致する場合、その行はパターンに当てはまると判定する。また、このときの定数の和を、パターンと行の差分と呼ぶものとする。差分は整数であり、正の値であっても負の値であってもよい。この差分はパターン管理テーブル５の列５Ｃに格納される。
【００４７】
いま、パターン管理テーブル５のグループ１には、パターンとして”s += a[i] * b[i]”が格納されている。一方、今回、行比較部４は、ソースコード２Ａの行Ｌ２として”s += a[i+1] * b[i+1]”を読み出している。両者を比較すると、行Ｌ２は、グループ１のパターンにおいて、変数ｉを変数ｉ＋１に置き換えたものであることが分かる。即ち、パターン管理テーブル５のグループ１のパターンと、行Ｌ２の差分は定数形式である。このとき、行比較部４は、行Ｌ２がグループ１のパターンに属すると判定し、ステップＳ８で「はい」に進む。
【００４８】
差分が定数形式の場合、行比較部４は、読み出した行を示す行番号とその差分を、パターン管理テーブル５においてそのパターンと同じグループに追加する（ステップＳ１０）。
【００４９】
ある行をパターン管理テーブル５にパターンとして格納した後、そのパターンに属する別の行を追加するのが１回目のとき、即ち、そのグループに属する２番目の行を追加するとき、行比較部４は、そのパターンに変数$ｊを追加する。また、このとき、行比較部４は、そのグループの列５Ｃに、今回読み出した行を示す行番号と、このパターンに分類された最初の行と今回読み出した行との差分を格納する。
【００５０】
一方、ある行をパターン管理テーブル５にパターンとして格納した後、そのパターンに属する別の行を追加するのが２回目以後のとき、即ち、そのグループに属する３番目以後の行を追加するとき、行比較部４は、そのグループの列５Ｃに、今回読み出した行を示す行番号と、このパターンに分類された最初の行と今回読み出した行との差分を格納する。このとき行比較部４は変数$ｊ或いはその他の変数の追加を行わない。
【００５１】
図７を参照して説明する。行比較部４が、行Ｌ２を読み出して、図６のパターン管理テーブル５に格納済みの各グループのパターンと比較すると、グループ１のパターンと、行Ｌ２の差分が定数形式である。また、グループ１に行を追加するのは１回目である。このとき、行比較部４は、図７に示すように、グループ１の列５Ｂ、パターン”s += a[i] * b[i]”の変数ｉに、変数＄ｊを加算する。また、グループ１の列５Ｃに、行としてＬ２、差分として１を格納する。
【００５２】
次に、行比較部４はソースコード２Ａから行Ｌ３を読み出し、図７のパターン管理テーブル５に格納済みの各グループのパターンと、行Ｌ３とを比較する（ステップＳ８）。上述の行Ｌ２の読み出し時と同様に、グループ１のパターンと行Ｌ３の差分は定数形式である。しかし、今回は、グループ１のパターンに行を追加するのは２回目である。このとき、行比較部４は、グループ１の列５Ｃに行として行Ｌ３を格納する。また、行比較部４は、同じくグループ１の列５Ｃに、差分として２を格納する。この差分値２は、最初にパターンとして格納した行Ｌ１と行Ｌ３の差分である。行Ｌ３と差分値２を格納後のパターン管理テーブル５の状態を図８に示す。
【００５３】
次に、行比較部４はソースコード２Ａから行Ｌ４を読み出し（ステップＳ３）、図８のパターン管理テーブル５に格納済みの各グループのパターンと、行Ｌ４とを比較する（ステップＳ８）。上述の行Ｌ２、行Ｌ３の読み出し時と同様に、グループ１のパターンと行Ｌ４の差分は定数形式である。また、グループ１のパターンに行を追加するのは３回目である。このとき、行比較部４は、グループ１の列５Ｃに行として行Ｌ４を格納する。また、行比較部４は、同じくグループ１の列５Ｃに、差分として３を格納する（ステップＳ１０）。この差分値３は、最初にパターンとして格納した行Ｌ１と行Ｌ４の差分である。行Ｌ４と差分値３を格納後のパターン管理テーブル５の状態を図９に示す。
【００５４】
次に、行比較部４は行Ｌ５を読み出す（ステップＳ３）。行Ｌ５は終わり波括弧なので、ステップＳ６で「はい」に進み、行比較部４での処理が終了し、パラメータ決定部６の動作に移行する。
【００５５】
図１０を参照して、パラメータ決定部６の動作について説明する。パラメータ決定部６は、パターン管理テーブル５からグループをひとつ選択する（ステップＳ２１）。ここでは、図９のパターン管理テーブル５から、グループ１を選択する。
【００５６】
パラメータ決定部６は、パターン管理テーブル５の列５Ｂに基づいて、各グループのパターンとインデックスとを決定する（ステップＳ２２、２３）。図９のパターン管理テーブル５の場合、パラメータ決定部６は、＄ｊをインデックスとし、”s += a[i+$j] * b[i+$j]”をパターンとして決定する。
【００５７】
次に、パラメータ決定部６は、パターン管理テーブル５の列５Ｃに基づいて、各グループのインデックスのレンジを決定する。パラメータ決定部６は初期値１５Ａを０と決定する（ステップＳ２４）。また、パラメータ決定部６は、そのグループに追加された行の数を繰り返し回数１５Ｂとして決定する（ステップＳ２５）。図８のパターン管理テーブル５の場合、Ｌ１〜Ｌ４の４行が記載されているので、繰り返し回数１５Ｂを４（回）と決定する。また、パラメータ決定部６は、パターン管理テーブル５の列５Ｃに基づいて、差分１５Ｃを決定する（ステップＳ２６）。
【００５８】
差分の決定方法としては、ループ１１のｆｏｒ文から抽出したインデックスの増分と、列５Ｃに格納された行数とを比較し、両者が一致する場合、その値が差分であると判定することが考えられる。
【００５９】
例えば、ステップＳ５において、行比較部４がインデックス更新式から抽出したインデックスの増分を、パラメータ決定部６に渡しておく。ソースコード２Ａが入力された場合、行比較部４はループ１１冒頭のｆｏｒ文の記載ｉ＋＝４から増分４を抽出する。
【００６０】
また、パラメータ決定部６が、パターン管理テーブル５の列５Ｃに格納された行数を数える。図８のパターン管理テーブル５の場合、列５ＣにはＬ１〜Ｌ４の計４行が格納されている。
【００６１】
そして、パラメータ決定部６が、予め行比較部４から渡された増分と、パターン管理テーブル５の列５Ｃに格納されている行数とを比較する。図２のソースコード２Ａと図８のパターン管理テーブル５の場合、どちらも４で一致するので、パラメータ決定部６は差分を４と判定する。両者が不一致の場合、パラメータ決定部６は、不図示の画像表示装置でエラーメッセージを表示することとしてもよい。
【００６２】
このようにして、パラメータ決定部６は、図９のパターン管理テーブル５に基づいて、図３の繰り返しパラメータを出力する。パターン１３として、図９のパターン管理テーブル５の列５Ｂに格納されている、パターン”s += a[i+$j] * b[i+$j]”を出力する。サブインデックス１４として$jを出力する。レンジ１５の初期値１５Ａとして０、繰り返し回数１５Ｂとして４（回）、差分１５Ｃとして１を出力する。
【００６３】
本実施の形態によれば、アンロールされたループを含むソースコードを入力として、アンロールされる前の文を出力することができる。
【００６４】
（第２の実施の形態）
本発明の第２の実施の形態について説明する。上述の第１の実施の形態では、ソースコード２として、ｆｏｒ文を含むソースコード２Ａを用いた。また、ソースコード２Ａのループ１１が含むパターンの種類、即ち、グループの数はひとつだけであった。また、１パターンはソースコードの１行に対応した。
【００６５】
これに対して、第２の実施の形態では、ひとつのループが含むグループの数が複数である点で第１の実施の形態と異なる。ソースコードはｆｏｒ文を含む点と、ひとつのパターンはソースコードの１行に対応する点では第１の実施の形態と同様である。
【００６６】
基本的な構成としては、第１の実施の形態と同様に、図１に示したソースコード処理システム１を用いる。ただし、ソースコード２として、図１１のソースコード２Ｂのように、グループを複数含むものをソースコード処理システム１に入力する。
【００６７】
図１１を参照すると、ソースコード２Ｂには、行頭の“Ｌ０：”、“Ｌ１：”、…、“Ｌ４”を含む５行が記載されている。行頭の記載“Ｌ０：”、“Ｌ１：”、…、“Ｌ４”は、本説明において個々の行を指定するための記載であり、ソースコード２Ｂにおいては省略可能である。
【００６８】
図４を参照して本実施の形態における行比較部４の動作について説明する。
【００６９】
始点指示２１を含む行を読み出したとき、ステップＳ２において、行比較部４は、始点指示２１を検出する。行Ｌ０を読み出したとき、行比較部４は、ステップＳ５において、行Ｌ０のインデックス更新式から増分２を抽出する。行Ｌ１を読み出したとき、行比較部４は、ステップＳ９において、行Ｌ１の文x[i]=a[i]+b[i]をパターン管理テーブル５に格納する。このときのパターン管理テーブル５の状態を図１２に示す。ここまでの動作は、第１の実施の形態において、行比較部４がソースコード２Ａから行Ｌ１を読み出して行った動作までと同様である。
【００７０】
次に、行比較部４は行Ｌ２を読み出す。図１２に示すように、パターン管理テーブル５にはグループ１のパターンとしてx[i]=a[i]+b[i]が格納されている。このパターンと、行Ｌ２の文y[i]=a[i]-b[i]の差分は定数形式にならない。このため、ステップＳ８は「いいえ」に進む。ステップＳ９において、行比較部４は、図１３に示すように、行Ｌ２の文y[i]=a[i]-b[i]をグループ２のパターンとしてパターン管理テーブル５に格納する。
【００７１】
次に、行比較部４は行Ｌ３を読み出す。図１３に示すように、パターン管理テーブル５には、グループ１、グループ２のパターンが格納されている。行比較部４は、ステップＳ８において、行Ｌ３の文と、グループ１、グループ２のパターンそれぞれとの差分を求める。行Ｌ３の文y[i+1]=a[i+1]+b[i+1]と差分を求めると、グループ１のパターンとの差分は定数形式であり、グループ２のパターンとの差分は定数形式にならない。
【００７２】
このため、行比較部４は、ステップＳ１０において、行Ｌ３と、行Ｌ１との差分である１とを、定数形式になるグループ１の列５Ｃに追加する。このときのパターン管理テーブル５の状態を図１４に示す。第１の実施の形態において、行Ｌ２を読み出したときと同様に、グループ１への行の追加は今回が初めてのため、列５Ｂのパターンに変数＄ｊを追加している。
【００７３】
次に、行比較部４は行Ｌ４を読み出す。図１４に示すように、パターン管理テーブル５には、グループ１、グループ２のパターンが格納されている。行比較部４は、ステップＳ８において、行Ｌ４の文と、グループ１、グループ２のパターンそれぞれとの差分を求める。行Ｌ４の文y[i+1]=a[i+1]-b[i+1]と差分を求めると、グループ１のパターンとの差分は定数形式にならず、グループ２のパターンとの差分は定数形式になる。
【００７４】
このため、行比較部４は、ステップＳ１０において、行Ｌ４と、行Ｌ２との差分である１とを、定数形式になるグループ２の列５Ｃに追加する。このときのパターン管理テーブル５の状態を図１５に示す。本実施の形態において、行Ｌ３を読み出したときには、グループ１に行を追加したのに対して、行Ｌ４を読み出した今回では、グループ２に行を追加している。グループ２への行の追加は今回が初めてのため、列５Ｂのパターンに変数＄ｊを追加する。
【００７５】
次に、行比較部４はステップＳ３において行Ｌ５を読み出す。行Ｌ５には終わり波括弧が記載されているため、ステップＳ６で「はい」に進み、行比較部４は処理を終了し、パターン決定部６の処理に移行する。
【００７６】
次に、図１０を参照して、本実施の形態におけるパターン決定部６の動作について説明する。ここでは、パターン１３、サブインデックス１４、レンジ１５、初期値１５Ａ、繰り返し回数１５Ｂ、差分１５Ｃを、それぞれ、パターン３１、３２、サブインデックス３３、レンジ３４、初期値３４Ａ、繰り返し回数３４Ｂ、差分３４Ｃに読み替えられたい。
【００７７】
行比較部４での処理の結果、パターン管理テーブル５は図１５のような状態になっている。パターン決定部６はグループ１を選択（ステップＳ２１）し、グループ１の列５Ｂ、５Ｃに対して、ステップＳ２２−Ｓ２６を順次実行する。ステップＳ２７において、パターン管理テーブル５には未処理のグループ２がある。そのため、パターン決定部６は、ステップＳ２１に戻り、グループ２を対象としてステップＳ２２−Ｓ２６を順次実行する。最終的に、パターン決定部６は図１６のような繰り返しパラメータ３Ｂを出力する。
【００７８】
図１６を参照すると、行３１、３２はループ２２に含まれるパターンを示す。行３３は行３１、３２に示すパターンのインデックスを示す。行３４は行３３に示すインデックスのレンジを示す。インデックスのレンジ３４は、初期値３４Ａ、インデックスの繰り返し回数３４Ｂ、インデックスの差分３３Ｃからなる。図１６の例では、初期値３４Ａは０であり、繰り返し回数３４Ｂは２であり、差分３４Ｃは１である。初期値３４Ａはループ２２の初期値である。繰り返し回数３４Ｂはループ２２の終了値である。
【００７９】
第２の実施の形態によれば、アンロールされたループを含むソースコードに、複数のパターンが含まれている場合であっても、アンロールされる前の文を出力することができる。
【００８０】
（第３の実施の形態）
本発明の第３の実施の形態について説明する。第１の実施の形態と比較すると、本実施の形態は、ソースコード２の中にｆｏｒ文を含まない点で異なる。ループが１つのグループを含む点、ひとつのパターンはソースコードの１行に対応する点については、第１の実施の形態と同様である。
【００８１】
基本的な構成としては、第１の実施の形態と同様に、図１に示したソースコード処理システム１を用いる。ただし、ソースコード２として、図１７のソースコード２Ｃのように、ｆｏｒ文を含まないものを入力する。ソースコード２Ｃを入力する直前においてパターン管理テーブル５は空である。
【００８２】
第１の実施の形態では、ループ１１の終わりを行Ｌ５の終わり波括弧で検出した。これに対して、本実施の形態では、ループ４２の終わりを終点指示４３によって検出する。終点指示４３は、始点指示４１の対となってループ４２の始点から終点を指定するための所定の文字列である。ソースコード２Ｃでは、終点指示４３は、冒頭に”//!”を記載したコメント”//! unrooled loop end”として記載されている。冒頭の”//!”については、ソースコード２Ｃを記述するコンピュータ言語によって規定される。
【００８３】
図４を参照して行比較部４の動作について説明する。ステップＳ２で始点指示４１を検出すると、行比較部４は、ループ４１の行Ｌ１を読み出す（ステップＳ３）。行Ｌ１はｆｏｒ文、終わり波括弧、終点指示４３のいずれにも該当しないのでステップＳ８に進む。この時点ではパターン管理テーブル５は空なので、ステップＳ８では「いいえ」に進み、パターン管理テーブル５に行Ｌ１をグループ１のパターンとして格納する（ステップＳ９）。このときのパターン管理テーブル５の状態を図１８に示す。
【００８４】
行Ｌ２、Ｌ３、Ｌ４と行Ｌ１との差分は、それぞれ定数形式である。このため、行比較部４は、行Ｌ２、Ｌ３、Ｌ４を読み出したとき、ステップＳ８において「はい」に進む。行Ｌ２、Ｌ３、Ｌ４をそれぞれ読み出して、ステップＳ１０を実行した直後のパターン管理テーブル５を、順に図１９、２０、２１に示す。
【００８５】
行Ｌ４の次に、行比較部４は終点指示５を読み出すと、行比較部４はステップＳ７にて「はい」に進み、処理を終了する。続いてパターン決定部６の処理に移る。
【００８６】
パターン決定部６は、図２１のパターン管理テーブル５に対して、図１０の処理を実行する。ここでは、パターン１３、サブインデックス１４、レンジ１５、初期値１５Ａ、繰り返し回数１５Ｂ、差分１５Ｃを、それぞれ、パターン４４、サブインデックス４５、レンジ４６、初期値４６Ａ、繰り返し回数４６Ｂ、差分４６Ｃに読み替えられたい。パターン決定部６の処理は第１の実施の形態とほぼ同様である。ここでパターン決定部６が出力する繰り返しパラメータ３Ｃを図２２に示す。
【００８７】
本実施の形態によれば、ソースコードに記載された、アンローリングされたループが、ｆｏｒ文を用いずに記載されたものであっても、アンロール前の文を求めることができる。
【００８８】
（第４の実施の形態）
本発明の第４の実施の形態について説明する。第１の実施の形態では、ひとつのパターンがソースコードの１行に対応していた。これに対して、本実施の形態では、ひとつのパターンがソースコードの複数行に対応する。ソースコードはｆｏｒ文を含む点、ループは１つのグループを含む点については、第１の実施の形態と同様である。
【００８９】
基本的な構成としては、第１の実施の形態と同様に、図１に示したソースコード処理システム１を用いる。ただし、ソースコード２として、図２３のソースコード２Ｄを用いる。ソースコード２Ｄは、行Ｌ２、Ｌ４として、インデックスを含まない行を含んでいる。インデックスを含んでいないため、行Ｌ２、Ｌ４は、インデックスに加算されるサブインデックスも含んでいない。
【００９０】
図４を参照して、本実施の形態における行比較部４の動作について説明する。
【００９１】
第１の実施の形態と同様に、本実施の形態では、行比較部４は、ループ５２の開始を始点指示５１にて検出する（ステップＳ２）。
【００９２】
行Ｌ０を読み出したとき、行比較部４は、インデックスの増分２を求める（ステップＳ３）。
【００９３】
行Ｌ１を読み出したとき、行比較部４は、パターン管理テーブル５、グループ１の列５Ｂに行Ｌ１のt=a[i]-b[i]を格納する。また、同じくグループ１の列５Ｃに行としてＬ１を格納する。行Ｌ１自身との差分はゼロなので差分として０を格納する（ステップＳ９）。このときのパターン管理テーブル５の状態を図２４に示す。
【００９４】
行Ｌ２を読み出したとき、行比較部４は、ステップＳ８において、既にパターン管理テーブル５に格納されているパターンと、行Ｌ２の文とを比較する。行Ｌ２のように、インデックスを含んでいない場合、行比較部４は、その行を、その直前にパターン管理テーブル５に格納されたパターンの一部として、パターン管理テーブル５に格納する。このときのパターン管理テーブル５の状態を図２５に示す。図２５に示すように、グループ１のパターンの一部として、行Ｌ２の行s+=t*tをパターンt=a[i]-b[i]と結合してひとつのパターンとして扱っている。尚、行Ｌ２はインデックスを含まないため、列５Ｃの行Ｌ２の差分は記載していない。
【００９５】
行Ｌ３を読み出したとき、ステップＳ８において、行比較部４は、行Ｌ３がグループ１のパターンに当てはまるか否かを判定する。行Ｌ３の文t=a[i+1]-b[i+1]と、図２５のパターン管理テーブル５、グループ１の列５Ｂの１行目に記載のパターンt=a[i]-b[i]とを比較すると、差分１の定数形式である。このため、行比較部４は当てはまると判定し、ステップＳ１０に進む。ステップＳ１０において、行比較部４は、グループ１の列５Ｃに、行Ｌ３と差分１とを格納する。このときのパターン管理テーブル５を図２６に示す。
【００９６】
行Ｌ４を読み出したとき、ステップＳ８において、行比較部４は、行Ｌ４がグループ１のパターンに当てはまるか否かを判定する。行Ｌ４の文s+=t*tと、図２５のパターン管理テーブル５、グループ１の列５Ｂの１行目に記載のパターンs+=t*tとを比較すると、両者は一致する。このため、行比較部４は当てはまると判定し、ステップＳ１０に進む。ステップＳ１０において、行比較部４は、グループ１の列５Ｃに、行Ｌ４を格納する。行Ｌ４はインデックスを含まないため差分は格納しない。このときのパターン管理テーブル５の状態を図２７に示す。
【００９７】
最後に、行Ｌ５を読み出したとき、行比較部４は、ステップＳ６において終わり波括弧を検出して、ループ５２が終了したと判定する。以後、パラメータ決定部６の処理に移行する。
【００９８】
図１０を参照してパラメータ決定部６の動作について説明する。パラメータ決定部６は、図２７の状態にあるパターン管理テーブル５に基づいて、図２８のような繰り返しパラメータ３Ｄを生成する。ここでは、パターン１３、サブインデックス１４、レンジ１５、初期値１５Ａ、繰り返し回数１５Ｂ、差分１５Ｃを、それぞれ、パターン６１、６２、サブインデックス６３、レンジ６４、初期値６４Ａ、繰り返し回数６４Ｂ、差分６４Ｃに読み替えられたい。パターン決定部６の処理は第１の実施の形態とほぼ同様である。パターン管理テーブル５、列５Ｃには、Ｌ１−Ｌ４の４行が記載されているが、本実施の形態では、２行の文でひとつのパターンを構成しているため、繰り返し回数６４Ｂは２となっている。
【００９９】
本実施の形態によれば、複数行からなるパターンをアンローリングしたソースコードから、アンローリングしていないパターンを求めることができる。
【０１００】
以上、本発明を実施形態に即して説明したが、他にも様々な変形が考えられる。
【０１０１】
（変形１）
上述の実施の形態では、説明の都合上、ソースコード２Ａ−２Ｄのループを構成する行は、いずれも、インデックスの差分が昇順になるように規則正しく記載されていた。しかし、実際のソースコードでは、降順に並ぶ場合もあり、更には、昇順でも降順でもなく、不規則に並ぶ可能性もある。
【０１０２】
こうした事情を考慮して、ソースコードからループを検出し、ループ内の行をインデックスの差分が昇順になるようにソートする処理を、行比較部４による処理の前に行うこととしてもよい。
【０１０３】
（変形２）
上述の実施の形態では、繰り返し回数１５Ｂ、３４Ｂ、４６Ｂ、６４Ｂとして、回数を表す自然数をそのまま出力した。これに代わって、繰り返し回数をパラメータ化（＄ｕ）して出力することとしてもよい。例えば、第１の実施の形態において、パラメータ決定部６は、繰り返し回数１５Ｂをパラメータ化することが考えられる。先に求めた繰り返し回数１５Ｂを、パラメータ＄ｕで置換する。図９のパターン管理テーブル５の場合、先に求めた４（回）を＄ｕに置換する。この場合、パラメータ決定部６はパラメータ＄ｕを行Ｌ０のｆｏｒ文にも適用する。パラメータ決定部６は、ループ１１のｆｏｒ文である行Ｌ０を読み出す。
【０１０４】
図２のソースコード２Ａの行Ｌ０には、「初期化」として、整数型の変数ｉをインデックスとして用いることが記載されている。「ループの継続条件」として、ｉ＜ｎが記載されている。「インデックスの更新」として、”i += 4”が記載されている。パラメータ決定部６は、「インデックスの更新」として記載されている、”i += 4”の値４を＄ｕに置き換えたｆｏｒ文を生成して出力する。
【０１０５】
上記の実施形態の一部又は全部は以下の付記のようにも記載されうるが、以下には限られない。
【０１０６】
（付記１）
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、
前記パターン管理テーブルを格納する記憶装置である記憶手段と、
前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段とを備え、
前記行比較手段は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
ソースコード処理システム。
【０１０７】
（付記２）
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
付記１に記載のソースコード処理システム。
【０１０８】
（付記３）
始点指示及び終点指示として予め定められた文字列に基づいて、前記ソースコード内における前記アンロールされたループのはじまり及び終わりを検出し、
前記始点指示及び終点指示の少なくとも一方は、前記予め定められた文字列の一部として、前記ソースコードを記述するコンピュータ言語によって定められた文字列を含む
付記１または付記２に記載のソースコード処理システム。
【０１０９】
（付記４）
前記終点指示として、ｆｏｒ文の終わりを示す終わり括弧を用いる、付記３に記載のソースコード処理システム。
【０１１０】
（付記５）
前記パターンをなす文は、
アンロールされる前のループで用いられるインデックスと、
前記アンロールされたループにおいて、前記インデックスに加算して用いられるサブインデックスとを含む、
付記１乃至付記４のいずれか一項に記載のソースコード処理システム。
【０１１１】
（付記６）
前記アンロールされたループが、前記インデックスを含む文が記述された第１の行と、前記第１の行の直後に続き、前記インデックスを含まない第２の行を含むとき、前記行比較手段は、前記第１の行を第１のパターンとして前記パターン管理テーブルに格納した後、前記第２の行を前記第１のパターンに結合する、付記５に記載のソースコード処理システム。
【０１１２】
（付記７）
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較段階と、
前記パターン管理テーブルを記憶装置に格納する記憶段階と、
前記記憶装置に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定段階とを、コンピュータを用いて行う方法であって、
前記行比較段階は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
ソースコード処理方法。
【０１１３】
（付記８）
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
付記７に記載のソースコード処理方法。
【０１１４】
（付記９）
始点指示及び終点指示として予め定められた文字列に基づいて、前記ソースコード内における前記アンロールされたループのはじまり及び終わりを検出し、
前記始点指示及び終点指示の少なくとも一方は、前記予め定められた文字列の一部として、前記ソースコードを記述するコンピュータ言語によって定められた文字列を含む
付記７または付記８に記載のソースコード処理方法。
【０１１５】
（付記１０）
前記終点指示として、ｆｏｒ文の終わりを示す終わり括弧を用いる、付記９に記載のソースコード処理方法。
【０１１６】
（付記１１）
前記パターンをなす文は、
アンロールされる前のループで用いられるインデックスと、
前記アンロールされたループにおいて、前記インデックスに加算して用いられるサブインデックスとを含む、
付記７乃至付記１０のいずれか一項に記載のソースコード処理方法。
【０１１７】
（付記１２）
前記アンロールされたループが、前記インデックスを含む文が記述された第１の行と、前記第１の行の直後に続き、前記インデックスを含まない第２の行を含むとき、前記行比較段階は、前記第１の行を第１のパターンとして前記パターン管理テーブルに格納した後、前記第２の行を前記第１のパターンに結合する、付記１１に記載のソースコード処理方法。
【０１１８】
（付記１３）
入力されたソースコードに基づいてパターン管理テーブルを更新する行比較手段と、
前記パターン管理テーブルを格納する記憶装置である記憶手段と、
前記記憶手段に格納した前記パターン管理テーブルに基づいて、前記ループに含まれる前記パターンの繰り返しに係るパラメータを算出するパラメータ決定手段として、コンピュータを機能させるためのプログラムであって、
前記行比較手段は、
前記ソースコードに含まれる、アンロールされたループを１行ずつ読み出し、
前記読み出した行と、前記パターン管理テーブルに予め格納されたパターンとを比較し、
前記比較の結果、前記読み出した行が前記パターンに当てはまらない場合、前記読み出した行を新たなパターンとして前記パターン管理テーブルに格納し、前記読み出した行が前記パターンに当てはまる場合、前記行を示す行番号を前記パターンに当てはまるものとして前記パターン管理テーブルに格納する、
プログラム。
【０１１９】
（付記１４）
前記アンロールされたループは、複数のパターンを含み、
前記行比較手段は、前記複数のパターンを別々に前記パターン管理テーブルに格納し、
前記行比較手段は、前記比較において、前記複数のパターンそれぞれと前記読み出した行とを比較する
付記１３に記載のプログラム。
【０１２０】
（付記１５）
始点指示及び終点指示として予め定められた文字列に基づいて、前記ソースコード内における前記アンロールされたループのはじまり及び終わりを検出し、
前記始点指示及び終点指示の少なくとも一方は、前記予め定められた文字列の一部として、前記ソースコードを記述するコンピュータ言語によって定められた文字列を含む
付記１３または付記１４に記載のプログラム。
【０１２１】
（付記１６）
前記終点指示として、ｆｏｒ文の終わりを示す終わり括弧を用いる、付記１５に記載のプログラム。
【０１２２】
（付記１７）
前記パターンをなす文は、
アンロールされる前のループで用いられるインデックスと、
前記アンロールされたループにおいて、前記インデックスに加算して用いられるサブインデックスとを含む、
付記１３乃至付記１６のいずれか一項に記載のプログラム。
【０１２３】
（付記１８）
前記アンロールされたループが、前記インデックスを含む文が記述された第１の行と、前記第１の行の直後に続き、前記インデックスを含まない第２の行を含むとき、前記行比較手段は、前記第１の行を第１のパターンとして前記パターン管理テーブルに格納した後、前記第２の行を前記第１のパターンに結合する、付記１７に記載のプログラム。
【符号の説明】
【０１２４】
１  ソースコード処理システム
２、２Ａ、２Ｂ、２Ｃ、２Ｄ  ソースコード
３、３Ａ、３Ｂ、３Ｃ、３Ｄ  繰り返しパラメータ
４  行比較部
５  パターン管理テーブル
６  パラメータ決定部
１１、２２、４２、５２  ループ
１２、２１、４１、５１  始点指示
１３、３１、３２、４４、６１、６２  パターン
１４、３３、４５、６３  サブインデックス
１５、３４、４６、６４  レンジ
１５Ａ、３４Ａ、４６Ａ、６４Ａ  初期値
１５Ｂ、３４Ｂ、４６Ｂ、６４Ｂ  繰り返し回数
１５Ｃ、３４Ｃ、４６Ｃ、６４Ｃ  差分
４３  終点指示
【図１】
2019191925.tif 000003
【図２】
2019191925.tif 000004
【図３】
2019191925.tif 000005
【図４】
2019191925.tif 000006
【図５】
2019191925.tif 000007
【図６】
2019191925.tif 000008
【図７】
2019191925.tif 000009
【図８】
2019191925.tif 000010
【図９】
2019191925.tif 000011
【図１０】
2019191925.tif 000012
【図１１】
2019191925.tif 000013
【図１２】
2019191925.tif 000014
【図１３】
2019191925.tif 000015
【図１４】
2019191925.tif 000016
【図１５】
2019191925.tif 000017
【図１６】
2019191925.tif 000018
【図１７】
2019191925.tif 000019
【図１８】
2019191925.tif 000020
【図１９】
2019191925.tif 000021
【図２０】
2019191925.tif 000022
【図２１】
2019191925.tif 000023
【図２２】
2019191925.tif 000024
【図２３】
2019191925.tif 000025
【図２４】
2019191925.tif 000026
【図２５】
2019191925.tif 000027
【図２６】
2019191925.tif 000028
【図２７】
2019191925.tif 000029
【図２８】
2019191925.tif 000030