(57)【特許請求の範囲】
【請求項１】
配列演算を含むソースプログラムをコンパイルするコンパイラ装置であって、
コンパイル処理における構文の解析の際に、前記配列演算に用いられる変数の取り得る数値範囲を解析し、前記配列演算に用いられる変数の取り得る数値範囲を用いて前記配列演算の演算値を格納する変数の取り得る数値範囲を解析する変数範囲解析部と、
前記配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、前記扱うことができる数値範囲が最も狭いデータ型と前記配列演算を含むソースプログラムから抽出される前記配列演算のデータ型とが一致するかどうかを判定するデータ型判定部と、
前記データ型判定部によって一致しないと判定された場合に、前記扱うことができる数値範囲が最も狭いデータ型で前記配列演算を行なう中間コードが生成されるように、前記配列演算のデータ型を変更するデータ型変更部とを少なくとも有することを特徴とするコンパイラ装置。
【請求項２】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数の上限値と下限値とが定義されている場合に、前記変数範囲解析部が、前記上限値と前記下限値とに基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１記載のコンパイラ装置。
【請求項３】
前記配列演算に用いられる変数がイテレータ変数であり、前記配列演算に用いられる変数の上限値と下限値とが、前記イテレータ変数における初期値、終了条件及び増分値によって定義されている請求項２記載のコンパイラ装置。
【請求項４】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数に定数値が代入されている場合に、前記変数範囲解析部が、前記定数値を、前記配列演算に用いられる変数の取り得る数値範囲とする請求項１記載のコンパイラ装置。
【請求項５】
前記配列演算に用いられる変数が代入式の左辺である場合に、前記変数範囲解析部が、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲を解析し、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１記載のコンパイラ装置。
【請求項６】
前記変数範囲解析部が、前記代入式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記代入式の極値を算出することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項５記載のコンパイラ装置。
【請求項７】
前記変数範囲解析部が、前記代入式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記代入式の右辺に含まれる全ての変数の上限値及び下限値のみを前記代入式に代入することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項５記載のコンパイラ装置。
【請求項８】
前記代入式の右辺に含まれる変数のうち少なくとも一つの変数において、上限値及び下限値の両方が定義されていない場合に、前記変数範囲解析部が、前記配列演算に用いられる変数において宣言されたデータ型が扱うことができる数値範囲を、前記上限値及び下限値の両方が定義されていない変数の取り得る数値範囲とする請求項５記載のコンパイラ装置。
【請求項９】
前記変数範囲解析部が、前記配列演算の式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記配列演算の極値を算出することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項１記載のコンパイラ装置。
【請求項１０】
前記変数範囲解析部が、前記配列演算の式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記配列演算の式の右辺に含まれる前記配列演算に用いられる変数の上限値及び下限値のみを前記配列演算の式に代入することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項１記載のコンパイラ装置。
【請求項１１】
配列演算を含むソースプログラムをコンパイルする方法であって、
（ａ）コンパイル処理における構文の解析の際に、前記配列演算に用いられる変数の取り得る数値範囲を解析し、前記配列演算に用いられる変数の取り得る数値範囲を用いて前記配列演算の演算値を格納する変数の取り得る数値範囲を解析する工程と、
（ｂ）前記配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、前記扱うことができる数値範囲が最も狭いデータ型と前記配列演算を含むソースプログラムから抽出される前記配列演算のデータ型とが一致するかどうかを判定する工程と、
（ｃ）一致しないと判定した場合に、前記扱うことができる数値範囲が最も狭いデータ型で前記配列演算を行なう中間コードが生成されるように、前記配列演算のデータ型を変更する工程とを少なくとも有することを特徴とするコンパイル方法。
【請求項１２】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数の上限値と下限値とが定義されている場合に、前記上限値と前記下限値とに基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１１記載のコンパイル方法。
【請求項１３】
前記配列演算に用いられる変数がイテレータ変数であり、前記配列演算に用いられる変数の上限値と下限値とが、前記イテレータ変数における初期値、終了条件及び増分値によって定義されている請求項１２記載のコンパイル方法。
【請求項１４】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数に定数値が代入されている場合に、前記定数値を、前記配列演算に用いられる変数の取り得る数値範囲とする請求項１１記載のコンパイル方法。
【請求項１５】
前記配列演算に用いられる変数が代入式の左辺である場合に、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲を解析し、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１１記載のコンパイル方法。
【請求項１６】
前記代入式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記代入式の極値を算出することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１５記載のコンパイル方法。
【請求項１７】
前記代入式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記代入式の右辺に含まれる全ての変数の上限値及び下限値のみを前記代入式に代入することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項１５記載のコンパイル方法。
【請求項１８】
前記代入式の右辺に含まれる変数のうち少なくとも一つの変数において、上限値及び下限値の両方が定義されていない場合に、前記配列演算に用いられる変数において宣言されたデータ型が扱うことができる数値範囲を、前記上限値及び下限値の両方が定義されていない変数の取り得る数値範囲とする請求項１５記載のコンパイル方法。
【請求項１９】
前記配列演算の式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記配列演算の極値を算出することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項１１記載のコンパイル方法。
【請求項２０】
前記配列演算の式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記配列演算の式の右辺に含まれる前記配列演算に用いられる変数の上限値及び下限値のみを前記配列演算の式に代入することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項１１記載のコンパイル方法。
【請求項２１】
配列演算を含むソースプログラムをコンパイルする方法を、コンピュータに実行させるためのプログラムであって、
（ａ）コンパイル処理における構文の解析の際に、前記配列演算に用いられる変数の取り得る数値範囲を解析し、前記配列演算に用いられる変数の取り得る数値範囲を用いて前記配列演算の演算値を格納する変数の取り得る数値範囲を解析するステップと、
（ｂ）前記配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、前記扱うことができる数値範囲が最も狭いデータ型と前記配列演算を含むソースプログラムから抽出される前記配列演算のデータ型とが一致するかどうかを判定するステップと、
（ｃ）一致しないと判定した場合に、前記扱うことができる数値範囲が最も狭いデータ型で前記配列演算を行なう中間コードが生成されるように、前記配列演算のデータ型を変更するステップとを少なくとも有することを特徴とするコンピュータに実行させるプログラム。
【請求項２２】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数の上限値と下限値とが定義されている場合に、前記上限値と前記下限値とに基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項２１記載のプログラム。
【請求項２３】
前記配列演算に用いられる変数がイテレータ変数であり、前記配列演算に用いられる変数の上限値と下限値とが、前記イテレータ変数における初期値、終了条件及び増分値によって定義されている請求項２２記載のプログラム。
【請求項２４】
前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数に定数値が代入されている場合に、前記定数値を、前記配列演算に用いられる変数の取り得る数値範囲とする請求項２１記載のプログラム。
【請求項２５】
前記配列演算に用いられる変数が代入式の左辺である場合に、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲を解析し、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項２１記載のプログラム。
【請求項２６】
前記代入式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記代入式の極値を算出することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項２５記載のプログラム。
【請求項２７】
前記代入式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記代入式の右辺に含まれる全ての変数の上限値及び下限値のみを前記代入式に代入することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析する請求項２５記載のプログラム。
【請求項２８】
前記代入式の右辺に含まれる変数のうち少なくとも一つの変数において、上限値及び下限値の両方が定義されていない場合に、前記配列演算に用いられる変数において宣言されたデータ型が扱うことができる数値範囲を、前記上限値及び下限値の両方が定義されていない変数の取り得る数値範囲とする請求項２５記載のプログラム。
【請求項２９】
前記配列演算の式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記配列演算の極値を算出することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項２１記載のプログラム。
【請求項３０】
前記配列演算の式が一次式であるか又は多次式であるかを判別し、一次式である場合に、前記配列演算の式の右辺に含まれる前記配列演算に用いられる変数の上限値及び下限値のみを前記配列演算の式に代入することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析する請求項２１記載のプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、配列演算を含むプログラムのコンパイルに関し、特にはベクトル化コンパイラ装置及びベクトル化コンパイル方法に関する。
【０００２】
【従来の技術】
図８は、従来のベクトル化コンパイラ装置を示す概略構成図である。図８に示すように、従来のベクトル化コンパイラ装置は、構文解析部６１、ベクトル化部６３、最適化部６５、コード生成部６７とで構成されている。ベクトル化コンパイラ装置は、最初にソースプログラム６０を入力として受け取る。
【０００３】
ソースプログラム６０は構文解析部６１に渡され、構文解析が行なわれる。その結果、ソースプログラム６０の原始言語とオブジェクトコード６８の目的言語との橋渡しをする中間コード６２が生成される。
【０００４】
中間コード６２は、後のベクトル化や最適化を実行しやすくするために生成されている。次に、中間コード６２はベクトル化部６３に渡され、中間コード６２のベクトル化判定及びベクトル化の実行が行なわれる。これによって、ベクトル化が可能な中間コード６２はベクトル化されているベクトル化中間コード６４に変換される。
【０００５】
ベクトル化中間コード６４は最適化部６５に渡され、ある種の最適化が施されて最適化中間コード６６が生成される。最適化中間コード６６はコード生成部６７に渡され、オブジェクトコード６８がベクトル化コンパイラ装置より出力される。
【０００６】
図９は、図８に示した従来のベクトル化コンパイラ装置における構文解析部を示す構成図である。図９に示すように、構文解析部６１は、構文認識部７０、シンボルテーブル登録部７１、配列演算部７２、構文処理部（１〜ｎ）７３、エラー処理部７４、及び中間コード生成部７５で構成されている。
【０００７】
構文認識部７０は、読み込んだソースプログラム６０が、プログラム言語のどの構文に該当するかを認識する。シンボルテーブル登録部７１はシンボルテーブルと呼ばれるデータベースを備えており、構文認識部７０でプログラムの解析対象が変数宣言や定義であると判定された場合に呼び出され、少なくとも変数の名前（シンボル名）やその変数のデータ型の情報（シンボル情報）をシンボルテーブルに登録する。
【０００８】
配列演算部７２は、構文認識部７０でプログラムの解析対象が配列の演算であると判定された場合に呼び出され、少なくともプログラムに記述されている配列演算の種類やオペランドのデータ型、オペランドの値を解析してその情報を中間コード生成部７５に渡す。
【０００９】
構文処理部７３は、配列演算部７２と同列のもので、配列演算以外の構文が現れた場合に構文認識部７０から呼び出され、その構文に対応する解析処理を行ない中間コード生成部７５に詳細情報を渡す。なお、各構文に対応する解析処理については、本明細書において重要ではないので省略する。
【００１０】
エラー処理部７４は、構文認識部７０で構文が認識できない場合に呼び出され、エラー処理を行なう。中間コード生成部７５は、配列演算部７２や構文処理部７３から中間コード６２を生成するために必要な情報を受け取り、その情報に対応する中間コード６２を生成する。
【００１１】
図１０は、図９に示した従来のベクトル化コンパイラ装置を構成する構文解析部の処理を示す流れ図である。図１０に示すように、最初に構文認識部７０により、ソースプログラム６０の読み込みが行なわれる。（ステップＳ２００）。次に、構文認識部７０により、読み込まれたソースプログラム６０から文が抽出されて解析が行なわれ（ステップＳ２０１）、更にプログラム文の解析対象が変数宣言又は定義であるかの判定が行なわれる（ステップＳ２０２）。
【００１２】
判定が真の場合、シンボルテーブル登録部７１は変数名やデータ型をシンボルテーブルに登録する（ステップＳ２１０）。その後ステップＳ２０３に移行する。一方、判定が偽の場合は、そのままステップＳ２０３に移行する。
【００１３】
ステップＳ２０３では、構文認識部７０により、プログラム文の解析対象が配列演算であるかどうかの判定が行なわれる。配列演算の判定が真の場合、配列演算部７２により演算の種類、演算のデータ型、値に関する情報が抽出される（ステップＳ２２０）。その後、中間コード生成部７５により、抽出された情報をもとに中間コード６２が生成され（ステップＳ２４０）、構文認識部７０によりプログラムの終了判定が行なわれる（ステップＳ２０６）。解析中のソースプログラム６０のうち、配列演算に対する中間コード６２は、この一連の処理（ステップＳ２２０及びＳ２４０）により生成される。
【００１４】
配列演算の判定が偽であれば、構文認識部７０により、配列演算以外の他の構文であるかどうか、即ち構文処理部（１〜ｎ）のうちのいずれかが対応する構文であるかどうかの判定が行なわれる（ステップＳ２０４）。
【００１５】
真の場合は、対応する構文処理部により構文処理が行なわれ、中間コード６２を生成するために必要な情報が抽出される（ステップＳ２３０）。その後、中間コード生成部７５により、抽出された情報に基づいて中間コード６２が生成される（ステップＳ２４０）。更に、構文認識部７０によりプログラムの終了判定が行なわれる（ステップＳ２０６）。
【００１６】
一方、判定が偽の場合は、構文認識部７０により、構文エラー処理が実行される（ステップＳ２０５）。その後、構文認識部７０により、プログラムの終了判定が行なわれる（ステップＳ２０６）。
【００１７】
なお、ステップＳ２０６におけるプログラムの終了判定では、構文認識部７０により、解析中のソースプログラム６０が終了したかどうかが判定される。真の場合は、ベクトル化部６３に処理が移される。偽の場合は、ステップＳ２０１に戻り、残りのソースプログラム６０の解析が続行される。
【００１８】
以上のような処理によって、図８及び図９で示した構文解析部６１は、中間コード６２を生成する。生成された中間コード６２の特徴として、配列演算に対する中間コード６２は、ソースプログラム６０の中で宣言された配列のデータ型で生成されていることが挙げられる。
【００１９】
図１１は、具体的なソースプログラムの一例、従来のベクトル化コンパイラ装置を使用した場合のシンボルテーブルの一例、及び中間コードの一例を示す図である。なお、以下の説明においては、適宜図１０を引用して説明する。
【００２０】
図１１に示すように、入力されたソースプログラム６０の各文（（１）〜（１２））に対して構文解析が行なわれる。先ず、（１）の文は引数なしでｃｈａｒ型を返す関数ｇの宣言であるので、ステップＳ２１０（図１０）において、シンボル名（変数名）とそのデータ型がシンボルテーブル６９に登録される。
【００２１】
また、（１）の文は配列演算に該当せず、構文処理としては変数宣言の分類にあたるので、ステップＳ２０４（図１０）の判定が真となる。よって、ステップＳ２３０（図１０）に移り、ここで変数宣言に対する構文解析処理が行なわれ、ステップＳ２４０（図１０）において変数宣言に対する中間コードが生成される。その後、ステップＳ２０６（図１０）において、プログラムの終了判定が行なわれる。プログラムに続きがあるので、再度ステップＳ２０１（図１０）に移り、処理が続行される。なお、ステップＳ２０４（図１０）、ステップＳ２３０（図１０）の処理は、配列演算に該当する（１１）以外のすべてのプログラム文で行なわれるので、以降は説明を省略する。
【００２２】
次に（２）の文は、配列変数ａ、ｂ、ｃの宣言であるので、ステップＳ２１０（図１０）においてシンボル名及びそのデータ型がシンボルテーブル６９に登録される。（３）、（４）、（５）の各文はそれぞれ初期値を有する変数定義であるので、同様にステップＳ２１０においてシンボル名とそのデータ型がシンボルテーブル６９に登録される。
【００２３】
（６）の文では新しい変数ｉが定義されているので、これに対してもステップＳ２１０において、シンボル名とデータ型がシンボルテーブル６９に登録される。（７）、（８）の文では、配列変数ｂとｃに対する代入式なので、変数の定義とみなされ、ステップＳ２１０において変数名やデータ型を登録しようとするが、既に登録されているので、そのまま処理を終える。（１０）の文では新しい変数ｊが定義されているので、これに対してもシンボル名とそのデータ型がシンボルテーブル６９に登録される。
【００２４】
次に、ｆｏｒ構文の本体である（１１）の文は配列演算であるので、ステップＳ２２０においてソースプログラム６０やシンボルテーブル６９から演算の種類、演算のデータ型及び値が抽出される。その後、ステップＳ２４０において、抽出された演算のデータ型で演算を行なう中間コード６２が生成される。
【００２５】
図１１に示す例では、演算対象の配列要素ｂやｃはｉｎｔ型であることがシンボルテーブル６９よりわかる。これより、演算種類が＋（加算）、演算データ型がｉｎｔ型、第１オペランドがｂ〔ｊ〕、第２オペランドがｃ〔ｊ〕である中間コード６２が生成される。上記したように、従来のベクトル化コンパイラ装置で生成される配列演算に対する中間コード６２は、ソースプログラム６０の中で宣言されたデータ型（図１１の例ではｉｎｔ型）で生成されていることがわかる。
【００２６】
この中間コード６２がベクトル化部６３に渡され、中間コード６２の演算とデータ型に該当するベクトル命令が存在すれば、その演算の並列度に対応するベクトル化中間コード６４が生成される。図１１の例では、２並列ｉｎｔ型ベクトル加算演算が存在することを仮定しているので、並列度が２のｉｎｔ型加算演算（ｉｎｔ〔２〕でｉｎｔの２並列を表現）を表すベクトル化中間コード６４が生成される。
【００２７】
従って、ソースプログラム６０に記述されているｆｏｒループ内の配列演算ａ〔ｊ〕＝ｂ〔ｊ〕＋ｃ〔ｊ〕は、ａ〔０〕＝ｂ〔０〕＋ｃ〔０〕とａ〔１〕＝ｂ〔１〕＋ｃ〔１〕、ａ〔２〕＝ｂ〔２〕＋ｃ〔２〕とａ〔３〕＝ｂ〔３〕＋ｃ〔３〕、ａ〔４〕＝ｂ〔４〕＋ｃ〔４〕とａ〔５〕＝ｂ〔５〕＋ｃ〔５〕、ａ〔６〕＝ｂ〔６〕＋ｃ〔６〕とａ〔７〕＝ｂ〔７〕＋ｃ〔７〕、ａ〔８〕＝ｂ〔８〕＋ｃ〔８〕とａ〔９〕＝ｂ〔９〕＋ｃ〔９〕との組み合わせで並列に行なわれる。即ち、通常１０回（ｊ＝０、１、・・・８、９）行なわれる配列演算は、５回（ｊ＝０、２、４、６、８）の並列配列演算で実行可能となる。
【００２８】
以上のように、従来のベクトル化コンパイラ装置では、ソースプログラム６０の中で演算対象について宣言されたデータ型で配列演算が実行されるように中間コード６２が生成され、この中間コード６２がベクトル化部６３に渡される。よって、ベクトル化中間コード６４もソースプログラム６０の中で演算対象について宣言されたデータ型で配列演算が実行されるように生成される。
【００２９】
【発明が解決しようとする課題】
ところで、一般的に、ベクトル化に対応する命令は、演算対象のデータ型のサイズが小さいほど、並列度が高まり高速に演算が実行できる。具体例を挙げると、アーキテクチャが持つレジスタのレジスタ長が６４ｂｉｔの場合、ｉｎｔ型３２ｂｉｔの演算であれば、２（＝６４／３２）並列の演算が可能であるのに対し、ｓｈｏｒｔデータ型１６ｂｉｔの演算であれば、４（＝６４／１６）並列、ｃｈａｒ型８ｂｉｔの演算であれば、８（＝６４／８）並列の演算が可能である。このことから、配列演算のデータ型（演算対象について宣言されたデータ型）のサイズを小さくしてベクトル化を行なうことが理想である。
【００３０】
しかし、上記した従来のベクトル化コンパイラ装置では、配列に格納される可能性のある値、即ち配列演算の演算値であるａ〔ｊ〕に格納される値の上限値及び下限値を解析することは行われていない。よって、演算値の取り得る数値範囲がプログラム中で宣言されたデータ型よりも小さいデータ型（扱うことができる数値範囲の狭いデータ型）の数値範囲に収まっている場合でも、より小さいデータ型でベクトル化は行われず、最初に演算対象について宣言されたデータ型でベクトル化の実行が行われる。そのため、上記した従来のベクトル化コンパイラ装置では、理想的なベクトル化、即ち、配列演算の演算値を扱うことのできる最小のデータ型でベクトル化を行なうことができず、演算の高速化が図れないという問題がある。
【００３１】
本発明の目的は、配列演算の演算値の取り得る数値範囲を解析して、配列演算の演算値を扱うことのできる最小のデータ型でベクトル化を行ない得るコンパイラ装置及びコンパイル方法を提供することにある。
【００３２】
【課題を解決するための手段】
上記目的を達成するために本発明にかかるコンパイラ装置は、配列演算を含むソースプログラムをコンパイルするコンパイラ装置であって、コンパイル処理における構文の解析の際に、前記配列演算に用いられる変数の取り得る数値範囲を解析し、前記配列演算に用いられる変数の取り得る数値範囲を用いて前記配列演算の演算値を格納する変数の取り得る数値範囲を解析する変数範囲解析部と、前記配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、前記扱うことができる数値範囲が最も狭いデータ型と前記配列演算を含むソースプログラムから抽出される前記配列演算のデータ型とが一致するかどうかを判定するデータ型判定部と、前記データ型判定部によって一致しないと判定された場合に、前記扱うことができる数値範囲が最も狭いデータ型で前記配列演算を行なう中間コードが生成されるように、前記配列演算のデータ型を変更するデータ型変更部とを少なくとも有することを特徴とする。
【００３３】
上記本発明にかかるコンパイラ装置においては、前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数の上限値と下限値とが定義されている場合に、前記変数範囲解析部は、前記上限値と前記下限値とに基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００３４】
この場合、前記配列演算に用いられる変数がイテレータ変数であれば、前記配列演算に用いられる変数の上限値と下限値とは、前記イテレータ変数における初期値、終了条件及び増分値によって定義されている。
【００３５】
上記本発明にかかるコンパイラ装置においては、前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数に定数値が代入されている場合に、前記変数範囲解析部は、前記定数値を、前記配列演算に用いられる変数の取り得る数値範囲とすることができる。
【００３６】
また、上記本発明にかかるコンパイラ装置においては、前記配列演算に用いられる変数が代入式の左辺である場合に、前記変数範囲解析部は、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲を解析し、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００３７】
この態様においては、前記変数範囲解析部は、前記代入式が一次式であるか又は多次式であるかを判別し、多次式である場合は、前記代入式の極値を算出することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。一方、一次式である場合は、前記代入式の右辺に含まれる全ての変数の上限値及び下限値のみを前記代入式に代入することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００３８】
また、この態様においては、前記代入式の右辺に含まれる変数のうち少なくとも一つの変数において、上限値及び下限値の両方が定義されていない場合に、前記変数範囲解析部は、前記配列演算に用いられる変数において宣言されたデータ型が扱うことができる数値範囲を、前記上限値及び下限値の両方が定義されていない変数の取り得る数値範囲とすることができる。
【００３９】
上記本発明にかかるコンパイラ装置においては、前記変数範囲解析部は、前記配列演算の式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記配列演算の極値を算出することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析することができる。一方、一次式である場合に、前記配列演算の式の右辺に含まれる前記配列演算に用いられる変数の上限値及び下限値のみを前記配列演算の式に代入することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析することができる。
【００４０】
次に、上記目的を達成するために本発明にかかるコンパイル方法は、配列演算を含むソースプログラムをコンパイルする方法であって、（ａ）コンパイル処理における構文の解析の際に、前記配列演算に用いられる変数の取り得る数値範囲を解析し、前記配列演算に用いられる変数の取り得る数値範囲を用いて前記配列演算の演算値を格納する変数の取り得る数値範囲を解析する工程と、（ｂ）前記配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、前記扱うことができる数値範囲が最も狭いデータ型と前記配列演算を含むソースプログラムから抽出される前記配列演算のデータ型とが一致するかどうかを判定する工程と、（ｃ）一致しないと判定した場合に、前記扱うことができる数値範囲が最も狭いデータ型で前記配列演算を行なう中間コードが生成されるように、前記配列演算のデータ型を変更する工程とを少なくとも有することを特徴とする。
【００４１】
上記本発明にかかるコンパイル方法においては、前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数の上限値と下限値とが定義されている場合に、前記上限値と前記下限値とに基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００４２】
この場合、前記配列演算に用いられる変数がイテレータ変数であれば、前記配列演算に用いられる変数の上限値と下限値とが、前記イテレータ変数における初期値、終了条件及び増分値によって定義されている。
【００４３】
上記本発明にかかるコンパイル方法においては、前記配列演算を含むソースプログラム中において、前記配列演算に用いられる変数に定数値が代入されている場合に、前記定数値を、前記配列演算に用いられる変数の取り得る数値範囲とすることができる。
【００４４】
また、上記本発明にかかるコンパイル方法においては、前記配列演算に用いられる変数が代入式の左辺である場合に、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲を解析し、前記代入式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００４５】
この態様においては、前記代入式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記代入式の極値を算出することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。一方、一次式である場合に、前記代入式の右辺に含まれる全ての変数の上限値及び下限値のみを前記代入式に代入することによって、前記配列演算に用いられる変数の取り得る数値範囲を解析することができる。
【００４６】
また、この態様においては、前記代入式の右辺に含まれる変数のうち少なくとも一つの変数において、上限値及び下限値の両方が定義されていない場合に、前記配列演算に用いられる変数において宣言されたデータ型が扱うことができる数値範囲を、前記上限値及び下限値の両方が定義されていない変数の取り得る数値範囲とすることができる。
【００４７】
上記本発明にかかるコンパイル方法においては、前記配列演算の式が一次式であるか又は多次式であるかを判別し、多次式である場合に、前記配列演算の極値を算出することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析することができる。一方、一次式である場合に、前記配列演算の式の右辺に含まれる前記配列演算に用いられる変数の上限値及び下限値のみを前記配列演算の式に代入することによって、前記配列演算の演算値を格納する変数が取り得る数値範囲を解析することができる。
【００４８】
本発明は、上記の本発明にかかるコンパイル方法を具現化するためのプログラムであっても良い。この場合、かかるプログラムをコンピュータにインストールして実行することにより、上記の本発明にかかるコンパイラ装置を実現することができる。なお、本発明でいう「配列演算」とはベクトル化の対象となる配列演算をいう。
【００４９】
【発明の実施の形態】
（実施の形態１）
以下、本発明の実施の形態にかかるコンパイラ装置及びコンパイル方法について、図１〜図５を参照しながら説明する。最初に、図１に基づいて本実施の形態にかかるコンパイラ装置について説明する。図１は、本実施の形態にかかるコンパイラ装置の構成を示す概略構成図である。
【００５０】
図１に示すように本実施の形態にかかるコンパイラ装置は、図８に示した従来のコンパイラ装置と同様に、ソースプログラム２０の構文解析を行なって中間コード５を生成する構文解析部１と、中間コード５をベクトル化中間コード６に変換するベクトル化部２、ベクトル化中間コード６を最適化中間コード７に変換する最適化部３、及び最適化中間コード７からオブジェクトコード２１を生成するコード生成部４で構成されている。
【００５１】
しかし、本実施の形態にかかるコンパイラ装置では、構文解析部１の構成や機能が図８で示した従来のコンパイラ装置と異なっている。なお、ベクトル化部２、最適化部３及びコード生成部４は、図８に示されたものと構成及び機能において同じである。本実施の形態にかかるコンパイラ装置における構文解析部１について以下に説明する。
【００５２】
図１に示すように、構文解析部１は、構文認識部１０、シンボルテーブル登録部１１、配列演算部１２、構文処理部（１〜ｎ）１３、エラー処理部１４、中間コード生成部１５、変数範囲解析部１６、データ型判定部１７及びデータ型変更部１８で構成されている。このうち、構文認識部１０、シンボルテーブル登録部１１、配列演算部１２、構文処理部（１〜ｎ）１３、エラー処理部１４及び中間コード生成部１５は、図９で示したものと同様のものである。本実施の形態にかかるコンパイラ装置は、変数範囲解析部１６、データ型判定部１７及びデータ型変更部１８が備えられている点で、従来のコンパイラ装置と異なっている。
【００５３】
変数範囲解析部１６は、ソースプログラム２０のコンパイル処理における構文解析の際に、ソースプログラム２０中で用いられている変数の取り得る数値範囲（上限値及び下限値）を解析する機能を有している。なお、変数範囲解析部１６は、変数が配列演算の演算値を格納する変数である場合は、配列演算に用いられる変数について解析した数値範囲に基づいて解析を行なう。
【００５４】
データ型判定部１７は、配列演算の演算値を格納する変数が取り得る数値範囲を扱うことができるデータ型の中から扱うことができる数値範囲が最も狭いデータ型を検出し、この扱うことができる数値範囲が最も狭いデータ型と配列演算のデータ型とが一致するかどうかを判定する機能を有している。なお、判定対象となる配列演算のデータ型は、ソースプログラム２０中で宣言されたデータ型であり、ソースプログラム２０から抽出される。
【００５５】
また、データ型変更部１８は、データ型が一致しない場合に、扱うことができる数値範囲が最も狭いデータ型で配列演算を行なう中間コードが生成されるように、配列演算のデータ型を変更する機能を有している。
【００５６】
次に、図２を用いて、図１に示すコンパイラ装置における処理及び本実施の形態にかかるコンパイル方法について説明する。図２は、図１に示すコンパイラ装置における処理の流れ及び本実施の形態にかかるコンパイル方法を示す流れ図である。なお、図２では構文解析部１における処理の流れのみが示されており、ベクトル化部２、最適化部３及びコード生成部４における処理の流れについては省略している。ベクトル化部２、最適化部３及びコード生成部４においては、従来と同様の処理が行われる。また、図１を適宜参酌しながら説明する。
【００５７】
図２に示すように、最初に構文認識部１０（図１参照）により、ソースプログラム２０の読み込みを行ない（Ｓ１）、更にソースプログラム２０から一つのプログラム文を抽出して解析を行なう（Ｓ２）。ソースプログラム２０には配列演算が含まれている。
【００５８】
次に、構文認識部１０により、抽出されたプログラム文が変数宣言又は定義であるかどうかの判定を行なう（Ｓ３）。変数宣言や定義でない場合は、ステップＳ４へと移行する。
【００５９】
一方、変数宣言又は変数の定義である場合は、シンボルテーブル登録部１１により、変数の名前や宣言されたデータ型といった情報をシンボルテーブルに登録する（Ｓ１０）。更に、この場合は、変数範囲解析部１６により、シンボルテーブルに登録された情報から、抽出されたプログラム文が変数の定義であるかどうかの判断を行なう（ステップＳ１１）。
【００６０】
判断の結果、定義でない場合は、ステップＳ４へと移行する。変数の定義である場合は、変数範囲解析部１６により、変数が取り得る数値範囲の解析を行ない、解析された数値範囲をシンボルテーブルに登録する（ステップＳ１２）。この数値範囲の解析は、ソースプログラム２０中になされた変数の定義に基づいて、変数に格納される可能性のある値の上限値及び下限値を、数学的手段を用いて算出することによって行なう。
【００６１】
なお、取り得る数値範囲の解析は、解析対象となる変数が、配列演算の演算値を格納するものであるのか、又は配列演算に用いられるものであるのかに拘わらず行なう。変数が配列演算の演算値を格納する変数である場合は、配列演算に用いられる変数について解析した数値範囲に基づいて解析を行なう。なお、ステップＳ１２の具体的な内容については、後述の図３において説明する。その後ステップＳ４へと移行する。
【００６２】
ステップＳ４では、配列演算部１２により、プログラム文の解析対象が配列演算であるかどうかの判定を行なう。配列演算である場合は、配列演算部１２により、演算の種類、演算対象オペランドのシンボルを抽出し、シンボルテーブルから、抽出したシンボルのデータ型（配列演算のデータ型）、値（演算値を格納する変数が取り得る数値範囲）に関する情報を抽出し、これらの情報をシンボルテーブルに登録する（ステップＳ２０）。更に、データ型判定部１７により、ステップＳ１２で解析した演算値を格納する変数が取り得る数値範囲に基づいて、この数値範囲を扱うことができるデータ型の中から、扱うことができる数値範囲が最も狭いデータ型を検出し、この扱うことができる数値範囲が最も狭いデータ型とステップＳ２０で抽出した配列演算のデータ型とが一致するかどうかを判定する（ステップＳ２１）。
【００６３】
扱うことができる数値範囲が最も狭いデータ型とステップＳ２０で抽出した配列演算のデータ型とが一致する場合は、ステップＳ４０へと移行する。一方、一致しない場合は、データ型変更部１８により、扱うことができる数値範囲が最も狭いデータ型で配列演算を行なう中間コードが生成されるように、配列演算のデータ型を変更する（ステップＳ２２）。その後、ステップＳ４０へと移行する。なお、ステップＳ２１及びＳ２２の具体的な内容については、後述の図４において説明する。
【００６４】
ステップＳ４０では、配列演算部１２で抽出された情報及びデータ型変更部１８によって変更された情報に基づき、中間コード生成部１５により、中間コード５を生成する。中間コードの生成後、ステップＳ７へと移行する。解析中のプログラムのうち、配列演算に対する中間コード５はこの一連の処理（ステップＳ２０〜Ｓ２２及びＳ４０）により生成される。
【００６５】
ステップＳ４における判定において、配列演算でないと判定した場合は、構文認識部１０により、配列演算以外の他の構文であるかどうか、即ち構文処理部（１〜ｎ）１３のうちのいずれかが対応する構文であるかどうかの判定を行なう（ステップＳ５）。配列演算以外の他の構文である場合は、対応する構文処理部１３により、構文処理を行なって配列演算以外のプログラム文に対する中間コード５を生成するために必要な情報を抽出する（ステップＳ３０）。
【００６６】
更に、ステップＳ３０で抽出された情報に基づいて、中間コード生成部１５により、中間コードを５生成する（ステップＳ４０）。この後、ステップＳ７へと移行する。
【００６７】
一方、配列演算以外の他の構文でない場合は、構文認識部１０により、構文エラー処理を実行する（ステップＳ６）。その後、ステップＳ７へと移行する。
【００６８】
ステップＳ７では、構文認識部１０により、解析中のソースプログラム２０が終了したかどうかを判定する。終了した場合は、ベクトル化部２に処理を移す。終了していない場合は、ステップＳ２へと戻り、残りのプログラム文の解析を続行する。
【００６９】
次に、図２で示したステップＳ１２について図３を用いて具体的に説明する。図３は、変数範囲解析部による処理を具体的に示す流れ図である。図３に示すステップＳ１００〜Ｓ１０８が図２に示すステップＳ１２に相当する。
【００７０】
図３に示すように、最初に、変数範囲解析部１６は、シンボルテーブルに登録された情報に基づいて、解析対象の変数がループのイテレータ変数であるかどうかの判定を行なう（ステップＳ１００）。イテレータ変数の場合は、ソースプログラム２０に定義されている初期値、終了条件、増分値を抽出し、これらの情報を基にこのイテレータ変数の取り得る数値範囲（上限値及び下限値）を算出し、算出された数値範囲をシンボルテーブルに登録する（ステップＳ１０１）。
【００７１】
イテレータ変数でない場合は、変数範囲解析部１６は、解析対象の変数に定数値が代入されているかどうかの判定を行なう（ステップＳ１０２）。定数値が代入されている場合は、この定数値を解析対象の変数の取り得る数値範囲とし、この定数値をシンボルテーブルに登録する（ステップＳ１０３）。定数値が代入されていない場合はステップＳ１０４に移行する。
【００７２】
解析対象の変数がイテレータ変数でなく、又定数値が代入された変数でもない場合は、代入式の左辺であるか、配列演算の演算値を格納する変数であるかのどちらかと考えられる。よって、ステップＳ１０４では、変数範囲解析部１６は、代入式又は配列演算の演算式の右辺に含まれる全ての変数の取り得る数値範囲を解析する。具体的には変数範囲解析部１６は、各変数について、シンボルテーブルから上限値及び下限値を抽出する。
【００７３】
但し、代入式又は配列演算の演算式の右辺に含まれる変数のうち少なくとも一つの変数について、上限値及び下限値の両方がシンボルテーブルに登録されていない場合は、シンボルテーブルからの数値範囲の抽出が行なえないため、変数範囲解析部１６は、上限値及び下限値の両方がシンボルテーブルに登録されていない変数が、代入式又は配列演算の演算式の右辺に含まれているかどうかを判定する（ステップＳ１０５）。
【００７４】
判定の結果、上記の変数が含まれていない場合は、ステップＳ１０７に移行する。上記の変数が含まれている場合は、解析対象の変数において宣言されたデータ型が扱うことができる数値範囲を抽出する（ステップＳ１０６）。その後、ステップＳ１０７に移行する。
【００７５】
ステップＳ１０７では、変数範囲解析部１６は、代入式又は配列演算の演算式の右辺に含まれる全ての変数の取り得る数値範囲に基づいて、解析対象の変数の取り得る数値範囲を解析する。なお、ステップＳ１０６で解析対象の変数において宣言されたデータ型が扱うことができる数値範囲を抽出した場合は、この抽出した数値範囲を、上限値及び下限値の両方がシンボルテーブルに登録されていない変数の取り得る数値範囲として、解析対象の変数の取り得る数値範囲を解析する。
【００７６】
具体的には、変数範囲解析部１６は、代入式又は配列演算の演算式の右辺に含まれる全ての変数の上限値と下限値との間に存する全数値に対する代入式又は配列演算の演算式の計算値を求めることによって、解析対象の変数の取り得る数値範囲を算出する。
【００７７】
但し、本実施の形態においては、変数範囲解析部１６は、代入式又は配列演算の演算式が一次式であるか又は多次式であるかを判別する機能を有している。そのため、代入式又は配列演算の演算式が一次式である場合は、各変数の上限値と下限値との間に存する全数値に対する代入式又は配列演算の演算式の計算値を求める必要はない。
【００７８】
この場合は、代入式又は配列演算の演算式の右辺に含まれる全ての変数の上限値及び下限値のみを代入式又は配列演算の演算式に代入することで、解析対象の変数の取り得る数値範囲を算出できる。
【００７９】
また、代入式又は配列演算の演算式が多次式である場合は、数学的な極値計算を行ない、これによって求められた極値を用いて、解析対象の変数の取り得る数値範囲を算出することもできる。
【００８０】
その後、数値範囲解析部１６は、算出された上限値及び下限値を、解析対象となる変数の数値範囲として、シンボルテーブルに登録する（ステップＳ１０８）。このように、ソースプログラム１０に含まれる全ての変数について、上記したステップＳ１００〜Ｓ１０８を行なうことにより、最終的に配列演算の演算値を格納する変数の取り得る数値範囲を解析することができる。
【００８１】
次に、図２で示したステップＳ２１及びＳ２２について図４を用いて具体的に説明する。図４は、データ型判定部及びデータ型変更部による処理を具体的に示す流れ図である。図４に示すステップＳ１１０は図２に示すステップＳ２０に相当し、図４に示すＳ１１１〜Ｓ１１２は図２に示すステップＳ２１に相当し、図４に示すステップＳ１１３は図２に示すステップＳ２２に相当する。
【００８２】
図４に示すように、最初に、データ型判定部１７はシンボルテーブルから配列演算に使用されるデータ型と、図３に示したステップＳ１００〜Ｓ１０８によって解析された配列演算の演算値を格納する変数の取り得る数値範囲（上限値及び下限値）を抽出する（ステップＳ１１０）。
【００８３】
次に、データ型判定部１７は、データ型情報（コンパイラ装置が通常有しており、アーキテクチャの機種に依存する情報）と配列演算の演算値を格納する変数の取り得る数値範囲とを対比して、この数値範囲を扱うことができるデータ型であって、扱うことができる数値範囲が最も狭いものを検出する。次いで、データ型判定部１７は、ステップＳ１１０で抽出した配列演算に使用されるデータ型と、上記の検出したデータ型とが一致するかどうかを判定する（ステップＳ１１１）。
【００８４】
判定の結果、一致する場合は、データ型判定部１７は、シンボルテーブルから抽出した配列演算に使用されるデータ型を演算情報として中間コード生成部１５に渡す（ステップＳ１１２）。よって、中間コード生成部１５は、シンボルテーブルから抽出した配列演算に使用されるデータ型で配列演算が行なわれるように中間コードを生成する。
【００８５】
一方、判定の結果、一致しない場合は、データ型判定部１７は、データ型変更部１８によって、配列演算に使用されるデータ型を上記の扱うことができる数値範囲が最も狭いデータ型に変更する。即ち、データ型判定部１７は、シンボルテーブルから抽出した配列演算に使用されるデータ型の代わりに、上記の扱うことができる数値範囲が最も狭いデータ型を演算情報として中間コード生成部１５に渡す（ステップＳ１１３）。よって、中間コード生成部１５は、上記の扱うことができる数値範囲が最も狭いデータ型で配列演算が行なわれるように中間コードを生成する。
【００８６】
以上のようにして、図１及び図２に示す中間コード５が生成される。よって、本実施の形態では、最も小さいデータ型で配列演算を行なう中間コードを生成することができ、従来に比べて並列度を上げて高速化を図ることが可能となる。
【００８７】
次に、具体的なソースプログラム例に基づいて、本実施の形態にかかるコンパイラ装置及びコンパイル方法について説明する。図５は、ソースプログラム及びシンボルテーブルの一例を示す図である。なお、従来例との効果の比較を行なうため、図５に示すソースプログラム２０は、図１１で示したソースプログラム６０と同じものである。図６は、コンパイラ装置が通常有しているデータ型情報を示す図である。図７は、図５に示すソースプログラムに基づいて生成された中間コード及びベクトル化中間コードを示す図である。
【００８８】
図５に示すソースプログラム２０中のプログラム文（１）〜（１２）に対し、図２〜図４で示したように構文解析が行なわれて、中間コードが生成される。図５に示すソースプログラム２０中において、変数ａは配列演算の演算値を格納する変数であり、これ以外の変数ｂ、ｃ、ｄ、ｅ、ｆ、ｊ、ｊは配列演算に用いられる変数である。以下にプログラム文ごとに説明する。
【００８９】
プログラム文（１）は、引数なしでｃｈａｒ型を返す関数ｇの宣言であるので、変数名とデータ型とがシンボルテーブルに登録される（図２／ステップＳ１０）。但し、プログラム文（１）は定義ではないので、取り得る数値範囲の解析は行なわれない。また、プログラム文（１）は配列演算にも該当せず、構文処理としては変数宣言の分類にあたる。よって、変数宣言に対する構文解析処理が行なわれ（図２／ステップＳ５、Ｓ３０）、変数宣言に対する中間コードが生成される（図２／ステップＳ４０）。
【００９０】
その後、プログラムの終了判定が行なわれるが（図２／ステップＳ７）、プログラムに続きがあるので、次のプログラム文（２）の処理が行われる（図２／ステップＳ２）。なお、変数宣言に対する構文解析処理（図２／ステップＳ５、Ｓ３０）は、配列演算に該当するプログラム文（１１）以外のすべてのプログラム文で行なわれる。このため、以下の説明においては省略している。
【００９１】
プログラム文（２）は、配列変数ａ〔１０〕、ｂ〔１０〕、ｃ〔１０〕の宣言である。よって、シンボル名とそのデータ型とがシンボルテーブルに登録される（図２／ステップＳ１０）。プログラム文（２）も定義ではないため、取り得る数値範囲の解析は行なわれない。
【００９２】
プログラム文（３）、（４）及び（５）は、それぞれ初期値を有する変数の定義である。よって、先ずシンボル名とそのデータ型とがシンボルテーブルに登録され（図２／ステップＳ１０）、次に取り得る数値範囲の解析が行なわれる（図２／ステップＳ１１及びＳ１２）。
【００９３】
ここでの数値範囲の解析について具体的に説明する。プログラム文（３）及び（４）では変数ｄ及びｅに‘１０００００’や‘１０００’といった定数値が代入されている。よって、これらの定数値が変数ｄ及びｅの取り得る数値範囲（上限値及び下限値）としてシンボルテーブルに登録される（図３／ステップＳ１００及びＳ１０１）。
【００９４】
プログラム文（５）は変数ｆの代入式であり、代入式の右辺には関数ｇの呼び出し結果が代入される。よって、定数値が代入されていないので、シンボルテーブルから代入式の右辺に含まれる変数の上限値と下限値とが抽出される（図３／ステップＳ１０４）。ここで、シンボルテーブルにおける変数ｇの項目を見ると、上限値及び下限値の両方が登録されていないことがわかる。
【００９５】
よって、変数ｆの取り得る数値範囲は、宣言時に指定されたデータ型、即ちｃｈａｒ型が取り得る数値範囲とされ、データ型情報から上限値及び下限値として‘１２７’と‘−１２８’とが抽出される（図３／ステップＳ１０５及びＳ１０６）。その後、変数ｇの上限値と下限値との間に存する全数値に対する代入式の計算値を求める（図３／ステップＳ１０７）。この場合は、関数ｇの返り値そのものが代入されるので、変数ｇの取り得る数値範囲が、変数ｆの取り得る数値範囲となる。よって、シンボルテーブルには、変数ｆの取り得る数値範囲として、上限値‘１２７’と下限値‘−１２８’とが登録される（図３／ステップＳ１０８）。
【００９６】
プログラム文（６）は、新しい変数ｉの定義である。よって、先ずシンボル名とデータ型がシンボルテーブルに登録される（図２／ステップＳ１０）。また、プログラム文（６）は変数ｉの定義であるため、取り得る数値範囲の解析が行なわれる（図２／ステップＳ１１及びＳ１２）。
【００９７】
ここでの数値範囲の解析について具体的に説明する。変数ｉは、ｆｏｒ文におけるイテレータ変数である（図３／ステップＳ１００）。よって、初期値、終了条件及び増分値から、変数ｉの取り得る数値範囲（上限値及び下限値）が算出され、シンボルテーブルに登録される（図３／ステップＳ１０１）。この場合、初期値がｉ＝０、終了条件がｉ＜１０、増分値が  ｉ＋＋（ｉ＝ｉ＋１）であるので、変数ｉの上限値は９、下限値は０である。よってシンボルテーブルには上限値９と下限値０とが登録される。
【００９８】
プログラム文（７）は、配列変数ｂ〔ｉ〕に対する代入式であり、変数ｂ〔ｉ〕の定義とみなされる。よって、上記のプログラム文（２）では宣言であったので、シンボル名とそのデータ型とがシンボルテーブルに登録されるだけであったが（図２／ステップＳ１０）、プログラム文（７）は定義であるので、取り得る数値範囲の解析が行なわれる（図２／ステップＳ１１及びＳ１２）。
【００９９】
ここでの数値範囲の解析について具体的に説明する。プログラム文（７）においては、代入式の右辺は‘ｄ／ｅ＊ｉ’と言うような変数を含んでいる。このためため、代入式の右辺に含まれる全ての変数（ｄ、ｅ、ｉ）の取り得る数値範囲（上限値及び下限値）がシンボルテーブルから抽出される（図３／ステップＳ１０４）。
【０１００】
シンボルテーブルにおいて、各変数の上限値及び下限値は、ｄ＝１０００００、ｅ＝１０００、０≦ｉ≦９と登録されており、上限値又は下限値が登録されていない変数は存在していない（図３／ステップＳ１０５）。よって、代入式の右辺に含まれる変数ｄ、ｅ及びｉの上限値と下限値との間に存する全数値に対する代入式の計算値が求められる（図３／ステップＳ１０７）。
【０１０１】
計算の結果、‘ｄ／ｅ＊ｉ’の上限値は‘９００’、下限値は‘０’であることがわかる。なお、プログラム文（７）の代入式は一次式であるので、上限値と下限値との間に存する全数値に対して、代入式の結果値を計算する必要はなく、各変数の上限値と下限値とのみを用いて計算が可能である。また、代入式が多次式の場合は、数学的に極値計算を行なって極値を算出し、この極値を変数ｂ〔ｉ〕の上限値又は下限値とすることもできる。計算結果は、変数ｂ〔ｉ〕の取り得る数値範囲としてシンボルテーブルに登録される（図３／ステップＳ１０８）。
【０１０２】
プログラム文（８）もプログラム（７）と同様、配列変数ｃ〔ｉ〕に対する代入式なので、変数ｃ〔ｉ〕の定義とみなされ、取り得る数値範囲の解析が行なわれる（図２／ステップＳ１１及びＳ１２）。プログラム文（８）では、代入式の右辺は‘ｅ＋ｆ’と言うような変数を含む式である。このため、プログラム（７）の場合と同様に、代入式の右辺に含まれる全ての変数（ｅ、ｆ）の取り得る数値範囲（上限値及び下限値）がシンボルテーブルから抽出される（図３／ステップＳ１０４）。
【０１０３】
シンボルテーブルにおいて、各変数の上限値及び下限値は、ｅ＝１０００、−１２８≦ｆ≦１２７と登録されており、上限値又は下限値が登録されていない変数は存在していない（図３／ステップＳ１０５）。よって、代入式の右辺に含まれる変数ｅ及びｆの上限値と下限値との間に存する全数値に対する代入式の計算値が求められる（図３／ステップＳ１０７）。
【０１０４】
計算の結果、‘ｅ＋ｆ’の上限値は‘１１２７’、下限値は‘８７２’であることがわかる。なお、プログラム文（８）の代入式も一次式であるので、上限値と下限値との間に存する全数値に対して、代入式の結果値を計算する必要はなく、各変数の上限値と下限値とのみを用いて計算が可能である。この計算結果は、変数ｃ〔ｉ〕の取り得る数値範囲としてシンボルテーブルに登録される（図３／ステップＳ１０８）。
【０１０５】
プログラム文（１０）は、プログラム文（６）と同様に、イテレータ変数ｊの定義である。よって、プログラム文（６）と同様に、シンボル名とデータ型とがシンボルテーブル登録され（図２／ステップＳ１０）、初期値ｊ＝０、終了条件ｊ＜１０、及び増分値ｊ＋＋に基づいて、取り得る数値範囲が算出される。シンボルテーブルには、上限値として９が、下限値として０が登録される。
【０１０６】
プログラム文（１１）は、配列演算の式であり、演算値を格納する配列変数ａ〔ｊ〕の定義である。よって、プログラム文（７）や（８）と同様に、取り得る数値範囲の解析が行なわれる（図２／ステップＳ１１及びＳ１２）。プログラム文（１１）において、配列演算の右辺は‘ｂ〔ｊ〕＋ｃ〔ｊ〕’であり、ｂ〔ｊ〕及びｃ〔ｊ〕といった変数を含んでいる。このため、変数ｂ〔ｊ〕及びｃ〔ｊ〕の取り得る数値範囲（上限値及び下限値）がシンボルテーブルから抽出される（図３／ステップＳ１０４）。
【０１０７】
シンボルテーブルにおいて、各変数の上限値及び下限値は、０≦ｂ〔ｊ〕≦９００、８７２≦ｃ〔ｊ〕≦１１２７と登録されており、上限値又は下限値が登録されていない変数は存在していない（図３／ステップＳ１０５）。よって、変数ｂ〔ｊ〕及びｃ〔ｊ〕の上限値と下限値との間に存する全数値に対する配列演算の式の計算値が求められる（図３／ステップＳ１０７）。
【０１０８】
計算の結果、‘ｂ〔ｊ〕＋ｃ〔ｊ〕’の上限値は‘２０２７’、下限値は‘８７２’であることがわかる。なお、プログラム文（９）の配列演算の式も一次式であるので、上限値と下限値との間に存する全数値に対して、配列演算の式の結果値を計算する必要はなく、各変数の上限値と下限値とのみを用いて計算が可能である。また、配列演算の式が多次式の場合は、数学的に極値計算を行なって極値を算出し、この極値を変数ａ〔ｉ〕の上限値又は下限値とすることもできる。この計算結果は、変数ａ〔ｊ〕の取り得る数値範囲としてシンボルテーブルに登録される（図３／ステップＳ１０８）。
【０１０９】
更に、プログラム文（１１）で行なわれる演算は配列演算であるので、ソースプログラムやシンボルテーブルから演算の種類、演算のデータ型、値（演算値を格納する変数が取り得る数値範囲）が抽出される（図２／ステップＳ４及びＳ２０）。演算対象の配列要素ｂ〔ｊ〕やｃ〔ｊ〕はｉｎｔ型であることがシンボルテーブルより抽出されるので、演算の種類が＋（加算）、演算のデータ型がｉｎｔ型、第１オペランドがｂ〔ｊ〕、第２オペランドがｃ〔ｊ〕というように抽出される。その後、データ型判定部とデータ型変更部とによる処理が実行される（図２／ステップＳ２１及びＳ２２）。
【０１１０】
具体的には、演算値を格納するａ〔ｊ〕の上限値及び下限値として８７２≦ａ〔ｊ〕≦２０２７が抽出され（図４／ステップＳ１１０）、この上限値及び下限値とデータ型情報とが対比され、扱うことができる数値範囲が最も狭いデータ型が検出される。この例では、ｓｈｏｒｔ型とｕｎｓｉｇｎｅｄ  ｓｈｏｒｔ型とが抽出される。シンボルテーブルから抽出した配列演算のデータ型はｉｎｔ型であることから、この扱うことができる数値範囲が狭いデータ型とは一致していないことが分かる（ステップＳ１１１）。
【０１１１】
よって演算のデータ型を、この場合ｓｈｏｒｔ型（又はｕｎｓｉｇｎｅｄ  ｓｈｏｒｔ型）に変更する。次に、演算情報（演算の種類、演算のデータ型、オペランドの値）が中間コード生成部に渡される（図４／ステップＳ１１３）。
【０１１２】
その後、中間コードが生成されるが、演算のデータ型は配列演算を実行するのに必要な最小のデータ型へ変更されているので、図７に示すように生成される中間コード５は、配列演算を実行するのに必要な最小のデータ型（実施例では、ｓｈｏｒｔデータ型）で生成されていることがわかる。また、図７に示すように、この中間コードがベクトル化部に渡され、中間コードの配列演算とこの配列演算のデータ型との両方に該当するベクトル命令が存在すれば、その演算の並列度に対応するベクトル化中間コード６が生成される。
【０１１３】
本実施の形態では、４並列ｓｈｏｒｔ型ベクトル加算演算が存在することを仮定しているので、並列度が４のｓｈｏｒｔ型加算演算（ｓｈｏｒｔ〔４〕でｓｈｏｒｔの４並列を表現）を表すベクトル化中間コードが生成されている。
【０１１４】
これによって、ソースプログラム２０に記述されているｆｏｒループ内の配列演算ａ〔ｊ〕＝ｂ〔ｊ〕＋ｃ〔ｊ〕は、ａ〔０〕＝ｂ〔０〕＋ｃ〔０〕とａ〔１〕＝ｂ〔１〕＋ｃ〔１〕とａ〔２〕＝ｂ〔２〕＋ｃ〔２〕とａ〔３〕＝ｂ〔３〕＋ｃ〔３〕との組み合わせ、ａ〔４〕＝ｂ〔４〕＋ｃ〔４〕とａ〔５〕＝ｂ〔５〕＋ｃ〔５〕とａ〔６〕＝ｂ〔６〕＋ｃ〔６〕とａ〔７〕＝ｂ〔７〕＋ｃ〔７〕との組み合わせ、ａ〔８〕＝ｂ〔８〕＋ｃ〔８〕とａ〔９〕＝ｂ〔９〕＋ｃ〔９〕との組み合わせで、並列に行なわれる。
【０１１５】
つまり、従来のベクトル化コンパイラではｊ＝０、２、４、６、８の５回行なわれていた配列演算が、ｊ＝０、４、８の３回の配列演算で実行可能となる。以上のように、本実施の形態では、演算のデータ型がソースプログラム中で宣言されているデータ型（ｉｎｔ型）から演算実行に必要な最小のデータ型（ｓｈｏｒｔ型）に最適化されているので、従来の方法でコンパイルした場合と比較して、演算の並列度が２から４に増加し、演算の高速化が図られていると言える。
【０１１６】
【発明の効果】
以上のように、本実施の形態にかかるコンパイラ装置及びコンパイル方法を用いれば、配列演算の演算値を格納する変数に格納される可能性のある値について、上限値および下限値を予測でき、この格納される可能性のある値を扱うことができる最小のデータ型でベクトル化を実行することが可能となる。この結果、利用できる最大の並列度を持つベクトル命令を使用することができ（最大の並列度でベクトル命令を実行でき）、ソースプログラムの実行の高速化を図ることができる。
【図面の簡単な説明】
【図１】本実施の形態にかかるコンパイラ装置の構成を示す概略構成図
【図２】図１に示すコンパイラ装置における処理の流れ及び本実施の形態にかかるコンパイル方法を示す流れ図
【図３】変数範囲解析部による処理を具体的に示す流れ図
【図４】データ型判定部及びデータ型変更部による処理を具体的に示す流れ図
【図５】ソースプログラム及びシンボルテーブルの一例を示す図
【図６】コンパイラ装置が通常有しているデータ型情報を示す図
【図７】図５に示すソースプログラムに基づいて生成された中間コード及びベクトル化中間コードを示す図
【図８】従来のベクトル化コンパイラ装置を示す概略構成図
【図９】図８に示した従来のベクトル化コンパイラ装置における構文解析部を示す構成図
【図１０】図９に示した従来のベクトル化コンパイラ装置を構成する構文解析部の処理を示す流れ図
【図１１】具体的なソースプログラムの一例、従来のベクトル化コンパイラ装置を使用した場合のシンボルテーブルの一例、及び中間コードの一例を示す
【符号の説明】
１  構文解析部
２  ベクトル化部
３  最適化部
４  コード生成部
５  中間コード
６  ベクトル化中間コード
７  最適化中間コード
１０  構文認識部
１１  シンボルテーブル登録部
１２  配列演算部
１３  構文解析部
１４  エラー処理部
１５  中間コード生成部
１６  変数範囲解析部
１７  データ判定部
１８  データ型変更部
【図１】
0003598090.tif 000002
【図２】
0003598090.tif 000003
【図３】
0003598090.tif 000004
【図４】
0003598090.tif 000005
【図５】
0003598090.tif 000006
【図６】
0003598090.tif 000007
【図７】
0003598090.tif 000008
【図８】
0003598090.tif 000009
【図９】
0003598090.tif 000010
【図１０】
0003598090.tif 000011
【図１１】
0003598090.tif 000012