JP2003150386A - コンパイラ装置及びコンパイル方法 - Google Patents

コンパイラ装置及びコンパイル方法

Info

Publication number
JP2003150386A
JP2003150386A JP2001349185A JP2001349185A JP2003150386A JP 2003150386 A JP2003150386 A JP 2003150386A JP 2001349185 A JP2001349185 A JP 2001349185A JP 2001349185 A JP2001349185 A JP 2001349185A JP 2003150386 A JP2003150386 A JP 2003150386A
Authority
JP
Japan
Prior art keywords
array operation
variable
expression
numerical range
limit value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2001349185A
Other languages
English (en)
Other versions
JP3598090B2 (ja
Inventor
Shinobu Asao
忍 浅尾
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2001349185A priority Critical patent/JP3598090B2/ja
Publication of JP2003150386A publication Critical patent/JP2003150386A/ja
Application granted granted Critical
Publication of JP3598090B2 publication Critical patent/JP3598090B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 配列演算の演算値の取り得る数値範囲を解析
して、配列演算の演算値を扱うことのできる最小のデー
タ型でベクトル化を行ない得るコンパイラ装置及びコン
パイル方法を提供することにある。 【解決手段】 コンパイラ装置の構文解析部1に、配列
演算の演算値を格納する変数の取り得る数値範囲を解析
する変数範囲解析部16と、配列演算の演算値を格納す
る変数が取り得る数値範囲を扱うことができるデータ型
の中から扱うことができる数値範囲が最も狭いデータ型
を検出し、この検出したデータ型と配列演算を含むソー
スプログラムから抽出される配列演算のデータ型とが一
致するかどうかを判定するデータ型判定部17と、一致
しない場合に、この検出したデータ型で配列演算を行な
う中間コードが生成されるように、配列演算のデータ型
を変更するデータ型変更部18とを備えておく。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、配列演算を含むプ
ログラムのコンパイルに関し、特にはベクトル化コンパ
イラ装置及びベクトル化コンパイル方法に関する。
【0002】
【従来の技術】図8は、従来のベクトル化コンパイラ装
置を示す概略構成図である。図8に示すように、従来の
ベクトル化コンパイラ装置は、構文解析部61、ベクト
ル化部63、最適化部65、コード生成部67とで構成
されている。ベクトル化コンパイラ装置は、最初にソー
スプログラム60を入力として受け取る。
【0003】ソースプログラム60は構文解析部61に
渡され、構文解析が行なわれる。その結果、ソースプロ
グラム60の原始言語とオブジェクトコード68の目的
言語との橋渡しをする中間コード62が生成される。
【0004】中間コード62は、後のベクトル化や最適
化を実行しやすくするために生成されている。次に、中
間コード62はベクトル化部63に渡され、中間コード
62のベクトル化判定及びベクトル化の実行が行なわれ
る。これによって、ベクトル化が可能な中間コード62
はベクトル化されているベクトル化中間コード64に変
換される。
【0005】ベクトル化中間コード64は最適化部65
に渡され、ある種の最適化が施されて最適化中間コード
66が生成される。最適化中間コード66はコード生成
部67に渡され、オブジェクトコード68がベクトル化
コンパイラ装置より出力される。
【0006】図9は、図8に示した従来のベクトル化コ
ンパイラ装置における構文解析部を示す構成図である。
図9に示すように、構文解析部61は、構文認識部7
0、シンボルテーブル登録部71、配列演算部72、構
文処理部(1〜n)73、エラー処理部74、及び中間
コード生成部75で構成されている。
【0007】構文認識部70は、読み込んだソースプロ
グラム60が、プログラム言語のどの構文に該当するか
を認識する。シンボルテーブル登録部71はシンボルテ
ーブルと呼ばれるデータベースを備えており、構文認識
部70でプログラムの解析対象が変数宣言や定義である
と判定された場合に呼び出され、少なくとも変数の名前
(シンボル名)やその変数のデータ型の情報(シンボル
情報)をシンボルテーブルに登録する。
【0008】配列演算部72は、構文認識部70でプロ
グラムの解析対象が配列の演算であると判定された場合
に呼び出され、少なくともプログラムに記述されている
配列演算の種類やオペランドのデータ型、オペランドの
値を解析してその情報を中間コード生成部75に渡す。
【0009】構文処理部73は、配列演算部72と同列
のもので、配列演算以外の構文が現れた場合に構文認識
部70から呼び出され、その構文に対応する解析処理を
行ない中間コード生成部75に詳細情報を渡す。なお、
各構文に対応する解析処理については、本明細書におい
て重要ではないので省略する。
【0010】エラー処理部74は、構文認識部70で構
文が認識できない場合に呼び出され、エラー処理を行な
う。中間コード生成部75は、配列演算部72や構文処
理部73から中間コード62を生成するために必要な情
報を受け取り、その情報に対応する中間コード62を生
成する。
【0011】図10は、図9に示した従来のベクトル化
コンパイラ装置を構成する構文解析部の処理を示す流れ
図である。図10に示すように、最初に構文認識部70
により、ソースプログラム60の読み込みが行なわれ
る。(ステップS200)。次に、構文認識部70によ
り、読み込まれたソースプログラム60から文が抽出さ
れて解析が行なわれ(ステップS201)、更にプログ
ラム文の解析対象が変数宣言又は定義であるかの判定が
行なわれる(ステップS202)。
【0012】判定が真の場合、シンボルテーブル登録部
71は変数名やデータ型をシンボルテーブルに登録する
(ステップS210)。その後ステップS203に移行
する。一方、判定が偽の場合は、そのままステップS2
03に移行する。
【0013】ステップS203では、構文認識部70に
より、プログラム文の解析対象が配列演算であるかどう
かの判定が行なわれる。配列演算の判定が真の場合、配
列演算部72により演算の種類、演算のデータ型、値に
関する情報が抽出される(ステップS220)。その
後、中間コード生成部75により、抽出された情報をも
とに中間コード62が生成され(ステップS240)、
構文認識部70によりプログラムの終了判定が行なわれ
る(ステップS206)。解析中のソースプログラム6
0のうち、配列演算に対する中間コード62は、この一
連の処理(ステップS220及びS240)により生成
される。
【0014】配列演算の判定が偽であれば、構文認識部
70により、配列演算以外の他の構文であるかどうか、
即ち構文処理部(1〜n)のうちのいずれかが対応する
構文であるかどうかの判定が行なわれる(ステップS2
04)。
【0015】真の場合は、対応する構文処理部により構
文処理が行なわれ、中間コード62を生成するために必
要な情報が抽出される(ステップS230)。その後、
中間コード生成部75により、抽出された情報に基づい
て中間コード62が生成される(ステップS240)。
更に、構文認識部70によりプログラムの終了判定が行
なわれる(ステップS206)。
【0016】一方、判定が偽の場合は、構文認識部70
により、構文エラー処理が実行される(ステップS20
5)。その後、構文認識部70により、プログラムの終
了判定が行なわれる(ステップS206)。
【0017】なお、ステップS206におけるプログラ
ムの終了判定では、構文認識部70により、解析中のソ
ースプログラム60が終了したかどうかが判定される。
真の場合は、ベクトル化部63に処理が移される。偽の
場合は、ステップS201に戻り、残りのソースプログ
ラム60の解析が続行される。
【0018】以上のような処理によって、図8及び図9
で示した構文解析部61は、中間コード62を生成す
る。生成された中間コード62の特徴として、配列演算
に対する中間コード62は、ソースプログラム60の中
で宣言された配列のデータ型で生成されていることが挙
げられる。
【0019】図11は、具体的なソースプログラムの一
例、従来のベクトル化コンパイラ装置を使用した場合の
シンボルテーブルの一例、及び中間コードの一例を示す
図である。なお、以下の説明においては、適宜図10を
引用して説明する。
【0020】図11に示すように、入力されたソースプ
ログラム60の各文((1)〜(12))に対して構文
解析が行なわれる。先ず、(1)の文は引数なしでch
ar型を返す関数gの宣言であるので、ステップS21
0(図10)において、シンボル名(変数名)とそのデ
ータ型がシンボルテーブル69に登録される。
【0021】また、(1)の文は配列演算に該当せず、
構文処理としては変数宣言の分類にあたるので、ステッ
プS204(図10)の判定が真となる。よって、ステ
ップS230(図10)に移り、ここで変数宣言に対す
る構文解析処理が行なわれ、ステップS240(図1
0)において変数宣言に対する中間コードが生成され
る。その後、ステップS206(図10)において、プ
ログラムの終了判定が行なわれる。プログラムに続きが
あるので、再度ステップS201(図10)に移り、処
理が続行される。なお、ステップS204(図10)、
ステップS230(図10)の処理は、配列演算に該当
する(11)以外のすべてのプログラム文で行なわれる
ので、以降は説明を省略する。
【0022】次に(2)の文は、配列変数a、b、cの
宣言であるので、ステップS210(図10)において
シンボル名及びそのデータ型がシンボルテーブル69に
登録される。(3)、(4)、(5)の各文はそれぞれ
初期値を有する変数定義であるので、同様にステップS
210においてシンボル名とそのデータ型がシンボルテ
ーブル69に登録される。
【0023】(6)の文では新しい変数iが定義されて
いるので、これに対してもステップS210において、
シンボル名とデータ型がシンボルテーブル69に登録さ
れる。(7)、(8)の文では、配列変数bとcに対す
る代入式なので、変数の定義とみなされ、ステップS2
10において変数名やデータ型を登録しようとするが、
既に登録されているので、そのまま処理を終える。(1
0)の文では新しい変数jが定義されているので、これ
に対してもシンボル名とそのデータ型がシンボルテーブ
ル69に登録される。
【0024】次に、for構文の本体である(11)の
文は配列演算であるので、ステップS220においてソ
ースプログラム60やシンボルテーブル69から演算の
種類、演算のデータ型及び値が抽出される。その後、ス
テップS240において、抽出された演算のデータ型で
演算を行なう中間コード62が生成される。
【0025】図11に示す例では、演算対象の配列要素
bやcはint型であることがシンボルテーブル69よ
りわかる。これより、演算種類が+(加算)、演算デー
タ型がint型、第1オペランドがb〔j〕、第2オペ
ランドがc〔j〕である中間コード62が生成される。
上記したように、従来のベクトル化コンパイラ装置で生
成される配列演算に対する中間コード62は、ソースプ
ログラム60の中で宣言されたデータ型(図11の例で
はint型)で生成されていることがわかる。
【0026】この中間コード62がベクトル化部63に
渡され、中間コード62の演算とデータ型に該当するベ
クトル命令が存在すれば、その演算の並列度に対応する
ベクトル化中間コード64が生成される。図11の例で
は、2並列int型ベクトル加算演算が存在することを
仮定しているので、並列度が2のint型加算演算(i
nt〔2〕でintの2並列を表現)を表すベクトル化
中間コード64が生成される。
【0027】従って、ソースプログラム60に記述され
ているforループ内の配列演算a〔j〕=b〔j〕+
c〔j〕は、a
〔0〕=b
〔0〕+c
〔0〕とa〔1〕
=b〔1〕+c〔1〕、a〔2〕=b〔2〕+c〔2〕
とa〔3〕=b〔3〕+c〔3〕、a〔4〕=b〔4〕
+c〔4〕とa〔5〕=b〔5〕+c〔5〕、a〔6〕
=b〔6〕+c〔6〕とa〔7〕=b〔7〕+c
〔7〕、a〔8〕=b〔8〕+c〔8〕とa
〔9〕=b
〔9〕+c
〔9〕との組み合わせで並列に行なわれる。
即ち、通常10回(j=0、1、・・・8、9)行なわ
れる配列演算は、5回(j=0、2、4、6、8)の並
列配列演算で実行可能となる。
【0028】以上のように、従来のベクトル化コンパイ
ラ装置では、ソースプログラム60の中で演算対象につ
いて宣言されたデータ型で配列演算が実行されるように
中間コード62が生成され、この中間コード62がベク
トル化部63に渡される。よって、ベクトル化中間コー
ド64もソースプログラム60の中で演算対象について
宣言されたデータ型で配列演算が実行されるように生成
される。
【0029】
【発明が解決しようとする課題】ところで、一般的に、
ベクトル化に対応する命令は、演算対象のデータ型のサ
イズが小さいほど、並列度が高まり高速に演算が実行で
きる。具体例を挙げると、アーキテクチャが持つレジス
タのレジスタ長が64bitの場合、int型32bi
tの演算であれば、2(=64/32)並列の演算が可
能であるのに対し、shortデータ型16bitの演
算であれば、4(=64/16)並列、char型8b
itの演算であれば、8(=64/8)並列の演算が可
能である。このことから、配列演算のデータ型(演算対
象について宣言されたデータ型)のサイズを小さくして
ベクトル化を行なうことが理想である。
【0030】しかし、上記した従来のベクトル化コンパ
イラ装置では、配列に格納される可能性のある値、即ち
配列演算の演算値であるa〔j〕に格納される値の上限
値及び下限値を解析することは行われていない。よっ
て、演算値の取り得る数値範囲がプログラム中で宣言さ
れたデータ型よりも小さいデータ型(扱うことができる
数値範囲の狭いデータ型)の数値範囲に収まっている場
合でも、より小さいデータ型でベクトル化は行われず、
最初に演算対象について宣言されたデータ型でベクトル
化の実行が行われる。そのため、上記した従来のベクト
ル化コンパイラ装置では、理想的なベクトル化、即ち、
配列演算の演算値を扱うことのできる最小のデータ型で
ベクトル化を行なうことができず、演算の高速化が図れ
ないという問題がある。
【0031】本発明の目的は、配列演算の演算値の取り
得る数値範囲を解析して、配列演算の演算値を扱うこと
のできる最小のデータ型でベクトル化を行ない得るコン
パイラ装置及びコンパイル方法を提供することにある。
【0032】
【課題を解決するための手段】上記目的を達成するため
に本発明にかかるコンパイラ装置は、配列演算を含むソ
ースプログラムをコンパイルするコンパイラ装置であっ
て、コンパイル処理における構文の解析の際に、前記配
列演算に用いられる変数の取り得る数値範囲を解析し、
前記配列演算に用いられる変数の取り得る数値範囲を用
いて前記配列演算の演算値を格納する変数の取り得る数
値範囲を解析する変数範囲解析部と、前記配列演算の演
算値を格納する変数が取り得る数値範囲を扱うことがで
きるデータ型の中から、扱うことができる数値範囲が最
も狭いデータ型を検出し、前記扱うことができる数値範
囲が最も狭いデータ型と前記配列演算を含むソースプロ
グラムから抽出される前記配列演算のデータ型とが一致
するかどうかを判定するデータ型判定部と、前記データ
型判定部によって一致しないと判定された場合に、前記
扱うことができる数値範囲が最も狭いデータ型で前記配
列演算を行なう中間コードが生成されるように、前記配
列演算のデータ型を変更するデータ型変更部とを少なく
とも有することを特徴とする。
【0033】上記本発明にかかるコンパイラ装置におい
ては、前記配列演算を含むソースプログラム中におい
て、前記配列演算に用いられる変数の上限値と下限値と
が定義されている場合に、前記変数範囲解析部は、前記
上限値と前記下限値とに基づいて、前記配列演算に用い
られる変数の取り得る数値範囲を解析することができ
る。
【0034】この場合、前記配列演算に用いられる変数
がイテレータ変数であれば、前記配列演算に用いられる
変数の上限値と下限値とは、前記イテレータ変数におけ
る初期値、終了条件及び増分値によって定義されてい
る。
【0035】上記本発明にかかるコンパイラ装置におい
ては、前記配列演算を含むソースプログラム中におい
て、前記配列演算に用いられる変数に定数値が代入され
ている場合に、前記変数範囲解析部は、前記定数値を、
前記配列演算に用いられる変数の取り得る数値範囲とす
ることができる。
【0036】また、上記本発明にかかるコンパイラ装置
においては、前記配列演算に用いられる変数が代入式の
左辺である場合に、前記変数範囲解析部は、前記代入式
の右辺に含まれる全ての変数の取り得る数値範囲を解析
し、前記代入式の右辺に含まれる全ての変数の取り得る
数値範囲に基づいて、前記配列演算に用いられる変数の
取り得る数値範囲を解析することができる。
【0037】この態様においては、前記変数解析部は、
前記代入式が一次式であるか又は多次式であるかを判別
し、多次式である場合は、前記代入式の極値を算出する
ことによって、前記配列演算に用いられる変数の取り得
る数値範囲を解析することができる。一方、一次式であ
る場合は、前記代入式の右辺に含まれる全ての変数の上
限値及び下限値のみを前記代入式に代入することによっ
て、前記配列演算に用いられる変数の取り得る数値範囲
を解析することができる。
【0038】また、この態様においては、前記代入式の
右辺に含まれる変数のうち少なくとも一つの変数におい
て、上限値及び下限値のうちの一方又は両方が定義され
ていない場合に、前記変数範囲解析部は、前記配列演算
に用いられる変数において宣言されたデータ型が扱うこ
とができる数値範囲を、前記上限値及び下限値のうちの
一方又は両方が定義されていない変数の取り得る数値範
囲とすることができる。
【0039】上記本発明にかかるコンパイラ装置におい
ては、前記変数解析部は、前記配列演算の式が一次式で
あるか又は多次式であるかを判別し、多次式である場合
に、前記配列演算の極値を算出することによって、前記
配列演算の演算値を格納する変数が取り得る数値範囲を
解析することができる。一方、一次式である場合に、前
記配列演算の式の右辺に含まれる前記配列演算に用いら
れる変数の上限値及び下限値のみを前記配列演算の式に
代入することによって、前記配列演算の演算値を格納す
る変数が取り得る数値範囲を解析することができる。
【0040】次に、上記目的を達成するために本発明に
かかるコンパイル方法は、配列演算を含むソースプログ
ラムをコンパイルする方法であって、(a)コンパイル
処理における構文の解析の際に、前記配列演算に用いら
れる変数の取り得る数値範囲を解析し、前記配列演算に
用いられる変数の取り得る数値範囲を用いて前記配列演
算の演算値を格納する変数の取り得る数値範囲を解析す
る工程と、(b)前記配列演算の演算値を格納する変数
が取り得る数値範囲を扱うことができるデータ型の中か
ら、扱うことができる数値範囲が最も狭いデータ型を検
出し、前記扱うことができる数値範囲が最も狭いデータ
型と前記配列演算を含むソースプログラムから抽出され
る前記配列演算のデータ型とが一致するかどうかを判定
する工程と、(c)一致しないと判定した場合に、前記
扱うことができる数値範囲が最も狭いデータ型で前記配
列演算を行なう中間コードが生成されるように、前記配
列演算のデータ型を変更する工程とを少なくとも有する
ことを特徴とする。
【0041】上記本発明にかかるコンパイル方法におい
ては、前記配列演算を含むソースプログラム中におい
て、前記配列演算に用いられる変数の上限値と下限値と
が定義されている場合に、前記上限値と前記下限値とに
基づいて、前記配列演算に用いられる変数の取り得る数
値範囲を解析することができる。
【0042】この場合、前記配列演算に用いられる変数
がイテレータ変数であれば、前記配列演算に用いられる
変数の上限値と下限値とが、前記イテレータ変数におけ
る初期値、終了条件及び増分値によって定義されてい
る。
【0043】上記本発明にかかるコンパイル方法におい
ては、前記配列演算を含むソースプログラム中におい
て、前記配列演算に用いられる変数に定数値が代入され
ている場合に、前記定数値を、前記配列演算に用いられ
る変数の取り得る数値範囲とすることができる。
【0044】また、上記本発明にかかるコンパイル方法
においては、前記配列演算に用いられる変数が代入式の
左辺である場合に、前記代入式の右辺に含まれる全ての
変数の取り得る数値範囲を解析し、前記代入式の右辺に
含まれる全ての変数の取り得る数値範囲に基づいて、前
記配列演算に用いられる変数の取り得る数値範囲を解析
することができる。
【0045】この態様においては、前記代入式が一次式
であるか又は多次式であるかを判別し、多次式である場
合に、前記代入式の極値を算出することによって、前記
配列演算に用いられる変数の取り得る数値範囲を解析す
ることができる。一方、一次式である場合に、前記代入
式の右辺に含まれる全ての変数の上限値及び下限値のみ
を前記代入式に代入することによって、前記配列演算に
用いられる変数の取り得る数値範囲を解析することがで
きる。
【0046】また、この態様においては、前記代入式の
右辺に含まれる変数のうち少なくとも一つの変数におい
て、上限値及び下限値のうちの一方又は両方が定義され
ていない場合に、前記配列演算に用いられる変数におい
て宣言されたデータ型が扱うことができる数値範囲を、
前記上限値及び下限値のうちの一方又は両方が定義され
ていない変数の取り得る数値範囲とすることができる。
【0047】上記本発明にかかるコンパイル方法におい
ては、前記配列演算の式が一次式であるか又は多次式で
あるかを判別し、多次式である場合に、前記配列演算の
極値を算出することによって、前記配列演算の演算値を
格納する変数が取り得る数値範囲を解析することができ
る。一方、一次式である場合に、前記配列演算の式の右
辺に含まれる前記配列演算に用いられる変数の上限値及
び下限値のみを前記配列演算の式に代入することによっ
て、前記配列演算の演算値を格納する変数が取り得る数
値範囲を解析することができる。
【0048】本発明は、上記の本発明にかかるコンパイ
ル方法を具現化するためのプログラムであっても良い。
この場合、かかるプログラムをコンピュータにインスト
ールして実行することにより、上記の本発明にかかるコ
ンパイラ装置を実現することができる。なお、本発明で
いう「配列演算」とはベクトル化の対象となる配列演算
をいう。
【0049】
【発明の実施の形態】(実施の形態1)以下、本発明の
実施の形態にかかるコンパイラ装置及びコンパイル方法
について、図1〜図5を参照しながら説明する。最初
に、図1に基づいて本実施の形態にかかるコンパイラ装
置について説明する。図1は、本実施の形態にかかるコ
ンパイラ装置の構成を示す概略構成図である。
【0050】図1に示すように本実施の形態にかかるコ
ンパイラ装置は、図8に示した従来のコンパイラ装置と
同様に、ソースプログラム20の構文解析を行なって中
間コード5を生成する構文解析部1と、中間コード5を
ベクトル化中間コード6に変換するベクトル化部2、ベ
クトル化中間コード6を最適化中間コード7に変換する
最適化部3、及び最適化中間コード7からオブジェクト
コード21を生成するコード生成部4で構成されてい
る。
【0051】しかし、本実施の形態にかかるコンパイラ
装置では、構文解析部1の構成や機能が図8で示した従
来のコンパイラ装置と異なっている。なお、ベクトル化
部2、最適化部3及びコード生成部4は、図8に示され
たものと構成及び機能において同じである。本実施の形
態にかかるコンパイラ装置における構文解析部1につい
て以下に説明する。
【0052】図1に示すように、構文解析部1は、構文
認識部10、シンボルテーブル登録部11、配列演算部
12、構文処理部(1〜n)13、エラー処理部14、
中間コード生成部15、変数範囲解析部16、データ型
判定部17及びデータ型変更部18で構成されている。
このうち、構文認識部10、シンボルテーブル登録部1
1、配列演算部12、構文処理部(1〜n)13、エラ
ー処理部14及び中間コード生成部15は、図9で示し
たものと同様のものである。本実施の形態にかかるコン
パイラ装置は、変数範囲解析部16、データ型判定部1
7及びデータ型変更部18が備えられている点で、従来
のコンパイラ装置と異なっている。
【0053】変数範囲解析部16は、ソースプログラム
20のコンパイル処理における構文解析の際に、ソース
プログラム20中で用いられている変数の取り得る数値
範囲(上限値及び下限値)を解析する機能を有してい
る。なお、変数範囲解析部16は、変数が配列演算の演
算値を格納する変数である場合は、配列演算に用いられ
る変数について解析した数値範囲に基づいて解析を行な
う。
【0054】データ型判定部17は、配列演算の演算値
を格納する変数が取り得る数値範囲を扱うことができる
データ型の中から扱うことができる数値範囲が最も狭い
データ型を検出し、この扱うことができる数値範囲が最
も狭いデータ型と配列演算のデータ型とが一致するかど
うかを判定する機能を有している。なお、判定対象とな
る配列演算のデータ型は、ソースプログラム20中で宣
言されたデータ型であり、ソースプログラム20から抽
出される。
【0055】また、データ型変更部18は、データ型が
一致しない場合に、扱うことができる数値範囲最も狭い
データ型で配列演算を行なう中間コードが生成されるよ
うに、配列演算のデータ型を変更する機能を有してい
る。
【0056】次に、図2を用いて、図1に示すコンパイ
ラ装置における処理及び本実施の形態にかかるコンパイ
ル方法について説明する。図2は、図1に示すコンパイ
ラ装置における処理の流れ及び本実施の形態にかかるコ
ンパイル方法を示す流れ図である。なお、図2では構文
解析部1における処理の流れのみが示されており、ベク
トル化部2、最適化部3及びコード生成部4における処
理の流れについては省略している。ベクトル化部2、最
適化部3及びコード生成部4においては、従来と同様の
処理が行われる。また、図1を適宜参酌しながら説明す
る。
【0057】図2に示すように、最初に構文認識部10
(図1参照)により、ソースプログラム20の読み込み
を行ない(S1)、更にソースプログラム20から一つ
のプログラム文を抽出して解析を行なう(S2)。ソー
スプログラム20には配列演算が含まれている。
【0058】次に、構文認識部10により、抽出された
プログラム文が変数宣言又は定義であるかどうかの判定
を行なう(S3)。変数宣言や定義でない場合は、ステ
ップS4へと移行する。
【0059】一方、変数宣言又は変数の定義である場合
は、シンボルテーブル登録部11により、変数の名前や
宣言されたデータ型といった情報をシンボルテーブルに
登録する(S10)。更に、この場合は、変数範囲解析
部16により、シンボルテーブルに登録された情報か
ら、抽出されたプログラム文が変数の定義であるかどう
かの判断を行なう(ステップS11)。
【0060】判断の結果、定義でない場合は、ステップ
S4へと移行する。変数の定義である場合は、変数範囲
解析部16により、変数が取り得る数値範囲の解析を行
ない、解析された数値範囲をシンボルテーブルに登録す
る(ステップS12)。この数値範囲の解析は、ソース
プログラム20中になされた変数の定義に基づいて、変
数に格納される可能性のある値の上限値及び下限値を、
数学的手段を用いて算出することによって行なう。
【0061】なお、取り得る数値範囲の解析は、解析対
象となる変数が、配列演算の演算値を格納するものであ
るのか、又は配列演算に用いられるものであるのかに拘
わらず行なう。変数が配列演算の演算値を格納する変数
である場合は、配列演算に用いられる変数について解析
した数値範囲に基づいて解析を行なう。なお、ステップ
S12の具体的な内容については、後述の図3において
説明する。その後ステップS4へと移行する。
【0062】ステップS4では、配列演算部12によ
り、プログラム文の解析対象が配列演算であるかどうか
の判定を行なう。配列演算である場合は、配列演算部1
2により、演算の種類、演算対象オペランドのシンボル
を抽出し、シンボルテーブルから、抽出したシンボルの
データ型(配列演算のデータ型)、値(演算値を格納す
る変数が取り得る数値範囲)に関する情報を抽出し、こ
れらの情報をシンボルテーブルに登録する(ステップS
20)。更に、データ型判定部17により、ステップS
12で解析した演算値を格納する変数が取り得る数値範
囲に基づいて、この数値範囲を扱うことができるデータ
型の中から、扱うことができる数値範囲が最も狭いデー
タ型を検出し、この扱うことができる数値範囲が最も狭
いデータ型とステップS20で抽出した配列演算のデー
タ型とが一致するかどうかを判定する(ステップS2
1)。
【0063】扱うことができる数値範囲が最も狭いデー
タ型とステップS20で抽出した配列演算のデータ型と
が一致する場合は、ステップS40へと移行する。一
方、一致しない場合は、データ型変更部18により、扱
うことができる数値範囲が最も狭いデータ型で配列演算
を行なう中間コードが生成されるように、配列演算のデ
ータ型を変更する(ステップS22)。その後、ステッ
プS40へと移行する。なお、ステップS21及びS2
2の具体的な内容については、後述の図4において説明
する。
【0064】ステップS40では、配列演算部12で抽
出された情報及びデータ型変更部18によって変更され
た情報に基づき、中間コード生成部15により、中間コ
ード5を生成する。中間コードの生成後、ステップS7
へと移行する。解析中のプログラムのうち、配列演算に
対する中間コード5はこの一連の処理(ステップS20
〜S22及びS40)により生成される。
【0065】ステップS4における判定において、配列
演算でないと判定した場合は、構文認識部10により、
配列演算以外の他の構文であるかどうか、即ち構文処理
部(1〜n)13のうちのいずれかが対応する構文であ
るかどうかの判定を行なう(ステップS5)。配列演算
以外の他の構文である場合は、対応する構文処理部13
により、構文処理を行なって配列演算以外のプログラム
文に対する中間コード5を生成するために必要な情報を
抽出する(ステップS30)。
【0066】更に、ステップS30で抽出された情報に
基づいて、中間コード生成部15により、中間コードを
2生成する(ステップS40)。この後、ステップS7
へと移行する。
【0067】一方、配列演算以外の他の構文でない場合
は、構文認識部10により、構文エラー処理を実行する
(ステップS6)。その後、ステップS7へと移行す
る。
【0068】ステップS7では、構文認識部10によ
り、解析中のソースプログラム20が終了したかどうか
を判定する。終了した場合は、ベクトル化部3に処理を
移す。終了していない場合は、ステップS2へと戻り、
残りのプログラム文の解析を続行する。
【0069】次に、図2で示したステップS12につい
て図3を用いて具体的に説明する。図3は、変数範囲解
析部による処理を具体的に示す流れ図である。図3に示
すステップS100〜S108が図2に示すステップS
12に相当する。
【0070】図3に示すように、最初に、変数範囲解析
部16は、シンボルテーブルに登録された情報に基づい
て、解析対象の変数がループのイテレータ変数であるか
どうかの判定を行なう(ステップS100)。イテレー
タ変数の場合は、ソースプログラム20に定義されてい
る初期値、終了条件、増分値を抽出し、これらの情報を
基にこのイテレータ変数の取り得る数値範囲(上限値及
び下限値)を算出し、算出された数値範囲をシンボルテ
ーブルに登録する(ステップS101)。
【0071】イテレータ変数でない場合は、変数範囲解
析部16は、解析対象の変数に定数値が代入されている
かどうかの判定を行なう(ステップS102)。定数値
が代入されている場合は、この定数値を解析対象の変数
の取り得る数値範囲とし、この定数値をシンボルテーブ
ルに登録する(ステップS103)。定数値が代入され
ていない場合はステップS104に移行する。
【0072】解析対象の変数がイテレータ変数でなく、
又定数値が代入された変数でもない場合は、代入式の左
辺であるか、配列演算の演算値を格納する変数であるか
のどちらかと考えられる。よって、ステップS104で
は、変数範囲解析部16は、代入式又は配列演算の演算
式の右辺に含まれる全ての変数の取り得る数値範囲を解
析する。具体的には変数範囲解析部16は、各変数につ
いて、シンボルテーブルから上限値及び下限値を抽出す
る。
【0073】但し、代入式又は配列演算の演算式の右辺
に含まれる変数のうち少なくとも一つの変数について、
上限値及び下限値のうちの一方又は両方がシンボルテー
ブルに登録されていない場合は、シンボルテーブルから
の数値範囲の抽出が行なえないため、変数解析部16
は、上限値及び下限値のうちの一方又は両方がシンボル
テーブルに登録されていない変数が、代入式又は配列演
算の演算式の右辺に含まれているかどうかを判定する
(ステップS105)。
【0074】判定の結果、上記の変数が含まれていない
場合は、ステップS107に移行する。上記の変数が含
まれている場合は、解析対象の変数において宣言された
データ型が扱うことができる数値範囲を抽出する(ステ
ップS106)。その後、ステップS107に移行す
る。
【0075】ステップS107では、変数範囲解析部1
6は、代入式又は配列演算の演算式の右辺に含まれる全
ての変数の取り得る数値範囲に基づいて、解析対象の変
数の取り得る数値範囲を解析する。なお、ステップS1
06で解析対象の変数において宣言されたデータ型が扱
うことができる数値範囲を抽出した場合は、この抽出し
た数値範囲を、上限値及び下限値のうちの一方又は両方
がシンボルテーブルに登録されていない変数の取り得る
数値範囲として、解析対象の変数の取り得る数値範囲を
解析する。
【0076】具体的には、変数範囲解析部16は、代入
式又は配列演算の演算式の右辺に含まれる全ての変数の
上限値と下限値との間に存する全数値に対する代入式又
は配列演算の演算式の計算値を求めることによって、解
析対象の変数の取り得る数値範囲を算出する。
【0077】但し、本実施の形態においては、変数範囲
解析部16は、代入式又は配列演算の演算式が一次式で
あるか又は多次式であるかを判別する機能を有してい
る。そのため、代入式又は配列演算の演算式が一次式で
ある場合は、各変数の上限値と下限値との間に存する全
数値に対する代入式又は配列演算の演算式の計算値を求
める必要はない。
【0078】この場合は、代入式又は配列演算の演算式
の右辺に含まれる全ての変数の上限値及び下限値のみを
代入式又は配列演算の演算式に代入することで、解析対
象の変数の取り得る数値範囲を算出できる。
【0079】また、代入式又は配列演算の演算式が多次
式である場合は、数学的な極値計算を行ない、これによ
って求められた極値を用いて、解析対象の変数の取り得
る数値範囲を算出することもできる。
【0080】その後、数値範囲解析部16は、算出され
た上限値及び下限値を、解析対象となる変数の数値範囲
として、シンボルテーブルに登録する(ステップS10
8)。このように、ソースプログラム10に含まれる全
ての変数について、上記したステップS100〜S10
8を行なうことにより、最終的に配列演算の演算値を格
納する変数の取り得る数値範囲を解析することができ
る。
【0081】次に、図12で示したステップS21及び
S22について図4を用いて具体的に説明する。図4
は、データ型判定部及びデータ型変更部による処理を具
体的に示す流れ図である。図4に示すステップS110
は図2に示すステップS20に相当し、図4に示すS1
11〜S112は図2に示すステップS21に相当し、
図4に示すステップS113は図2に示すステップS2
2に相当する。
【0082】図4に示すように、最初に、データ型判定
部17はシンボルテーブルから配列演算に使用されるデ
ータ型と、図3に示したステップS100〜S108に
よって解析された配列演算の演算値を格納する変数の取
り得る数値範囲(上限値及び下限値)を抽出する(ステ
ップS110)。
【0083】次に、データ型判定部17は、データ型情
報(コンパイラ装置が通常有しており、アーキテクチャ
の機種に依存する情報)と配列演算の演算値を格納する
変数の取り得る数値範囲とを対比して、この数値範囲を
扱うことができるデータ型であって、扱うことができる
数値範囲が最も狭いものを検出する。次いで、データ型
判定部17は、ステップS110で抽出した配列演算に
使用されるデータ型と、上記の検出したデータ型とが一
致するかどうかを判定する(ステップS111)。
【0084】判定の結果、一致する場合は、データ型判
定部17は、シンボルテーブルから抽出した配列演算に
使用されるデータ型を演算情報として中間コード生成部
15に渡す(ステップS112)。よって、中間コード
生成部15は、シンボルテーブルから抽出した配列演算
に使用されるデータ型で配列演算が行なわれるように中
間コードを生成する。
【0085】一方、判定の結果、一致しない場合は、デ
ータ型判定部17は、配列演算に使用されるデータ型を
上記の扱うことができる数値範囲が最も狭いデータ型に
変更する。即ち、データ型判定部17は、シンボルテー
ブルから抽出した配列演算に使用されるデータ型の代わ
りに、上記の扱うことができる数値範囲が最も狭いデー
タ型を演算情報として中間コード生成部15に渡す(ス
テップS113)。よって、中間コード生成部15は、
上記の扱うことができる数値範囲が最も狭いデータ型で
配列演算が行なわれるように中間コードを生成する。
【0086】以上のようにして、図1及び図2に示す中
間コード5が生成される。よって、本実施の形態では、
最も小さいデータ型で配列演算を行なう中間コードを生
成することができ、従来に比べて並列度を上げて高速化
を図ることが可能となる。
【0087】次に、具体的なソースプログラム例に基づ
いて、本実施の形態にかかるコンパイラ装置及びコンパ
イル方法について説明する。図5は、ソースプログラム
及びシンボルテーブルの一例を示す図である。なお、従
来例との効果の比較を行なうため、図5に示すソースプ
ログラム20は、図11で示したソースプログラム60
と同じものである。図6は、コンパイラ装置が通常有し
ているデータ型情報を示す図である。図7は、図5に示
すソースプログラムに基づいて生成された中間コード及
びベクトル化中間コードを示す図である。
【0088】図5に示すソースプログラム20中のプロ
グラム文(1)〜(12)に対し、図2〜図4で示した
ように構文解析が行なわれて、中間コードが生成され
る。図5に示すソースプログラム20中において、変数
aは配列演算の演算値を格納する変数であり、これ以外
の変数b、c、d、e、f、j、jは配列演算に用いら
れる変数である。以下にプログラム文ごとに説明する。
【0089】プログラム文(1)は、引数なしでcha
r型を返す関数gの宣言であるので、変数名とデータ型
とがシンボルテーブルに登録される(図2/ステップS
10)。但し、プログラム文(1)は定義ではないの
で、取り得る数値範囲の解析は行なわれない。また、プ
ログラム文(1)は配列演算にも該当せず、構文処理と
しては変数宣言の分類にあたる。よって、変数宣言に対
する構文解析処理が行なわれ(図2/ステップS5、S
30)、変数宣言に対する中間コードが生成される(図
2/ステップS40)。
【0090】その後、プログラムの終了判定が行なわれ
るが(図2/ステップS7)、プログラムに続きがある
ので、次のプログラム文(2)の処理が行われる(図2
/ステップS2)。なお、変数宣言に対する構文解析処
理(図2/ステップS5、S30)は、配列演算に該当
するプログラム文(11)以外のすべてのプログラム文
で行なわれる。このため、以下の説明においては省略し
ている。
【0091】プログラム文(2)は、配列変数a〔1
0〕、b〔10〕、c〔10〕の宣言である。よって、
シンボル名とそのデータ型とがシンボルテーブルに登録
される(図2/ステップS10)。プログラム文(2)
も定義ではないため、取り得る数値範囲の解析は行なわ
れない。
【0092】プログラム文(3)、(4)及び(5)
は、それぞれ初期値を有する変数の定義である。よっ
て、先ずシンボル名とそのデータ型とがシンボルテーブ
ルに登録され(図2/ステップS10)、次に取り得る
数値範囲の解析が行なわれる(図2/ステップS11及
びS12)。
【0093】ここでの数値範囲の解析について具体的に
説明する。プログラム文(3)及び(4)では変数d及
びeに‘100000’や‘1000’といった定数値
が代入されている。よって、これらの定数値が変数d及
びeの取り得る数値範囲(上限値及び下限値)としてシ
ンボルテーブルに登録される(図3/ステップS100
及びS101)。
【0094】プログラム文(5)は変数fの代入式であ
り、代入式の右辺には関数gの呼び出し結果が代入され
る。よって、定数値が代入されていないので、シンボル
テーブルから代入式の右辺に含まれる変数の上限値と下
限値とが抽出される(図3/ステップS104)。ここ
で、シンボルテーブルにおける変数gの項目を見ると、
上限値及び下限値の両方が登録されていないことがわか
る。
【0095】よって、変数fの取り得る数値範囲は、宣
言時に指定されたデータ型、即ちchar型が取り得る
数値範囲とされ、データ型情報から上限値及び下限値と
して‘127’と‘−128’とが抽出される(図3/
ステップS105及びS106)。その後、変数gの上
限値と下限値との間に存する全数値に対する代入式の計
算値を求める(図3/ステップS107)。この場合
は、関数gの返り値そのものが代入されるので、変数g
の取り得る数値範囲が、変数fの取り得る数値範囲とな
る。よって、シンボルテーブルには、変数fの取り得る
数値範囲として、上限値‘127’と下限値‘−12
8’とが登録される(図3/ステップS108)。
【0096】プログラム文(6)は、新しい変数iの定
義である。よって、先ずシンボル名とデータ型がシンボ
ルテーブルに登録される(図2/ステップS10)。ま
た、プログラム文(6)は変数iの定義であるため、取
り得る数値範囲の解析が行なわれる(図2/ステップS
11及びS12)。
【0097】ここでの数値範囲の解析について具体的に
説明する。変数iは、for文におけるイテレータ変数
である(図3/ステップS100)。よって、初期値、
終了条件及び増分値から、変数iの取り得る数値範囲
(上限値及び下限値)が算出され、シンボルテーブルに
登録される(図3/ステップS101)。この場合、初
期値がi=0、終了条件がi<10、増分値が i++
(i=i+1)であるので、変数iの上限値は9、下限
値は0である。よってシンボルテーブルには上限値9と
下限値0とが登録される。
【0098】プログラム文(7)は、配列変数b〔i〕
に対する代入式であり、変数b〔i〕の定義とみなされ
る。よって、上記のプログラム文(2)では宣言であっ
たので、シンボル名とそのデータ型とがシンボルテーブ
ルに登録されるだけであったが(図2/ステップS1
0)、プログラム文(7)は定義であるので、取り得る
数値範囲の解析が行なわれる(図2/ステップS11及
びS12)。
【0099】ここでの数値範囲の解析について具体的に
説明する。プログラム文(7)においては、代入式の右
辺は‘d/e*i’と言うような変数を含んでいる。こ
のためため、代入式の右辺に含まれる全ての変数(d、
e、i)の取り得る数値範囲(上限値及び下限値)がシ
ンボルテーブルから抽出される(図3/ステップS10
4)。
【0100】シンボルテーブルにおいて、各変数の上限
値及び下限値は、d=100000、e=1000、0
≦i≦9と登録されており、上限値又は下限値が登録さ
れていない変数は存在していない(図3/ステップS1
05)。よって、代入式の右辺に含まれる変数d、e及
びiの上限値と下限値との間に存する全数値に対する代
入式の計算値が求められる(図3/ステップS10
7)。
【0101】計算の結果、‘d/e*i’の上限値は
‘900’、下限値は‘0’であることがわかる。な
お、プログラム文(7)の代入式は一次式であるので、
上限値と下限値との間に存する全数値に対して、代入式
の結果値を計算する必要はなく、各変数の上限値と下限
値とのみを用いて計算が可能である。また、代入式が多
次式の場合は、数学的に極値計算を行なって極値を算出
し、この極値を変数b〔i〕の上限値又は下限値とする
こともできる。計算結果は、変数b〔i〕の取り得る数
値範囲としてシンボルテーブルに登録される(図3/ス
テップS108)。
【0102】プログラム文(8)もプログラム(7)と
同様、配列変数c〔i〕に対する代入式なので、変数c
〔i〕の定義とみなされ、取り得る数値範囲の解析が行
なわれる(図2/ステップS11及びS12)。プログ
ラム文(8)では、代入式の右辺は‘e+f’と言うよ
うな変数を含む式である。このため、プログラム(7)
の場合と同様に、代入式の右辺に含まれる全ての変数
(e、f)の取り得る数値範囲(上限値及び下限値)が
シンボルテーブルから抽出される(図3/ステップS1
04)。
【0103】シンボルテーブルにおいて、各変数の上限
値及び下限値は、e=1000、−128≦f≦127
と登録されており、上限値又は下限値が登録されていな
い変数は存在していない(図3/ステップS105)。
よって、代入式の右辺に含まれる変数e及びfの上限値
と下限値との間に存する全数値に対する代入式の計算値
が求められる(図3/ステップS107)。
【0104】計算の結果、‘e+f’の上限値は‘11
27’、下限値は‘872’であることがわかる。な
お、プログラム文(8)の代入式も一次式であるので、
上限値と下限値との間に存する全数値に対して、代入式
の結果値を計算する必要はなく、各変数の上限値と下限
値とのみを用いて計算が可能である。この計算結果は、
変数c〔i〕の取り得る数値範囲としてシンボルテーブ
ルに登録される(図3/ステップS108)。
【0105】プログラム文(10)は、プログラム文
(6)と同様に、イテレータ変数jの定義である。よっ
て、プログラム文(6)と同様に、シンボル名とデータ
型とがシンボルテーブル登録され(図2/ステップS1
0)、初期値j=0、終了条件j<10、及び増分値j
++に基づいて、取り得る数値範囲が算出される。シン
ボルテーブルには、上限値として9が、下限値として0
が登録される。
【0106】プログラム文(11)は、配列演算の式で
あり、演算値を格納する配列変数a〔j〕の定義であ
る。よって、プログラム文(7)や(8)と同様に、取
り得る数値範囲の解析が行なわれる(図2/ステップS
11及びS12)。プログラム文(11)において、配
列演算の右辺は‘b〔j〕+c〔j〕’であり、b
〔j〕及びc〔j〕といった変数を含んでいる。このた
め、変数b〔j〕及びc〔j〕の取り得る数値範囲(上
限値及び下限値)がシンボルテーブルから抽出される
(図3/ステップS104)。
【0107】シンボルテーブルにおいて、各変数の上限
値及び下限値は、0≦b〔j〕≦900、872≦c
〔j〕≦1127と登録されており、上限値又は下限値
が登録されていない変数は存在していない(図3/ステ
ップS105)。よって、変数b〔j〕及びc〔j〕の
上限値と下限値との間に存する全数値に対する配列演算
の式の計算値が求められる(図3/ステップS10
7)。
【0108】計算の結果、‘b〔j〕+c〔j〕’の上
限値は‘2027’、下限値は‘872’であることが
わかる。なお、プログラム文(9)の配列演算の式も一
次式であるので、上限値と下限値との間に存する全数値
に対して、配列演算の式の結果値を計算する必要はな
く、各変数の上限値と下限値とのみを用いて計算が可能
である。また、配列演算の式が多次式の場合は、数学的
に極値計算を行なって極値を算出し、この極値を変数a
〔i〕の上限値又は下限値とすることもできる。この計
算結果は、変数a〔j〕の取り得る数値範囲としてシン
ボルテーブルに登録される(図3/ステップS10
8)。
【0109】更に、プログラム文(11)で行なわれる
演算は配列演算であるので、ソースプログラムやシンボ
ルテーブルから演算の種類、演算のデータ型、値(演算
値を格納する変数が取り得る数値範囲)が抽出される
(図2/ステップS4及びS20)。演算対象の配列要
素b〔j〕やc〔j〕はint型であることがシンボル
テーブルより抽出されるので、演算の種類が+(加
算)、演算のデータ型がint型、第1オペランドがb
〔j〕、第2オペランドがc〔j〕というように抽出さ
れる。その後、データ型判定部とデータ型変更部とによ
る処理が実行される(図2/ステップS21及びS2
2)。
【0110】具体的には、演算値を格納するa〔j〕の
上限値及び下限値として872≦a〔j〕≦2027が
抽出され(図4/ステップS110)、この上限値及び
下限値とデータ型情報とが対比され、扱うことができる
数値範囲が最も狭いデータ型が検出される。この例で
は、short型とunsigned short型と
が抽出される。シンボルテーブルから抽出した配列演算
のデータ型はint型であることから、この扱うことが
できる数値範囲が狭いデータ型とは一致していないこと
が分かる(ステップS111)。
【0111】よって演算のデータ型を、この場合sho
rt型(又はunsigned short型)に変更
する。次に、演算情報(演算の種類、演算のデータ型、
オペランドの値)が中間コード生成部に渡される(図4
/ステップS113)。
【0112】その後、中間コードが生成されるが、演算
のデータ型は配列演算を実行するのに必要な最小のデー
タ型へ変更されているので、図7に示すように生成され
る中間コード5は、配列演算を実行するのに必要な最小
のデータ型(実施例では、shortデータ型)で生成
されていることがわかる。また、図7に示すように、こ
の中間コードがベクトル化部に渡され、中間コードの配
列演算とこの配列演算のデータ型との両方に該当するベ
クトル命令が存在すれば、その演算の並列度に対応する
ベクトル化中間コード6が生成される。
【0113】本実施の形態では、4並列short型ベ
クトル加算演算が存在することを仮定しているので、並
列度が4のshort型加算演算(short〔4〕で
shortの4並列を表現)を表すベクトル化中間コー
ドが生成されている。
【0114】これによって、ソースプログラム20に記
述されているforループ内の配列演算a〔j〕=b
〔j〕+c〔j〕は、a
〔0〕=b
〔0〕+c
〔0〕と
a〔1〕=b〔1〕+c〔1〕とa〔2〕=b〔2〕+
c〔2〕とa〔3〕=b〔3〕+c〔3〕との組み合わ
せ、a〔4〕=b〔4〕+c〔4〕とa〔5〕=b
〔5〕+c〔5〕とa〔6〕=b〔6〕+c〔6〕とa
〔7〕=b〔7〕+c〔7〕との組み合わせ、a〔8〕
=b〔8〕+c〔8〕とa
〔9〕=b
〔9〕+c
〔9〕
との組み合わせで、並列に行なわれる。
【0115】つまり、従来のベクトル化コンパイラでは
j=0、2、4、6、8の5回行なわれていた配列演算
が、j=0、4、8の3回の配列演算で実行可能とな
る。以上のように、本実施の形態では、演算のデータ型
がソースプログラム中で宣言されているデータ型(in
t型)から演算実行に必要な最小のデータ型(shor
t型)に最適化されているので、従来の方法でコンパイ
ルした場合と比較して、演算の並列度が2から4に増加
し、演算の高速化が図られていると言える。
【0116】
【発明の効果】以上のように、本実施の形態にかかるコ
ンパイラ装置及びコンパイル方法を用いれば、配列演算
の演算値を格納する変数に格納される可能性のある値に
ついて、上限値および下限値を予測でき、この格納され
る可能性のある値を扱うことができる最小のデータ型で
ベクトル化を実行することが可能となる。この結果、利
用できる最大の並列度を持つベクトル命令を使用するこ
とができ(最大の並列度でベクトル命令を実行でき)、
ソースプログラムの実行の高速化を図ることができる。
【図面の簡単な説明】
【図1】本実施の形態にかかるコンパイラ装置の構成を
示す概略構成図
【図2】図1に示すコンパイラ装置における処理の流れ
及び本実施の形態にかかるコンパイル方法を示す流れ図
【図3】変数範囲解析部による処理を具体的に示す流れ
【図4】データ型判定部及びデータ型変更部による処理
を具体的に示す流れ図
【図5】ソースプログラム及びシンボルテーブルの一例
を示す図
【図6】コンパイラ装置が通常有しているデータ型情報
を示す図
【図7】図5に示すソースプログラムに基づいて生成さ
れた中間コード及びベクトル化中間コードを示す図
【図8】従来のベクトル化コンパイラ装置を示す概略構
成図
【図9】図8に示した従来のベクトル化コンパイラ装置
における構文解析部を示す構成図
【図10】図9に示した従来のベクトル化コンパイラ装
置を構成する構文解析部の処理を示す流れ図
【図11】具体的なソースプログラムの一例、従来のベ
クトル化コンパイラ装置を使用した場合のシンボルテー
ブルの一例、及び中間コードの一例を示す
【符号の説明】
1 構文解析部 2 ベクトル化部 3 最適化部 4 コード生成部 5 中間コード 6 ベクトル化中間コード 7 最適化中間コード 10 構文認識部 11 シンボルテーブル登録部 12 配列演算部 13 構文解析部 14 エラー処理部 15 中間コード生成部 16 変数範囲解析部 17 データ判定部 18 データ型変更部

Claims (30)

    【特許請求の範囲】
  1. 【請求項1】 配列演算を含むソースプログラムをコン
    パイルするコンパイラ装置であって、 コンパイル処理における構文の解析の際に、前記配列演
    算に用いられる変数の取り得る数値範囲を解析し、前記
    配列演算に用いられる変数の取り得る数値範囲を用いて
    前記配列演算の演算値を格納する変数の取り得る数値範
    囲を解析する変数範囲解析部と、 前記配列演算の演算値を格納する変数が取り得る数値範
    囲を扱うことができるデータ型の中から、扱うことがで
    きる数値範囲が最も狭いデータ型を検出し、前記扱うこ
    とができる数値範囲が最も狭いデータ型と前記配列演算
    を含むソースプログラムから抽出される前記配列演算の
    データ型とが一致するかどうかを判定するデータ型判定
    部と、 前記データ型判定部によって一致しないと判定された場
    合に、前記扱うことができる数値範囲が最も狭いデータ
    型で前記配列演算を行なう中間コードが生成されるよう
    に、前記配列演算のデータ型を変更するデータ型変更部
    とを少なくとも有することを特徴とするコンパイラ装
    置。
  2. 【請求項2】 前記配列演算を含むソースプログラム中
    において、前記配列演算に用いられる変数の上限値と下
    限値とが定義されている場合に、前記変数範囲解析部
    が、前記上限値と前記下限値とに基づいて、前記配列演
    算に用いられる変数の取り得る数値範囲を解析する請求
    項1記載のコンパイラ装置。
  3. 【請求項3】 前記配列演算に用いられる変数がイテレ
    ータ変数であり、前記配列演算に用いられる変数の上限
    値と下限値とが、前記イテレータ変数における初期値、
    終了条件及び増分値によって定義されている請求項2記
    載のコンパイラ装置。
  4. 【請求項4】 前記配列演算を含むソースプログラム中
    において、前記配列演算に用いられる変数に定数値が代
    入されている場合に、前記変数範囲解析部が、前記定数
    値を、前記配列演算に用いられる変数の取り得る数値範
    囲とする請求項1記載のコンパイラ装置。
  5. 【請求項5】 前記配列演算に用いられる変数が代入式
    の左辺である場合に、前記変数範囲解析部が、前記代入
    式の右辺に含まれる全ての変数の取り得る数値範囲を解
    析し、前記代入式の右辺に含まれる全ての変数の取り得
    る数値範囲に基づいて、前記配列演算に用いられる変数
    の取り得る数値範囲を解析する請求項1記載のコンパイ
    ラ装置。
  6. 【請求項6】 前記変数解析部が、前記代入式が一次式
    であるか又は多次式であるかを判別し、多次式である場
    合に、前記代入式の極値を算出することによって、前記
    配列演算に用いられる変数の取り得る数値範囲を解析す
    る請求項5記載のコンパイラ装置。
  7. 【請求項7】 前記変数解析部が、前記代入式が一次式
    であるか又は多次式であるかを判別し、一次式である場
    合に、前記代入式の右辺に含まれる全ての変数の上限値
    及び下限値のみを前記代入式に代入することによって、
    前記配列演算に用いられる変数の取り得る数値範囲を解
    析する請求項5記載のコンパイラ装置。
  8. 【請求項8】 前記代入式の右辺に含まれる変数のうち
    少なくとも一つの変数において、上限値及び下限値のう
    ちの一方又は両方が定義されていない場合に、前記変数
    範囲解析部が、前記配列演算に用いられる変数において
    宣言されたデータ型が扱うことができる数値範囲を、前
    記上限値及び下限値のうちの一方又は両方が定義されて
    いない変数の取り得る数値範囲とする請求項5記載のコ
    ンパイラ装置。
  9. 【請求項9】 前記変数解析部が、前記配列演算の式が
    一次式であるか又は多次式であるかを判別し、多次式で
    ある場合に、前記配列演算の極値を算出することによっ
    て、前記配列演算の演算値を格納する変数が取り得る数
    値範囲を解析する請求項1記載のコンパイラ装置。
  10. 【請求項10】 前記変数解析部が、前記配列演算の式
    が一次式であるか又は多次式であるかを判別し、一次式
    である場合に、前記配列演算の式の右辺に含まれる前記
    配列演算に用いられる変数の上限値及び下限値のみを前
    記配列演算の式に代入することによって、前記配列演算
    の演算値を格納する変数が取り得る数値範囲を解析する
    請求項1記載のコンパイラ装置。
  11. 【請求項11】 配列演算を含むソースプログラムをコ
    ンパイルする方法であって、 (a)コンパイル処理における構文の解析の際に、前記
    配列演算に用いられる変数の取り得る数値範囲を解析
    し、前記配列演算に用いられる変数の取り得る数値範囲
    を用いて前記配列演算の演算値を格納する変数の取り得
    る数値範囲を解析する工程と、 (b)前記配列演算の演算値を格納する変数が取り得る
    数値範囲を扱うことができるデータ型の中から、扱うこ
    とができる数値範囲が最も狭いデータ型を検出し、前記
    扱うことができる数値範囲が最も狭いデータ型と前記配
    列演算を含むソースプログラムから抽出される前記配列
    演算のデータ型とが一致するかどうかを判定する工程
    と、 (c)一致しないと判定した場合に、前記扱うことがで
    きる数値範囲が最も狭いデータ型で前記配列演算を行な
    う中間コードが生成されるように、前記配列演算のデー
    タ型を変更する工程とを少なくとも有することを特徴と
    するコンパイル方法。
  12. 【請求項12】 前記配列演算を含むソースプログラム
    中において、前記配列演算に用いられる変数の上限値と
    下限値とが定義されている場合に、前記上限値と前記下
    限値とに基づいて、前記配列演算に用いられる変数の取
    り得る数値範囲を解析する請求項11のコンパイル方
    法。
  13. 【請求項13】 前記配列演算に用いられる変数がイテ
    レータ変数であり、前記配列演算に用いられる変数の上
    限値と下限値とが、前記イテレータ変数における初期
    値、終了条件及び増分値によって定義されている請求項
    12記載のコンパイル方法。
  14. 【請求項14】 前記配列演算を含むソースプログラム
    中において、前記配列演算に用いられる変数に定数値が
    代入されている場合に、前記定数値を、前記配列演算に
    用いられる変数の取り得る数値範囲とする請求項11記
    載のコンパイル方法。
  15. 【請求項15】 前記配列演算に用いられる変数が代入
    式の左辺である場合に、前記代入式の右辺に含まれる全
    ての変数の取り得る数値範囲を解析し、前記代入式の右
    辺に含まれる全ての変数の取り得る数値範囲に基づい
    て、前記配列演算に用いられる変数の取り得る数値範囲
    を解析する請求項11記載のコンパイル方法。
  16. 【請求項16】 前記代入式が一次式であるか又は多次
    式であるかを判別し、多次式である場合に、前記代入式
    の極値を算出することによって、前記配列演算に用いら
    れる変数の取り得る数値範囲を解析する請求項15記載
    のコンパイル方法。
  17. 【請求項17】 前記代入式が一次式であるか又は多次
    式であるかを判別し、一次式である場合に、前記代入式
    の右辺に含まれる全ての変数の上限値及び下限値のみを
    前記代入式に代入することによって、前記配列演算に用
    いられる変数の取り得る数値範囲を解析する請求項15
    記載のコンパイル方法。
  18. 【請求項18】 前記代入式の右辺に含まれる変数のう
    ち少なくとも一つの変数において、上限値及び下限値の
    うちの一方又は両方が定義されていない場合に、前記配
    列演算に用いられる変数において宣言されたデータ型が
    扱うことができる数値範囲を、前記上限値及び下限値の
    うちの一方又は両方が定義されていない変数の取り得る
    数値範囲とする請求項15記載のコンパイル方法。
  19. 【請求項19】 前記配列演算の式が一次式であるか又
    は多次式であるかを判別し、多次式である場合に、前記
    配列演算の極値を算出することによって、前記配列演算
    の演算値を格納する変数が取り得る数値範囲を解析する
    請求項11記載のコンパイル方法。
  20. 【請求項20】 前記配列演算の式が一次式であるか又
    は多次式であるかを判別し、一次式である場合に、前記
    配列演算の式の右辺に含まれる前記配列演算に用いられ
    る変数の上限値及び下限値のみを前記配列演算の式に代
    入することによって、前記配列演算の演算値を格納する
    変数が取り得る数値範囲を解析する請求項11記載のコ
    ンパイル方法。
  21. 【請求項21】 配列演算を含むソースプログラムをコ
    ンパイルする方法を、コンピュータに実行させるための
    プログラムであって、 (a)コンパイル処理における構文の解析の際に、前記
    配列演算に用いられる変数の取り得る数値範囲を解析
    し、前記配列演算に用いられる変数の取り得る数値範囲
    を用いて前記配列演算の演算値を格納する変数の取り得
    る数値範囲を解析するステップと、 (b)前記配列演算の演算値を格納する変数が取り得る
    数値範囲を扱うことができるデータ型の中から、扱うこ
    とができる数値範囲が最も狭いデータ型を検出し、前記
    扱うことができる数値範囲が最も狭いデータ型と前記配
    列演算を含むソースプログラムから抽出される前記配列
    演算のデータ型とが一致するかどうかを判定するステッ
    プと、 (c)一致しないと判定した場合に、前記扱うことがで
    きる数値範囲が最も狭いデータ型で前記配列演算を行な
    う中間コードが生成されるように、前記配列演算のデー
    タ型を変更するステップとを少なくとも有することを特
    徴とするコンピュータに実行させるプログラム。
  22. 【請求項22】 前記配列演算を含むソースプログラム
    中において、前記配列演算に用いられる変数の上限値と
    下限値とが定義されている場合に、前記上限値と前記下
    限値とに基づいて、前記配列演算に用いられる変数の取
    り得る数値範囲を解析する請求項21のプログラム。
  23. 【請求項23】 前記配列演算に用いられる変数がイテ
    レータ変数であり、前記配列演算に用いられる変数の上
    限値と下限値とが、前記イテレータ変数における初期
    値、終了条件及び増分値によって定義されている請求項
    22記載のプログラム。
  24. 【請求項24】 前記配列演算を含むソースプログラム
    中において、前記配列演算に用いられる変数に定数値が
    代入されている場合に、前記定数値を、前記配列演算に
    用いられる変数の取り得る数値範囲とする請求項21記
    載のプログラム。
  25. 【請求項25】 前記配列演算に用いられる変数が代入
    式の左辺である場合に、前記代入式の右辺に含まれる全
    ての変数の取り得る数値範囲を解析し、前記代入式の右
    辺に含まれる全ての変数の取り得る数値範囲に基づい
    て、前記配列演算に用いられる変数の取り得る数値範囲
    を解析する請求項21記載のプログラム。
  26. 【請求項26】 前記代入式が一次式であるか又は多次
    式であるかを判別し、多次式である場合に、前記代入式
    の極値を算出することによって、前記配列演算に用いら
    れる変数の取り得る数値範囲を解析する請求項25記載
    のプログラム。
  27. 【請求項27】 前記代入式が一次式であるか又は多次
    式であるかを判別し、一次式である場合に、前記代入式
    の右辺に含まれる全ての変数の上限値及び下限値のみを
    前記代入式に代入することによって、前記配列演算に用
    いられる変数の取り得る数値範囲を解析する請求項25
    記載のプログラム。
  28. 【請求項28】 前記代入式の右辺に含まれる変数のう
    ち少なくとも一つの変数において、上限値及び下限値の
    うちの一方又は両方が定義されていない場合に、前記配
    列演算に用いられる変数において宣言されたデータ型が
    扱うことができる数値範囲を、前記上限値及び下限値の
    うちの一方又は両方が定義されていない変数の取り得る
    数値範囲とする請求項25記載のプログラム。
  29. 【請求項29】 前記配列演算の式が一次式であるか又
    は多次式であるかを判別し、多次式である場合に、前記
    配列演算の極値を算出することによって、前記配列演算
    の演算値を格納する変数が取り得る数値範囲を解析する
    請求項21記載のプログラム。
  30. 【請求項30】 前記配列演算の式が一次式であるか又
    は多次式であるかを判別し、一次式である場合に、前記
    配列演算の式の右辺に含まれる前記配列演算に用いられ
    る変数の上限値及び下限値のみを前記配列演算の式に代
    入することによって、前記配列演算の演算値を格納する
    変数が取り得る数値範囲を解析する請求項21記載のプ
    ログラム。
JP2001349185A 2001-11-14 2001-11-14 コンパイラ装置及びコンパイル方法 Expired - Fee Related JP3598090B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2001349185A JP3598090B2 (ja) 2001-11-14 2001-11-14 コンパイラ装置及びコンパイル方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2001349185A JP3598090B2 (ja) 2001-11-14 2001-11-14 コンパイラ装置及びコンパイル方法

Publications (2)

Publication Number Publication Date
JP2003150386A true JP2003150386A (ja) 2003-05-23
JP3598090B2 JP3598090B2 (ja) 2004-12-08

Family

ID=19161893

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2001349185A Expired - Fee Related JP3598090B2 (ja) 2001-11-14 2001-11-14 コンパイラ装置及びコンパイル方法

Country Status (1)

Country Link
JP (1) JP3598090B2 (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005301415A (ja) * 2004-04-07 2005-10-27 Ricoh Co Ltd コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム
WO2011096016A1 (ja) * 2010-02-05 2011-08-11 株式会社 東芝 コンパイラ装置
JP7492655B1 (ja) 2022-05-12 2024-05-29 之江実験室 アレイ型解析プリミティブ構造に基づくバックエンドコンパイラの実現方法及び装置

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005301415A (ja) * 2004-04-07 2005-10-27 Ricoh Co Ltd コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム
WO2011096016A1 (ja) * 2010-02-05 2011-08-11 株式会社 東芝 コンパイラ装置
JPWO2011096016A1 (ja) * 2010-02-05 2013-06-06 株式会社東芝 コンパイラ装置
JP7492655B1 (ja) 2022-05-12 2024-05-29 之江実験室 アレイ型解析プリミティブ構造に基づくバックエンドコンパイラの実現方法及び装置

Also Published As

Publication number Publication date
JP3598090B2 (ja) 2004-12-08

Similar Documents

Publication Publication Date Title
JP4105264B2 (ja) コンパイラ
US20060195828A1 (en) Instruction generator, method for generating instructions and computer program product that executes an application for an instruction generator
CN110096439B (zh) 一种面向solidity语言的测试用例生成方法
Laguna et al. Gpumixer: Performance-driven floating-point tuning for gpu scientific applications
Dahiya et al. Black-box equivalence checking across compiler optimizations
Etessami et al. Model checking of recursive probabilistic systems
JP2008510230A (ja) 非循環命令パターンの認識の方法
Moosbrugger et al. This is the moment for probabilistic loops
Gupta et al. Effective use of SMT solvers for program equivalence checking through invariant-sketching and query-decomposition
Lee et al. Raive: Runtime assessment of floating-point instability by vectorization
JP2003150386A (ja) コンパイラ装置及びコンパイル方法
Sargsyan et al. Scalable and accurate clones detection based on metrics for dependence graph
Olschanowsky et al. Pir: Pmac's idiom recognizer
Sharma et al. Sound bit-precise numerical domains
Jeuring et al. Libraries for generic programming in Haskell
Solovev et al. Next-generation intermediate representations for binary code analysis
Giegerich et al. Towards a discipline of dynamic programming
Szűgyi et al. C++ metastring library and its applications
Grahne et al. Design and implementation of a string database query language
Maalej et al. Combining range and inequality information for pointer disambiguation
Collberg Automatic derivation of compiler machine descriptions
Ogata Automatically extracting the correspondence between the natural language and the pseudo-code descriptions of instruction set manuals
Pavlatos et al. Parallel hardware stochastic context-free parsers
Cohen et al. Evaluating and improving recursive descent parsers
JP2003067195A (ja) 最適化コンパイル方法及び最適化コンパイル装置

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040622

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040816

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040907

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040910

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080917

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080917

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090917

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090917

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100917

Year of fee payment: 6

LAPS Cancellation because of no payment of annual fees