(57)【特許請求の範囲】
【請求項１】
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得し、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する、
ことを含む処理をコンピュータに実行させるコンパイラプログラム。
【請求項２】
前記複数の構造体を取得する処理は、更に、データを読み出す命令を表す構造体と、データを格納する命令を表す構造体と、演算及び読み出す命令の間のデータ依存関係とを取得し、
前記データ依存関係を有する演算を表す構造体に印を付す処理は、前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体の演算との間でデータ依存関係を有する演算を表す構造体、及び前記印が付加された前記構造体の演算との間でデータ依存関係を有する前記読み出す命令を表す構造体に他の印を付加し、前記印が付加された前記構造体の読み出し命令が読み出すデータを格納する命令を表す構造体に他の印を付加する請求項１記載のコンパイラプログラム。
【請求項３】
前記最適化を実施する処理は、更に、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる演算を表す前記構造体であって、かつ、前記印が付加された前記構造体に対して前記最適化を実施する請求項１又は２記載のコンパイラプログラム。
【請求項４】
前記演算である場合に前記構造体に印を付加する処理は、前記取得された演算を表す構造体の各々について、前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合であって、かつ、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる前記演算でない場合に前記構造体に印を付加する請求項１又は２記載のコンパイラプログラム。
【請求項５】
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得し、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する、
ことを含むコンパイラ方法。
【請求項６】
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得する字句構文解析部と、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する最適化部と、
を含むコンパイラ装置。
【請求項７】
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得する字句構文解析部と、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する最適化部と、
を含むコンパイラ装置と、
利用者の操作により入力情報を前記コンパイラ装置へ送信する情報端末と、
を含む、コンパイラシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示する技術は、コンパイラプログラム、コンパイラシステム、コンパイラ方法、及びコンパイラ装置に関する。
【背景技術】
【０００２】
従来、高級言語で記述された原始プログラム（ソースプログラム）を、機械語プログラム（目的プログラム）に翻訳するためのコンパイラに、目的プログラムの実行時の効率を高めるための最適化機能を持たせる技術が存在する。
【０００３】
例えば、コンパイラにおける命令式を木構造に変換し、当該木構造を構成する項を優先順位の高い方から順にサーチして中間結果の項に当該中間結果の演算精度を保障する最低のビットを設定する。そして、最低のビット数を設定された木構造を構成する項を優先順位の低い方から順にサーチして中間結果のうち、代入元の演算精度が代入先の演算精度を超えている場合のみ代入元の演算精度を代入先の演算精度に置き換えることを用いて式解析を行う方法がある。
【０００４】
また、まず、除算以外の最適化の前に、中間形式での命令の種類毎の割合を調べ、除算が性能のボトルネックとなるかどうか判断する。そして、除算が性能のボトルネックとなる場合は、依存関係のない複数の除算を、除数の積の逆数を計算し、除算の商を逆数と被逆数と被除数に対応する除数以外の全ての除数の積として求める方法がある。
【０００５】
また、数値計算プログラムを中間言語に変換し、精度落ちを生じる箇所を検出して当該部分を精度落ちの防止を行ったものに変換する方法がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開昭６３−１７３１３２号公報
【特許文献２】特開２０００−１８１７２２号公報
【特許文献３】特開平４−１１２２２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
１つの側面では、開示する技術は、入力値の精度に敏感な演算の精度を落とさずにプログラムの他の部分の演算を高速化する。
【課題を解決するための手段】
【０００８】
一つの態様として、開示の技術は、コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得する。また、前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加する。また、前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加する。また、前記印が付加されていない構造体のうち、最適化の対象となる構造体に対して前記最適化を実施する。なお、最適化は、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化であるものとする。
【発明の効果】
【０００９】
一つの側面として、入力値の精度に敏感な演算の精度を落とさずにプログラムの他の部分の演算を高速化する、という効果を有する。
【図面の簡単な説明】
【００１０】
【図１】コンパイラの処理の流れの例を示した図である。
【図２】構文木の例を示した図である。
【図３】浮動小数点除算に対するテンプレート例を示す図である。
【図４】テンプレートの組み合わせによる命令作成の例を示す図である。
【図５】浮動小数点の整数への型変換のテンプレートを示す図である。
【図６】複数のノードを含む単一のテンプレートによる命令作成の例を示す図である。
【図７】テンプレートでは対応できない例を示す図である。
【図８】load/store命令を介したデータ依存の可能性がある場合の例を示す図である。
【図９】従来のデータ構造体の例を示す図である。
【図１０】本実施形態において用いるデータ構造体の例を示す図である。
【図１１】ノードに印を付加した例を示す図である。
【図１２】第１の実施形態に係るコンパイラ装置を含むシステム構成を示す概略図である。
【図１３】第１の実施形態に係るコンパイラ装置の機能ブロック図である。
【図１４】記録表の例を示す図である。
【図１５】第１の実施形態に係るコンパイラ装置として機能するコンピュータの概略構成を示すブロック図である。
【図１６】第１の実施形態に係るコンパイル処理の一例を示すフローチャートである。
【図１７】第１の実施形態に係る最適化処理の一例を示すフローチャートである。
【図１８】第１の実施形態に係る構文木の探索と印の付加処理の一例を示すフローチャートである。
【図１９】第１の実施形態に係る構文木の探索処理の一例を示すフローチャートである。
【図２０】第１の実施形態に係る構文木の再探索処理の一例を示すフローチャートである。
【図２１】第１の実施形態に係る命令・選択生成処理の一例を示すフローチャートである。
【図２２】ソースプログラムの一例を示す図である。
【図２３】構文木の例を示す図である。
【図２４】構文木の例を示す図である。
【図２５】根ノードの選択の例を示す図である。
【図２６】入力値の精度に敏感な演算に対応するノードに印を付加する例を示す図である。
【図２７】親ノードに印が付加されている場合のノードに印を付加する例を示す図である。
【図２８】構文木の葉まで印が伝播した例を示す図である。
【図２９】ノードに印がついている構文木の命令生成の例を示す図である。
【図３０】根ノードを選択の例を示す図である。
【図３１】探索の例を示す図である。
【図３２】探索の例を示す図である。
【図３３】探索の例を示す図である。
【図３４】ノードに印が付加されていない構文木について命令生成を行った例を示す図である。
【図３５】ソースプログラムの例を示す図である。
【図３６】load命令及びstore命令を含む構文木の例を示す図である。
【図３７】構文木の再探索前の状態を表す例を示す図である。
【図３８】store命令とload命令の指し示すアドレスが一致する可能性がある場合におけるノードに印を付加する例を示す図である。
【図３９】再探索の結果の例を示す図である。
【図４０】store命令及びload命令を含む構文木の命令生成の例を示す図である。
【図４１】最適化記録表の例を示す図である。
【図４２】第２の実施形態に係るコンパイラ装置の機能ブロック図である。
【図４３】第２の実施形態に係るコンパイラ装置として機能するコンピュータの概略構成を示すブロック図である。
【図４４】第２の実施形態に係るコンパイル処理の一例を示すフローチャートである。
【図４５】第２の実施形態に係る引数解析処理の一例を示すフローチャートである。
【図４６】第２の実施形態に係る最適化処理の一例を示すフローチャートである。
【図４７】指定処理記録表の一例を示す図である。
【図４８】第３の実施形態に係るコンパイラ装置の機能ブロック図である。
【図４９】第３の実施形態に係るコンパイラ装置として機能するコンピュータの概略構成を示すブロック図である。
【図５０】第３の実施形態に係るコンパイル処理の一例を示すフローチャートである
【図５１】第３の実施形態に係る引数解析処理の一例を示すフローチャートである。
【図５２】第３の実施形態に係る最適化処理の一例を示すフローチャートである。
【図５３】第３の実施形態に係る構文木の探索と印の付加処理の一例を示すフローチャートである。
【図５４】第３の実施形態に係る構文木の探索処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下、開示する技術に係る実施形態について説明する。
【００１２】
まず、実施形態の詳細を説明する前に、後述する各実施形態により提供されるシステムにおいて前提となるコンパイラと最適化について説明する。
【００１３】
コンパイラとは、図１に示すように、高級プログラム言語で記載された原始プログラム（以後、ソースプログラムとする。）を、機械語プログラム（以後、目的プログラムとする。）に翻訳するためのプログラムである。
【００１４】
コンパイラの動作は、一般的に、引数解析処理、字句・構文解析処理、最適化処理、命令選択・生成処理、及び機械語出力処理となる。
【００１５】
ここで、引数解析処理は、コンパイラの起動時に渡されたファイル名指定、オプションを解析し、コンパイラの動作を決定する。
【００１６】
また、字句・構文解析処理は、ソースプログラムを読み取り、ソースプログラムに記述されている処理をコンパイラ内で用いられる中間言語に変換する。
【００１７】
ここで、現在多くのコンパイラでは、ソースプログラムを直接目的プログラムに変換するのではなく、ソースプログラムを一旦コンパイラ内部で中間的な表現に変換し、さらに、その中間的な表現を目的プログラムに変換するという方法がとられている。この中間的な表現のことを中間言語という。
【００１８】
中間言語を用いることの利点は、ソースプログラムが持つ制御構造やデータ構造・命令間の依存関係などを計算機が扱いやすい形式で表現することにある。中間言語には、何種類もの形式が存在し、１つのコンパイラが複数の形式を用いることも可能であるが、後述する各実施形態においては、中間言語として構文木形式を用いる。なお、中間言語として３番地文形式、４番地文形式等、他の表現方法を用いてもよい。
【００１９】
また、構文木は、ソースプログラムに含まれるデータ、演算などを表すノードと、ノード間の依存関係を表すアークとを含む。単純な演算「c= a / b 」を表すソースプログラムを構文木に変換した一例を図２に示す。ここで、入力のないノードを「葉」、出力のないノードを「根」と呼ぶ。あるノードＡとノードＢとがアークでつながっており、ノードＢがノードＡの出力を入力とする場合、ノードＢをノードＡの「親」と呼び、ノードＡをノードＢの「子」と呼ぶ。このノード間の親子関係が、ノード間の依存関係の一例である。なお、構文木以外の他の形式の中間言語にも、データ、演算などを表す構成要素間の親子関係、又は、上流と下流との関係を表す依存関係が含まれる。そのため、他の形式の中間言語を用いても、後述するコンパイラにおける処理を、構文木を用いた場合と同様に処理をすることができる。
【００２０】
また、最適化処理は、目的プログラムの実行時の効率を高めるための中間言語を変換する処理である。一般的なコンパイラは、多くの最適化機能を有し、最適化機能は、例えば以下の３種類に分類することができる。具体的には、制御解析・データ解析と、通常の最適化と、積極的な最適化とである。なお、３種類の最適化の実施順は、順不同であり、また、必要に応じて１つの最適化を複数回繰り返すことがある。
【００２１】
ここで、制御解析・データ解析とは、プログラムの制御の流れ及びデータの解析であるが、この解析自体は最適化ではなく、制御解析・データ解析によって、最適化の実施に必要な情報が提供される。制御解析・データ解析には、複数のポインタ変数が指すメモリアドレスが同じものかどうかの解析も含まれる。
【００２２】
また、通常の最適化は、ソースプログラムから得られた中間言語をその意味するところを変えないよう、より効率の良い中間言語に変換する処理である。なお、通常の最適化は、必ず実施する処理ではない。通常の最適化の実施の可否は通常の最適化を実施するオプションが指定されたか否かによって決まる。
【００２３】
また、積極的な最適化は、最適化の一種であり、詳細は後述する。積極的な最適化の実施の可否は積極的な最適化を実施するオプションが指定されたか否かによって決まる。なお、積極的な最適化は、第１プログラムに対してコンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の一例である。
【００２４】
また、命令選択・生成処理は、中間言語を、対応する目的プログラムの機械語命令に変換する処理である。機械語命令への変換には、テンプレートと呼ばれる、単独あるいは複数の中間言語命令を目的プログラムの機械語命令と紐付けるためのルールを用いる。
【００２５】
なお、命令選択は最適化と独立した処理ではない。命令選択の方法を複数個用意し、最適化レベル（最適化をまったく実施しない場合、通常の最適化のみを実施する場合、積極的な最適化も実施する場合）に応じて、そのうちの１つを選択させることができる。もちろん、最適化を実施するかしないかに関わらず、同じ命令を選択しても良い。
【００２６】
また、機械語出力処理は、目的プログラムを出力する処理である。
【００２７】
コンパイラの重要な機能の１つに上述した最適化がある。近年のコンパイラでは、最適化の一種である「積極的な最適化」を備えているものが多い。積極的な最適化とは、ソースプログラムを解析しただけでは得ることができない特定の条件を仮定することにより達成することができる、通常の最適化より効率の良い最適化である。また、積極的な最適化は、目的プログラムでの演算の実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化処理ともいえる。この点について、詳細に説明する。
【００２８】
科学技術の分野で用いられるプログラムでは、数値を浮動小数点で表現して演算することが一般的である。浮動小数点数の演算については、ＩＥＥＥ７５４と呼ばれる標準規格がある。当該標準規格は、データの形式（基本形式、交換形式）、演算の種類、誤差の丸めの規則、又は例外処理の事柄に対して定められている。
【００２９】
例えば、上記のようなＩＥＥＥ７５４に準拠した浮動小数点演算に対する積極的な最適化として、ＩＥＥＥ７５４への準拠度合いを緩めることによる大幅な高速化を可能とする最適化がある。
【００３０】
次に、上記の浮動小数点演算に対する積極的な最適化について２つの例について考えてみる。
【００３１】
１つめの積極的な最適化の例を、「変数ｘと定数１．０との乗算をｘそのものと置き換えることで乗算を省略する」とする。この場合、演算の対象が特定の値以外の場合、当該積極的な最適化を実施した場合と実施しない場合とでは同じ結果を返すが、特定の値では、結果が異なることがある。例えば、ｘがＩＥＥＥ７５４で正規化して表現できる範囲を超えた値であれば、乗算の実行結果は、元のｘの値と異なることがあるが、最適化を適用した結果として乗算が省略されれば、式の値としてｘがそのまま使われる。
【００３２】
２つめの積極的な最適化の例を、「浮動小数点除算ｙ／ｘを、ｙを直接ｘで除算するのではなく、ｘの逆数とｙとの乗算に置き換えることで、計算時間の短縮やスループットの向上を図る」とする。これは、ハードウェアの設計によっては、除算命令１個より逆数演算と乗算との組み合わせの方が計算時間やスループットが短縮されることがありうるという理由に基づくものである。当該例は、逆数を求める演算を支援するハードウェアを備えた計算機において実行されるものとする。逆数を求める演算のハードウェア的な支援については、従来技術を用いる。図３に例を示す。
【００３３】
図３の例においては、最適化を行わない場合、または通常の最適化を実施する場合には、図３に示す構文木を変形せずに、そのまま対応するテンプレート「fdiv %a,%b,%c」を用いて目的プログラムを生成する。一方、積極的な最適化を実施する場合には、図３に示す構文木を、まず、ｂのノードをｂの逆数を求める構造に変形し、当該ｂの逆数を求めた結果とａの積によりｃを算出する構造になるように構文木を変形する。そして、変形した構文木に対応するテンプレート「reciprocal %b,%t及びfmul %t,%a,%c」を用いて目的プログラムを生成する。
【００３４】
この場合、除算命令を直接用いて除算を求めた場合と、除数の逆数を求めてから、被除数と除数の逆数との乗算で求めた場合とでは、理論上は同じ結果となる。しかし、与えられたデータの値によっては、計算値をＩＥＥＥ７５４が定めた形式に正規化したときの誤差により、異なる結果となる場合がある。
【００３５】
上記２つの例のように、演算対象が特定の値でないと仮定すれば、最適化を実施した場合と、実施しない場合とで結果は変わらないが、演算対象が特定の値以外の値かどうかはソースプログラムを解析しただけではわからない。そのため、上記２つの最適化は、積極的な最適化といえる。
【００３６】
積極的な最適化で生じる誤差の影響は、殆どの場合には無視しても差し支えない。しかし、入力値の精度に敏感な演算（入力値の精度に応じて出力結果が影響を受ける演算）の入力値として、積極的な最適化が実施された結果が使われた場合、プログラムの実行結果に想定外の影響を及ぼすことがある。そのため、入力値の精度に敏感な演算に対する入力値を出力する演算に対して、積極的な最適化を抑止する必要がある。
【００３７】
ここで、入力値の精度に敏感な演算の例を示す。１つ目の例として、「浮動小数点数の整数への変換」について説明する。
【００３８】
浮動小数点数を、小数点以下を切り捨てて整数に変換する場合、例えば、元のデータの値が、「1.0000000000000000」であるとすると結果の値が１となるが、元の値が、「0.9999999999999999」であるとすると結果の値が０となる。
【００３９】
次に、２つ目の例として「浮動小数点数同士の比較による分岐」について説明する。
【００４０】
２つの浮動小数点数の大小、又は一致／不一致の比較によって、その後の実行する命令を変える比較分岐命令の場合について考える。この場合、例えば、２つの値が「1.0」と「1.0000000000000001」であった場合と「1.0」と「0.9999999999999999」であった場合では、大小の比較結果が逆になるので、その後のプログラムの挙動がまったく異なることがあり得る。
【００４１】
上述の通り、積極的な最適化は、その性質上、入力値の精度に敏感な演算と組み合わせて用いることが困難な場合がある。これに対し、積極的な最適化の抑止方法として、下記（１）、（２）、及び（３）のような３つの抑止方法が考えられる。
【００４２】
（１）積極的な最適化のファイル単位での完全な抑止
（２）ユーザによるソースプログラムの修正
（３）コンパイラによる自動判別を用いた一部の積極的な最適化の抑止
【００４３】
上記（１）の方法は、プログラムを最適化するかどうか、また、どの程度まで最適化するかのレベルを、コンパイラを起動するときにユーザが与えるオプションで指定する方法である。この指定を行うことにより、積極的な最適化の実施を完全に抑止することができる。
【００４４】
上記（２）の方法は、ユーザがソースプログラム上に最適化に関するプラグマ指定を挿入する方法である。ここで、プラグマ指定とは、プログラムの翻訳方法をソースプログラムの行単位やブロックなどを単位として制御する方法である。プラグマ指定をソースプログラムの精度に敏感な演算への入力を生成している演算が記載された箇所に対して記述することで積極的な最適化を抑止したい部分を指定し、積極的な最適化を抑止することができる。
【００４５】
上記（３）の方法は、コンパイラの命令選択処理において、１つの中間言語のノードではなく、複数の中間言語のノードの連鎖に対して、目的プログラムの命令の並びを対応させる方法である。当該方法を用いることにより、積極的な最適化の結果を入力値の精度に敏感な演算が用いる場合に、２つの連鎖した中間言語のノードを含めた目的プログラムの生成を指定することができる。
【００４６】
次に、上記（３）の方法について例を挙げて詳細に説明する。
【００４７】
例として、図４に示す「数式 ii=(int64_t)(aa/xx);」のような浮動小数点除算の結果を整数へと型変換する処理を表す中間言語から目的プログラムを得る場合を考える。この場合、単独の浮動小数点除算を表すテンプレートと、単独の型変換を表すテンプレートとの組み合わせで実現することができる。
【００４８】
まず、浮動小数点除算の目的プログラムへの変換が積極的な最適化を実施する場合と、積極的な最適化を行わない場合との２通り考えられるとする。この場合、図３に示すように、最適化レベル別に、２つのテンプレートを用意する。１つは、積極的な最適化を実施した構文木に適用して目的プログラムへ変換するためのテンプレートであり、もう１つは、積極的な最適化を実施していない構文木に適用して目的プログラムへ変換するためのテンプレートである。また、型変換に関しては、図５のように、最適化レベルによらず１通りだけ用意することにする。当該例において、「数式 ii=(int64_t)(aa/xx);」の中間言語に対して、図４に示すように、図３に示す積極的な最適化を実施する場合、または実施しない場合のテンプレートと、図５に示すテンプレートとを組み合わせて適用することができる。
【００４９】
なお、図４に示す構文木は、積極的な最適化を実施していない構文木の例を示しているが、積極的な最適化を実施する場合には、積極的な最適化により変換された構文木に対して、積極的な最適化を実施する場合のテンプレートが適用される。
【００５０】
この方法の場合、最適化レベルを積極的な最適化を実施すると指定すると、誤差を生じる可能性のある逆数との乗算による除算演算の結果を浮動小数点数の整数への変換の入力として用いるため、プログラムの実行結果に想定外の影響を及ぼす可能性がある。
【００５１】
当該問題に対して、上記（３）の方法は、除算とその結果を利用する型変換命令との各々に対する２つのテンプレートを組み合わせて、積極的な最適化を実施する場合のテンプレートを用意する。また、当該テンプレートとは別に、図６のように、除算とその結果を利用する型変換命令との両方を含むパターンの構文木に対して、全ての最適化レベルで構文木に適用して目的プログラムへ変換するためのテンプレートを用意する。
【００５２】
ここで、目的プログラムの生成において複数の最適化レベル毎のテンプレートが適応できる場合（複数の最適化レベルが実施できる場合）について考える。この場合、テンプレートの優先順位を定めておくことで、最適化レベルが決定されるようにする。例えば、図３、及び図５のテンプレートよりも、図６のテンプレートが優先して選ばれるように設定しておく。このようにすることにより、型変換命令が後続する除算命令に対し、最適化を実施しない、又は通常の最適化が実施され、図６のテンプレートを適用する。よって、積極的な最適化の実施を抑止することができる。
【００５３】
しかし、上記（１）〜（３）の方法に対しては、各々下記のような課題がある。
【００５４】
上記（１）の方法に対しては、最適化レベルの指定がソースプログラムを記述したファイル単位で行われることになる。そのため、当該ファイルに記述されたソースプログラム中に１箇所でも入力値の精度に敏感な演算がある場合、当該ファイルに指定する最適化レベルを当該演算に合わせて落とす必要がある。このような方法であると、同じファイルに存在する残りの演算に対し、積極的な最適化が実施できないため、プログラム全体の効率化を妨げることから、性能に対する悪影響が大きい。
【００５５】
上記（２）の方法に対しては、正しくプラグマを挿入するためには、目的プログラムを実行させるハードウェアに対して、ユーザが詳細な知識を持つ必要がある。そのため、全てのユーザが利用可能な方法であるとはいえない。また、ユーザにソースプログラムを修正させることの負担が大きいといえる。また、ソースプログラムに挿入されたプラグマは、他のハードウェアの目的プログラムに翻訳する用途に使えるとは限らないため、ユーザはプログラムを実行させるハードウェア毎にプラグマを変更する必要がある。また、大規模なプログラムでは、全ての積極的な最適化を抑止したい場所に適切にプラグマを挿入するのは非常に大きな工数がかかる可能性がある。
【００５６】
上記（３）の方法に対しては、２つの観点から課題がある。１つめの課題（ａ）として、コンパイラは、問題となりそうな演算の組み合わせに対し、事前にテンプレートを用意しなければならない。しかし、実際のプログラムでは、事前にテンプレートを用意できない場合がありうるということである。
【００５７】
例えば、上記（３）の方法について説明した際に用いた例「ii=(int64_t)(aa/xx);」を少し変更した「ii=(int64_t)(aa/xx-yy);」というソースプログラムを考える。当該ソースプログラムの構文木は、図７のようになり、図６に示す構文木とは異なる。そのため、図６に示す、積極的な最適化を実施しない場合のテンプレートを適用することができず、積極的な最適化を抑止することができない。図７のパターンの構文木に対応するただ１つのテンプレートをコンパイラに追加したとしても、このような例は無数にあるため、ユーザは自分の翻訳しようとするプログラムで積極的な最適化が適切に抑止されることを確証できない。
【００５８】
２つ目の課題（ｂ）は、複数の構文木がデータのメモリ転送命令を介してデータ依存関係を結ぶ可能性がある場合に対応できないということである。例えば、図８に示すように、プログラムのある部分で得られた値をstore命令でメモリに格納し、別の部分でload命令を使用してメモリから取り出して演算に用いることを考える。図８では、プログラムのある部分では浮動小数点除算が実行され、別の部分では型変換命令が実行される例を示している。
【００５９】
この場合、浮動小数点除算と型変換命令とは異なる構文木に存在するので、上記（３）の方法の様に、浮動小数点除算と型変換との両方を含むパターンの構文木に対して、ただ１つの積極的な最適化を実施しないテンプレートを用意する方法は適用できない。そのため、ユーザがプログラム中にstore命令、又はload命令を用いるような処理がないことを確認する必要がある。
【００６０】
よって、上記（３）の方法では、特に、「積極的な最適化」の対象となる演算と、「入力値の精度に敏感な演算」との構文木上での距離が遠い場合、積極的な最適化を実施することにより、問題が起きる可能性が高まる。また、メモリを介して間接的に繋がっている場合も、積極的な最適化を実施することにより、問題が起きる可能性が高まる。
【００６１】
これは、距離が遠い場合、又はメモリを介している場合は、「入力値の精度に敏感な演算」から遡って影響が波及する範囲に、「積極的な最適化」の対象となる演算が含まれるかどうかをユーザが判断することが難しくなることによるものである。
【００６２】
上述の通り、上記（１）〜（３）の積極的な最適化の抑止方法については問題がある。そのため、後述する各実施形態に係るコンパイラにおいては、上記課題（ａ）及び（ｂ）を解決して、積極的な最適化の適切な実施、又は抑止を実現する。なお、課題（ａ）及び（ｂ）が解決できれば、上記（１）及び（２）の方法を用いる必要性は著しく減少すると考えられるため、上記（１）及び（２）の課題はほぼ問題にならない。
【００６３】
以下、実施形態の概要として、上記の課題（ａ）及び（ｂ）の解決方法について説明する。
【００６４】
まず、課題（ａ）の解決方法について説明する。課題（ａ）に対しては、構文木上で、入力値の精度に敏感な演算を始点として、既存のデータ依存解析を行い、その入力値の精度に敏感な演算の入力値を生成した演算を特定して印を付加する。
【００６５】
さらに、当該印を付けた演算に再帰的に既存のデータ依存解析を適用することで、同じ構文木の中の、入力値の精度に敏感な演算に影響を与える全ての演算に、その距離に関係なく印の伝播を可能とすることで、特定作業を完了する。
【００６６】
そして、印を付けられた演算、即ち、入力値の精度に敏感な演算に対する入力値にかかわる演算を積極的な最適化の対象外とすることで、課題（ａ）を解決する。
【００６７】
なお、課題（ａ）を解決するために、実施形態に係るコンパイラ内部のデータ構造を変更する。例えば、図９に示す従来のノードのデータ依存関係の情報を含むノードを表す構造体に、当該ノードが入力値の精度に敏感な演算に連絡することを表明する印を付加し、図１０に示すような構造体に変更する。例えば、ノードを表す構造体に、図１０に示すように真偽値を表す「error_sensitive」というメンバを追加し、当該メンバの値が真で有るときに、当該ノードが入力値の精度に敏感な演算に連絡することを表明するものとすることができる。なお、「error_sensitive」というメンバが真である場合には、図１１に示すように、従来のノード表記に印を付加し、積極的な最適化を実施しない対象として表明する。
【００６８】
次に、課題（ｂ）の解決方法について説明する。課題（ｂ）に対しては、既存の、メモリとのデータ転送命令同士の間のアドレス解析を行うことで、入力値の精度に敏感な演算が含まれる構文木以外の構文木にまで、印の伝播する範囲を拡大させる。このようにすることにより、複数の構文木にまたがった特定作業が可能となる。
【００６９】
そして、複数の構文木にまたがって印をつけられた演算も入力値の精度に敏感な演算の入力値に関わる演算であるとの判断が可能となるので、それらに対し積極的な最適化の対象外とすることで、課題（ｂ）を解決する。
【００７０】
以下、図面を参照して、各実施形態について詳細に説明する。なお、各実施形態において用いられる、「入力値の精度に敏感な演算」は予め定義されているものとする。また、各実施形態において、上述した前提となるコンパイラと最適化についての説明、及び実施形態の概要と共通する内容については、詳細な説明を省略する。
【００７１】
図１２は、第１の実施形態のコンパイラシステム５の一例である。図１２に示すように、コンパイラシステム５は、コンパイラ装置１と、利用者用の利用者端末３と、外部ディスク４０とを有する。また、外部ディスク４０は、ソースプログラム記憶部４２、及び目的プログラム記憶部４６を有する。第１の実施形態に係るコンパイラ装置１は、インターネット等のネットワーク２を介して、利用者端末３、及び外部ディスク４０と相互に通信可能に接続される。なお、図１２における利用者端末３は、１つの場合について図示したが、利用者端末３の数は図示の例に限定されず、コンパイラシステム５は任意の数の利用者端末３を有することができる。また、利用者端末３は、例えば、パーソナルコンピュータ等の情報処理装置であり、コンパイルを行う者により利用されるものとする。
【００７２】
ソースプログラム記憶部４２には、ソースプログラムの各々が記憶されている。
【００７３】
目的プログラム記憶部４６は、目的プログラムの各々が記憶される。
【００７４】
図１３に、第１の実施形態に係るコンパイラ装置１の機能ブロック図を示す。図１３に示すように、コンパイラ装置１は、引数解析部２２、字句構文解析部２４、最適化部２６、命令生成部２８、目的プログラム出力部３０、テンプレート記憶部３２、記録表記憶部４４を含むコンパイラ２０を有する。
【００７５】
コンパイラ２０は、利用者端末３から受信した入力情報（コマンド）に基づいて、起動され、ネットワーク２を介してソースプログラム記憶部４２から対象となるソースプログラムを取得する。また、コンパイラ２０は、取得したソースプログラムを目的プログラムに変換し、ネットワーク２を介して目的プログラム記憶部４６に記憶する。
【００７６】
引数解析部２２は、利用者端末３から受信した入力情報に基づいて、コンパイラの動作を決定する。具体的には、引数解析部２２は、利用者端末３から受信した、コンパイラの起動時に渡されたソースプログラムを格納したファイル、又は目的プログラムを格納すべきファイルのファイル名などのファイル名指定により、対象となるファイルを決定する。また、引数解析部２２は、利用者端末３から受信した、コンパイラの起動時に渡された、どのような最適化を実施するかを指定するオプションを解析し、実施する最適化を決定する。また、引数解析部２２は、利用者端末３から受信した、出力する目的プログラムの形式を指定するオプションを解析し、出力する目的プログラムの形式を決定する。なお、決定される最適化は、後述する字句構文解析部２４において生成される構文木の全てが対象となる。
【００７７】
字句構文解析部２４は、引数解析部２２において決定した、対象となるソースプログラムを格納したファイル名に基づいて、対象となるソースプログラムに記述された処理をコンパイラ内で用いられる中間言語である構文木形式に変換する。字句構文解析部２４により、特定の演算単位の構文木の各々が生成される。字句構文解析部２４により、複数の演算間のデータの入出力の関係を表すデータ依存関係を取得することができる。
【００７８】
具体的には、字句構文解析部２４は、まず、引数解析部２２において決定した、対象となるソースプログラムを格納したファイル名に基づいて、ソースプログラム記憶部４２から、対象となるソースプログラムを取得する。次に、字句構文解析部２４は、取得したソースプログラムに記述された処理について、字句解析を行う。次に、字句構文解析部２４は、字句解析結果に基づいて、構文解析を行い、特定の演算単位の構文木の各々を生成する。
【００７９】
最適化部２６は、字句構文解析部２４において生成した構文木の各々について、引数解析部２２において決定した最適化に関するコンパイラの動作に基づいて、最適化を実施する。具体的には、まず、最適化部２６は、制御解析・データ解析を行い、通常の最適化、又は積極的な最適化の実施に必要な情報を取得する。第１の実施形態においては、最適化部２６は、従来技術を用いて、全ての構文木に含まれるstore命令の各々とload命令の各々との指すアドレスが一致するか否かの判定結果を取得する。
【００８０】
ここで、アドレスが一致するか否かの判定結果は、一致する、一致しない、及び不明の３種類に分類されるものであるが、第１の実施形態においては、一致する、及び不明の場合に一致すると判定するものとする。
【００８１】
次に、最適化部２６は、構文木の各々について、当該構文木のノードを探索し、当該構文木に含まれるノードのうち、入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印を付加する。
【００８２】
具体的には、まず、最適化部２６は、構文木の各々のうち、処理対象となる構文木の根ノードを処理対象となるノードとして決定する。次に、最適化部２６は、当該ノードが、「入力値の精度に敏感な演算を表すノード」、及び「親ノードに印が付加されている」という２つの条件のうち少なくとも１つを満たしているか判定する。次に、最適化部２６は、条件を満たしていると判定した場合、当該ノードに印を付加する。例えば、ノードが、図１０に示すようなデータ構造体で表される場合、当該ノードのデータ構造体の「error_sensitive」の値を１（true）に変更することで、当該ノードに印を付加することができる。また、最適化部２６は、当該ノードがload命令か否かを判定する。最適化部２６は、当該ノードがload命令である場合には、当該load命令の指すアドレスを、図１４に示すような記録表記憶部４４に記憶されている記録表に記憶する。
【００８３】
次に、最適化部２６は、当該ノードに未処理の子ノードが存在する場合には、当該子ノードを処理対象のノードとして選択し、同様の処理を再帰的に繰り返す。次に、最適化部２６は、全ての子ノードについて処理を終了したら処理対象のノードを当該ノードの親ノードに変更し、未処理の子ノードが存在するか判定する。次に、最適化部２６は、未処理の子ノードが存在する場合には、再帰的に上記処理を繰り返す。一方、未処理の子ノードが存在しない場合には、当該処理対象のノードの親ノードを処理対象のノードとする処理を繰り返す。最適化部２６は、上記処理を繰り返すことにより、構文木の各々について、当該構文木に含まれるノードの各々について印を付加する処理を行う。
【００８４】
次に、最適化部２６は、構文木の各々について、当該構文木のノードを再探索し、当該構文木に含まれるノードのうち、別の構文木に含まれる入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印を付加する。
【００８５】
具体的には、まず、最適化部２６は、構文木の各々のうち、処理対象となる構文木の根ノードを処理対象となるノードとして決定する。次に、最適化部２６は、当該ノードが「store命令を表すノードであり、かつ、store命令の指すアドレスが記録表記憶部４４に記憶されている記録表に記憶されている」、及び「親ノードに印が付加されている」のうち少なくとも一方の条件を満たすか判定する。次に、最適化部２６は、条件を満たしていると判定した場合、当該ノードに印を付加する。
【００８６】
次に、最適化部２６は、当該ノードに未処理の子ノードが存在する場合には、当該子ノードを処理対象のノードとして選択し、同様の処理を再帰的に繰り返す。次に、最適化部２６は、全ての子ノードについて処理を終了したら処理対象のノードを当該ノードの親ノードに変更し、未処理の子ノードが存在するか判定する。次に、最適化部２６は、未処理の子ノードが存在する場合には、再帰的に上記処理を繰り返す。一方、未処理の子ノードが存在しない場合には、当該処理対象のノードの親ノードを処理対象のノードとする処理を繰り返す。最適化部２６は、上記処理を繰り返すことにより、構文木の各々について、当該構文木に含まれるノードの各々について印を付加する処理を行う。
【００８７】
次に、最適化部２６は、引数解析部２２において決定した最適化に関するコンパイラの動作に基づいて、構文木の各々について、最適化を実施する。具体的には、最適化部２６は、引数解析部２２において最適化を実施するオプションが指定されていないと判定した場合には、全ての構文木について通常の最適化、及び積極的な最適化を行わない。また、最適化部２６は、引数解析部２２において最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されていないと判定した場合、全ての構文木に対して通常の最適化を実施する。また、最適化部２６は、引数解析部２２において最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されていると判定した場合には、構文木の各々について、通常の最適化、又は積極的な最適化を実施する。
【００８８】
ここで、最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されている場合における、通常の最適化を実施するか、積極的な最適化を実施するかの判断について説明する。最適化部２６は、処理対象となる構文木に含まれるノードに印が付加されているか否かにより判断する。最適化部２６は、処理対象となる構文木に含まれるノードに印が付加されている場合には、当該構文木に対して通常の最適化を実施する。一方、最適化部２６は、処理対処となる構文木に含まれるノードに印が付加されていない場合には、当該構文木に対して積極的な最適化を実施する。最適化部２６は、最適化を行わない、通常の最適化を行った、積極的な最適化を行ったという最適化処理の結果（最適化レベル）も含めて、処理済の構文木の各々を命令生成部２８に出力する。なお、処理済の構文木とは、最適化又は積極的な最適化を実施した場合には、最適化済み又は積極的な最適化済み構文木であり、最適化を実施していない場合には、字句構文解析部２４で生成されたままの状態の構文木である。
【００８９】
命令生成部２８は、最適化部２６における処理済みの構文木の各々を、テンプレート記憶部３２に記憶されているテンプレートの各々に基づいて、目的プログラムに変換する。また、命令生成部２８は、当該目的プログラムを、目的プログラム出力部３０に出力する。
【００９０】
具体的には、まず、命令生成部２８は、処理対象となる構文木を選択する。次に、命令生成部２８は、テンプレート記憶部３２に記憶されているテンプレートから、処理対象となる構文木に対応するテンプレートを選択する。
【００９１】
ここで、テンプレート記憶部３２には、構文木の各パターンに対応したテンプレートの各々が、最適化レベル毎に分類されて記憶されている。具体的には、構文木の各パターンに対応したテンプレートの各々が、最適化を実施しない場合のテンプレート群、通常の最適化を実施した場合のテンプレート群、及び積極的な最適化を実施した場合のテンプレート群に分類されて記憶されている。
【００９２】
そこで、命令生成部２８は、処理対象となる構文木に対して最適化が行われなかった場合には、テンプレート記憶部３２に記憶されている、最適化を実施しない場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。また、命令生成部２８は、処理対象となる構文木に対して通常の最適化が行われた場合には、テンプレート記憶部３２に記憶されている通常の最適化を実施した場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。また、命令生成部２８は、処理対象の構文木に対して積極的な最適化が行われた場合には、テンプレート記憶部３２に記憶されている、積極的な最適化を実施した場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。
【００９３】
次に、命令生成部２８は、処理対象となる構文木と、選択したテンプレートとに基づいて、当該構文木を目的プログラムに変換する。
【００９４】
目的プログラム出力部３０は、命令生成部２８において変換された目的プログラムの各々をまとめ、１つの目的プログラムとして、ネットワーク２を介して、外部ディスク４０に記憶されている目的プログラム記憶部４６に記憶する。
【００９５】
記録表記憶部４４には、図１４に示すような、印が付加されたload命令のノードを示す情報とアドレスとの組み合わせを記憶する記録表が記憶されている。
【００９６】
コンパイラ装置１は、例えば図１５に示すコンピュータ２００で実現することができる。コンピュータ２００はＣＰＵ２０２、一時記憶領域としてのメモリ２０４、及び不揮発性の記憶装置２０６を備える。また、コンピュータ２００は、入出力装置２０８が接続される入出力インターフェース（Ｉ／Ｆ）２１０を備える。また、コンピュータ２００は、記録媒体２１２に対するデータの読み込み及び書き込みを制御するｒｅａｄ／ｗｒｉｔｅ（Ｒ／Ｗ）部２１４、及びインターネット等のネットワーク２に接続されるネットワークＩ／Ｆ２１６を備える。ＣＰＵ２０２、メモリ２０４、記憶装置２０６、入出力Ｉ／Ｆ２１０、Ｒ／Ｗ部２１４、及びネットワークＩ／Ｆ２１６は、バス２１８を介して互いに接続される。
【００９７】
記憶装置２０６はＨＤＤ（Hard Disk Drive）、ＳＳＤ（solid state drive）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶装置２０６には、コンピュータ２００をコンパイラ装置１として機能させるためのコンパイラプログラム３００が記憶される。また、記憶装置２０６は、テンプレートの各々が記憶されるテンプレート記憶領域３５０を有する。また、記録表が記録される記録表記憶領域３５４を有する。
【００９８】
ＣＰＵ２０２は、コンパイラプログラム３００を記憶装置２０６から読みだしてメモリ２０４に展開する。また、ＣＰＵ２０２は、コンパイラプログラム３００が有するプロセスを順次実行する。また、ＣＰＵ２０２は、テンプレート記憶領域３５０に記憶されたテンプレートの各々を読み出し、メモリ２０４に展開する。また、ＣＰＵ２０２は、記録表記憶領域３５４に記憶された記録表を読み出し、メモリ２０４に展開する。
【００９９】
コンパイラプログラム３００は、引数解析プロセス３０２と、字句構文解析プロセス３０４と、最適化プロセス３０６と、命令生成プロセス３０８と、目的プログラム出力プロセス３１０とを有する。
【０１００】
ＣＰＵ２０２は、引数解析プロセス３０２を実行することで、図１３に示す引数解析部２２として動作する。また、ＣＰＵ２０２は、字句構文解析プロセス３０４を実行することで、図１３に示す字句構文解析部２４として動作する。また、ＣＰＵ２０２は、最適化プロセス３０６を実行することで、図１３に示す最適化部２６として動作する。また、ＣＰＵ２０２は、命令生成プロセス３０８を実行することで、図１３に示す命令生成部２８として動作する。また、ＣＰＵ２０２は、目的プログラム出力プロセス３１０を実行することで、図１３に示す目的プログラム出力部３０として動作する。
【０１０１】
これにより、コンパイラプログラム３００を実行したコンピュータ２００が、コンパイラ装置１として機能することになる。
【０１０２】
なお、コンパイラ装置１は、例えば半導体集積回路、より詳しくはＡＳＩＣ（Application Specific Integrated Circuit）等で実現することも可能である。
【０１０３】
次に、第１の実施形態に係るコンパイラ装置１の作用について説明する。まず、利用者端末３から受信された入力情報をコンパイラ装置１が受け付けると、コンパイラ装置１において、図１６に示すコンパイル処理が実行される。なお、コンパイラ装置１により実行されるコンパイル処理は、開示する技術のコンパイラ方法の一例である。
【０１０４】
図１６は、コンパイル処理の一例を示すフローチャートである。図１６に示すコンパイル処理のフローチャートにおいて、まず、ステップＳ１００で、引数解析部２２は、入力情報に含まれるファイル名指定、オプション等を解析する。
【０１０５】
次に、ステップＳ１０２で、引数解析部２２は、テンプレート記憶部３２から、テンプレートの各々を取得する。
【０１０６】
次に、ステップＳ１０４で、引数解析部２２は、ネットワーク２を介してソースプログラム記憶部４２から、ステップＳ１００において取得した、処理対象となるソースプログラムのファイルを取得する。
【０１０７】
次に、ステップＳ１０６で、字句構文解析部２４は、ステップＳ１０４において取得したソースプログラムについて、字句解析、及び構文解析を行い、中間言語である構文木の各々を取得する。
【０１０８】
次に、ステップＳ１０８で、最適化部２６は、ステップＳ１０４において取得した構文木の各々について、ステップＳ１００において取得したオプション解析の結果に基づいて、最適化を実施する。
【０１０９】
次に、ステップＳ１１０で、命令生成部２８は、ステップＳ１０８において取得した構文木の各々と、ステップＳ１０２において取得したテンプレートの各々とに基づいて、構文木の各々を、目的プログラムの命令に変換する。
【０１１０】
次に、ステップＳ１１２で、目的プログラム出力部３０は、ステップＳ１１０において取得した目的プログラムの命令をまとめ、一つの目的プログラムとする。また、目的プログラム出力部３０は、まとめた目的プログラムをネットワーク２を介して、目的プログラム記憶部４６に記憶する。そして、目的プログラム出力部３０は、コンパイル処理を終了する。
【０１１１】
上述のステップＳ１０８の最適化の処理について、図１７において詳細に説明する。図１７は、ステップＳ１０８の最適化処理の一例を示すフローチャートである。図１７に示す最適化処理のフローチャートにおいて、まず、ステップＳ２００で、最適化部２６は、ステップＳ１０６において取得した構文木の各々について、制御解析、及びデータ解析を行い、最適化の実施に必要な情報を取得する。最適化部２６は、構文木の各々に含まれるstore命令とload命令とのアドレスの対応関係を取得する。
【０１１２】
次に、ステップＳ２０２で、最適化部２６は、ステップＳ１０６において取得した構文木の各々について、構文木の探索を行い、入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印を付加する。
【０１１３】
次に、ステップＳ２０４で、最適化部２６は、ステップＳ１００において取得したオプション解析の結果に基づいて、最適化を実施するオプションが指定されているか否かを判定する。最適化部２６が、オプションが指定されていると判定した場合には、最適化処理は、ステップＳ２０６へ移行する。一方、最適化部２６が、オプションが指定されていないと判定した場合には、全ての構文木について最適化を行わないと判定し、最適化処理は終了する。
【０１１４】
次に、ステップＳ２０６で、最適化部２６は、処理対象となる構文木を決定する。
【０１１５】
次に、ステップＳ２１０で、最適化部２６は、ステップＳ１００において取得したオプション解析の結果に基づいて、積極的な最適化を実施するオプションが指定されているか否かを判定する。最適化部２６が、積極的な最適化のオプションが指定されていると判定した場合には、最適化処理は、ステップＳ２１２へ移行する。一方、最適化部２６が、積極的な最適化のオプションが指定されていないと判定した場合には、最適化処理は、ステップＳ２１６へ移行する。
【０１１６】
次に、ステップＳ２１２で、最適化部２６は、処理対象となる構文木に含まれるノードに印が付加されているノードが含まれているか否かを判定する。最適化部２６が、処理対象となる構文木に含まれるノードに印が付加されているノードが含まれていると判定した場合には、最適化処理は、ステップＳ２１６へ移行する。一方、最適化部２６は、処理対象となる構文木に含まれるノードに印が付加されているノードが含まれていないと判定した場合には、最適化処理は、ステップＳ２１４へ移行する。
【０１１７】
次に、ステップＳ２１４で、最適化部２６は、処理対象となる構文木に対して、積極的な最適化を実施する。
【０１１８】
ステップＳ２１６で、最適化部２６は、処理対象となる構文木に対して、通常の最適化を実施する。
【０１１９】
次に、ステップＳ２２０で、最適化部２６は全ての構文木について、ステップＳ２０６〜ステップＳ２１４、又はステップＳ２１６までの処理を終了したか否かを判定する。最適化部２６が、全ての構文木についてステップＳ２０６〜ステップＳ２１６までの処理を終了したと判定した場合には、最適化処理は終了する。一方、最適化部２６が、全ての構文木についてＳＳ２０６〜ステップＳ２１６までの処理を終了していないと判定した場合には、最適化処理は、ステップＳ２０６へ移行する。
【０１２０】
上述のステップＳ２０２の構文木の探索と印の付加処理について、図１８において詳細に説明する。図１８は、ステップＳ２０２の構文木の探索と印の付加処理の一例を示すフローチャートである。図１８に示す構文木の探索と印の付加処理のフローチャートにおいて、まず、ステップＳ３００で、最適化部２６は、処理対象となる構文木を決定する。
【０１２１】
次に、ステップＳ３０２で、最適化部２６は、処理対象となる構文木について探索を行い、対象となるノードに印を付加する。
【０１２２】
次に、ステップＳ３０４で、最適化部２６は、全ての構文木についてステップＳ３０２の処理を終了したか否かを判定する。最適化部２６が、全ての構文木についてステップＳ３０２の処理を終了したと判定した場合には、ステップＳ３０６へ移行する。一方、最適化部２６が、全ての構文木についてステップＳ３０２の処理を終了していないと判定した場合には、ステップＳ３００へ移行する。
【０１２３】
次に、ステップＳ３０６で、最適化部２６は、処理対象となる構文木を決定する。
【０１２４】
次に、ステップＳ３０８で、最適化部２６は、処理対象となる構文木を再探索し、対象となるノードに印を付加する。
【０１２５】
次に、ステップＳ３１０で、最適化部２６は、全ての構文木についてステップＳ３０８の処理を終了したか否かを判定する。最適化部２６が、全ての構文木についてステップＳ３０８の処理を終了したと判定した場合には、構文木の探索と印付け処理は終了する。一方、最適化部２６が、全ての構文木についてステップＳ３０８の処理を終了していないと判定した場合には、構文木の探索と印付け処理は、ステップＳ３０６へ移行する。
【０１２６】
上述のステップＳ３０２の構文木の探索処理について、図１９において詳細に説明する。図１９は、ステップＳ３０２の構文木の探索処理の一例を示すフローチャートである。図１９に示す構文木の探索処理のフローチャートにおいて、まず、ステップＳ４００で、最適化部２６は、処理対象となる構文木の根ノードを処理対象となるノードとして選択する。
【０１２７】
次に、ステップＳ４０２で、最適化部２６は、当該ノードが、予め定められた入力値の精度に敏感な演算を表すか否かを判定する。最適化部２６が、当該ノードが、予め定められた入力値の精度に敏感な演算を表すと判定した場合には、構文木の探索処理は、ステップＳ４０６へ移行する。一方、最適化部２６が、当該ノードが、予め定められた入力値の精度に敏感な演算を表さないと判定した場合には、構文木の探索処理は、ステップＳ４０４へ移行する。
【０１２８】
次に、ステップＳ４０４で、最適化部２６は、当該ノードの親ノードに印が付加されているか否かを判定する。最適化部２６が、当該ノードの親ノードに印が付加されていると判定した場合には、構文木の探索処理は、ステップＳ４０６へ移行する。一方、最適化部２６が、当該ノードの親ノードに印が付加されていないと判定した場合には、構文木の探索処理は、ステップＳ４１２へ移行する。
【０１２９】
次に、ステップＳ４０６で、最適化部２６は、当該ノードに印を付加する。
【０１３０】
次に、ステップＳ４０８で、最適化部２６は、当該ノードがload命令を表すか否かを判定する。最適化部２６が、当該ノードがload命令を表すと判定した場合には、構文木の探索処理は、ステップＳ４１０へ移行する。一方、最適化部２６が、当該ノードがload命令を表さないと判定した場合には、構文木の探索処理は、ステップＳ４１２へ移行する。
【０１３１】
次に、ステップＳ４１０で、最適化部２６は、ステップＳ２００において取得した、当該ノードのload命令の指すアドレスを記録表記憶部４４に記憶されている記録表に記憶する。
【０１３２】
次に、ステップＳ４１２で、最適化部２６は、当該ノードの全ての子ノードについて、ステップＳ４０２〜Ｓ４１０の処理を終了したか否かを判定する。最適化部２６が、当該ノードの全ての子ノードについてステップＳ４０２の処理を終了していないと判定した場合には、構文木の探索処理は、ステップＳ４１４へ移行する。一方、最適化部２６が、当該ノードの全ての子ノードについてステップＳ４０２の処理を終了したと判定した場合には、構文木の探索処理は、ステップＳ４１６へ移行する。
【０１３３】
次に、ステップＳ４１４で、最適化部２６は、当該ノードの子ノードから、処理対象となるノードを選択し、ステップＳ４０２へ移行する。
【０１３４】
ステップＳ４１６で、最適化部２６は、当該ノードが根ノードであるか否かを判定する。最適化部２６が、当該ノードが根ノードであると判定した場合には、構文木の探索処理を終了する。一方、最適化部２６が、当該ノードが根ノードでないと判定した場合には、構文木の探索処理は、ステップＳ４１８へ移行する。
【０１３５】
次に、ステップＳ４１８で、最適化部２６が、当該ノードの親ノードを処理対象となるノードとして決定し、構文木の探索処理は、ステップＳ４１２へ移行する。
【０１３６】
上述のステップＳ３０８の構文木の再探索処理について、図２０において詳細に説明する。図２０は、ステップＳ３０８の構文木の再探索処理の一例を示すフローチャートである。図２０に示す構文木の再探索処理のフローチャートにおいて、まず、ステップＳ５００で、最適化部２６は、処理対象となる構文木の根ノードを処理対象となるノードとして選択する。
【０１３７】
次に、ステップＳ５０２で、最適化部２６は、当該ノードが、store命令を表すノードか否かを判定する。最適化部２６が、当該ノードが、store命令を表すノードであると判定した場合には、構文木の再探索処理は、ステップＳ５０４へ移行する。一方、最適化部２６が、当該ノードが、store命令を表すノードでないと判定した場合には、構文木の再探索処理は、ステップＳ５０６へ移行する。
【０１３８】
次に、ステップＳ５０４で、最適化部２６は、ステップＳ２００において取得した解析結果と、記録表記憶部４４に記憶されている記録表とに基づいて、当該ノードが表すstore命令が指し示すアドレスと一致する可能性があるload命令が存在するか否か判定する。最適化部２６が、当該ノードが表すstore命令が指し示すアドレスと一致する可能性があるload命令が存在すると判定した場合には、構文木の再探索処理は、ステップＳ５０８へ移行する。一方、最適化部２６が、当該ノードが表すstore命令が指し示すアドレスと一致する可能性があるload命令が存在しないと判定した場合には、ステップＳ５０６へ移行する。
【０１３９】
次に、ステップＳ５０６で、最適化部２６は、当該ノードの親ノードに印が付加されているか否かを判定する。最適化部２６が、当該ノードの親ノードに印が付加されていると判定した場合には、構文木の再探索処理は、ステップＳ５０８へ移行する。一方、最適化部２６が、当該ノードの親ノードに印が付加されていないと判定した場合には、構文木の再探索処理は、ステップＳ５１４へ移行する。
【０１４０】
次に、ステップＳ５０８で、最適化部２６は、当該ノードに印を付加する。
【０１４１】
次に、ステップＳ５１４で、最適化部２６は、当該ノードの全ての子ノードについて、ステップＳ５０２の処理を終了したか否かを判定する。最適化部２６が、当該ノードの全ての子ノードについてステップＳ５０２の処理を終了していないと判定した場合には、構文木の再探索処理は、ステップＳ５１６へ移行する。一方、最適化部２６が、当該ノードの全ての子ノードについてステップＳ５０２の処理を終了したと判定した場合には、構文木の探索処理は、ステップＳ５１８へ移行する。
【０１４２】
次に、ステップＳ５１６で、最適化部２６は、当該ノードの子ノードから、処理対象となるノードを選択し、構文木の再探索処理は、ステップＳ５０２へ移行する。
【０１４３】
ステップＳ５１８で、最適化部２６は、当該ノードが根ノードであるか否かを判定する。最適化部２６が、当該ノードが根ノードであると判定した場合には、構文木の再探索処理を終了する。一方、最適化部２６が、当該ノードが根ノードでないと判定した場合には、構文木の再探索処理は、ステップＳ５２０へ移行する。
【０１４４】
次に、ステップＳ５２０で、最適化部２６が、当該ノードの親ノードを処理対象となるノードとして決定し、構文木の再探索処理は、ステップＳ５１４へ移行する。
【０１４５】
上述のステップＳ１１０の命令選択・生成処理について、図２１において詳細に説明する。図２１は、ステップＳ１１０の命令選択・生成処理の一例を示すフローチャートである。図２１に示す命令選択・生成処理のフローチャートにおいて、まず、ステップＳ６００で、命令生成部２８は、処理対象となる構文木を決定する。
【０１４６】
次に、ステップＳ６０４で、命令生成部２８は、ステップＳ１０８において決定した処理対象となる構文木の最適化処理の結果に基づいて、当該構文木について最適化が実施されたか否かを判定する。命令生成部２８が、当該構文木について最適化が実施されたと判定する場合には、命令選択・生成処理は、ステップＳ６０８へ移行する。一方、命令生成部２８が、当該構文木について最適化が実施されていないと判定した場合には、ステップＳ６０６へ移行する。
【０１４７】
次に、ステップＳ６０６で、命令生成部２８は、ステップＳ１０２において取得したテンプレートのうち、最適化を実施しない場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。そして、命令生成部２８は、選択したテンプレートに基づいて、処理対象となる構文木を目的プログラムに変換する。
【０１４８】
次に、ステップＳ６０８で、命令生成部２８は、ステップＳ１０８において取得した処理対象となる構文木の最適化処理の結果に基づいて、当該構文木について積極的な最適化が実施されたか否かを判定する。命令生成部２８が、当該構文木について積極的な最適化が実施されたと判定する場合には、命令選択・生成処理は、ステップＳ６１４へ移行する。一方、命令生成部２８が、当該構文木について通常の最適化が実施されたと判定する場合には、命令選択・生成処理は、ステップＳ６１２へ移行する。
【０１４９】
ステップＳ６１２で、命令生成部２８は、ステップＳ１０２において取得したテンプレートのうち、通常の最適化を実施した場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。そして、命令生成部２８は、選択したテンプレートに基づいて、処理対象となる構文木を目的プログラムに変換する。
【０１５０】
ステップＳ６１４で、命令生成部２８は、ステップＳ１０２において取得したテンプレートのうち、積極的な最適化を実施した場合のテンプレート群から、当該構文木に対応するテンプレートを選択する。そして、命令生成部２８は、選択したテンプレートに基づいて、処理対象となる構文木を目的プログラムに変換する。
【０１５１】
次に、ステップＳ６１８で、命令生成部２８は全ての構文木について、ステップＳ６０４の処理を終了したか否かを判定する。命令生成部２８が、全ての構文木についてステップＳ６０４の処理を終了したと判定した場合には、命令・選択生成処理は終了する。一方、命令生成部２８が、全ての構文木についてＳ６０４の処理を終了していないと判定した場合には、命令・選択生成処理は、ステップＳ６００へ移行する。
【０１５２】
次に、プログラムの例１及び例２を挙げて簡単に、第１の実施形態に係る構文木の探索、及び構文木の再探索について説明する。
【０１５３】
まず、第１の例として、図２２に示すソースプログラムについて考える。字句構文解析部２４の処理により、当該ソースプログラムから生成される構文木は、図２３と、図２４となる。ここで、図２３の構文木について、構文木の探索処理について考える。まず、最適化部２６は、図２５に示すように、図２３の構文木の根ノードから子ノードへと再帰的に探索を開始する。このとき、最適化部２６は、図２６に示すように、探索の結果、入力値の精度に敏感な演算となるノードについて印を付加する。また、最適化部２６は、図２７、及び図２８に示すように、探索の結果、親ノードに印がついている場合、探索対象となるノードに印を付加する。そして、最適化部２６において、当該構文木に印が付加されているノードが含まれる場合には、積極的な最適化の実施を抑制する。図２９に当該構文木について、命令生成部２８の処理を行った結果を示す。
【０１５４】
一方、図２４の構文木について、構文木の探索処理について考える。まず、最適化部２６は、図３０に示すように、図２４の構文木の根ノードから子ノードへと再帰的に探索を開始する。このとき、最適化部２６は、図３１〜図３３に示すように、探索の結果、入力値の精度に敏感な演算となるノード、又は親ノードに印が付加されているノードが存在しないため、全てのノードに印を付加しない。そのため、積極的な最適化を実施するオプションが指定されている場合には、当該構文木に、積極的な最適化の実施を抑止することを示す印が付加されているノードが含まれないため、最適化部２６が、当該構文木に対して積極的な最適化の実施をする。図３４に当該構文木について、命令生成部２８の処理を行った結果を示す。
【０１５５】
このように、図２３の構文木については、構文木の根に近いノードに入力値の精度に敏感な演算があることが明らかとなったので、浮動小数点除算の命令生成において、積極的な最適化が抑止される。同様に、図２４の構文木は構文木の中に入力値の精度に敏感な演算がないことが明らかなので、積極的な最適化が実施される。
【０１５６】
次に、第２の例として、図３５に示すソースプログラムについて考える。字句構文解析部２４の処理により、当該ソースプログラムから生成される構文木は、図３６左と、図３６右となる。ここで、図３６右、及び左の構文木について、構文木の再探索処理について考える。まず、再探索を行う段階で、図３６の右、及び左の構文木の状態は、図３７の右、及び左に示す構文木の状態になっており、記録表記憶部４４に記憶されている記録表に図１４の内容が記憶されている。この場合、図３７の左の構文木の根ノードがstore命令を表すノードであるため、最適化部２６は、当該ノードのstore命令が指すアドレスと記録表に記憶されているload命令のアドレスとが、一致する可能性があるか解析する。そして、一致する可能性があれば、当該ノードに印をつけ、再探索の処理を継続する。図３８に一致する可能性がある場合の例を示す。また、最適化部２６の再探索の処理の終了状態を図３９に示す。そして、図４０に当該構文木について、命令生成部２８の処理を行った結果を示す。
【０１５７】
このように、図３９左のstore命令を表すノードを根に持つ構文木の浮動小数点命令には、「入力値の精度に敏感な演算に連絡する」ことを表明する印が付加されているため、積極的な最適化が抑止される。
【０１５８】
以上説明したように、第１の実施形態によれば、入力値の精度に敏感な演算の精度を落とさずに、プログラムの他の部分の演算を高速化することができる。
【０１５９】
なお、第１の実施形態のコンパイラ装置における、印を付加する処理、及び印が付加されているノードを含む構文木に対して積極的な最適化の実施を抑止する処理以外の処理については、コンパイラの構成により処理内容を変更してもよい。
【０１６０】
次に、第２の実施形態について説明する。なお、第１の実施形態と同様の構成及び作用となる部分については、同一符号を付して説明を省略する。
【０１６１】
第２の実施形態では、特定の種類の積極的な最適化をコンパイラ起動時に渡すオプションで指定し、当該特定の種類の積極的な最適化を抑止の対象から外す点が第１の実施形態と異なっている。なお、第２の実施形態においては、コンパイラの起動時オプションとして、抑止の対象から外す積極的な最適化の種類を指定するオプションを新設する。また、予めオプションに指定する、積極的な最適化の種類に対応する文字列を定義しておく。また、図４１に示すように積極的な最適化において実施される処理の種類と、当該処理の種類に対応する文字列と、抑止対象外か否かの情報とを格納した最適化記録表を設ける。ここで、最適化記録表の「最適化機能」の欄の情報が実施される処理の種類を表し、「オプション文字列」の欄の情報が対応する文字列を表し、「抑止対象外」の欄の情報が抑止対象外か否かの情報を表す。なお、最適化記録表の「抑止対象外」の初期値は、「Ｎｏ」であるとする。また、第２の実施形態においては、１つの構文木において対象となる積極的な最適化の種類は１つであるものとする。
【０１６２】
図１２は、第２の実施形態のコンパイラシステム４０５の一例である。図１２に示すように、コンパイラシステム４０５は、コンパイラ装置４０１と、利用者端末３と、外部ディスク４０とを有する。第２の実施形態に係るコンパイラ装置４０１は、インターネット等のネットワーク２を介して、利用者用の利用者端末３、及び外部ディスク４０と相互に通信可能に接続される。
【０１６３】
図４２に、第２の実施形態に係るコンパイラ装置４０１の機能ブロック図を示す。図４２に示すように、コンパイラ装置４０１は、引数解析部４２２、字句構文解析部２４、最適化部４２６、命令生成部２８、目的プログラム出力部３０を含むコンパイラ４２０を有する。また、コンパイラ４２０は、テンプレート記憶部３２、記録表記憶部４４、及び最適化記録表記憶部４４８を有する。
【０１６４】
コンパイラ４２０は、利用者端末３から受信した、入力情報（コマンド）に基づいて、起動され、ネットワーク２を介して、ソースプログラム記憶部４２から対象となるソースプログラムを取得する。また、コンパイラ４２０は、取得したソースプログラムを目的プログラムに変換し、ネットワーク２を介して、目的プログラム記憶部４６に記憶する。
【０１６５】
引数解析部４２２は、利用者端末３から受信した入力情報に基づいて、コンパイラの動作を決定する。引数解析部４２２は、取得したコンパイラの起動オプションとして、抑止の対象外とする積極的な最適化の種類に対応する文字列があるか否かを判定する。引数解析部４２２は、当該文字列があると判定した場合には、最適化記録表記憶部４４８に記憶されている、図４１に示す最適化記録表の当該文字列に対応する「抑止対象外」の欄を「Ｙｅｓ」に設定する。なお、引数解析部４２２の他の処理は、第１の実施形態の引数解析部２２と同様のため、説明は省略する。
【０１６６】
最適化部４２６は、字句構文解析部２４において取得した構文木の各々について、引数解析部４２２において取得した最適化に関するコンパイラの動作に基づいて、最適化を実施する。最適化部４２６は、字句構文解析部２４において取得した構文木の各々について、制御解析、及びデータ解析を行う。また、最適化部４２６は、構文木の各々について、構文木の探索と印の付加処理を行う。
【０１６７】
次に、最適化部４２６は、引数解析部４２２において取得した最適化に関するコンパイラの動作に基づいて、最適化を実施するオプションが指定されていないと判定した場合には、全ての構文木について通常の最適化、及び積極的な最適化を行わない。
【０１６８】
また、最適化部４２６は、引数解析部４２２において最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されていないと判定した場合、全ての構文木に対して、通常の最適化を実施する。
【０１６９】
また、最適化部４２６は、引数解析部４２２において最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されていると判定した場合には、構文木の各々に対して、通常の最適化、又は積極的な最適化を実施する。
【０１７０】
ここで、最適化を実施するオプションが指定され、かつ、積極的な最適化のオプションが指定されている場合における、通常の最適化を実施するか、積極的な最適化を実施するかの判断について説明する。まず、最適化部４２６は、処理対象の構文木に含まれるノードの各々に基づいて、対象となる積極的な最適化の種類を取得する。次に、最適化部４２６は、取得した積極的な最適化の種類が最適化記録表記憶部４４８に記憶されている最適化記録表にあるか否かを判定する。ここで、最適化部４２６は、最適化記録表に、取得した積極的な最適化の種類がある場合には、最適化記録表の当該積極的な最適化に対応する「抑止対象外」の欄が「ＹＥＳ」であるか否か判定する。最適化部４２６が、「ＹＥＳ」であると判定した場合には、処理対象となる構文木に積極的な最適化を実施する。
【０１７１】
一方、最適化部４２６は、最適化記録表に取得した積極的な最適化の種類がない、又は対象の積極的な最適化に対応する「抑止対象外」の欄が「Ｎｏ」である場合には、当該構文木に含まれるノードに印が付加されているか否かにより判断する。
【０１７２】
最適化部４２６は、処理対象となる構文木に含まれるノードに印が付加されている場合には、当該構文木に対して通常の最適化を実施する。一方、最適化部４２６は、処理対処となる構文木に含まれるノードに印が付加されているノードが存在しない場合には、当該構文木に対して積極的な最適化を実施する。
【０１７３】
最適化記録表記憶部４４８には、図４１に示すような最適化記録表が記憶されている。
【０１７４】
コンパイラ装置４０１は、例えば図４３に示すコンピュータ５００で実現することができる。コンピュータ５００はＣＰＵ５０２、一時記憶領域としてのメモリ５０４、及び不揮発性の記憶装置５０６を備える。また、コンピュータ５００は、入出力装置２０８が接続される入出力Ｉ／Ｆ２１０を備える。また、コンピュータ５００は、記録媒体２１２に対するデータの読み込み及び書き込みを制御するＲ／Ｗ部２１４、及びインターネット等のネットワーク２に接続されるネットワークＩ／Ｆ２１６を備える。ＣＰＵ５０２、メモリ５０４、記憶装置５０６、入出力Ｉ／Ｆ２１０、Ｒ／Ｗ部２１４、及びネットワークＩ／Ｆ２１６は、バス２１８を介して互いに接続される。
【０１７５】
記憶装置５０６はＨＤＤ、ＳＳＤ、フラッシュメモリ等によって実現できる。記憶媒体としての記憶装置５０６には、コンピュータ５００をコンパイラ装置５０１として機能させるためのコンパイラプログラム６００が記憶される。また、記憶装置５０６は、テンプレートの各々が記憶されるテンプレート記憶領域３５０を有する。また、記憶装置５０６は、記録表が記録される記録表記憶領域３５４と、最適化記録表が記録される最適化記録表記憶領域５５８とを有する。
【０１７６】
ＣＰＵ５０２は、コンパイラプログラム６００を記憶装置５０６から読みだしてメモリ５０４に展開する。また、ＣＰＵ５０２は、コンパイラプログラム６００が有するプロセスを順次実行する。また、ＣＰＵ５０２は、最適化記録表記憶領域６５８に記憶された最適化記録表を読み出し、メモリ５０４に展開する。他の記憶領域に記憶された各種データも、第１実施形態と同様に、メモリ５０４に展開する。
【０１７７】
コンパイラプログラム６００は、引数解析プロセス６０２と、字句構文解析プロセス３０４と、最適化プロセス６０６と、命令生成プロセス３０８と、目的プログラム出力プロセス３１０とを有する。
【０１７８】
ＣＰＵ５０２は、引数解析プロセス６０２を実行することで、図４２に示す引数解析部４２２として動作する。また、ＣＰＵ５０２は、最適化プロセス６０６を実行することで、図４２に示す最適化部４２６として動作する。他のプロセスについては、第１実施形態におけるコンパイラプログラム３００のプロセスと同様である。
【０１７９】
なお、コンパイラ装置５０１は、例えば半導体集積回路、より詳しくはＡＳＩＣ等で実現することも可能である。
【０１８０】
次に、第２の実施形態に係るコンパイラ装置５０１の作用について説明する。まず、利用者端末３から受信された入力情報をコンパイラ装置５０１が受け付けると、コンパイラ装置５０１において、図４４に示すコンパイル処理が実行される。なお、コンパイラ装置５０１により実行されるコンパイル処理は、開示する技術のコンパイラ方法の一例である
【０１８１】
図４４は、コンパイル処理の一例を示すフローチャートである。図４４に示すコンパイル処理のフローチャートにおいて、まず、ステップＳ７００で、引数解析部４２２は、最適化記録表記憶部４４８から最適化記録表を取得する。
【０１８２】
次に、ステップＳ７０２で、引数解析部４２２は、引数解析を行う。
【０１８３】
ステップＳ１０６の次のステップＳ７０４で、最適化部４２６は、ステップＳ１０４において取得した構文木の各々について、ステップＳ７０２において取得したオプション解析の結果に基づいて、最適化を実施する。
【０１８４】
上述のステップＳ７０２の引数解析の処理について、図４５において詳細に説明する。なお、図４５において、図示は省略するが、第１の実施形態のステップＳ１００において実施された引数解析処理も、当該引数解析処理において行われるものとする。図４５は、ステップＳ７０２の引数解析処理の一例を示すフローチャートである。図４５に示す引数解析処理のフローチャートにおいて、まず、ステップＳ８００で、引数解析部４２２は、入力情報において、抑止の対象から外す積極的な最適化を指定するオプションが指定されているか否かを判定する。引数解析部４２２が、抑止の対象から外す積極的な最適化を指定するオプションが指定されていると判定した場合には、引数解析処理は、ステップＳ８０２へ移行する。一方、引数解析部４２２が、抑止の対象から外す積極的な最適化を指定するオプションが指定されていないと判定した場合には、引数解析処理を終了する。
【０１８５】
次に、ステップＳ８０２で、引数解析部４２２は、ステップＳ８００において取得した抑止の対象から外す積極的な最適化を指定するオプションの文字列を切り出す。
【０１８６】
次に、ステップＳ８０６で、引数解析部４２２は、ステップＳ７００において取得した最適化記録表の「オプション文字列」の欄が、ステップＳ８０２において取得した文字列となる、「抑止対象外」の欄を「ＹＥＳ」に変更する。
【０１８７】
上述のステップＳ７０４の最適化処理について、図４６において詳細に説明する。図４６は、ステップＳ７０４の最適化処理の一例を示すフローチャートである。図４６に示す最適化処理のフローチャートにおいて、ステップＳ２１０で肯定判定されると、最適化処理はステップＳ９００へ移行する。ステップＳ９００で、最適化部４２６は、処理対象となる構文木に含まれるノードの各々に基づいて、対象となる積極的な最適化の種類を取得する。
【０１８８】
ステップＳ９０２で、最適化部４２６は、ステップＳ９００において取得した積極的な最適化の種類と、ステップＳ７００において取得した最適化記録表に基づいて、処理対象となる積極的な最適化が抑止対象外か否かを判定する。最適化部４２６が、処理対象となる積極的な最適化が抑止対象外であると判定した場合には、最適化処理は、ステップＳ２１４へ移行する。一方、最適化部４２６が、処理対象となる積極的な最適化が抑止対象であると判定した場合には、ステップＳ２１２へ移行する。
【０１８９】
ステップＳ９００で、最適化部４２６は、ステップＳ９００において取得した積極的な最適化と、ステップＳ７００において取得した最適化記録表に基づいて、処理対象となる積極的な最適化が抑止対象外か否かを判定する。最適化部４２６が、処理対象となる積極的な最適化が抑止対象外であると判定した場合には、最適化処理は、ステップＳ２１４へ移行する。一方、最適化部４２６が、処理対象となる積極的な最適化が抑止対象であると判定した場合には、ステップＳ２１２へ移行する。
【０１９０】
以上説明したように、第２の実施形態によれば、入力値の精度に敏感な演算の精度を落とさずに、プログラムの他の部分の演算を高速化することができる。
【０１９１】
また、積極的な最適化の抑止の対象外とするオプションを指定可能とすることで、より高速化を実現することができる。例えば、当該コンパイラの行うことの出来る積極的な最適化のうちいくつかを適用しても、その最適化の対象となった処理が生成したデータが入力値の精度に敏感な演算に影響しないと判断できる場合である。
【０１９２】
次に、第３の実施形態について説明する。なお、第１の実施形態と同様の構成及び作用となる部分については、同一符号を付して説明を省略する。
【０１９３】
第３の実施形態では、特定の種類の入力値の精度に敏感な演算をコンパイラ起動時に渡すオプションで指定し、当該演算の入力データを生成する全ての種類の積極的な最適化を抑止の対象から外す点が第１の実施形態と異なっている。なお、第３の実施形態においては、コンパイラの起動時オプションとして、抑止の対象から外す、入力値の精度に敏感な演算の種類を指定するオプションを新設する。また、予めオプションに指定する、入力値の精度に敏感な演算の種類に対応する文字列を定義しておく。また、図４７に示すように演算の種類と、当該演算の種類に対応する文字列と、抑止対象外か否かの情報とを格納した指定処理記録表を設ける。ここで、指定処理記録表の「演算種」の欄の情報が実施される演算の種類を表し、「オプション文字列」の欄の情報が対応する文字列を表し、「抑止対象外」の欄の情報が抑止対象外か否かの情報を表す。なお、指定処理記録表の「抑止対象外」の初期値は、「Ｎｏ」であるとする。
【０１９４】
図１２は、第３の実施形態のコンパイラシステム７０５の一例である。図１２に示すようにコンパイラシステム７０５は、コンパイラ装置７０１と、利用者端末３と、外部ディスク４０とを有する。第３の実施形態に係るコンパイラ装置７０１は、インターネット等のネットワーク２を介して、利用者用の利用者端末３、及び外部ディスク４０と相互に通信可能に接続される。
【０１９５】
図４８に、第３の実施形態に係るコンパイラ装置７０１の機能ブロック図を示す。図４８に示すように、コンパイラ装置７０１は、引数解析部７２２、字句構文解析部２４、最適化部７２６、命令生成部２８、目的プログラム出力部３０、及びテンプレート記憶部３２を含むコンパイラ７２０を有する。また、コンパイラ７２０は、記録表記憶部４４、及び指定処理記録表記憶部７４８を有する。
【０１９６】
コンパイラ７２０は、利用者端末３から受信した、入力情報（コマンド）に基づいて、起動され、ネットワーク２を介して、ソースプログラム記憶部４２から対象となるソースプログラムを取得する。また、コンパイラ７２０は、取得したソースプログラムを目的プログラムに変換し、ネットワーク２を介して、目的プログラム記憶部４６に記憶する。
【０１９７】
引数解析部７２２は、利用者端末３から受信した入力情報に基づいて、コンパイラの動作を決定する。引数解析部７２２は、取得したコンパイラの起動オプションとして、抑止の対象外とする入力値の精度に敏感な演算に対応する文字列があるか否かを判定する。引数解析部７２２は、当該文字列があると判定した場合には、指定処理記録表記憶部７４８に記憶されている、図４７に示す指定処理記録表の当該文字列に対応する「抑止対象外」の欄を「Ｙｅｓ」に設定する。なお、引数解析部７２２の他の処理は、第１の実施形態の引数解析部２２と同様のため、説明は省略する。
【０１９８】
最適化部７２６は、字句構文解析部２４において取得した構文木の各々について、引数解析部７２２において取得した最適化に関するコンパイラの動作に基づいて、最適化を実施する。最適化部７２６は、字句構文解析部２４において取得した構文木の各々について、制御解析、及びデータ解析を行う。
【０１９９】
次に、最適化部７２６は、構文木の各々について、当該構文木のノードを探索し、当該構文木に含まれるノードのうち、入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印付けを行う。
【０２００】
具体的には、まず、最適化部７２６は、構文木の各々のうち、処理対象となる構文木の根ノードを処理対象となるノードとして決定する。次に、最適化部７２６は、当該ノードが、「入力値の精度に敏感な演算を表すノード」かつ、「当該演算が抑止の対象外でない」、及び「親ノードに印がついている」という２つの条件のうち少なくとも１つを満たしているか判定する。ここで、「当該演算が抑止の対象外でない」か否かの判定には、指定処理記録表記憶部７４８に記憶されている指定処理記録表に、対象となる演算に対応する演算種があり、かつ、当該「抑止対象外」の欄が「Ｎо」となっているかにより判定する。最適化部７２６が、演算種があり、かつ、当該「抑止対象外」の欄が「Ｎｏ」となっていると判定した場合には、「当該演算が抑止の対象外でない」と判定する。一方、最適化部７２６が、演算種があり、かつ、当該「抑止対象外」の欄が「ＹＥＳ」となっていると判定した場合には、「当該演算が抑止の対象外」と判定する。
【０２０１】
次に、最適化部７２６は、条件を満たしていると判定した場合、当該ノードに印を付加する。次に、最適化部７２６は、当該ノードがload命令か否かを判定する。最適化部７２６は、当該ノードがload命令である場合には、当該load命令の指すアドレスを記録表記憶部４４に記憶されている記録表に記憶する。最適化部７２６は、第１の実施形態の最適化部２６と同様に、処理対象のノードに未処理の子ノードが存在しなくなるまで、同様の処理を再帰的に繰り返すことにより、構文木の各々について、当該構文木に含まれるノードの各々について印を付加する処理を行う。
【０２０２】
次に、最適化部７２６は、構文木の各々について、当該構文木を再探索し、当該構文木に含まれるノードのうち、別の構文木の入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印を付加する。
【０２０３】
指定処理記録表記憶部７４８には、図４７に示すような指定処理記録表が記憶されている。
【０２０４】
コンパイラ装置７０１は、例えば図４９に示すコンピュータ８００で実現することができる。コンピュータ８００はＣＰＵ８０２、一時記憶領域としてのメモリ８０４、及び不揮発性の記憶装置８０６を備える。また、コンピュータ８００は、入出力装置２０８が接続される入出力Ｉ／Ｆ２１０を備える。また、コンピュータ８００は、記録媒体２１２に対するデータの読み込み及び書き込みを制御するＲ／Ｗ部２１４、及びインターネット等のネットワーク２に接続されるネットワークＩ／Ｆ２１６を備える。ＣＰＵ８０２、メモリ８０４、記憶装置８０６、入出力Ｉ／Ｆ２１０、Ｒ／Ｗ部２１４、及びネットワークＩ／Ｆ２１６は、バス２１８を介して互いに接続される。
【０２０５】
記憶装置８０６はＨＤＤ、ＳＳＤ、フラッシュメモリ等によって実現できる。記憶媒体としての記憶装置８０６には、コンピュータ８００をコンパイラ装置７０１として機能させるためのコンパイラプログラム９００が記憶される。また、記憶装置８０６は、テンプレートの各々が記憶されるテンプレート記憶領域３５０を有する。また、記憶装置８０６は、記録表が記録される記録表記憶領域３５４と、指定処理記録表が記録される指定処理記録表記憶領域９５８とを有する。
【０２０６】
ＣＰＵ８０２は、コンパイラプログラム９００を記憶装置８０６から読みだしてメモリ８０４に展開する。また、ＣＰＵ８０２は、コンパイラプログラム９００が有するプロセスを順次実行する。また、ＣＰＵ８０２は、指定処理記録表記憶領域９５８に記憶された指定処理記録表を読み出し、メモリ８０４に展開する。他の記憶領域に記憶された各種データも、第１実施形態と同様に、メモリ５０４に展開する。
【０２０７】
コンパイラプログラム９００は、引数解析プロセス９０２と、字句構文解析プロセス３０４と、最適化プロセス９０６と、命令生成プロセス３０８と、目的プログラム出力プロセス３１０とを有する。
【０２０８】
ＣＰＵ８０２は、引数解析プロセス９０２を実行することで、図４８に示す引数解析部７２２として動作する。また、ＣＰＵ８０２は、最適化プロセス９０６を実行することで、図４８に示す最適化部７２６として動作する。他のプロセスについては、第１実施形態におけるコンパイラプログラム３００のプロセスと同様である。
【０２０９】
なお、コンパイラ装置７０１は、例えば半導体集積回路、より詳しくはＡＳＩＣ等で実現することも可能である。
【０２１０】
次に、第３の実施形態に係るコンパイラ装置７０１の作用について説明する。まず、利用者端末３から受信された入力情報をコンパイラ装置７０１が受け付けると、コンパイラ装置７０１において、図５０に示すコンパイル処理が実行される。なお、コンパイラ装置７０１により実行されるコンパイル処理は、開示する技術のコンパイラ方法の一例である
【０２１１】
図５０は、コンパイル処理の一例を示すフローチャートである。図５０に示すコンパイル処理のフローチャートにおいて、まず、ステップＳ１１００で、引数解析部７２２は、指定処理記録表記憶部７４８から指定処理記録表を取得する。
【０２１２】
次に、ステップＳ１１０２で、引数解析部７２２は、引数解析を行う。
【０２１３】
ステップＳ１０６の次のステップＳ１１０４で、最適化部７２６は、ステップＳ１０４において取得した構文木の各々について、ステップＳ１１０２において取得したオプション解析の結果に基づいて、最適化を実施する。
【０２１４】
上述のステップＳ１１０２の引数解析の処理について、図５１において詳細に説明する。なお、図５１において、図示は省略するが、第１の実施形態のステップＳ１００において実施された引数解析処理も、当該引数解析処理において行われるものとする。図５１は、ステップＳ１１０２の引数解析処理の一例を示すフローチャートである。図５１に示す引数解析処理のフローチャートにおいて、まず、ステップＳ１１５０で、引数解析部７２２は、入力情報において、抑止の対象から外す入力値の精度に敏感な演算を指定するオプションが指定されているか否かを判定する。引数解析部７２２が、抑止の対象から外す入力値の精度に敏感な演算を指定するオプションが指定されていると判定した場合には、引数解析処理は、ステップＳ１１５２へ移行する。一方、引数解析部７２２が、抑止の対象から外す入力値の精度に敏感な演算を指定するオプションが指定されていないと判定した場合には、引数解析処理を終了する。
【０２１５】
次に、ステップＳ１１５２で、引数解析部７２２は、ステップＳ１１５０において取得した抑止の対象から外す入力値の精度に敏感な演算を指定するオプションの文字列を切り出す。
【０２１６】
次に、ステップＳ１１５４で、引数解析部７２２は、ステップＳ１１００において取得した指定処理記録表の「オプション文字列」の欄が、ステップＳ１１５２において取得した文字列となる、「抑止対象外」の欄を「ＹＥＳ」に変更する。
【０２１７】
上述のステップＳ１１０４の最適化処理について、図５２において詳細に説明する。図５２は、ステップＳ１１０４の最適化処理の一例を示すフローチャートである。図５２に示す最適化処理のフローチャートにおいて、ステップＳ２００の次のステップＳ１２００で、最適化部７２６は、ステップＳ１０６において取得した構文木の各々について、構文木の探索を行う。また、最適化部７２６は、探索された構文木の入力値の精度に敏感な演算の入力値に関わる演算に関わるノードに対して印を付加する。
【０２１８】
上述のステップＳ１２００の構文木の探索と印付け処理について、図５３において詳細に説明する。図５３は、ステップＳ１２００の構文木の探索と印の付加処理の一例を示すフローチャートである。図５３に示す構文木の探索と印の付加処理のフローチャートにおいて、ステップＳ３００の次のステップＳ１３００で、最適化部７２６は、処理対象となる構文木について探索を行い、対象となるノードに印を付加する。
【０２１９】
上述のステップＳ１３００の構文木の探索処理について、図５４において詳細に説明する。図５４は、ステップＳ１３００の構文木の探索処理の一例を示すフローチャートである。図５４に示す構文木の探索処理のフローチャートにおいて、ステップＳ４０２で、処理対象のノードが示す演算が対象の演算であるとして、肯定判定されると、構文木の探索処理はステップＳ１４００へ移行する。ステップＳ１４００で、最適化部７２６は、処理対象のノードが示す演算が、ステップＳ１１００において取得した指定処理記録表に存在し、当該演算に対応する「抑止対象外」の欄が「ＹＥＳ」か否かを判定する。最適化部７２６が、指定処理記録表に存在し、当該演算に対応する「抑止対象外」の欄が「ＹＥＳ」であると判定した場合には、構文木の探索処理は、ステップＳ４０４へ移行する。一方、最適化部７２６が、指定処理記録表に存在しない、又は、当該演算に対応する「抑止対象外」の欄が「Ｎｏ」であると判定した場合には、構文木の探索処理は、ステップＳ４０６へ移行する。
【０２２０】
以上説明したように、第３の実施形態によれば、入力値の精度に敏感な演算の精度を落とさずに、プログラムの他の部分の演算を高速化することができる。
【０２２１】
また、入力値の精度に敏感な演算を積極的な最適化の抑止の対象外とするオプションを指定可能とすることで、より高速化を実現することができる。例えば、当該データに、プログラムに積極的な最適化を適用した場合に通常の最適化と異なる結果を生成するような特殊な値を含まないと判断できる場合、それらの積極的な最適化は抑止の対象から外すことができる。
【０２２２】
また、上記では、開示する技術に係る各プログラムが記憶装置２０６、５０６、及び８０６に予め記憶（インストール）されている態様を説明したが、これに限定されない。開示の技術に係る各プログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記録媒体に記録された形態で提供することも可能である。
【０２２３】
以上の実施形態に関し、更に以下の付記を開示する。
【０２２４】
（付記１）
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得し、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する、
ことを含む処理をコンピュータに実行させるコンパイラプログラム。
（付記２）
前記複数の構造体を取得する処理は、更に、データを読み出す命令を表す構造体と、データを格納する命令を表す構造体と、演算及び読み出す命令の間のデータ依存関係とを取得し、
前記データ依存関係を有する演算を表す構造体に印を付す処理は、前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体の演算との間でデータ依存関係を有する演算を表す構造体、及び前記印が付加された前記構造体の演算との間でデータ依存関係を有する前記読み出す命令を表す構造体に他の印を付加し、前記印が付加された前記構造体の読み出し命令が読み出すデータを格納する命令を表す構造体に他の印を付加する付記１記載のコンパイラプログラム。
（付記３）
前記最適化を実施する処理は、更に、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる演算を表す前記構造体であって、かつ、前記印が付加された前記構造体に対して前記最適化を実施する付記１又は２記載のコンパイラプログラム。
（付記４）
前記演算である場合に前記構造体に印を付加する処理は、前記取得された演算を表す構造体の各々について、前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合であって、かつ、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる前記演算でない場合に前記構造体に印を付加する付記１又は２記載のコンパイラプログラム。
（付記５）
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得し、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する、
ことを含むコンパイラ方法。
（付記６）
前記複数の構造体を取得する処理は、更に、データを読み出す命令を表す構造体と、データを格納する命令を表す構造体と、演算及び読み出す命令の間のデータ依存関係とを取得し、
前記データ依存関係を有する演算を表す構造体に印を付す処理は、前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体の演算との間でデータ依存関係を有する演算を表す構造体、及び前記印が付加された前記構造体の演算との間でデータ依存関係を有する前記読み出す命令を表す構造体に他の印を付加し、前記印が付加された前記構造体の読み出し命令が読み出すデータを格納する命令を表す構造体に他の印を付加する付記５記載のコンパイラ方法。
（付記７）
前記最適化を実施する処理は、更に、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる演算を表す前記構造体であって、かつ、前記印が付加された前記構造体に対して前記最適化を実施する付記５又は６記載のコンパイラ方法。
（付記８）
前記演算である場合に前記構造体に印を付加する処理は、前記取得された演算を表す構造体の各々について、前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合であって、かつ、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる前記演算でない場合に前記構造体に印を付加する付記５又は６記載のコンパイラ方法。
（付記９）
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得する字句構文解析部と、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する最適化部と、
を含むコンパイラ装置。
（付記１０）
前記字句構文解析部は、更に、データを読み出す命令を表す構造体と、データを格納する命令を表す構造体と、演算及び読み出す命令の間のデータ依存関係とを取得し、
前記最適化部は、前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体の演算との間でデータ依存関係を有する演算を表す構造体、及び前記印が付加された前記構造体の演算との間でデータ依存関係を有する前記読み出す命令を表す構造体に他の印を付加し、前記印が付加された前記構造体の読み出し命令が読み出すデータを格納する命令を表す構造体に他の印を付加する付記９項記載のコンパイラ装置。
（付記１１）
前記最適化部は、更に、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる演算を表す前記構造体であって、かつ、前記印が付加された前記構造体に対して前記最適化を実施する付記９又は１０記載のコンパイラ装置。
（付記１２）
前記最適化部は、前記取得された演算を表す構造体の各々について、前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合であって、かつ、前記最適化の対象となる演算のうち、抑止対象外として指定された前記最適化の対象となる前記演算でない場合に前記構造体に印を付加する付記９又は１０記載のコンパイラ装置。
（付記１３）
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得する字句構文解析部と、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する最適化部と、
を含むコンパイラ装置と、
利用者の操作により入力情報を前記コンパイラ装置へ送信する情報端末と、
を含む、コンパイラシステム。
（付記１４）
コンパイルの対象となる第１プログラムに含まれる複数の演算の各々を表す複数の構造体と、前記複数の演算間のデータの入出力の関係を表すデータ依存関係とを取得し、
前記取得された構造体の各々について、前記取得された前記構造体によって表わされる前記演算が、入力値の精度に応じて出力結果が特定の影響を受ける演算である場合に前記構造体に印を付加し、
前記取得されたデータ依存関係に基づいて、前記印が付加された前記構造体によって表わされる演算に対して特定のデータ依存関係を有する演算を表す構造体に他の印を付加し、
前記印が付加されていない構造体のうち、前記第１プログラムに対して前記コンパイルを施すことによって取得予定の第２プログラムの実行が特定の条件下で異なる結果を生成する演算の内容に置き換える最適化の対象となる構造体に対して前記最適化を実施する、
ことを含む処理をコンピュータに実行させるコンパイラプログラムを記憶した記録媒体。
【符号の説明】
【０２２５】
１、４０１、７０１   コンパイラ装置
２     ネットワーク
３     利用者端末
５、４０５、７０５   コンパイラシステム
２０、４２０、７２０ コンパイラ
２２、４２２、７２２ 引数解析部
２４   字句構文解析部
２６、４２６、７２６ 最適化部
２８   命令生成部
３０   目的プログラム出力部
３２   テンプレート記憶部
４０、 外部ディスク
４２   ソースプログラム記憶部
４４   記録表記憶部
４６   目的プログラム記憶部
４４８ 最適化記録表記憶部
７４８ 指定処理記録表記憶部
【図１】
0006409639.tif 000002
【図２】
0006409639.tif 000003
【図３】
0006409639.tif 000004
【図４】
0006409639.tif 000005
【図５】
0006409639.tif 000006
【図６】
0006409639.tif 000007
【図７】
0006409639.tif 000008
【図８】
0006409639.tif 000009
【図９】
0006409639.tif 000010
【図１０】
0006409639.tif 000011
【図１１】
0006409639.tif 000012
【図１２】
0006409639.tif 000013
【図１３】
0006409639.tif 000014
【図１４】
0006409639.tif 000015
【図１５】
0006409639.tif 000016
【図１６】
0006409639.tif 000017
【図１７】
0006409639.tif 000018
【図１８】
0006409639.tif 000019
【図１９】
0006409639.tif 000020
【図２０】
0006409639.tif 000021
【図２１】
0006409639.tif 000022
【図２２】
0006409639.tif 000023
【図２３】
0006409639.tif 000024
【図２４】
0006409639.tif 000025
【図２５】
0006409639.tif 000026
【図２６】
0006409639.tif 000027
【図２７】
0006409639.tif 000028
【図２８】
0006409639.tif 000029
【図２９】
0006409639.tif 000030
【図３０】
0006409639.tif 000031
【図３１】
0006409639.tif 000032
【図３２】
0006409639.tif 000033
【図３３】
0006409639.tif 000034
【図３４】
0006409639.tif 000035
【図３５】
0006409639.tif 000036
【図３６】
0006409639.tif 000037
【図３７】
0006409639.tif 000038
【図３８】
0006409639.tif 000039
【図３９】
0006409639.tif 000040
【図４０】
0006409639.tif 000041
【図４１】
0006409639.tif 000042
【図４２】
0006409639.tif 000043
【図４３】
0006409639.tif 000044
【図４４】
0006409639.tif 000045
【図４５】
0006409639.tif 000046
【図４６】
0006409639.tif 000047
【図４７】
0006409639.tif 000048
【図４８】
0006409639.tif 000049
【図４９】
0006409639.tif 000050
【図５０】
0006409639.tif 000051
【図５１】
0006409639.tif 000052
【図５２】
0006409639.tif 000053
【図５３】
0006409639.tif 000054
【図５４】
0006409639.tif 000055