(57)【特許請求の範囲】
【請求項１】
コンピュータを用い、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムをコンパイルする方法であって、
前記コンピュータが、前記ソースプログラムに含まれる前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録するステップと、
前記コンピュータが、前記ソースプログラムに基づいて、特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出するステップと、
前記コンピュータが、前記特殊化情報テーブルを参照して、前記検出した総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定するステップと、
前記判定ステップで前記特殊化条件がコンパイル時に成立するか否かが不定であると判定されると、前記コンピュータが、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換するステップとを有するコンパイル方法。
【請求項２】
前記特殊化サブプログラムを指定する記述が、１つの総称サブプログラムに対して複数の特殊化サブプログラムを指定する記述を含み、かつ、前記特殊化条件を設定する記述が、前記複数の特殊化サブプログラムのそれぞれが適用される特殊化条件を設定する記述を含んでおり、前記コンピュータは、前記複数の特殊化サブプログラム及び特殊化条件を、前記特殊化情報テーブルにエントリを分けて登録する、請求項１に記載のコンパイル方法。
【請求項３】
前記コンピュータは、前記特殊化条件がコンパイル時に成立すると判定されるまで、又は、全ての特殊化条件の判定が終了するまで、前記特殊化情報テーブルのエントリを１つずつ選択し、該選択したエントリの特殊化条件がコンパイル時に成立するか否かを判定する、請求項２に記載のコンパイル方法。
【請求項４】
前記判定ステップで前記特殊化条件がコンパイル時に成立するか否かが不定であると判定された後に、他の特殊化条件が成立するか否かがコンパイル時に不定であると判定されると、前記コンピュータが、前記不定と判定された特殊化条件が成立せず、かつ、前記不定と判定された他の特殊化条件が成立するときに、当該他の特殊化条件に対応する特殊化サブプログラムを呼び出すコードを生成し追加するステップを更に有する、請求項３に記載のコンパイル方法。
【請求項５】
前記判定ステップで前記特殊化条件がコンパイル時に成立するか否かが不定であると判定された後に、他の特殊化条件が成立すると判定されると、前記コンピュータが、前記不定と判定された特殊化条件が成立しないときに、前記成立すると判定された特殊化条件に対応する特殊化サブプログラムを呼び出すコードを生成し追加するステップを更に有する、請求項３に記載のコンパイル方法。
【請求項６】
前記判定ステップで前記特殊化条件がコンパイル時に成立するか否かが不定であると判定された後に、全ての特殊化条件の判定が終了すると、前記コンピュータが、前記不定と判定された特殊化条件が成立しないときに、前記総称サブプログラムを呼び出すコードを生成し追加するステップを更に有する、請求項３に記載のコンパイル方法。
【請求項７】
前記特殊化条件がコンパイル時に成立すると判定されると、前記コンピュータが、前記総称サブプログラムの呼び出すコードを、前記特殊化条件が成立する特殊化サブプログラムの呼び出すコードに変換するステップを更に有する、請求項１乃至３の何れか一に記載のコンパイル方法。
【請求項８】
前記コンピュータが、前記総称サブプログラムの呼び出しを検出するステップに先行して、前記ソースプログラムの実行時に呼び出される総称サブプログラムを検索し、前記特殊化サブプログラムが指定された総称サブプログラムを、特殊化サブプログラムが指定されている旨を示すフラグと共にサブプログラム情報テーブルに登録するステップを更に有する、請求項１乃至７の何れか一に記載のコンパイル方法。
【請求項９】
前記特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出するステップが、
前記コンピュータが、前記ソースプログラムに基づいて、総称サブプログラムの呼び出しを検出するステップと、
前記コンピュータが、前記フラグを参照して、前記検出した総称サブプログラムに対して特殊化サブプログラムが指定されているか否かを判定するステップとを含む、請求項８に記載のコンパイル方法。
【請求項１０】
コンピュータに、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムを入力させ、前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録させるための構文解析部と、
前記コンピュータに、前記ソースプログラムに基づいて、前記特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出させるための特殊化検出部と、
前記コンピュータに、前記特殊化情報テーブルを参照させて、前記検出された総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定させるための特殊化条件判定部と、
前記特殊化条件がコンパイル時に成立すると判定されると、前記コンピュータに、前記総称サブプログラムを呼び出すコードを、前記特殊化条件が成立する特殊化サブプログラムを呼び出すコードに変換させ、前記特殊化条件がコンパイル時に成立するか否かが不定であると判定されると、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換させるためのコード変換・生成部とを備えるコンパイラ。
【請求項１１】
前記特殊化サブプログラムを指定する記述が、１つの総称サブプログラムに対して複数の特殊化サブプログラムを指定する記述を含み、かつ、前記特殊化条件を設定する記述が、前記複数の特殊化サブプログラムのそれぞれの特殊化条件を設定する記述を含み、前記構文解析部は、前記複数の特殊化サブプログラム及び特殊化条件を、前記特殊化情報テーブルにエントリを分けて登録する、請求項１０に記載のコンパイラ。
【請求項１２】
前記特殊化条件判定部は、前記特殊化条件がコンパイル時に成立すると判定されるまで、又は、全ての特殊化条件の判定が終了されるまで、前記コンピュータに、前記特殊化情報テーブルのエントリを１つずつ選択させ、該選択したエントリの特殊化条件がコンパイル時に成立するか否かを判定させるためのものである、請求項１１に記載のコンパイラ。
【請求項１３】
前記コンピュータが、前記特殊化条件がコンパイル時に成立するか否かが不定であると判定した後に、他の特殊化条件が成立するか否かがコンパイル時に不定であると判定したときに、前記コード変換・生成部は、前記コンピュータに、前記不定と判定された特殊化条件が成立せず、かつ、前記不定と判定された他の特殊化条件が成立するときに、当該他の特殊化条件に対応する特殊化サブプログラムを呼び出すコードを生成させ追加させることを特徴とする、請求項１２に記載のコンパイラ。
【請求項１４】
前記コンピュータが、前記特殊化条件がコンパイル時に成立するか否かが不定であると判定した後に、他の特殊化条件が成立すると判定したときに、前記コード変換・生成部は、前記コンピュータに、前記不定と判定された特殊化条件が成立しないときに、前記成立すると判定された特殊化条件に対応する特殊化サブプログラムを呼び出すコードを生成させ追加させることを特徴とする、請求項１２に記載のコンパイラ。
【請求項１５】
前記コンピュータが、前記特殊化条件がコンパイル時に成立するか否かが不定であると判定した後に、全ての特殊化条件の判定が終了したと判定したときに、前記コード変換・生成部は、前記コンピュータに、前記不定と判定された特殊化条件が成立しないときに、前記総称サブプログラムを呼び出すコードを生成させ追加させることを特徴とする、請求項１２に記載のコンパイラ。
【請求項１６】
コンピュータに、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムをコンパイルする処理を実行させるプログラムであって、前記コンピュータに、
前記ソースプログラムに含まれる前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録する処理と、
前記ソースプログラムに基づいて、特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出する処理と、
前記特殊化情報テーブルを参照して、前記検出した総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定する処理と、
前記判定処理で前記特殊化条件がコンパイル時に成立するか否かが不定であると判定すると、前記コンピュータが、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換する処理とを実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンパイル方法、及び、プログラムに関し、更に詳しくは、ソースプログラムに対応したプログラムを生成するコンパイラ、コンパイル方法、及び、プログラムに関する。
【背景技術】
【０００２】
プログラム中のサブプログラム（手続き、関数、サブルーチンなど）は、型や構造が異なる複数の種類のデータに対して動作する「総称サブプログラム」として記述される場合がある。特に、言語処理系が提供する組込みサブプログラムや実行時ライブラリルーチン等がこれに該当する。このような総称サブプログラムは、対象データの種類のあり得る全てのパターンに対して動作するように記述されているため、個々のパターンにたいしては、必ずしも最適な方法で動作するとは限らない。更に、High Performance Fortran（ＨＰＦ）に代表される並列言語では、総称サブプログラムは、対象データの種類に加えて、並列化方法（e.g.データ分散の種別）や並列実行の環境（e.g.プロセッサ数や相互結合網のトポロジ）に関しても総称的である必要がある。このため、性能上のオーバヘッドは更に大きくなる可能性が高い。
【０００３】
ここで、コンパイルにおけるプログラム最適化に関する技術としては、特許文献１、特許文献２に記載された技術がある。特許文献１では、まず、最適化対象プログラムに、プログラム中の変数が取る値と、その値を取る頻度とを対応付けて記録する手続コード（プロファイルコード）を付加し、プログラム実行時に変数が取る値とその頻度とを、プロファイル情報として記憶する。次に、変数を用いるプログラム部分を、高頻度の変数の値（特定値）で特殊化して新たに付加し、実行時に、変数の値が特定値に一致するときに、新たに付加したプログラム部分（特殊化部分）が実行されるようなコードを生成する。このようなコードからオブジェクトプログラムを生成することで、高速実行が可能なプログラムを得ることができる。
【０００４】
また、特許文献２では、まず、高級言語で記述されたソースプログラムをコンパイルし、当該プログラムに対する目的コードである第１目的コードを生成する。次に、第１目的コードを実行する際に動的なデータを計測するための計測コードを、第１目的コードに挿入する。続いて、第１目的コードを実行することで得られる計測データから得られる情報を用いて、第１目的コードに対して最適化処理を行う。その後、第１目的コードを、最適化された第２目的コードに翻訳する処理を行うための翻訳コードを生成し、第１目的コードに付加する。このようにすることで、アプリケーションを実行する環境が、ソースプログラムのコンパイル時の環境とは異なる環境であっても、実行環境に応じた最適化が可能である。
【特許文献１】特開平１１−１４９３８０号公報
【特許文献２】特開２００２−３５１６７４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
サブプログラムが「総称的」であることに起因して、性能上のオーバヘッドが発生する問題を解決する手法として、特定のデータや並列実行環境に対して「特殊化」したサブプログラムを用意しておき、実際のデータや並列実行環境が条件に合致していれば、その特殊化したプログラムを使用するという手法が考えられる。特殊化したプログラムは、特定の条件下で動作が最適化されているため、性能上のオーバヘッドは小さく、最適な方法で動作することが期待できる。
【０００６】
サブプログラムの特殊化に関連する手法としては、下記に示す（ａ）〜（ｅ）の５つが挙げられる。
（ａ）ユーザプログラム上のＩＦ構文によるサブプログラムの選択：
特殊化の適用条件（「特殊化条件」）を実行時に判定し、ＩＦ構文により適切なサブプログラム呼び出しを選択する：
（ｂ）組込みサブプログラムや実行時ライブラリルーチンの中のＩＦ構文による処理の分岐：
組込みサブプログラムや実行時ライブラリルーチンの中で、対象データの個々のパターンに応じて最適な処理を選択する。
（ｃ）サブプログラムのオーバーロードとオーバーライド：
サブプログラムのオーバーロードやオーバーライドなどの機能により、同一の名前を持つ総称サブプログラムと特殊化サブプログラムとを定義しておき、実際にどのサブプログラムを呼び出すかは、処理系がコンパイル時又は実行時に決定する。
（ｄ）テンプレート特殊化：
Ｃ＋＋などの言語が持つテンプレートを用いると、特定の条件に合致する場合のみに適用される特殊化されたサブプログラムを定義できる。
（ｅ）言語処理系による自動特殊化：
言語処理系が、手続き間解析や実行時プロファイリングにより得られた情報から、特殊化されたサブプログラムを自動的に生成する。
特許文献１や特許文献２のアプローチは、上記（ｄ）の手法に近い。
【０００７】
しかし、上記した（ａ）の手法には、次のような問題点がある。すなわち、（ａ）の手法では、特殊化の種類ごとにサブプログラム呼び出しのコードを付け加えなければならないため、コードの書き換えが必要になる。また、ソースプログラム上で明示的に呼び出すサブプログラムに対する特殊化しか記述できないので、種々の実行時処理のために処理系が暗黙的に呼び出す実行時ライブラリルーチンの特殊化に適用することはできない。また、（ｂ）の手法では、対応済みパターン以外では効果がないという問題がある。すなわち、通常、組み込みサブプログラムや実行時ライブラリルーチンのコードにユーザが手を出すことはできないため、ユーザが対応パターンを拡張することができない。
【０００８】
（ｃ）の手法では、実際にどのサブプログラムを呼び出すかは、言語仕様が定める情報（通常、引数の型や個数）のみに基づいて決定されるため、指定できる特殊化条件に関する制約が大きいという問題がある。すなわち、あらゆる特殊化条件を、型そのものとして表現しなければならない（e.g.配列の寸法が２のべき乗であることを表す型）。このような方法は煩雑である上、コンパイル時に不定の動的な情報（e.g.並列実行環境）に基づく特殊化を実現するのに必要な「動的な型生成」の機能を持つ言語は多くない。つまり、データ分散の種別や並列実行環境などの情報に基づく、柔軟な特殊化条件を指定することができないか、或いは、困難である。
【０００９】
（ｄ）の手法では、テンプレートのパラメータとして指定できるのは、型名や整数値などの情報のみであり、更にテンプレートのインスタンス化はコンパイル時に行われる。従って、（ｃ）の手法と同様に、指定できる特殊化条件に関する制約が大きい。（ｅ）の手法では、引数の値や型に基づく定型的な特殊化（e.g.定数の畳み込み）しか実現できず、より効果が大きい高度な特殊化(e.g.アルゴリズムの特殊化)は実現できないという問題がある。
【００１０】
本発明は、任意の総称サブプログラムについて、任意の特殊化が可能なコンパイル方法、コンパイラ、及び、プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明のコンパイル方法は、コンピュータを用い、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムをコンパイルする方法であって、前記コンピュータが、前記ソースプログラムに含まれる前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録するステップと、前記コンピュータが、前記ソースプログラムに基づいて、特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出するステップと、前記コンピュータが、前記特殊化情報テーブルを参照して、前記検出した総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定するステップと、前記判定ステップで前記特殊化条件がコンパイル時に成立するか否かが不定であると判定されると、前記コンピュータが、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換するステップとを有することを特徴とする。
【００１２】
本発明のコンパイラは、コンピュータに、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムを入力させ、前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録させるための構文解析部と、前記コンピュータに、前記ソースプログラムに基づいて、前記特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出させるための特殊化検出部と、前記コンピュータに、前記特殊化情報テーブルを参照させて、前記検出された総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定させるための特殊化条件判定部と、前記特殊化条件がコンパイル時に成立すると判定されると、前記コンピュータに、前記総称サブプログラムを呼び出すコードを、前記特殊化条件が成立する特殊化サブプログラムを呼び出すコードに変換させ、前記特殊化条件がコンパイル時に成立するか否かが不定であると判定されると、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換させるためのコード変換・生成部とを備えることを特徴とする。
【００１３】
本発明のプログラムは、コンピュータに、総称サブプログラムに対する特殊化サブプログラムを指定する記述と、コンパイル時に不定の情報を含み、前記特殊化サブプログラムが適用される特殊化条件を設定する記述とを含むソースプログラムをコンパイルする処理を実行させるプログラムであって、前記コンピュータに、前記ソースプログラムに含まれる前記特殊化サブプログラム及び特殊化条件を特殊化情報テーブルに記録する処理と、前記ソースプログラムに基づいて、特殊化サブプログラムが指定された総称サブプログラムの呼び出しを検出する処理と、前記特殊化情報テーブルを参照して、前記検出した総称サブプログラムに対応する特殊化サブプログラムの特殊化条件がコンパイル時に成立するか否かを判定する処理と、前記判定処理で前記特殊化条件がコンパイル時に成立するか否かが不定であると判定すると、前記コンピュータが、前記総称サブプログラムを呼び出すコードを、前記特殊化条件の成立時に前記特殊化サブプログラムを呼び出すコードに変換する処理とを実行させることを特徴とする。
【発明の効果】
【００１４】
本発明のコンパイル方法、コンパイラ、及び、プログラムは、任意の総称サブプログラムについて、任意の特殊化を行うことができる。
【発明を実施するための最良の形態】
【００１５】
以下、図面を参照し、本発明の実施の形態を詳細に説明する。図１は、本発明の一実施形態のコンパイラを示している。コンパイラ１０１は、構文解析部１０２、特殊化部１０３、並列化部１０７、最適化部１０８、及び、コード生成部１０９を有する。コンパイラ１０１は、ソースプログラム１００を入力し、オブジェクトプログラム１１０を出力する。コンパイラ１０１内の各部の機能は、コンピュータ上で所定のプログラムを実行することで実現される。コンパイラ１０１は、定数伝播や定数の畳み込みなどの、ソースプログラム１００の中の式を静的に評価する機能を持つ。
【００１６】
ソースプログラム１００は、所定言語で記述されたプログラムである。ソースプログラム１００は、総称サブプログラムに対して特殊化サブプログラムを指定する記述と、その特殊化条件を設定する記述とを含む。構文解析部１０２は、ソースプログラム１００の構文解析を行い、特殊化情報テーブル１１１とサブプログラム情報テーブル１１２とを含む各種の情報テーブルを生成する。構文解析部１０２は、特殊化情報テーブル１１１に、ソースプログラム１００に記述されている特殊化サブプログラムと、その特殊化サブプログラムに設定された特殊化条件とを記録する。構文解析部１０２は、サブプログラム情報テーブル１１２に、ソースプログラム１００に現れる全てのサブプログラムの情報を記録する。その際、特殊化を宣言されているサブプログラムに対しては、特殊化が宣言されている旨を示すフラグ（「特殊化フラグ」）をオンに設定すると共に、対応する特殊化情報テーブル１１１へのリンクを設定する。
【００１７】
特殊化部１０３は、サブプログラムの特殊化を行う。サブプログラムの特殊化では、サブプログラム情報テーブル１１２を参照して、ソースプログラム実行時に呼び出される総称サブプログラムに対して、特殊化が宣言されているか否かを判定する。特殊化が宣言されているときは、特殊化情報テーブル１１１を参照して、特殊化条件がコンパイル時に成立するか否かを判定する。成立すると判定したときは、総称サブプログラムの呼び出しを、特殊化サブプログラムの呼び出しに置き換える。成立するか否かがコンパイル時に確定できない（不定である）ときは、総称サブプログラムの呼び出し部分を、実行時に特殊化条件が成立するときに特殊化サブプログラムを呼び出すコードに変換する。成立しないと判定したときは、総称サブプログラムの呼び出しのままとする。並列化部１０７は、必要に応じてプログラムの並列化を行う。最適化部１０８は、種々の最適化を適用する。コード生成部１０９は、オブジェクトコードを生成する。
【００１８】
本実施形態では、
（１）ソースプログラム１００において総称サブプログラムの特殊化を記述するための言語の機能
（２）特殊化部１０３
（３）特殊化情報テーブル１１１
が重要である。以下に、それぞれについて、更に詳しく説明する。
【００１９】
まず、総称サブプログラムの特殊を記述するための言語機能について説明する。言語を拡張し、以下に説明する、総称サブプログラムに対する特殊化を宣言する機能と特殊化条件を設定する機能を追加する。図２に、ＨＰＦにて、総称サブプログラムの特殊化を行うプログラムの例を示す。なお、図２に用いられている言語拡張の文法は、一例であり、これに限定されるものではない。すなわち、図２に例示した文法により実現できる言語の機能を規定するのであって、文法自体を規定するものではない。
【００２０】
・総称サブプログラムに対する特殊化を宣言する機能
総称サブプログラム（組込みサブプログラム及び実行時ライブラリルーチンを含む）に対して、特殊化されたサブプログラムを指定する。図２では、Ｆｏｒｔｒａｎの引用仕様宣言を拡張した構文により、ＨＰＦの実行時ライブラリ手続redist_copyに対する特殊化サブプログラムを指定している。また、redist_copyに対する特殊化サブプログラムとして、２つの特殊化サブプログラムredist_copy_squareとredist_copy_blockを指定している。
【００２１】
interface文で総称名として指定されているhpf(redist_copy)は、当該引用仕様宣言が、ＨＰＦの実行時ライブラリ手続redist_copyに対する総称引用仕様を指定することを示す。引用仕様本体は、対となるend interfaceまでの間に記述する。引用仕様本体のsubroutine文のプレフィックスとして指定されているspecial指定子は、そのsubroutine文で宣言されている手続が、当該引用仕様宣言が指定する総称手続の「特殊化引用仕様」であることを宣言する。redist_copy_square(a1,a2)のa1,a2は、当該特殊化サブプログラムの引数を表す。subroutineからend subroutineまでの間には、引数を含む変数の宣言や特殊化条件を記述する。
【００２２】
・特殊化条件を設定する機能
引用仕様本体にて、特殊化サブプログラムを適用する条件を明示する。引用仕様本体の宣言部に現れるspecialize_if(...)は、当該特殊化手続きに対する「特殊化条件」を指定する。特殊化条件としてspecialize_if文の括弧内に指定できるのは、その中の全ての演算が組込みであり、かつ、全ての一次子が制限式か特殊化条件一時変数であるような、論理型のスカラである式である。ここで、特殊化条件一時変数とは、その中の全ての演算が組込みであり、かつ、全ての一次子が制限式か特殊化条件一時変数であるような初期値式を持つ変数とする（e.g.図２の変数np）。
【００２３】
上記の特殊化条件の定義により、並列実行におけるプロセッサ台数、ある変数の値といったコンパイル時には不定で、実行時に確定する可能性がある動的な条件を、特殊化条件として設定できる。更に、特殊化引用仕様で指定されている、仮引数に対する記述的な分散指示文（e.g.図２の引用仕様本体におけるdistribute指示文）は、暗黙的な特殊化条件とみなされる。
【００２４】
次に、特殊化部１０３について詳細に説明する。特殊化部１０３は、特殊化検出部１０４、特殊化条件判定部１０５、及び、コード変換・生成部１０６を有する。特殊化検出部１０４は、プログラム実行で呼び出される総称サブプログラムの呼び出しを処理する際に、サブプログラム情報テーブル１１２を参照して、当該サブプログラムに対して特殊化サブプログラムが指定されているか否かを検出する。特殊化条件判定部１０５は、処理中の総称サブプログラムに対する特殊化サブプログラムが指定されているときは、特殊化情報テーブル１１１を参照して、対応する特殊化条件の成否を判定する。一つの総称サブプログラムに対して複数の特殊化サブプログラムが指定されているときは、特殊化情報テーブル１１１からエントリを１つずつ取り出し、各特殊化条件の判定を行う。
【００２５】
コード変換・生成部１０６は、特殊化条件判定部１０５が特殊化条件が成立していると判定すると、当該総称サブプログラム呼び出しを、特殊化サブプログラムの呼び出しで置換する。特殊化条件が成立するか否かがコンパイル時に不定である場合は、特殊化条件の成否を実行時に判定し、その結果に基づいて、対応する特殊化サブプログラム又は元の総称サブプログラムを呼び分けるコードを生成する。複数の特殊化条件が成立する場合は、特殊化情報テーブル１１１の最も上位に現れる特殊化サブプログラムを優先して呼び出すようにコードを生成する。
【００２６】
続いて、特殊化情報テーブル１１１について説明する。特殊化情報テーブル１１１は、特殊化を宣言されている総称サブプログラムのそれぞれに対応する複数のテーブルを有する。各テーブルには、対応する総称サブプログラムに対して指定されている各特殊化サブプログラムの名前、引数、及び、特殊化条件が、総称サブプログラムの引用仕様宣言に現れた順序で記録される。
【００２７】
図３に、特殊化部１０３の動作手順を示す。特殊化検出部１０４は、サブプログラムの呼び出しを検出すると、サブプログラム情報テーブル１１２を参照し、当該サブプログラムの特殊化フラグがオンであるか否かを判定する（ステップＳ１）。特殊化フラグがオンでないと判定された場合、当該サブプログラムに対する特殊化サブプログラムは存在しないので、コード変換・生成部１０６は、元の総称サブプログラムの呼び出しを生成する（ステップＳ１３）。つまり、総称サブプログラムの特殊化サブプログラムへの置き換えは行わない。
【００２８】
特殊化検出部１０４は、ステップＳ１で特殊化フラグがオンであると判定すると、対応する特殊化情報テーブル１１１に、未処理のエントリがあるか否かを判定する（ステップＳ２）。未処理のエントリがある場合は、未処理のエントリの中の先頭のエントリを、カレントエントリとして選ぶ。特殊化条件判定部１０５は、カレントエントリの特殊化条件がコンパイル時に成立するか否か、又は、コンパイル時には確定できず不定であるかを判定する（ステップＳ３）。条件が成立しない場合は、カレントエントリを処理済みとして、ステップＳ２に戻り、次の未処理エントリを選択する。特殊化条件が１つも成立又は不定と判定されることなく、全てのエントリの特殊化条件の判定を終了したときは、ステップＳ２からステップＳ１３へと進んで、元の総称サブプログラムの呼び出しを生成する。ステップＳ３で、何れかのエントリの特殊化条件が成立すると判定されたときは、コード変換・生成部１０６は、当該サブプログラムの呼び出しを、当該エントリの特殊化サブプログラムの呼び出しに変換したコードを生成する（ステップＳ１０）。
【００２９】
ステップＳ３で不定であると判定された場合、コード変換・生成部１０６は、カレントエントリの特殊化条件を条件式とするＩＦ構文を生成する（ステップＳ４）。特殊化条件に特殊化一時変数が現れる場合、宣言部にその宣言を生成し、ＩＦ構文の直前にその定義を生成する。特殊化条件又は特殊化一時変数の定義に表れる仮引数は、対応する実引数で置換する。その後、コード変換・生成部１０６は、ステップＳ４で生成したＩＦ構文内に、カレントエントリの特殊化サブプログラムの呼び出しを生成し、カレントエントリを処理済みとする（ステップＳ５）。ステップＳ５で、特殊化サブプログラムを、ステップＳ４で生成したＩＦ構文において条件式が成立した場合に実行されるサブプログラムとして記述することで、総称サブプログラムを呼び出す部分が、特殊化条件成立時に特殊化サブプログラムを呼び出すコードに変換される。
【００３０】
続いて、特殊化検出部１０４は、特殊化情報テーブル１１１の中に、未処理のエントリがあるか否かを判定する（ステップＳ６）。未処理のエントリがあるときは、その中の先頭のエントリを、カレントエントリとして選ぶ。特殊化条件判定部１０５は、カレントエントリの特殊化条件がコンパイル時に成立するか否か、又は、不定であるかを判定する（ステップＳ８）。不定と判定した場合、コード変換・生成部１０６は、カレントエントリの特殊化条件を条件式とするＥＬＳＥ  ＩＦ文を生成する（ステップＳ１１）。このとき、特殊化条件に特殊化一時変数が現れる場合は、宣言部にその宣言を生成し、ＩＦ構文の直前にその定義を生成する。特殊化条件又は特殊化一時変数の定義に現れる仮引数は、対応する実引数で置換する。コード変換・生成部１０６は、カレントエントリの特殊化サブプログラムの呼び出しを生成し、カレントエントリを処理済とする（ステップＳ１２）。ステップＳ１２で生成される特殊化サブプログラムは、ステップＳ１１で生成したＥＬＳＥ  ＩＦの条件式が成立するときに実行されるサブプログラムである。その後、ステップＳ６に戻り、次のエントリを選択する。
【００３１】
ステップＳ８で、特殊化検出部１０４が特殊化条件が成立すると判定した場合、コード変換・生成部１０６は、ＥＬＳＥ文を生成し（ステップＳ９）、ステップＳ１０に進んで特殊化サブプログラムの呼び出しを生成する。つまり、直前のＩＦ構文の条件式が成立しない場合に実行される特殊化サブプログラムの呼び出しを生成する。特殊化条件が成立しないときは、ステップＳ６に戻る。ステップＳ６で、未処理のエントリがないと判定されると、つまり、全ての特殊化条件の判定が終了すると、コード変換・生成部１０６は、ＥＬＳＥ文を生成し（ステップＳ７）、ステップＳ１３に進んで、総称サブプログラムの呼び出しを生成する。つまり、直前のＩＦ構文の条件式が成立しないときに実行される総称サブプログラムの呼び出しを生成する。
【００３２】
以下、図２に示すプログラムを用いて、特殊化部１０３の動作の具体例を説明する。なお、説明容易となるように、図２のプログラムにはredist_copyの呼び出しを明示してあるが、本来、ＨＰＦの実行時ライブラリ手続は処理系によって暗黙的に呼び出されるものであり、ユーザプログラム上から直接に呼び出されることは通常ないことに注意されたい。図３に示す処理に先立って、構文解析部１０２は、図２に示すプログラムから、特殊化情報テーブル１１１と、サブプログラム情報テーブル１１２とを生成する。
【００３３】
図４に、特殊化情報テーブル１１１及びサブプログラム情報テーブル１１２のデータ例を示す。図２では、interface文で総称名として指定されているredist_copyに対して、interfaceからend interfaceまでの間にspecial指定子が存在するので、総称サブプログラムredist_copyに対して特殊化フラグをオンに設定する。また、作成する／作成したredist_copyに対する特殊化サブプログラムの情報を記録する特殊化情報テーブルへのリンクを設定する。
【００３４】
図２では、ＨＰＦの実行時ライブラリ手続redist_copyに対して、２つの特殊化サブプログラムredist_copy_squareとredist_copy_blockが宣言されている。構文解析部１０２は、これら特殊化サブプログラムを、redist_copyについての特殊化情報テーブル１１１の各エントリに登録する。各エントリは、特殊化手続の手続名、引数、特殊化条件を有する。例えば、手続名「redist_copy_square」について、引数「real a1(:,:) , a2(:,:)、distribute a1(*,block)、distribute a2(block,*)」、特殊化条件「mod(size(a1,1), np) == 0 .and. mod(np,2) == 0」を登録する。
【００３５】
特殊化部１０３は、プログラム内で、サブプログラムを呼び出す部分を検出する。このとき、特殊化部１０３は、ソースプログラム上での明示的に呼び出されるサブプログラムだけでなく、ソースプログラムの実行時に黙示的に呼び出されるサブプログラムも検出する。特殊化部１０３がredist_copy(x1, x2)の呼び出しを検出すると、特殊化検出部１０４は、ステップＳ１でサブプログラム情報テーブル１１２を検索し、redist_copyの特殊化フラグがオンであるか否かを調べる。特殊化フラグはオンであるので、ステップＳ２に進む。特殊化条件判定部１０５は、特殊化情報テーブル１１１の最初のエントリ（redist_copy_square）をカレントエントリとする。その後、ステップＳ３で、カレントエントリの特殊化条件が成立しているか否かを判定する。
【００３６】
特殊化条件の判定では、特殊化条件に含まれる引数（a1,a2）を、サブプログラム呼び出し時の引数（x1,x2）に変換した上で、条件判定を行う。図２を参照すると、第１引数であるx1の１次元目のサイズは１０２４で、np（=number_of_processors（））の値は８であるので（２行目及び３行目）、特殊化条件の前段部分であるmod(size(x1,1),np)==0は成立する。また、後段部分mod(np,2)==0も成立する。従って、ステップＳ３からステップＳ１０へと進む。コード変換・生成部１０６は、当該特殊化サブプログラム（redist_copy_square）の呼び出しを生成して、redist_copy(x1, x2)についての処理を終了する。
【００３７】
次に、特殊化部１０３がredist_copy(y1, y2)の呼び出しを検出すると、特殊化検出部１０４は、ステップＳ１で、サブプログラム情報テーブル１１２を検索し、redist_copyの特殊化フラグがオンであると判定する。特殊化条件判定部１０５は、ステップＳ２で特殊化情報テーブル１１１の最初のエントリ（redist_copy_square）をカレントエントリとし、ステップＳ３でカレントエントリの特殊化条件が成立しているか否かを判定する。
【００３８】
redist_cpoy_squareの特殊化条件の成否を判定すると、特殊化条件の前段部分であるmod(size(y1,1),np)==0が成立するかどうかが不定である。従って、ステップＳ３からステップＳ４、Ｓ５へと進み、コード変換・生成部１０６が、特殊化条件を条件式とするＩＦ構文と、条件式が成立したときに実行される特殊化サブプログラムの呼び出し（redist_copy_square）を生成する。このとき、distribute指示文は、暗黙的な特殊化条件とみなされるので、特殊化条件に、distribute指示文に対応する条件を追加する。また、ＩＦ構文に先行して、特殊化一時変数npの宣言（integer np）及び定義(np=number_of_processors())を併せて生成する。
【００３９】
ステップＳ５で、特殊化サブプログラムの呼び出しを生成した後、ステップＳ６へ進む。特殊化条件判定部１０５は、ステップＳ６で２つ目のエントリ（redist_copy_block）をカレントエントリとして選択し、ステップＳ８でカレントエントリの特殊化条件が成立するか否かを判定する。この特殊化条件の成否も不定であるので、ステップＳ８からステップＳ１１へと進む。コード変換・生成部１０６は、ステップＳ１１、Ｓ１２で、else if文と、else if文の条件式が成立したときに実行される特殊化サブプログラム（redist_copy_square）の呼び出しを生成する。その後、ステップＳ６へ戻る。
【００４０】
ステップＳ６で、次のエントリを選択しようとすると、特殊化情報テーブル１１１には未処理のエントリが残っていないので、ステップＳ６からステップＳ７へと進む。コード変換・生成部１０６は、ステップＳ７で、ステップＳ１１で生成したelse ifに対応するelse文を生成し、ステップＳ１３で、元の総称サブプログラム（redist_copy）の呼び出しを生成し、redist_copy(y1, y2)についての処理を終了する。
【００４１】
続いて、特殊化部１０３がredist_copy(z1, z2)の呼び出しを検出すると、特殊化検出部１０４は、ステップＳ１で、サブプログラム情報テーブル１１２を検索し、redist_copyの特殊化フラグがオンであると判定する。特殊化条件判定部１０５は、ステップＳ２で特殊化情報テーブル１１１の最初のエントリ（redist_copy_square）をカレントエントリとし、ステップＳ３でカレントエントリの特殊化条件が成立しているか否かを判定する。この特殊化条件は成立しないので、ステップ２に戻り、次のエントリ（redist_cpoy_block）を選択する。
【００４２】
ステップＳ３で、redist_cpoy_blockの特殊化条件の成否を判定すると、この条件も成立しないので、ステップ２に戻る。ステップＳ２で、次のエントリを選択しようとすると、特殊化情報テーブル１１１には未処理のエントリが残っていないので、ステップＳ２からステップＳ１３へと進む。コード変換・生成部１０６は、ステップＳ１３で、元の総称サブプログラム（redist_copy）の呼び出しを生成し、redist_copy(z1, z2)についての処理を終了する。この場合は、全ての特殊化サブプログラムについて特殊化条件が成立しないので特殊化サブプログラムへの変換は行われない。
【００４３】
図５に、特殊化部１０３による処理結果を示す。図２に示すプログラムに含まれる３つのredist_copyの呼び出しを、図３に示す処理にて処理すると、図５に示す結果が得られる。１つ目のredist_copyは、コンパイル時にredist_copy_squareの特殊化条件が成立するケースであり、redist_copy(x1, x2)は、redist_copy_square(x1. x2)に置き換えられる。２つ目のredist_copyは、実行時にredist_copy_squareの特殊化条件が成立するときは、redist_copy_squareを呼び出し、不成立時にredist_copy_blockの特殊化条件が成立するときはredist_copy_blockを呼び出し、双方とも不成立のときは、元のredist_copyを呼び出すコードに変換される。３つ目のredist_copyは、何れのコンパイル時に特殊化条件も成立しないので、元のredist_copyの呼び出しのままである。
【００４４】
本実施形態では、プログラミング言語に、総称的に定義されているサブプログラムに対して、特定の条件下でより性能が高い特殊化サブプログラムを指定する機能と、その適用条件を設定する機能とを持たせる。特殊化条件の設定では、動的な情報を、特殊化条件に設定できる。コンパイラは、特殊化を伴うサブプログラムの呼び出しを検出し、特殊化条件の成否をコンパイル時に判定する。条件成立時は、元の総称サブプログラム呼び出しを特殊化サブプログラム呼び出しで置き換える。コンパイル時に特殊化条件の成否が不明なときは、実行時に特殊化条件の成否を判定して、特殊化サブプログラム又は元の総称サブプログラムを呼び分けるコードを生成する。
【００４５】
本実施形態では、必要に応じて実行時に条件判定を行うことで、より柔軟な特殊化条件をユーザが設定できる。また、特殊化条件の判定と特殊化サブプログラムの呼び出しとを、処理系が自動的に行うことで、実行環境や問題設定の変更に伴うソースプログラムの修正が不要である。ソースプログラムに、特殊化サブプログラムを指定する機能と特殊化条件を設定する機能とを持たせることで、組込みサブプログラムや実行時ライブラリルーチンを特殊化の対象にできる。また、ユーザがソースプログラムにて特殊化サブプログラムを定義することにより、任意の特殊化を実現できる。
【００４６】
なお、上記実施形態では、ソースプログラムにＦｏｒｔｒａｎを用いる例について説明したが、ソースプログラムの言語は、Ｆｏｒｔｒａｎ又はその拡張言語には限られない。例えば、Ｃ言語の拡張である並列言語Unified Parallel C（UPC）を用いることもできる。図６に、ＵＰＣの例を示す。１行目では、総称的な、すなわち、任意の型・任意のブロックサイズの共有配列を処理対象とする関数ArrayCopyのプロトタイプが宣言されている。２行目のspecialize(ArrayCopy)にて、総称的な関数ArrayCopyに対して、特殊化サブプログラムを指定する。３行目以降において、ArrayCopyに対する特殊化条件と特殊化関数（ArrayCopy_Congruent）とが宣言されている。このようなソースプログラムに対するコンパイラの動作は、ＦｏｒｔｒａｎとＣの文法の違いを除き、上記実施形態のそれと同じである。
【００４７】
以上、本発明をその好適な実施形態に基づいて説明したが、本発明のコンパイラ、コンパイル方法、及び、プログラムは、上記実施形態にのみ限定されるものではなく、上記実施形態の構成から種々の修正及び変更を施したものも、本発明の範囲に含まれる。
【図面の簡単な説明】
【００４８】
【図１】本発明の一実施形態のコンパイラを示すブロック図。
【図２】ソースプログラム例を示す図。
【図３】特殊化部の動作手順を示すフローチャート。
【図４】サブプログラム情報テーブル及び特殊化情報テーブルのデータ例を示す図。
【図５】特殊化部による処理後のプログラムを示す図。
【図６】ＵＰＣ言語で記述したプログラムを示す図。
【符号の説明】
【００４９】
１００：ソースプログラム
１０１：コンパイラ
１０２：構文解析部
１０３：特殊化部
１０４：特殊化検出部
１０５：特殊化条件判定部
１０６：コード変換・生成部
１０７：並列化部
１０８：最適化部
１０９：コード生成部
１１０：オブジェクトプログラム
１１１：特殊化情報テーブル
１１２：サブプログラム情報テーブル
【図１】
0004985461.tif 000002
【図２】
0004985461.tif 000003
【図３】
0004985461.tif 000004
【図４】
0004985461.tif 000005
【図５】
0004985461.tif 000006
【図６】
0004985461.tif 000007