(57)【要約】【課題】関数定義コードの集合である関数定義部分を、より多く共通化することが可能なテンプレートコンパイル方法を提供する。【解決手段】テンプレート１２２に基づいて生成される関数定義部分の重要度を示すプロファイルデータ１８が、格納部に格納される。コンパイラ１３が、複数のサブソースプログラム１２１を独立にコンパイルすることにより生成される複数のサブオブジェクトプログラム１７１に含まれる関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分１７４とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分１７３とするかを、プロファイルデータ１８に基づいて決定する。コンパイラ１３が、前記決定に基づいて、共通化関数定義部分１７４又は独立関数定義部分１７３を含むオブジェクトプログラム１７を生成する。【選択図】図３
2011203960.tif 000002
【特許請求の範囲】
【請求項１】
高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、前記複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納部に格納するステップと、
コンパイラが、前記複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、前記重要度情報に基づいて決定するステップと、
前記コンパイラが、前記決定に基づいて、前記共通化関数定義部分、又は、前記独立関数定義部分を含むオブジェクトプログラムを生成するステップとを含む
ことを特徴とするテンプレートコンパイル方法。
【請求項２】
前記重要度情報は、生成された前記オブジェクトプログラムを実行することにより得られる情報である
ことを特徴とする請求項１に記載のテンプレートコンパイル方法。
【請求項３】
前記重要度情報は、前記テンプレートに基づいて生成される関数定義部分の実行の頻度を示すプロファイルデータである
ことを特徴とする請求項２に記載のテンプレートコンパイル方法。
【請求項４】
前記コンパイラが、前記プロファイルデータと、前記テンプレートに基づいて生成される関数定義部分の中間コードに対する、前記中間コードの中の型パラメータに依存する処理の中間コードの割合とに基づいて、前記決定を行う
ことを特徴とする請求項２に記載のテンプレートコンパイル方法。
【請求項５】
前記コンパイラが、前記テンプレートに基づいて生成される関数定義部分を前記プロファイルデータにおける実行の頻度の順にソートして、前記テンプレートに基づいて生成される関数定義部分の中で、前記実行の頻度が予め定められた基準値より少ない関数定義部分を抽出し、抽出された前記関数定義部分を共通化する
ことを特徴とする請求項４に記載のテンプレートコンパイル方法。
【請求項６】
前記コンパイラが、前記実行の頻度が予め定められた基準値より少ない関数定義部分の中で、前記割合が予め定められた閾値より低い関数定義部分を抽出し、抽出された前記関数定義部分を共通化する
ことを特徴とする請求項５に記載のテンプレートコンパイル方法。
【請求項７】
前記コンパイラは、前記重要度情報を取得するモードと、少なくとも１個の前記共通化関数定義部分を含む前記オブジェクトプログラムを生成するモードとを備える
ことを特徴とする請求項１に記載のテンプレートコンパイル方法。
【請求項８】
高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、前記複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納する格納部と、
前記複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、前記重要度情報に基づいて決定し、前記決定に基づいて、前記共通化関数定義部分、又は、前記独立関数定義部分を含むオブジェクトプログラムを生成するコンパイラとを含む
ことを特徴とするテンプレートコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テンプレートコンパイル方法及びテンプレートコンパイル装置に関する。
【背景技術】
【０００２】
テンプレートを持ち高級言語であるＣ＋＋言語で記述されたソースプログラムを、オブジェクトプログラムに変換するコンパイル、換言すれば、テンプレートコンパイルが知られている。テンプレートは、アルゴリズムとデータの分離を図ることにより、プログラムの保守性と再利用性を高めるジェネリックプログラミングを可能にする技術である。
【０００３】
テンプレートコンパイルにおいては、テンプレートに与えられた型パラメータ毎に、テンプレートに基づいて関数定義部分、換言すれば、テンプレートのインスタンスが生成される。テンプレートに基づいて生成される関数定義部分は、テンプレートを具現化したオブジェクトコード、換言すれば、具現化オブジェクトである。このため、ソースプログラムにおいてテンプレートにおいて複数の型パラメータが与えられた場合には、生成されるオブジェクトプログラムのサイズが、全体として、増大する。
【０００４】
図１５は、２個の型パラメータが与えられたテンプレートの一例を示す。図１５のテンプレート＃１０１は、ソースプログラム１００に含まれる。図１５のテンプレート＃１０１においては、型パラメータ＜ｉｎｔ＞と、型パラメータ＜ｆｌｏａｔ＞とが与えられている。型パラメータ＜ｉｎｔ＞は整数型の演算を実行することを指示するパラメータであり、型パラメータ＜ｆｌｏａｔ＞は浮動小数点型の演算を実行することを指示するパラメータである。
【０００５】
なお、図１５において、実際のテンプレートは最初の３行であり、残りの４行はテンプレートに型パラメータを与える部分である。従って、図１５のテンプレート＃１０１は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
【０００６】
図１６は、与えられた型パラメータにより具現化されたインスタンスの一例を示す。図１５のテンプレート＃１０１を含むソースプログラム１００がコンパイルされた結果として、図１６のテンプレート＃１０１のインスタンス、換言すれば、具現化されたオブジェクトプログラム２００が得られる。図１６のインスタンスにおいては、型パラメータ＜ｉｎｔ＞に対応する関数定義部分＃２０１と、型パラメータ＜ｆｌｏａｔ＞に対応する関数定義部分＃２０２とが含まれる。関数定義部分は、複数の関数定義コードの列である。換言すれば、１個のテンプレート＃１０１が、与えられた２個の型に応じて、２個の関数定義部分＃２０１及び＃２０２として具現化される。テンプレート＃１０１の部分についてのコードのサイズが２倍になった結果、オブジェクトプログラム２００のサイズも、全体として、例えば、ほぼ２倍に増加してしまう。
【０００７】
このようなオブジェクトプログラムのサイズの増加を防ぐため、テンプレートコンパイル方法において、テンプレートから生成される複数の関数定義コードのうち同一コードとなるものの関数定義コードの共通化を図って、テンプレート機構により増加するコードサイズを縮小することが提案されている。
【０００８】
テンプレートから生成されるインスタンスは、与えられた型パラメータが異なる場合でも、結果として、異なる関数定義コードとなるとは限らない。テンプレートにおける関数の内容と与えられる型パラメータによっては、同一の関数定義に具現化されたコードとなることがある。従って、異なる型パラメータに対して同一の関数定義に具現化されたコードが生成される場合には、当該同一の関数定義に具現化されたコードを１個の関数定義に具現化されたコードに置換することができる。
【０００９】
図１７は、型パラメータに依存しないテンプレートの一例を示す。図１７のテンプレート＃３０１は、ソースプログラム３００に含まれる。図１７のテンプレート＃３０１においては、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞と型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞とが与えられている。例えば、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞は名前Ａのデータ構造を生成することを指示するパラメータである。
【００１０】
なお、図１７において、実際のテンプレートは最初の３行であり、残りの複数の行はテンプレートに型パラメータを与える部分である。従って、図１７のテンプレート＃３０１は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
【００１１】
図１８は、結果的に同一のコードに具現化されたインスタンスの一例を示す。図１７のテンプレート＃３０１を含むソースプログラム３００がコンパイルされた結果として、図１８のテンプレート＃３０１のインスタンス、換言すれば、具現化されたオブジェクトプログラム４００が得られる。図１８のインスタンスにおいては、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞に対応する関数定義部分＃４０１と、型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞に対応する関数定義部分＃４０２とが含まれる。換言すれば、１個のテンプレート＃３０１が、与えられた２個の型に応じて、２個の関数定義部分＃４０１及び＃４０２として具現化される。
【００１２】
２個の関数定義部分＃４０１及び＃４０２は、図１８に示すように、各々の第１行に現れるマングル名「Ａ」及び「Ｂ」を除いて、全く同一の関数定義に具現化されている。従って、型パラメータが相互に異なっていても、これに依存することなく、具現化された関数定義コードは同一となる。このような場合、型パラメータが異なっても、結果として生成される複数の関数定義コードが１個の関数定義コードに置換される。
【００１３】
なお、以上の他に、共通可能プログラム構造が共通可能宣言及びこれに関連する１つ以上の共通可能本体を含み、共通可能宣言が具体化で使用するために存在すれば、次のコンパイルにおいて、共通可能本体を使用するコンパイラが提案されている。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特開２００５−１４１３８０号公報
【特許文献２】特公平７−０３１６０６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
前述したように、テンプレートコンパイル方法において、同一のテンプレートに基づいて生成される複数の同一の関数定義に具現化されたコードを、１個の関数定義に具現化されたコードに置換することができる。これにより、テンプレートにより増加するコードサイズを縮小することができる。従って、更に、多くの関数定義コードを共通化して、オブジェクトプログラムのサイズを縮小することが望まれる。
【００１６】
本発明は、関数定義コードの集合である関数定義部分を、より多く共通化することが可能なテンプレートコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
開示されるテンプレートコンパイル方法は、高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納部に格納するステップと、コンパイラが、複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、重要度情報に基づいて決定するステップと、コンパイラが、決定に基づいて、共通化関数定義部分、又は、独立関数定義部分を含むオブジェクトプログラムを生成するステップとを含む。
【発明の効果】
【００１８】
開示されるテンプレートコンパイル方法によれば、オブジェクトプログラムの実行性能をあまり損なうことなく、同一又は類似の内容を持つ複数の関数定義コードの集合である関数定義部分を共通化することができ、オブジェクトプログラムのサイズを縮小することができる。
【図面の簡単な説明】
【００１９】
【図１】テンプレートコンパイル装置の構成の一例を示す図である。
【図２】プロファイル機能付加モードにおけるコンパイル処理の一例を示す。
【図３】インスタンス共通化モードにおけるコンパイル処理の一例を示す。
【図４】プロファイルデータ生成部のデータ構造の説明図である。
【図５】プロファイルデータ及びプロファイルデータによる共通化対象の判定の説明図である。
【図６】型パラメータに依存する処理の割合による共通化の判定の説明図である。
【図７】テンプレートコンパイル処理における変換されたソースプログラムを示す。
【図８】テンプレートコンパイル処理における共通化インスタンスを含むオブジェクトプログラムの一例を示す。
【図９】テンプレートコンパイル処理のフローチャートである。
【図１０】プロファイル機能付加モードにおけるコンパイル処理のフローチャートである。
【図１１】インスタンス共通化モードにおけるコンパイル処理のフローチャートである。
【図１２】プロファイル解析処理の詳細のフローチャートである。
【図１３】テンプレートインスタンス共通化判定準備処理のフローチャートである。
【図１４】テンプレートインスタンス共通化処理のフローチャートである。
【図１５】テンプレートコンパイル処理における、型パラメータが与えられたテンプレートの一例を示す。
【図１６】与えられた型パラメータにより具現化されたインスタンスの一例を示す。
【図１７】型パラメータに依存しないテンプレートの一例を示す。
【図１８】結果的に同一のコードに具現化されたインスタンスの一例を示す。
【図１９】型パラメータに依存するテンプレートの一例を示す。
【図２０】結果的にほぼ同一のコードに具現化されたインスタンスの一例を示す。
【図２１】テンプレートコンパイル処理の説明図である。
【発明を実施するための形態】
【００２０】
本発明者の検討によれば、従来のテンプレートコンパイル方法においては、異なる型パラメータに対して同一の関数定義に具現化されたコードを生成する場合しか、関数定義コードを共通化できない。
【００２１】
図１９は、型パラメータに依存するテンプレートの一例を示す。図１９のテンプレート＃５０１は、ソースプログラム５００に含まれる。図１９のテンプレート＃５０１においては、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞と型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞とが与えられている。例えば、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞は名前Ａのデータ構造を生成することを指示するパラメータである。また、型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞の「ｉｎｔ  ｖａｌｕｅ，  ｉｄ；」において、メンバｉｄのオフセットはＡとは異なるものとする。
【００２２】
ここで、実際には、処理＃１は、型パラメータＴ及びａに関する情報を参照しない、換言すれば、依存しないが、数１０００行のコードを含む長い処理である。また、処理＃２は、処理＃１とは異なる処理であって、型パラメータＴ及びａに関する情報を参照しない、換言すれば、依存しないが、数１０００行のコードを含む長い処理である。
【００２３】
なお、図１９において、実際のテンプレートは、最初の８行であり、残りの複数の行はテンプレートに型パラメータを与える部分である。但し、前述したように、実際には、処理＃１及び処理＃２は、数１０００行のコードを含む長い処理である。従って、図１９のテンプレート＃５０１は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
【００２４】
図２０は、結果的に同一のコードに具現化されたインスタンスの一例を示す。図１９のテンプレート＃５０１を含むソースプログラム５００がコンパイルされた結果として、図２０のテンプレート＃５０１のインスタンス、換言すれば、具現化されたオブジェクトプログラム６００が得られる。図２０のインスタンスにおいては、型パラメータ＜ｓｔｒｕｃｔ  Ａ＞に対応する関数定義部分＃６０１と、型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞に対応する関数定義部分＃６０２とが含まれる。換言すれば、１個のテンプレート＃５０１が、与えられた２個の型に応じて、２個の関数定義部分＃６０１及び＃６０２として具現化される。ここで、前述したように、処理＃１及び処理＃２は、各々、数１０００行のコードを含む長い処理である。また、２個の関数定義部分＃６０１及び＃６０２において、各々の第１行に現れるマングル名「Ａ」及び「Ｂ」を除いて、ほぼ同一の関数定義に具現化されている。更に、２個の関数定義部分＃６０１及び＃６０２において、メンバｉｄのオフセットが相互に異なるために、各々の第６行が異なる。
【００２５】
図１９のように定義されたテンプレート＃５０１では、型に依存する処理はわずかであり、一方、型に依存しない処理＃１及び処理＃２は、ソースプログラム５００のみならず、オブジェクトプログラム６００においても、全く同一である。従って、同一である部分の割合は極めて大きい。それにも拘らず、オブジェクトプログラム６００は、結果として、図２０に示すように、別個に、処理＃１及び処理＃２を含む２つの独立した関数定義部分＃６０１及び＃６０２として具現化される。
【００２６】
処理＃１は、前述したように、型パラメータＴ及びａに関する情報を参照しない。従って、関数定義部分＃６０１及び＃６０２において、全く同一の処理である。処理＃２も同様である。しかし、長い処理＃１及び長い処理＃２を含む関数定義部分＃６０１及び＃６０２を共通化することはできない。換言すれば、大きなテンプレート関数の一部が型パラメータに依存する場合、当該テンプレートに基づいて生成されたインスタンスの大部分は共通であるが、共通化することはできない。
【００２７】
また、本発明者の検討によれば、従来のテンプレートコンパイル方法においては、処理が1つのコンパイル単位に閉じており、複数のコンパイル単位間においては異なるマングル名を持ちながら全く同一の関数定義に具現化された関数テンプレートの共通化ができない。
【００２８】
例えば、コンパイル時において、個々のサブオブジェクトプログラムにおいて異なるマングル名を持ちながら同一の関数定義に具現化されたコードが含まれることを検出して、共通化することはできない。換言すれば、図２０の関数定義部分＃６０１及び＃６０２が個々のサブオブジェクトプログラムに含まれる場合、これらを共通化することはできない。例えば、テンプレートとして、共通の関数を記述したインクルードファイルを複数のサブソースプログラムに予め展開すれば、複数のコンパイル単位において同一の関数定義に具現化されたコードを生成することができる。しかし、これらの複数のサブソースプログラムを独立してコンパイルした場合、コンパイラは、同一の関数定義に具現化されたコードを生成するが、これらのマングル名が異なっていた場合、同一のテンプレートが複数のサブソースプログラムにおいて利用されたことを検出することができない。従って、コンパイル時に、同一の関数定義に具現化されたコードを共通化することができないので、事実上、インクルードファイルを用いたことによる共通化の効果は得られない。
【００２９】
例えば、ヘッダーファイルにおいて、template<typename T> tFunc(T& t) { /* 定義 */ }のような関数テンプレートが定義され、型テンプレートＴに対し、class Ａ〜Ｆを適用した場合に同一のオブジェクトが生成されるとする。そして、このような関数テンプレートが、ソースプログラムのファイル ABC.cc では図２１（Ａ）に示すように使用され、ソースプログラムのファイル DEF.cc では図２１（Ｂ）に示すように使用されるとする。
【００３０】
この場合、ソースプログラムのファイルABC.cc のコンパイル時には 、tFunc<A>(A&)、 tFunc<B>(B&)、 tFunc<C>(C&) をまとめた関数定義部分が生成される。ソースプログラムのファイルDEF.cc のコンパイル時には、 tFunc<D>(D&)、 tFunc<E>(E&)、 tFunc<F>(F&) をまとめた関数定義部分が生成される。しかし、結果として、この2つの関数定義部分は、異なるマングル名を持ちながら同一のオブジェクトコードになるにもかかわらず、オブジェクトプログラムにおいて重複して存在し、重複部分を削除することができない。
【００３１】
開示のテンプレートコンパイル方法及びテンプレートコンパイル装置は、テンプレートに基づいて生成される関数定義部分を、複数のコンパイル単位においてできるだけ共通化する。
【００３２】
図１は、コンパイル処理装置の構成の一例を示す図である。
【００３３】
図１のコンピュータシステムは、コンピュータ１とコンピュータ２とを含む。コンピュータ１は、コンパイラ１３を含むコンパイル処理装置である。コンピュータ２は、オブジェクトプログラム１７を実行するデータ処理装置である。
【００３４】
コンピュータ１は、格納部１１と、コンパイラ１３とを含む。格納部１１は、ソースプログラム１２を格納する。ソースプログラム１２は、高級言語であるＣ＋＋言語で記述される。コンパイラ１３は、コンパイルを実行するコンパイル処理部であり、例えばオペレータにより入力された指示に従って、ソースプログラム１２をコンパイルしてオブジェクトプログラム１７を生成して、格納部１１に格納する。このために、コンパイラ１３は、プロファイル処理部１４と、共通化処理部１５と、通常処理部１６とを含む。
【００３５】
ソースプログラム１２は、複数のサブソースプログラム１２１を含む。複数のサブソースプログラム１２１の各々が、コンパイル単位である。従って、生成されたオブジェクトプログラム１７は、複数のサブオブジェクトプログラム１７１を含む。複数のサブオブジェクトプログラム１７１が、複数のサブソースプログラム１２１をコンパイルした結果である。
【００３６】
コンピュータ２は、オブジェクトプログラム１７を実行する処理部を含む。後述するように、コンピュータ２によりオブジェクトプログラム１７を実行することにより、プロファイルデータ１８が得られる。プロファイルデータ１８は、コンピュータ１の格納部１１に格納される。
【００３７】
コンパイラ１３へのオペレータの指示は、コンパイルのモードを指定する指示入力であり、例えば、コンピュータ１の入力装置から入力される。モードは、コンパイルのモードを指定する情報であり、例えば、プロファイル機能組み込みモード、インスタンス共通化モード、通常モードのいずれかである。プロファイル機能組み込みモードは、後述するように、重要度情報を取得するモードである。インスタンス共通化モードは、後述するように、少なくとも１個の共通化関数定義部分１７４を含むオブジェクトプログラム１７を生成するモードである。
【００３８】
プロファイル処理部１４は、プロファイル機能組み込みモードが指定された場合に、プロファイル機能組み込みモードでソースプログラム１２をコンパイルすることにより、オブジェクトプログラム１７を生成する。プロファイル機能組み込みモードはプロファイル処理部１４により実行される。プロファイル機能組み込みモードについては、図２を参照して後述する。
【００３９】
なお、後述するように、サブオブジェクトプログラム１７１は、プロファイルデータ生成部１７２を含む。これにより、生成されたオブジェクトプログラム１７をコンピュータ２において実行することにより、プロファイルデータ１８が生成される。
【００４０】
共通化処理部１５は、インスタンス共通化モードが指定された場合に、インスタンス共通化モードでソースプログラム１２をコンパイルすることにより、オブジェクトプログラム１７を生成する。インスタンス共通化モードは共通化処理部１５により実行される。インスタンス共通化モードにおいては、複数のサブソースプログラム１２１のインスタンスが共通化される。共通化されるインスタンスは、プロファイルデータ１８に基づいて決定される。インスタンス共通化モードについては、図３を参照して後述する。
【００４１】
通常処理部１６は、通常モードが指定された場合に、通常モードでソースプログラム１２をコンパイルすることにより、オブジェクトプログラム１７を生成する。通常モードは通常処理部１６により実行される。通常モードは、コンパイラ１３の本来の機能であり、従って、通常モードにおいては、複数のサブソースプログラム１２１のインスタンスは共通化されない。
【００４２】
なお、通常モードはコンパイラ１３の本来の機能である。従って、モードが指定されない場合、又は、プロファイル機能組み込みモード及びインスタンス共通化モードが指定されない場合には、通常モードでのコンパイルが実行されるようにしても良い。
【００４３】
図２は、コンパイラによるテンプレートコンパイル処理の説明図であり、特に、プロファイル機能付加モードにおけるコンパイル処理の一例を示す。
【００４４】
プロファイル機能付加モードは、コンパイラ１３に、プロファイル機能付加モードでのコンパイルを指示する命令である。プロファイル機能付加モードにおいて、コンパイルの対象であるソースプログラム１２が指定される。
【００４５】
ソースプログラム１２は、複数のサブソースプログラム１２１を含む。サブソースプログラム１２１は、大きな１個のソースプログラム１２の一部であり、例えば開発上の理由から別々に開発される。このため、サブソースプログラム１２１は、各々が独立にコンパイルされる。換言すれば、サブソースプログラム１２１は、コンパイルの単位である。
【００４６】
サブソースプログラム１２１は、各々、テンプレート１２２を含む。これは、サブソースプログラム１２１が別々に開発されるためである。複数のテンプレート１２２は、同一の関数定義に具現化されたコードを生成する場合もあれば、生成しない場合もある。換言すれば、複数のテンプレート１２２が、同一の関数定義に具現化されたコードを生成するか否かは、ソースプログラム１２をコンパイルするまで知ることができない。各々のテンプレート１２２は、関数定義コードの列、換言すれば、関数定義コードの集合を生成させる関数テンプレートである。
【００４７】
プロファイル機能付加モードが指定されると、コンパイラ１３のプロファイル処理部１４が、指定されたソースプログラム１２を格納部１１から読み出してコンパイルすることにより、オブジェクトプログラム１７を生成する。オブジェクトプログラム１７はコンパイルの結果である。
【００４８】
オブジェクトプログラム１７は、複数のサブオブジェクトプログラム１７１を含む。サブオブジェクトプログラム１７１は、大きな１個のオブジェクトプログラム１７の一部であり、サブソースプログラム１２１が独立にコンパイルされるために、コンパイルの単位毎に生成される。従って、サブオブジェクトプログラム１７１は、サブソースプログラム１２１に対応して生成される。
【００４９】
サブオブジェクトプログラム１７１は、各々、関数定義部分１７３を含む。関数定義部分１７３は、テンプレート１２２に対応して、１又は複数生成される。関数定義部分１７３は、テンプレート１２２及び型パラメータの指定に基づいて生成された、複数の関数定義コードの列、換言すれば、関数定義コードの集合である。なお、この時点での関数定義部分１７３は、共通化されていない。また、１個のサブオブジェクトプログラム１７１に含まれる関数定義部分１７３の数は、１個には限られない。
【００５０】
サブオブジェクトプログラム１７１は、各々、１個のプロファイルデータ生成部１７２を含む。プロファイルデータ生成部１７２は、本来、ソースプログラム１２には存在しないコードであり、プロファイル処理部１４により、サブオブジェクトプログラム１７１に付加されたコードである。
【００５１】
ここで、関数定義部分１７３は、プロファイル機能付加モードでのコンパイルのみならず通常モードでのコンパイルにおいても、テンプレート１２２及び型パラメータの指定に基づいて生成される。従って、プロファイル処理部１４は、通常モードでのコンパイル処理を実行すると共に、プロファイルデータ生成部１７２を付加する処理を実行する。
【００５２】
オブジェクトプログラム１７は、例えば、コンピュータ２に入力されコンピュータ２により実行される。コンピュータ２は、例えばオペレータにより入力された指示に従って、オブジェクトプログラム１７をコンピュータ１の格納部１１から読み出して実行する。この実行により、プロファイルデータ１８が得られる。この場合、格納部１１は、実際には、コンピュータ１とコンピュータ２とが共有する記憶手段である。従って、プロファイルデータ１８も、格納部１１に格納される。なお、コンピュータ２は、コンパイルを実行したコンピュータ１であっても良い。
【００５３】
オブジェクトプログラム１７の実行により、各々のサブオブジェクトプログラム１７１に付加されたプロファイルデータ生成部１７２も実行される。これにより、プロファイルデータ１８が得られる。前述したように、サブオブジェクトプログラム１７１はサブソースプログラム１２１に対応する。従って、プロファイルデータ生成部１７２は、自己の属するサブオブジェクトプログラム１７１の対応するサブソースプログラム１２１のテンプレート１２２について、プロファイルデータ１８を生成する。換言すれば、プロファイルデータ生成部１７２は、テンプレート１２２及び型パラメータの指定に基づいて関数定義部分１７３が生成される都度に、プロファイルデータ１８を生成する。生成されたプロファイルデータ１８は、１個のソースプログラム１２についての１個のプロファイルデータ１８とされる。
【００５４】
プロファイルデータ１８は重要度情報である。重要度情報は、オブジェクトプログラム１７の全体の実行性能における、各関数定義部分１７３の実行性能が占める重要性を示す指標である。換言すれば、プロファイルデータ１８は、オブジェクトプログラム１７におけるテンプレート１２２又はテンプレート１２２のインスタンスの重要度を示す。
【００５５】
プロファイルデータ１８としては、例えば、テンプレート１２２に基づいて生成される関数定義部分１７３の実行の頻度を示すデータが用いられる。具体的には、オブジェクトプログラム１７の全体におけるその関数定義部分１７３の実行回数、換言すれば、呼出回数が用いられる。プロファイルデータ１８として、オブジェクトプログラム１７の全体における各関数定義部分１７３の実行時間を用いるようにしても良い。
【００５６】
なお、プロファイルデータ１８は、ソースプログラム１２のコンパイルにより生成したオブジェクトプログラム１７の実行以外の手段により、得るようにしても良い。例えば、オペレータが類似のソースプログラムの設計から経験的に得たデータを、プロファイルデータ１８として格納部１１に格納するようにしても良い。換言すれば、プロファイルデータ１８は、インスタンス共通化モードにおけるコンパイル処理に先立って得ることができる重要度情報であれば良い。
【００５７】
プロファイル機能付加モードにおけるコンパイル処理は、インスタンス共通化モードにおけるコンパイル処理を最適に実行するために十分なプロファイルデータ１８が得られるまで、繰り返し実行される。例えば、プロファイル機能付加モードにおけるコンパイル処理は、１回〜数１００回実行される。これに対して、インスタンス共通化モードにおけるコンパイル処理は、例えば１回実行されるのみである。
【００５８】
図３は、コンパイラによるテンプレートコンパイル処理の説明図であり、特に、インスタンス共通化モードにおけるコンパイル処理の一例を示す。
【００５９】
インスタンス共通化モードは、コンパイラ１３に、インスタンス共通化モードでのコンパイルを指示する命令である。インスタンス共通化モードにおいて、コンパイルの対象であるソースプログラム１２が指定される。また、インスタンス共通化モードにおいて、指定されたソースプログラム１２についてのプロファイルデータ１８が読み出され、ソースプログラム１２と共に、コンパイルに用いられる。
【００６０】
インスタンス共通化モードが指定されると、コンパイラ１３の共通化処理部１５が、指定されたソースプログラム１２を格納部１１から読み出してコンパイルすることにより、オブジェクトプログラム１７を生成する。前述したように、サブソースプログラム１２１が独立にコンパイルされるために、オブジェクトプログラム１７は、複数のサブオブジェクトプログラム１７１を含む。
【００６１】
複数のサブオブジェクトプログラム１７１は、例えば、図３に示すように、複数の関数定義部分１７３に代えて、複数のサブオブジェクトプログラム１７１に共通の１個の共通化関数定義部分１７４を含む。共通化関数定義部分１７４は、複数のテンプレート１２２に対応して、１又は複数生成される。共通化関数定義部分１７４は、テンプレート１２２及び型パラメータの指定に基づいて生成された、複数の関数定義コードの列、換言すれば、関数定義コードの集合である。
【００６２】
なお、共通化関数定義部分１７４の数は、１個には限られない。また、複数のサブオブジェクトプログラム１７１の関数定義部分１７３を全て共通化する必要はない。従って、実際には、１個のオブジェクトプログラム１７には、共通化関数定義部分１７４と、関数定義部分１７３とが混在する。この場合、共通化関数定義部分１７４の数は１個には限られず、関数定義部分１７３の数も１個には限られない。
【００６３】
１個のオブジェクトプログラム１７において、共通化関数定義部分１７４及び関数定義部分１７３がどのように存在するかは、インスタンス共通化モードでのコンパイル処理に依存する。このために、前述したように、プロファイル機能付加モードにおけるコンパイル処理を例えば数１００回実行して十分なプロファイルデータ１８を得ることにより、オブジェクトプログラム１７が最適化される。
【００６４】
前述したように、複数のサブオブジェクトプログラム１７１の関数定義部分１７３を全て共通化する必要はない。換言すれば、共通化によりオブジェクトプログラム１７の処理性能が低下する場合には、関数定義部分１７３は共通化されない。
【００６５】
共通化による処理性能の低下を回避するために、プロファイルデータ１８が用いられる。換言すれば、プロファイルデータ１８に基づいて、共通化される関数定義部分１７３と、共通化されない関数定義部分１７３とが決定される。プロファイルデータ１８としては、例えば、後述するように、実行回数が用いられる。
【００６６】
例えば、実行回数又は頻度が少ないテンプレート１２２のインスタンス、換言すれば、関数は、共通化される。これにより、オブジェクトプログラム１７のサイズ、換言すれば、コードの数を大幅に少なくすることができ、一方、実行速度が大きく低下することは無い。また、実行回数が多いテンプレート１２２は、共通化されない。これにより、オブジェクトプログラム１７のサイズは減少しないが、実行速度の低下も無い。このように、複数の関数定義部分１７３を共通化した共通化関数定義部分１７４と、複数の関数定義部分１７３とを混在させることにより、オブジェクトプログラム１７のサイズを大幅に小さくすることができ、かつ、実行速度が大きく低下することを回避することができる。従って、実際には、オブジェクトプログラム１７は、少なくとも１個の共通化関数定義部分１７４と、少なくとも１個の関数定義部分１７３とを含む。
【００６７】
なお、図３におけるサブオブジェクトプログラム１７１は、プロファイルデータ生成部１７２を含まない。換言すれば、インスタンス共通化モードでのコンパイル処理においては、プロファイルデータ生成部１７２を付加する処理は実行されない。
【００６８】
オブジェクトプログラム１７は、例えば、コンピュータ２に入力されコンピュータ２により実行される。このオブジェクトプログラム１７は、関数定義部分１７３に代えて共通化関数定義部分１７４を含むので、処理速度が高速であり、かつ、小さいサイズを有する。
【００６９】
図２及び図３とは異なり、通常モードは、コンパイラ１３に、通常モードでのコンパイルを指示する命令である。通常モードにおいて、コンパイルの対象であるソースプログラム１２が指定される。
【００７０】
通常モードが指定されると、コンパイラ１３の通常処理部１６が、指定されたソースプログラム１２を格納部１１から読み出してコンパイルすることにより、オブジェクトプログラム１７を生成する。前述したように、サブソースプログラム１２１が独立にコンパイルされるために、オブジェクトプログラム１７は、複数のサブオブジェクトプログラム１７１を含む。
【００７１】
通常モードの場合、サブオブジェクトプログラム１７１は、複数の関数定義部分１７３を含む。換言すれば、通常モードにおいては、関数定義部分１７３は共通化されない。従って、通常モードのコンパイルにより得られたオブジェクトプログラム１７は、例えば、図２において、各々のサブオブジェクトプログラム１７１におけるプロファイルデータ生成部１７２を省略したものと等しい。
【００７２】
次に、図１〜図３のテンプレートコンパイル処理の一例について、図４〜図８を参照して詳細に説明する。
【００７３】
コンパイラ１３は、前述したように、図４に示すデータ構造を有するプロファイルデータ生成部１７２をサブオブジェクトプログラム１７１に追加することにより、図５に示すプロファイルデータ１８を生成する。更に、コンパイラ１３は、図６に示す基準により共通化の判定処理を実行して、共通化するテンプレート１２２のインスタンス、換言すれば、関数定義部分１７３を決定する。なお、共通化するインスタンスは中間コードの時点で決定されるので、決定の時点では、実際には、関数定義部分１７３は生成されていない。従って、共通化される関数定義部分１７３は、厳密には、共通化するインスタンスであり、共通化されなければ関数定義部分１７３となる部分である。
【００７４】
この後、コンパイラ１３は、ソースプログラム１２を、図７に示すように書き換えた後にコンパイルして、図８に示すオブジェクトプログラム１７を得る。なお、実際には、ソースプログラム１２ではなく、ソースプログラムから生成された中間コードが書き換えられる。
【００７５】
図４は、プロファイルデータ生成部のデータ構造の説明図である。
【００７６】
コンパイラ１３は、プロファイル処理部１４において、各々のサブオブジェクトプログラム１７１に、図４に示すデータ構造を有するプロファイルデータ生成部１７２を追加する。これにより、例えば図２０に示すオブジェクトプログラム６００に図４に示すプロファイルデータ生成部１７２を追加したサブオブジェクトプログラム１７１が得られる。サブオブジェクトプログラム１７１においてプロファイルデータ生成部１７２が追加される位置は、コンパイラ１３に依存する。
【００７７】
プロファイルデータ生成部１７２は、例えば、テンプレート１２２に基づいて定義される関数の実行回数を記録する。具体的には、１つの関数名に対して、その実行回数がカウントされる。この処理は、プロファイルデータ生成部１７２の第１行〜第５行の命令により実行される。また、プロファイルデータ生成部１７２は、例えば、前記関数名を有する１群の関数について、その実行回数の合計を記録する。この処理は、プロファイルデータ生成部１７２の第６行〜第９行の命令により実行される。
【００７８】
具体的には、コンパイラ１３は、プロファイルデータ生成部１７２として、具現化されたテンプレート、換言すれば、関数定義部分１７３となる部分毎に、カウンタ領域を設ける命令「char*function name」を追加する。これにより、カウンタ領域は、サブオブジェクトプログラム１７１の実行時において、サブオブジェクトプログラム１７１が使用するデータ領域内に設けられ、「０」に初期化される。
【００７９】
また、コンパイラ１３は、プロファイルデータ生成部１７２として、関数定義部分１７３となる部分の入口に、カウンタ領域の値を「＋１」だけ増加させる命令「long long exec count」を追加する。これにより、関数定義部分１７３が実行されると、その都度、対応するカウンタ領域の値が「＋１」される。
【００８０】
また、コンパイラ１３は、プロファイルデータ生成部１７２として、全てのサブオブジェクトプログラム１７１の全てのカウンタ領域の値を、テーブル形式のプロファイルデータ１８のファイルとして、オブジェクトプログラム１７の実行終了時に、出力する命令を追加する。この命令は、プロファイルデータ生成部１７２の第７行〜第８行に示される。これにより、テンプレート１２２の重要度情報として、テンプレート１２２のインスタンス、換言すれば、関数定義部分１７３の実行回数を得ることができる。具体的には、１個のオブジェクトプログラム１７について、１個のプロファイルデータ１８のファイルが得られる。
【００８１】
以上により、プロファイルデータ生成部１７２が付加された複数のサブオブジェクトプログラム１７１をオブジェクトプログラム１７が、コンピュータ２により実行される。これにより、オブジェクトプログラム１７についてのプロファイルデータ１８が、格納部１１に得られる。
【００８２】
更に、コンパイラ１３は、インスタンス共通化モードでのコンパイルにおいて、生成されたプロファイルデータ１８を読み出して、読み出したプロファイルデータ１８に基づいて、テンプレート１２２から具現化されたインスタンスを、その重要度順にソートする。これにより、図５に示すソートの結果としての実行回数テーブル１８１が得られる。この後、コンパイラ１３は、実行回数テーブル１８１に基づいて、図６に示すように、割合テーブル１８２を生成する。更に、コンパイラ１３は、実行回数テーブル１８１及び割合テーブル１８２に基づいて、テンプレート１２２のインスタンスを、共通化関数定義部分１７４とするか、独立関数定義部分１７３とするかを決定する。独立関数定義部分１７３は関数定義部分１７３と同一である。
【００８３】
なお、実行回数テーブル１８１及び割合テーブル１８２の生成処理は、インスタンス共通化モードでのコンパイルにおいて実行されるが、オブジェクトプログラム１７がコンピュータ２により実行された後に実行するようにしても良い。実行回数テーブル１８１及び割合テーブル１８２は、プロファイルデータ１８であると考えて良い。
【００８４】
図５は、プロファイルデータ及びプロファイルデータによる共通化対象の判定の説明図である。
【００８５】
プロファイルデータ１８として、前述したように、例えばテンプレート１２２のインスタンスの実行回数を格納するテーブル形式のプロファイルデータ１８のファイルが得られる。コンパイラ１３の共通化処理部１５は、テーブル形式のプロファイルデータ１８のファイルを格納部１１から読み出して、読み出したテーブル形式のプロファイルデータ１８のファイルについて、実行回数の多い順にソートする。これにより、図５に示す実行回数テーブル１８１が得られる。従って、実行回数テーブル１８１は、テンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報である。ここで、重要度は実行回数である。
【００８６】
なお、テーブル形式のプロファイルデータ１８のファイルは、実行回数の順にソートされていない。また、実行回数テーブル１８１において、テンプレート１２２のインスタンスの他に、一般の関数の実行回数も格納されている。
【００８７】
図５において、例えば、テンプレート 「get_id」 のインスタンスの内、「get_id<X>」 の実行回数は、このソースプログラム１２の中で最も多く実行された関数 ｆｕｎｃ１ の実行回数の７割以上に相当する。一方、「get_id<A>」の実行回数及び「get_id<B>」 の実行回数は、各々、関数 ｆｕｎｃ１ の実行回数の１万分の１未満である。
【００８８】
そこで、例えば、閾値を、当該ソースプログラム１２中で最も多く実行される関数の実行回数の１００分の１とする。閾値は、経験的に定めることができ、コンパイラ１３の共通化処理部１５が予め保持する。コンパイラ１３の共通化処理部１５は、共通化インスタンスの対象を、実行回数が閾値未満であるインスタンスとする。この場合、「get_id<A>」 と「get_id<B>」は共通化インスタンスの対象となるが、「get_id<X>」は共通化インスタンスの対象とならない。
【００８９】
以上に加えて、コンパイラ１３の共通化処理部１５は、テンプレート１２２を解析し、図６の割合テーブル１８２に示すように、テンプレート１２２の中間コードの中で、型パラメータに依存する中間コードがそのテンプレート１２２の全体に占める割合を求める。これは、以下の理由による。
【００９０】
例えば、型パラメータに依存する中間コード（以下、依存部分ともいう）の割合がある量を越えると、依存部分の切り分け処理の追加によるサイズの増加が、共通化によるサイズ削減を上回るようになる。換言すれば、重要度の高い、又は、実行回数の多いインスタンスを共通化すると、依存部分を切り分ける処理の追加による実行性能の悪化が無視できなくなる。
【００９１】
図６は、型パラメータに依存する処理の割合による共通化の判定の説明図である。
【００９２】
コンパイラ１３による構文解析と中間コード生成の結果、テンプレート１２２毎に、そのテンプレート１２２から生成された中間コードの行数Ａと、その中間コードの中で型パラメータに依存する処理の行数Ｂが求まる。これにより、そのテンプレート１２２における、型パラメータに依存する処理の割合Ｂ／Ａが求まる。換言すれば、図６に示す割合テーブル１８２が得られる。従って、割合テーブル１８２は、テンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報である。ここで、重要度は型パラメータに依存する処理の割合Ｂ／Ａである。
【００９３】
例えば、図６において、テンプレート「get_id 」では、型パラメータに依存する処理の割合は、中間コードの５割である。これに対して、テンプレート「id_distinct」では、型パラメータに依存する処理の割合は、３％未満である。
【００９４】
そこで、例えば、閾値を５％とする。換言すれば、型パラメータに依存する処理の割合が５％以上の場合に、そのテンプレートを共通化することとする。閾値は、経験的に定めることができ、コンパイラ１３の共通化処理部１５が予め保持する。コンパイラ１３の共通化処理部１５は、テンプレート「get_id」は共通化の対象とするが、テンプレート「id_distinct」は共通化の対象としない。
【００９５】
以上の例では、コンパイラ１３の共通化処理部１５は、まず、図５に示す実行回数テーブル１８１に基づいて、共通化インスタンスの対象となる「get_id<A>」 と「get_id<B>」を選択する。この後、コンパイラ１３の共通化処理部１５は、選択した「get_id<A>」 と「get_id<B>」について、更に、図６に示す割合テーブル１８２に基づいて、共通化インスタンスの対象となるか否かを判定する。これにより、以上の例では、最終的に、「get_id<A>」 と「get_id<B>」が共通化インスタンスの対象と判断される。
【００９６】
図７は、テンプレートコンパイル処理の説明図であり、特に、変換されたソースプログラムを示す。
【００９７】
コンパイラ１３は、共通化処理部１５において、共通化すると判断されたテンプレート１２２を共通化するように、当該テンプレート１２２の中間コードを生成する。具体的には、テンプレート１２２が共通化の対象であるような場合に、テンプレート１２２のソースコードを、以下のような中間コードに変換する。
【００９８】
具体的には、コンパイラ１３の共通化処理部１５は、図１９に示すソースプログラム１２を読み込む。図１９に示すソースプログラム１２において、前述したように、テンプレート１２２は、最初の８行であり、残りの複数の行はテンプレート１２２に型パラメータ＜ｓｔｒｕｃｔ  Ａ＞と型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞とを与える部分である。
【００９９】
テンプレート１２２において、処理＃１は、型パラメータＴ及びａに関する情報を参照しない、換言すれば、依存しないが、数１０００行のコードを含む長い処理である。また、処理＃２は、処理＃１とは異なる処理であって、型パラメータＴ及びａに関する情報を参照しない、換言すれば、依存しないが、数１０００行のコードを含む長い処理である。処理＃１及び処理＃２の各々が、関数定義部分１７３又は共通化関数定義部分１７４となる部分である。
【０１００】
この後、コンパイラ１３の共通化処理部１５は、読み込んだ図１９に示すソースプログラム１２のテンプレート１２２における「ｉｎｔ  ｉｄ；」及び「ｉｄ＝ａ−＞ｉｄ；」の２行を、図７における第２行〜第７行に示す部分＃１２２に変換する。換言すれば、メンバｉｄへの処理を記述する行が、メンバｉｄへの処理を型によって別ける処理となるように、書き換えられる。これにより、テンプレート１２２により定まるコードを含むソースコード＃１２１が得られる。
【０１０１】
部分＃１２２は、メンバｉｄへの処理を型によって別ける処理である。換言すれば、部分＃１２２により、ＴがＡならば第４行の処理が実行され、ＴがＡ以外（即ち、Ｂ）ならば第６行の処理が実行される。
【０１０２】
なお、図７は、変換後の中間コードの集合である中間プログラム１２’を、ソースコードの集合であるソースプログラム１２における概念として表したものである。
【０１０３】
部分＃１２２への変換のために、コンパイラ１３の共通化処理部１５は、型パラメータＴに関する処理を検出し、それをＰとする。例えば、sizeof (T) 式のように型Ｔそのものの性質を問う処理や、型がＴやＴの派生型であるような変数やパラメータに関する処理などが検出される。そして、コンパイラ１３は、検出した処理に対して、この処理と、型パラメータＴに対して共通化の対象となる具現化された型Ｔ１、Ｔ２、・・・Ｔｎとを比較する条件式を追加する。追加された条件式は、図７の第３行及び第５行に示される。
【０１０４】
また、コンパイラ１３の共通化処理部１５は、型Ｔ１、Ｔ２、・・・Ｔｎに応じて、ＰをＰ１、Ｐ２、・・・Ｐｎとして具現化し、各条件式のthen節に挿入する。挿入されたＰは、図７の第４行のthen以下、及び、第６行のthen以下に示される。第４行の処理は、型Ａに対して具現化された処理である。第６行の処理は、型Ｂに対して具現化された処理である。
【０１０５】
図７においては、テンプレート１２２に型パラメータ＜ｓｔｒｕｃｔ  Ａ＞と型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞とを与える部分が、同一のサブソースプログラム１２１に存在する。しかし、テンプレート１２２に型パラメータ＜ｓｔｒｕｃｔ  Ａ＞と型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞とを与える部分が、異なるサブソースプログラム１２１に存在しても良い。換言すれば、あるサブソースプログラム１２１にテンプレート１２２及び型パラメータ＜ｓｔｒｕｃｔ  Ａ＞を与える部分が存在し、他のサブソースプログラム１２１に同一のテンプレート１２２及び型パラメータ＜ｓｔｒｕｃｔ  Ｂ＞を与える部分が存在しても良い。
【０１０６】
これは、以下の理由による。前述したように、複数のサブソースプログラム１２１は個々にコンパイルされるが、１個のオブジェクトプログラム１７について、１個のプロファイルデータ１８としての実行回数テーブル１８１が得られる。また、複数のサブオブジェクトプログラム１７１において、その部分を共通化することはできないが、同一のオブジェクトプログラム１７であることは知ることができるので、１個のプロファイルデータ１８としての割合テーブル１８２を得ることができる。
【０１０７】
図８は、テンプレートコンパイル処理における共通化インスタンスを含むオブジェクトプログラムの一例を示す。
【０１０８】
コンパイラ１３は、共通化処理部１５において、共通化されたインスタンス、換言すれば、共通化関数定義部分１７４が存在する場合、部分＃１７１に示すように、元となるインスタンスの全てのラベル、例えば「Ａ」及び「Ｂ」を追加する。ラベルは、前述した、型Ｔ１、Ｔ２、・・・Ｔｎに応じて具現化されたＰ１、Ｐ２、・・・Ｐｎである。これにより、コンパイル単位が異なっていても、換言すれば、共通化関数定義部分１７４を含むサブオブジェクトプログラム１７１が、共通化されたことを認識しなくても、当該共通化関数定義部分１７４を実行することができる。
【０１０９】
また、コンパイラ１３の共通化処理部１５は、前述した追加された条件式に従って、部分＃１７２、部分＃１７３、部分＃１７４を生成する。なお、図８に示すオブジェクトプログラム１７は、図２０に示すオブジェクトプログラム６００と、各々に含まれるコードが少し異なるが、同一の処理を実行する。各々に含まれるコードが少し異なる理由は、前述したように、ソースプログラム１２を図７に示すように書き換えたことに起因する。
【０１１０】
数１０００行の長い処理である処理＃１及び処理＃２は、部分＃１７４において、各々、１回出現するだけであり、重複していない。これにより、オブジェクトプログラム１７のサイズを小さくすることができる。
【０１１１】
前述したように、処理＃１は、型パラメータＴ及びａに依存しないが、数１０００行のコードを含む長い処理である。処理＃２は、処理＃１とは異なる処理であって、型パラメータＴ及びａに依存しないが、数１０００行のコードを含む長い処理である。処理＃１及び処理＃２の各々が、共通化関数定義部分１７４である。従って、図８に示すオブジェクトプログラム１７は、処理＃１を実行する第１の共通化関数定義部分１７４と、処理＃２を実行する第２の共通化関数定義部分１７４とを含む。
【０１１２】
図８に示すオブジェクトプログラム１７は、図２０に示すオブジェクトプログラム６００よりも長いように見受けられる。しかし、前述したように、処理＃１及び処理＃２の各々は、数１０００行のコードを含む。従って、処理＃１及び処理＃２の各々を１回しか含まない図８に示すオブジェクトプログラム１７は、処理＃１及び処理＃２の各々を２回含む図２０に示すオブジェクトプログラム６００よりも極めて短い。
【０１１３】
なお、テンプレート１２２が共通化の対象であっても、具現化の対象となった型が共通化するインスタンスとして具現化する対象でなければ、独立のインスタンスとして具現化する。
【０１１４】
図８においては、例えば、共通化関数定義部分１７４である処理＃１が、あるサブオブジェクトプログラム１７１に存在する。しかし、あるサブオブジェクトプログラム１７１に存在する共通化関数定義部分１７４である処理＃１は、他のサブオブジェクトプログラム１７１からも実行することができる。これは、前述したように、元となるインスタンスの全てのラベル、例えば「Ａ」及び「Ｂ」を部分＃１７１に保持しているためである。
【０１１５】
次に、図１〜図３のテンプレートコンパイル処理について、図９〜図１４を参照して説明する。
【０１１６】
図９は、テンプレートコンパイル処理のフローチャートである。
【０１１７】
コンパイルの実行に先立って、オペレータが、コンパイラ１３に対して、プロファイルデータ１８を取得するために、コンパイラ１３の動作モードをプロファイル機能付加モード、換言すれば、プロファイル機能組み込みモードに設定し、ソースプログラム１２を指定して、コンパイルの実行を指示する。なお、プロファイル機能付加モードを指定することにより、プロファイル機能組み込みモード及びインスタンス共通化モードの双方が指定されるようにしても良い。
【０１１８】
コンパイラ１３は、プロファイル機能付加モードが指定されているか否かを判断する（ステップＳ１）。プロファイル機能付加モードが指定されている場合（ステップＳ１  ＹＥＳ）、コンパイラ１３は、プロファイル処理部１４により、プロファイル機能組み込みモードでソースプログラム１２をコンパイルして（ステップＳ２）、オブジェクトプログラム１７を生成する。
【０１１９】
なお、ステップＳ１において、コンパイラ１３は、実際には、何らかのモードが指定されているか、換言すれば、プロファイル機能付加モード又はインスタンス共通化モードが指定されているか否かを判断する。
【０１２０】
ステップＳ２の後、コンピュータ２が、生成されたオブジェクトプログラム１７を実行すると、プロファイルデータ１８が得られる（ステップＳ３）。
【０１２１】
この後、オペレータは、プロファイルデータ１８を参照して、十分なプロファイルデータ１８が取得できたか否かを判断する（ステップＳ４）。十分なプロファイルデータ１８が取得できない場合（ステップＳ４  ＮＯ）、ステップＳ３を繰り返す。十分なプロファイルデータ１８が取得できた場合（ステップＳ４  ＹＥＳ）、オペレータが、コンパイラ１３に対して、コンパイラ１３の動作モードをインスタンス共通化モードに設定し、ソースプログラム１２を指定して、コンパイルの実行を指示する。
【０１２２】
なお、ステップＳ３の繰り返しの回数を予めコンパイラ１３に与え、コンパイラ１３が当該繰り返しの回数だけステップＳ３を実行し、ステップＳ４において、当該繰り返しの回数の分の実行が終了したかを否かを判断するようにしても良い。この場合、更に、コンパイラ１３の動作モードが、当該繰り返しの回数だけステップＳ３を実行した後に、プロファイル機能付加モードからインスタンス共通化モードに切り替わるようにしても良い。
【０１２３】
コンパイラ１３は、インスタンス共通化モードが指定されているか否かを判断する（ステップＳ５）。インスタンス共通化モードが指定されている場合（ステップＳ５  ＹＥＳ）、コンパイラ１３は、共通化処理部１５により、プロファイルデータ１８を読み出して、これを用いてインスタンス共通化モードでソースプログラム１２をコンパイルして（ステップＳ６）、オブジェクトプログラム１７を生成する。
【０１２４】
インスタンス共通化モードが指定されていない場合（ステップＳ５  ＮＯ）、コンパイラ１３は、通常処理部１６により、通常モードでソースプログラム１２をコンパイルして（ステップＳ７）、オブジェクトプログラム１７を生成する。
【０１２５】
ステップＳ１において、プロファイル機能付加モードが指定されていない場合（ステップＳ１  ＮＯ）、コンパイラ１３は、ステップＳ７を実行する。
【０１２６】
図１０は、プロファイル機能付加モードにおけるコンパイル処理のフローチャートである。
【０１２７】
コンパイラ１３は、ソースプログラム１２のファイルであるソースファイルを格納部１１から読み出し（ステップＳ１１）、読み出したソースプログラム１２の構文を解析して（ステップＳ１２）、解析の結果に基づいてソースコードを中間コードに変換することにより中間コードのファイルを生成する（ステップＳ１３）。
【０１２８】
この後、コンパイラ１３は、生成した中間コードのファイルに、プロファイル生成コード、換言すれば、プロファイルデータ生成部１７２となる中間コードを挿入する（ステップＳ１４）。
【０１２９】
この後、コンパイラ１３は、中間コードを最適化した後に（ステップＳ１５）、中間コードをオブジェクトコードに変換することによりオブジェクトプログラム１７を生成して（ステップＳ１６）、生成したオブジェクトプログラム１７を出力する（ステップＳ１７）。
【０１３０】
図１１は、インスタンス共通化モードにおけるコンパイル処理のフローチャートである。
【０１３１】
コンパイラ１３に、ソースプログラム１２のファイルであるソースファイルを格納１１から読み出し（ステップＳ２１）、プロファイルデータ１８のファイルであるプロファイル履歴ファイルを格納１１から読み出す（ステップＳ２２）。
【０１３２】
この後、コンパイラ１３は、読み出したプロファイルデータ１８を解析する（ステップＳ２３）。これにより、図５に示す実行回数テーブル１８１が生成される。プロファイルデータ１８の解析処理については、図１２を参照して後述する。
【０１３３】
この後、コンパイラ１３は、読み出したソースプログラム１２の構文を解析する（ステップＳ２４）。これにより、図６に示す割合テーブル１８２が生成される。コンパイラ１３は、構文の解析の結果、換言すれば、割合テーブル１８２に基づいて、ソースコードを中間コードに変換することにより、中間コードのファイルを生成する（ステップＳ２５）。
【０１３４】
この後、コンパイラ１３は、テンプレート１２２のインスタンス、換言すれば、関数定義部分１７３に相当する部分を、プロファイルデータ１８の解析の結果、換言すれば、実行回数テーブル１８１に基づいて、共通化するか否かを判断する（ステップＳ２６）。共通化の判断処理については、図１３を参照して後述する。
【０１３５】
この後、コンパイラ１３は、共通化すると判断した、テンプレート１２２のインスタンス、換言すれば、関数定義部分１７３に相当する部分を、共通化する（ステップＳ２７）。インスタンスの共通化処理については、図１４を参照して後述する。
【０１３６】
この後、コンパイラ１３は、中間コードを最適化した後に（ステップＳ２８）、中間コードをオブジェクトコードに変換することによりオブジェクトプログラム１７を生成して（ステップＳ２９）、生成したオブジェクトプログラム１７を出力する（ステップＳ２１０）。
【０１３７】
図１２は、プロファイル解析処理の詳細のフローチャートである。
【０１３８】
コンパイラ１３は、プロファイルデータ１８のファイルであるプロファイル履歴ファイルを格納部１１から読み出す（ステップＳ３１）。更に、コンパイラ１３は、実行回数テーブル１８１を生成する（ステップＳ３２）。実行回数テーブル１８１は、プロファイルデータ１８において記述されたテンプレート１２２に基づいて生成される関数定義部分１７３の数だけの欄を持つ。これらの欄は生成時には空である。この後、コンパイラ１３は、読み込んだプロファイルデータ１８から、テンプレート１２２に基づいて生成される関数定義部分１７３の実行回数を読み出し、読み出した実行回数を、実行回数テーブル１８１に記入する（ステップＳ３３）。これにより、実行回数テーブル１８１が得られる。
【０１３９】
図１３は、テンプレートインスタンス共通化判定準備処理のフローチャートである。
【０１４０】
コンパイラ１３は、ステップＳ２３において作成した実行回数テーブル１８１から、同一の関数名を持つテンプレート１２２のインスタンス、換言すれば、関数定義部分１７３についてだけ、その実行回数データを抜き出して、抽出テーブルを作成する（ステップＳ４１）。更に、コンパイラ１３は、作成した抽出テーブルを、インスタンスの実行回数の多い順にソートする（ステップＳ４２）。この後、コンパイラ１３は、予め定められた閾値より少ない実行回数を持つインスタンス、換言すれば、関数定義部分１７３を生成したテンプレート１２２を共通化の対象としてマークする（ステップＳ４３）。マークは、例えばテンプレート１２２の中間コードの入り口において後述する入り口ラベルの次に付加される。これにより、共通化処理の対象となるインスタンス、換言すれば、テンプレート１２２が決定される。
【０１４１】
図１４は、テンプレートインスタンス共通化処理のフローチャートである。
【０１４２】
コンパイラ１３は、ソースプログラム１２の先頭から順に１個のテンプレート１２２を取り出して、当該テンプレート１２２が共通化インスタンス生成済みとしてマークされているか否かを判断する（ステップＳ５１）。テンプレート１２２が共通化インスタンス生成済みとしてマークされている場合（ステップＳ５１  ＹＥＳ）、コンパイラ１３は、そのテンプレート１２２についての処理を終了する。
【０１４３】
テンプレート１２２が共通化インスタンス生成済みとしてマークされていない場合（ステップＳ５１  ＮＯ）、コンパイラ１３は、テンプレート１２２のインスタンス、換言すれば、テンプレート１２２が共通化の対象としてマークされているか否かを判断する（ステップＳ５２）。
【０１４４】
テンプレート１２２が共通化の対象としてマークされている場合（ステップＳ５２  ＹＥＳ）、コンパイラ１３は、テンプレート１２２の中間コードのうち、型パラメータに依存する中間コードの割合が予め定めた基準より少ないか否かを判断する（ステップＳ５３）。
【０１４５】
型パラメータに依存する中間コードの割合が予め定めた基準よりも少ない場合（ステップＳ５３  ＹＥＳ）、コンパイラ１３は、テンプレート１２２の中間コードの型パラメータに依存する中間コードについて、当該型パラメータに依存する処理を挿入する（ステップＳ５４）。この後、コンパイラ１３は、更に、テンプレート１２２の、共通化の対象としてマークされたインスタンスの全ての入口ラベルを、インスタンスの先頭に挿入し（ステップＳ５５）、テンプレート１２２を共通化インスタンス生成済みとしてマークする（ステップＳ５６）。マークは、例えばテンプレート１２２の中間コードの入り口において前記入り口ラベルの次に付加される。
【０１４６】
ステップＳ５２において、テンプレート１２２のインスタンス、換言すれば、テンプレート１２２が共通化の対象としてマークされていない場合（ステップＳ５２  ＮＯ）、コンパイラ１３は、テンプレート１２２を、通常通りに具現化する（ステップＳ５７）。
【０１４７】
また、ステップＳ５３において、型パラメータに依存する中間コードの割合が予め定めた基準以上である場合（ステップＳ５３  ＮＯ）、コンパイラ１３は、ステップＳ５７を実行する。
【符号の説明】
【０１４８】
１    コンパイル処理装置
１１    格納部
１２    ソースプログラム
１３    コンパイラ
１４    プロファイル処理部
１５    共通化処理部
１６    通常処理部
１７    オブジェクトプログラム
１８    プロファイルデータ
１２１    サブソースプログラム
１２２    テンプレート
１７１    サブオブジェクトプログラム
１７２    プロファイルデータ生成部
１７３    関数定義部分
１７４    共通化関数定義部分
【図１】
2011203960.tif 000003
【図２】
2011203960.tif 000004
【図３】
2011203960.tif 000005
【図４】
2011203960.tif 000006
【図５】
2011203960.tif 000007
【図６】
2011203960.tif 000008
【図７】
2011203960.tif 000009
【図８】
2011203960.tif 000010
【図９】
2011203960.tif 000011
【図１０】
2011203960.tif 000012
【図１１】
2011203960.tif 000013
【図１２】
2011203960.tif 000014
【図１３】
2011203960.tif 000015
【図１４】
2011203960.tif 000016
【図１５】
2011203960.tif 000017
【図１６】
2011203960.tif 000018
【図１７】
2011203960.tif 000019
【図１８】
2011203960.tif 000020
【図１９】
2011203960.tif 000021
【図２０】
2011203960.tif 000022
【図２１】
2011203960.tif 000023