(57)【要約】【課題】シフト関数高速化のためのコンパイル方法を提供すること。【解決手段】シフト関数を高速化する処理で、シフト後の先頭要素になる要素番号を計算する文を生成し、元の文の直前に挿入する（４０１）。次に、シフト後の配列の先頭要素からシフト前の配列の最終要素までを参照するループを生成し、元の文の直前に挿入する（４０２）。次に、要素番号を１にする文を生成し、元の文の直前に挿入する（４０３）。次に、シフト前の配列の先頭要素から、シフト後の最終要素までを参照するループを生成し、元の文の直前に挿入する（４０４）。最後に、元の文を削除する（４０５）。【選択図】　図４
2004126835.tif 000002
【特許請求の範囲】
【請求項１】
シフト関数のシフト数が定数であることを認識するステップと、シフト後の配列参照をシフト前の配列要素番号を利用した２つのループを生成するステップとを有することを特徴とする、シフト関数高速化のためのコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、シフト関数の適用される文中で主記憶装置（メモリ）の参照回数を削減するコンパイル方法に関し、特にシフト関数に起因する性能の低下を削減するための、コンパイル方法に関する。
【０００２】
【従来の技術】
マイクロプロセッサ性能は、命令レベル並列性の向上や動作周波数の向上などにより、年々向上を続けている。これに対し、主記憶装置（メモリ）の性能はプロセッサ性能の向上に追いついてない。そのため、メモリの参照回数が多くなるとメモリ性能がネックとなり実行性能が低下してしまう場合がある。そのため、ソースプログラムをオブジェクトプログラムに変換するコンパイラにおいて、メモリの参照回数を削減することは、実行性能を向上させるために重要である。
【０００３】
一方、Ｆｏｒｔｒａｎ９０では、プログラム記述性を向上させるために、配列名の記述で配列演算が可能になっている。例えば、Ａ，Ｂ，ＣをサイズＮの配列とし、Ｂのｉ番目の要素とＣのｉ番目の要素を加算しＡのｉ番目の要素に代入することを１〜Ｎのすべてのｉについて行う場合は、Ａ＝Ｂ＋Ｃと記述すればよい。そうするとコンパイラは、これをループ繰り返し数がＮのループと認識しループの作成を行う。
【０００４】
また、Ｆｏｒｔｒａｎ９０では、配列に対し配列要素をある数だけシフトさせた結果を求めるＣＳＨＩＦＴという組み込み関数が存在する。この関数の詳しい動作については、下記する非特許文献１に記載されている。ここで、上記式で配列Ｂに対しシフト数２でＣＳＨＩＦＴ関数を適用した場合、つまり、Ａ＝ＣＳＨＩＦＴ（Ｂ，２）＋Ｃと記述した場合にコンパイラは、ＣＳＨＩＦＴ（Ｂ，２）の結果をワーク配列に代入するＷＯＲＫ＝ＣＳＨＩＦＴ（Ｂ，２）と、Ａ＝ＷＯＲＫ＋Ｃの２つの文と解釈し、それぞれの文に対しループ繰り返しがＮのループを作成する。ここでＷＯＲＫはサイズＮの配列とする。
【０００５】
【非特許文献１】
「東田幸樹、山本芳人、熊沢友信著：入門Ｆｏｒｔｒａｎ９０実線プログラミング、１９９４年、ソフトバンク（株）、３９５〜３９６頁」
【０００６】
【発明が解決しようとする課題】
上記の従来技術によれば、配列演算中にシフト関数を適用すると、ワーク配列への代入文が必要になってしまい、メモリの参照回数が多くなるという問題がある。
【０００７】
本発明の目的は、シフト関数の適用された文に対し、シフト後の配列参照をシフト前の配列要素番号を利用し、ワーク配列への代入文を削除、すなわち、メモリの参照回数を削減することにより、オブジェクトプログラムの実行性能を向上させるためのコンパイル方法を提供することにある。
【０００８】
【課題を解決するための手段】
本発明の目的は、シフト関数の適用された文に対し、シフト後の先頭要素からシフト前の最終要素までを参照するループと、シフト前の先頭要素から、シフト後の最終要素までを参照するループの２つのループを作成することにより達成する。
【０００９】
【発明の実施の形態】
以下、図面を用いて本発明の実施の形態を説明する。
【００１０】
図１は、本発明によるコンパイラが稼動する計算機システムの構成図である。計算機システムは、ＣＰＵ１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４、外部記憶装置１０７より構成されている。主記憶装置１０４には、コンパイラ１０５と、コンパイル処理過程で必要となる中間コード１０６が保持される。外部記憶装置１０７には、ソースプログラム１０８と、オブジェクトプログラム１０９が格納される。コンパイル処理は、コンパイラ１０５をＣＰＵ１０１で実行させることにより行われる。
【００１１】
図２は、コンパイラ１０５で行われるコンパイル処理の一例を示したフローチャートである。コンパイラ１０５は、構文解析２０１、シフト関数変換２０２、コード生成２０３からなる。構文解析２０１では、ソースプログラム１０８を読み込み、コンパイラ内部で処理可能な中間コード１０６を作成する。シフト関数変換２０２では、中間コード１０６を読み込み、中間コード中に出現するシフト関数情報を収集し、シフト関数高速化変換を行った中間コード１０６を生成する。コード生成２０３では、中間コード１０６を読み込み、オブジェクトプログラム１０９を生成する。
【００１２】
図３は、シフト関数変換２０２の処理の一例を示したフローチャートである。まずステップ３０１では、対象となるシフト関数のシフト数が定数であるかを調べる。シフト数が定数でない場合は、ステップ３０３に進み、ワーク配列を使用する従来のシフト関数変換を実施する。シフト数が定数である場合は、ステップ３０２に進み、シフト関数高速化変換を実施する。
【００１３】
図７は、シフト関数の動作を示した図の一例である。７０１は、配列要素が配列の先頭から何番目の要素であるかを示した番号である。７０２は、シフト前の配列要素が配列の先頭から何番目の要素かを示した番号である。この番号は、常に７０１の番号と同じになる。７０３は、配列要素を２つシフトさせた場合に、配列要素がシフト前の何番目の要素かを示した番号である。この図より、配列要素を２つシフトさせた後の先頭要素は、シフト前の３番目の配列要素であることが分かる。つまり、シフト後の先頭要素がシフト前の何番目の要素かを求めることができれば、その番号を使ってシフト後の配列参照を表現することが可能になる。しかし、ここで注意しなければいけないのは、配列をシフトさせることにより、シフト前の最終要素の次にシフト前の先頭要素が出現する場所が存在するということである。すなわち、シフト後の配列参照をシフト前の配列要素番号で参照する場合、配列要素番号が最終要素番号（＝Ｎ）になったら、次の配列要素番号を先頭要素番号（＝１）に設定する処理が必要になるということである。
【００１４】
図４は、本発明の方法による、シフト関数を高速化するための処理の一例を示したフローチャートである。まずステップ４０１では、シフト後の先頭要素がシフト前の何番目の要素かを求める式を生成し、元の文の直前に挿入する。ステップ４０２では、シフト後の先頭要素からシフト前の最終要素までを参照するループを生成し、元の文の直前に挿入する。ステップ４０３では、要素番号を１にする文を生成し、元の文の直前に挿入する。ステップ４０４では、シフト前の先頭要素から、シフト後の最終要素までを参照するループを生成し、元の文の直前に挿入する。ステップ４０５では、元の文を削除する。
【００１５】
図５は、シフト関数を適用しているソースプログラムの例である。このプログラムは、大きさＮの配列Ａ，Ｂ，Ｃが定義されており、配列Ｂの要素をシフト数２だけシフトさせた結果と配列Ｃを加算した結果を配列Ａに代入することを表現している。
【００１６】
図５のソースプログラムに対し、図４のシフト高速化変換を適用した結果を図６に示す。まず、ステップ４０１の処理によりシフト後の先頭要素がシフト前の何番目の要素かを求めるために６０２が生成される。ここで、ＭＯＤＵＬＯとは剰余算を計算する関数とする。また、ＦＯＲＴＲＡＮでは、特別な指示がなければ配列の先頭要素番号が１になるため、ＭＯＤＵＬＯの結果に１を加えたものがシフト後の先頭要素になる要素番号となる（６０３）。次にステップ４０２で、前半ループ６０４〜６０７が生成される。前半ループの繰り返しは、１から配列の大きさＮからシフト数を減算したものと配列の大きさＮの小さいほうまでとなる。また、ループ内での配列要素参照は、シフト関数の対象になっている配列（Ｂ）は要素番号計算で生成したＩＮＤＥＸを用い、その他の配列はループ制御変数（Ｉ）を用いる。次にステップ４０３で、要素番号を１にする６０８が生成される。次にステップ４０４で、後半ループ６０９〜６１２が生成される。後半ループの繰り返しは、前半ループの次の繰り返しから配列サイズＮまでとなる。また、ループ内での配列参照は、前半ループと同じく、シフト関数の対象になっている配列（Ｂ）はＩＮＤＥＸを用い、その他の配列はＩを用いる。この変換により、ワーク配列を使用しないコードが作成できる。また、ループを２つに分割することによって、ループ内にｉｆ文が残らないという利点もある。
【００１７】
本実施例では１次元配列の場合について説明したが、多次元配列の場合についても、各次元のシフト数が定数であれば図４の処理を各次元に対して適用することにより、ワーク配列を使用しないコードが生成できる。
【００１８】
【発明の効果】
本発明によれば、シフト関数の適用された文に対し、ワーク配列を使用しないコードが生成できるため、メモリの参照回数を削減することができ、オブジェクトコードの実行性能向上につながる。
【図面の簡単な説明】
【図１】コンパイラが稼動するシステムの構成図。
【図２】コンパイラの処理手順を示す図。
【図３】シフト関数変換の処理手順を示す図。
【図４】シフト関数高速化変換の処理手順を示す図。
【図５】ソースプログラムの例を示す図。
【図６】シフト関数高速化変換の例を示す図。
【図７】シフト関数動作例を示す図。
【符号の説明】
４０１…シフト後の先頭要素になる要素番号を計算する文を生成する処理、４０２…前半ループを生成する処理、４０３…要素番号を１にする文を生成する処理、４０４…後半ループを生成する処理、４０５…元の文を削除する処理。
【図１】
2004126835.tif 000003
【図２】
2004126835.tif 000004
【図３】
2004126835.tif 000005
【図４】
2004126835.tif 000006
【図５】
2004126835.tif 000007
【図６】
2004126835.tif 000008
【図７】
2004126835.tif 000009