JP2011203960A - テンプレートコンパイル方法及びテンプレートコンパイル装置 - Google Patents

テンプレートコンパイル方法及びテンプレートコンパイル装置 Download PDF

Info

Publication number
JP2011203960A
JP2011203960A JP2010069971A JP2010069971A JP2011203960A JP 2011203960 A JP2011203960 A JP 2011203960A JP 2010069971 A JP2010069971 A JP 2010069971A JP 2010069971 A JP2010069971 A JP 2010069971A JP 2011203960 A JP2011203960 A JP 2011203960A
Authority
JP
Japan
Prior art keywords
function definition
template
compiler
common
sub
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2010069971A
Other languages
English (en)
Inventor
Manabu Matsuyama
学 松山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2010069971A priority Critical patent/JP2011203960A/ja
Publication of JP2011203960A publication Critical patent/JP2011203960A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】関数定義コードの集合である関数定義部分を、より多く共通化することが可能なテンプレートコンパイル方法を提供する。
【解決手段】テンプレート122に基づいて生成される関数定義部分の重要度を示すプロファイルデータ18が、格納部に格納される。コンパイラ13が、複数のサブソースプログラム121を独立にコンパイルすることにより生成される複数のサブオブジェクトプログラム171に含まれる関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分174とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分173とするかを、プロファイルデータ18に基づいて決定する。コンパイラ13が、前記決定に基づいて、共通化関数定義部分174又は独立関数定義部分173を含むオブジェクトプログラム17を生成する。
【選択図】図3

Description

本発明は、テンプレートコンパイル方法及びテンプレートコンパイル装置に関する。
テンプレートを持ち高級言語であるC++言語で記述されたソースプログラムを、オブジェクトプログラムに変換するコンパイル、換言すれば、テンプレートコンパイルが知られている。テンプレートは、アルゴリズムとデータの分離を図ることにより、プログラムの保守性と再利用性を高めるジェネリックプログラミングを可能にする技術である。
テンプレートコンパイルにおいては、テンプレートに与えられた型パラメータ毎に、テンプレートに基づいて関数定義部分、換言すれば、テンプレートのインスタンスが生成される。テンプレートに基づいて生成される関数定義部分は、テンプレートを具現化したオブジェクトコード、換言すれば、具現化オブジェクトである。このため、ソースプログラムにおいてテンプレートにおいて複数の型パラメータが与えられた場合には、生成されるオブジェクトプログラムのサイズが、全体として、増大する。
図15は、2個の型パラメータが与えられたテンプレートの一例を示す。図15のテンプレート#101は、ソースプログラム100に含まれる。図15のテンプレート#101においては、型パラメータ<int>と、型パラメータ<float>とが与えられている。型パラメータ<int>は整数型の演算を実行することを指示するパラメータであり、型パラメータ<float>は浮動小数点型の演算を実行することを指示するパラメータである。
なお、図15において、実際のテンプレートは最初の3行であり、残りの4行はテンプレートに型パラメータを与える部分である。従って、図15のテンプレート#101は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
図16は、与えられた型パラメータにより具現化されたインスタンスの一例を示す。図15のテンプレート#101を含むソースプログラム100がコンパイルされた結果として、図16のテンプレート#101のインスタンス、換言すれば、具現化されたオブジェクトプログラム200が得られる。図16のインスタンスにおいては、型パラメータ<int>に対応する関数定義部分#201と、型パラメータ<float>に対応する関数定義部分#202とが含まれる。関数定義部分は、複数の関数定義コードの列である。換言すれば、1個のテンプレート#101が、与えられた2個の型に応じて、2個の関数定義部分#201及び#202として具現化される。テンプレート#101の部分についてのコードのサイズが2倍になった結果、オブジェクトプログラム200のサイズも、全体として、例えば、ほぼ2倍に増加してしまう。
このようなオブジェクトプログラムのサイズの増加を防ぐため、テンプレートコンパイル方法において、テンプレートから生成される複数の関数定義コードのうち同一コードとなるものの関数定義コードの共通化を図って、テンプレート機構により増加するコードサイズを縮小することが提案されている。
テンプレートから生成されるインスタンスは、与えられた型パラメータが異なる場合でも、結果として、異なる関数定義コードとなるとは限らない。テンプレートにおける関数の内容と与えられる型パラメータによっては、同一の関数定義に具現化されたコードとなることがある。従って、異なる型パラメータに対して同一の関数定義に具現化されたコードが生成される場合には、当該同一の関数定義に具現化されたコードを1個の関数定義に具現化されたコードに置換することができる。
図17は、型パラメータに依存しないテンプレートの一例を示す。図17のテンプレート#301は、ソースプログラム300に含まれる。図17のテンプレート#301においては、型パラメータ<struct A>と型パラメータ<struct B>とが与えられている。例えば、型パラメータ<struct A>は名前Aのデータ構造を生成することを指示するパラメータである。
なお、図17において、実際のテンプレートは最初の3行であり、残りの複数の行はテンプレートに型パラメータを与える部分である。従って、図17のテンプレート#301は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
図18は、結果的に同一のコードに具現化されたインスタンスの一例を示す。図17のテンプレート#301を含むソースプログラム300がコンパイルされた結果として、図18のテンプレート#301のインスタンス、換言すれば、具現化されたオブジェクトプログラム400が得られる。図18のインスタンスにおいては、型パラメータ<struct A>に対応する関数定義部分#401と、型パラメータ<struct B>に対応する関数定義部分#402とが含まれる。換言すれば、1個のテンプレート#301が、与えられた2個の型に応じて、2個の関数定義部分#401及び#402として具現化される。
2個の関数定義部分#401及び#402は、図18に示すように、各々の第1行に現れるマングル名「A」及び「B」を除いて、全く同一の関数定義に具現化されている。従って、型パラメータが相互に異なっていても、これに依存することなく、具現化された関数定義コードは同一となる。このような場合、型パラメータが異なっても、結果として生成される複数の関数定義コードが1個の関数定義コードに置換される。
なお、以上の他に、共通可能プログラム構造が共通可能宣言及びこれに関連する1つ以上の共通可能本体を含み、共通可能宣言が具体化で使用するために存在すれば、次のコンパイルにおいて、共通可能本体を使用するコンパイラが提案されている。
特開2005−141380号公報 特公平7−031606号公報
前述したように、テンプレートコンパイル方法において、同一のテンプレートに基づいて生成される複数の同一の関数定義に具現化されたコードを、1個の関数定義に具現化されたコードに置換することができる。これにより、テンプレートにより増加するコードサイズを縮小することができる。従って、更に、多くの関数定義コードを共通化して、オブジェクトプログラムのサイズを縮小することが望まれる。
本発明は、関数定義コードの集合である関数定義部分を、より多く共通化することが可能なテンプレートコンパイル方法を提供することを目的とする。
開示されるテンプレートコンパイル方法は、高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納部に格納するステップと、コンパイラが、複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、重要度情報に基づいて決定するステップと、コンパイラが、決定に基づいて、共通化関数定義部分、又は、独立関数定義部分を含むオブジェクトプログラムを生成するステップとを含む。
開示されるテンプレートコンパイル方法によれば、オブジェクトプログラムの実行性能をあまり損なうことなく、同一又は類似の内容を持つ複数の関数定義コードの集合である関数定義部分を共通化することができ、オブジェクトプログラムのサイズを縮小することができる。
テンプレートコンパイル装置の構成の一例を示す図である。 プロファイル機能付加モードにおけるコンパイル処理の一例を示す。 インスタンス共通化モードにおけるコンパイル処理の一例を示す。 プロファイルデータ生成部のデータ構造の説明図である。 プロファイルデータ及びプロファイルデータによる共通化対象の判定の説明図である。 型パラメータに依存する処理の割合による共通化の判定の説明図である。 テンプレートコンパイル処理における変換されたソースプログラムを示す。 テンプレートコンパイル処理における共通化インスタンスを含むオブジェクトプログラムの一例を示す。 テンプレートコンパイル処理のフローチャートである。 プロファイル機能付加モードにおけるコンパイル処理のフローチャートである。 インスタンス共通化モードにおけるコンパイル処理のフローチャートである。 プロファイル解析処理の詳細のフローチャートである。 テンプレートインスタンス共通化判定準備処理のフローチャートである。 テンプレートインスタンス共通化処理のフローチャートである。 テンプレートコンパイル処理における、型パラメータが与えられたテンプレートの一例を示す。 与えられた型パラメータにより具現化されたインスタンスの一例を示す。 型パラメータに依存しないテンプレートの一例を示す。 結果的に同一のコードに具現化されたインスタンスの一例を示す。 型パラメータに依存するテンプレートの一例を示す。 結果的にほぼ同一のコードに具現化されたインスタンスの一例を示す。 テンプレートコンパイル処理の説明図である。
本発明者の検討によれば、従来のテンプレートコンパイル方法においては、異なる型パラメータに対して同一の関数定義に具現化されたコードを生成する場合しか、関数定義コードを共通化できない。
図19は、型パラメータに依存するテンプレートの一例を示す。図19のテンプレート#501は、ソースプログラム500に含まれる。図19のテンプレート#501においては、型パラメータ<struct A>と型パラメータ<struct B>とが与えられている。例えば、型パラメータ<struct A>は名前Aのデータ構造を生成することを指示するパラメータである。また、型パラメータ<struct B>の「int value, id;」において、メンバidのオフセットはAとは異なるものとする。
ここで、実際には、処理#1は、型パラメータT及びaに関する情報を参照しない、換言すれば、依存しないが、数1000行のコードを含む長い処理である。また、処理#2は、処理#1とは異なる処理であって、型パラメータT及びaに関する情報を参照しない、換言すれば、依存しないが、数1000行のコードを含む長い処理である。
なお、図19において、実際のテンプレートは、最初の8行であり、残りの複数の行はテンプレートに型パラメータを与える部分である。但し、前述したように、実際には、処理#1及び処理#2は、数1000行のコードを含む長い処理である。従って、図19のテンプレート#501は、テンプレートと、テンプレートに型パラメータを与える部分とを含む。
図20は、結果的に同一のコードに具現化されたインスタンスの一例を示す。図19のテンプレート#501を含むソースプログラム500がコンパイルされた結果として、図20のテンプレート#501のインスタンス、換言すれば、具現化されたオブジェクトプログラム600が得られる。図20のインスタンスにおいては、型パラメータ<struct A>に対応する関数定義部分#601と、型パラメータ<struct B>に対応する関数定義部分#602とが含まれる。換言すれば、1個のテンプレート#501が、与えられた2個の型に応じて、2個の関数定義部分#601及び#602として具現化される。ここで、前述したように、処理#1及び処理#2は、各々、数1000行のコードを含む長い処理である。また、2個の関数定義部分#601及び#602において、各々の第1行に現れるマングル名「A」及び「B」を除いて、ほぼ同一の関数定義に具現化されている。更に、2個の関数定義部分#601及び#602において、メンバidのオフセットが相互に異なるために、各々の第6行が異なる。
図19のように定義されたテンプレート#501では、型に依存する処理はわずかであり、一方、型に依存しない処理#1及び処理#2は、ソースプログラム500のみならず、オブジェクトプログラム600においても、全く同一である。従って、同一である部分の割合は極めて大きい。それにも拘らず、オブジェクトプログラム600は、結果として、図20に示すように、別個に、処理#1及び処理#2を含む2つの独立した関数定義部分#601及び#602として具現化される。
処理#1は、前述したように、型パラメータT及びaに関する情報を参照しない。従って、関数定義部分#601及び#602において、全く同一の処理である。処理#2も同様である。しかし、長い処理#1及び長い処理#2を含む関数定義部分#601及び#602を共通化することはできない。換言すれば、大きなテンプレート関数の一部が型パラメータに依存する場合、当該テンプレートに基づいて生成されたインスタンスの大部分は共通であるが、共通化することはできない。
また、本発明者の検討によれば、従来のテンプレートコンパイル方法においては、処理が1つのコンパイル単位に閉じており、複数のコンパイル単位間においては異なるマングル名を持ちながら全く同一の関数定義に具現化された関数テンプレートの共通化ができない。
例えば、コンパイル時において、個々のサブオブジェクトプログラムにおいて異なるマングル名を持ちながら同一の関数定義に具現化されたコードが含まれることを検出して、共通化することはできない。換言すれば、図20の関数定義部分#601及び#602が個々のサブオブジェクトプログラムに含まれる場合、これらを共通化することはできない。例えば、テンプレートとして、共通の関数を記述したインクルードファイルを複数のサブソースプログラムに予め展開すれば、複数のコンパイル単位において同一の関数定義に具現化されたコードを生成することができる。しかし、これらの複数のサブソースプログラムを独立してコンパイルした場合、コンパイラは、同一の関数定義に具現化されたコードを生成するが、これらのマングル名が異なっていた場合、同一のテンプレートが複数のサブソースプログラムにおいて利用されたことを検出することができない。従って、コンパイル時に、同一の関数定義に具現化されたコードを共通化することができないので、事実上、インクルードファイルを用いたことによる共通化の効果は得られない。
例えば、ヘッダーファイルにおいて、template<typename T> tFunc(T& t) { /* 定義 */ }のような関数テンプレートが定義され、型テンプレートTに対し、class A〜Fを適用した場合に同一のオブジェクトが生成されるとする。そして、このような関数テンプレートが、ソースプログラムのファイル ABC.cc では図21(A)に示すように使用され、ソースプログラムのファイル DEF.cc では図21(B)に示すように使用されるとする。
この場合、ソースプログラムのファイルABC.cc のコンパイル時には 、tFunc<A>(A&)、 tFunc<B>(B&)、 tFunc<C>(C&) をまとめた関数定義部分が生成される。ソースプログラムのファイルDEF.cc のコンパイル時には、 tFunc<D>(D&)、 tFunc<E>(E&)、 tFunc<F>(F&) をまとめた関数定義部分が生成される。しかし、結果として、この2つの関数定義部分は、異なるマングル名を持ちながら同一のオブジェクトコードになるにもかかわらず、オブジェクトプログラムにおいて重複して存在し、重複部分を削除することができない。
開示のテンプレートコンパイル方法及びテンプレートコンパイル装置は、テンプレートに基づいて生成される関数定義部分を、複数のコンパイル単位においてできるだけ共通化する。
図1は、コンパイル処理装置の構成の一例を示す図である。
図1のコンピュータシステムは、コンピュータ1とコンピュータ2とを含む。コンピュータ1は、コンパイラ13を含むコンパイル処理装置である。コンピュータ2は、オブジェクトプログラム17を実行するデータ処理装置である。
コンピュータ1は、格納部11と、コンパイラ13とを含む。格納部11は、ソースプログラム12を格納する。ソースプログラム12は、高級言語であるC++言語で記述される。コンパイラ13は、コンパイルを実行するコンパイル処理部であり、例えばオペレータにより入力された指示に従って、ソースプログラム12をコンパイルしてオブジェクトプログラム17を生成して、格納部11に格納する。このために、コンパイラ13は、プロファイル処理部14と、共通化処理部15と、通常処理部16とを含む。
ソースプログラム12は、複数のサブソースプログラム121を含む。複数のサブソースプログラム121の各々が、コンパイル単位である。従って、生成されたオブジェクトプログラム17は、複数のサブオブジェクトプログラム171を含む。複数のサブオブジェクトプログラム171が、複数のサブソースプログラム121をコンパイルした結果である。
コンピュータ2は、オブジェクトプログラム17を実行する処理部を含む。後述するように、コンピュータ2によりオブジェクトプログラム17を実行することにより、プロファイルデータ18が得られる。プロファイルデータ18は、コンピュータ1の格納部11に格納される。
コンパイラ13へのオペレータの指示は、コンパイルのモードを指定する指示入力であり、例えば、コンピュータ1の入力装置から入力される。モードは、コンパイルのモードを指定する情報であり、例えば、プロファイル機能組み込みモード、インスタンス共通化モード、通常モードのいずれかである。プロファイル機能組み込みモードは、後述するように、重要度情報を取得するモードである。インスタンス共通化モードは、後述するように、少なくとも1個の共通化関数定義部分174を含むオブジェクトプログラム17を生成するモードである。
プロファイル処理部14は、プロファイル機能組み込みモードが指定された場合に、プロファイル機能組み込みモードでソースプログラム12をコンパイルすることにより、オブジェクトプログラム17を生成する。プロファイル機能組み込みモードはプロファイル処理部14により実行される。プロファイル機能組み込みモードについては、図2を参照して後述する。
なお、後述するように、サブオブジェクトプログラム171は、プロファイルデータ生成部172を含む。これにより、生成されたオブジェクトプログラム17をコンピュータ2において実行することにより、プロファイルデータ18が生成される。
共通化処理部15は、インスタンス共通化モードが指定された場合に、インスタンス共通化モードでソースプログラム12をコンパイルすることにより、オブジェクトプログラム17を生成する。インスタンス共通化モードは共通化処理部15により実行される。インスタンス共通化モードにおいては、複数のサブソースプログラム121のインスタンスが共通化される。共通化されるインスタンスは、プロファイルデータ18に基づいて決定される。インスタンス共通化モードについては、図3を参照して後述する。
通常処理部16は、通常モードが指定された場合に、通常モードでソースプログラム12をコンパイルすることにより、オブジェクトプログラム17を生成する。通常モードは通常処理部16により実行される。通常モードは、コンパイラ13の本来の機能であり、従って、通常モードにおいては、複数のサブソースプログラム121のインスタンスは共通化されない。
なお、通常モードはコンパイラ13の本来の機能である。従って、モードが指定されない場合、又は、プロファイル機能組み込みモード及びインスタンス共通化モードが指定されない場合には、通常モードでのコンパイルが実行されるようにしても良い。
図2は、コンパイラによるテンプレートコンパイル処理の説明図であり、特に、プロファイル機能付加モードにおけるコンパイル処理の一例を示す。
プロファイル機能付加モードは、コンパイラ13に、プロファイル機能付加モードでのコンパイルを指示する命令である。プロファイル機能付加モードにおいて、コンパイルの対象であるソースプログラム12が指定される。
ソースプログラム12は、複数のサブソースプログラム121を含む。サブソースプログラム121は、大きな1個のソースプログラム12の一部であり、例えば開発上の理由から別々に開発される。このため、サブソースプログラム121は、各々が独立にコンパイルされる。換言すれば、サブソースプログラム121は、コンパイルの単位である。
サブソースプログラム121は、各々、テンプレート122を含む。これは、サブソースプログラム121が別々に開発されるためである。複数のテンプレート122は、同一の関数定義に具現化されたコードを生成する場合もあれば、生成しない場合もある。換言すれば、複数のテンプレート122が、同一の関数定義に具現化されたコードを生成するか否かは、ソースプログラム12をコンパイルするまで知ることができない。各々のテンプレート122は、関数定義コードの列、換言すれば、関数定義コードの集合を生成させる関数テンプレートである。
プロファイル機能付加モードが指定されると、コンパイラ13のプロファイル処理部14が、指定されたソースプログラム12を格納部11から読み出してコンパイルすることにより、オブジェクトプログラム17を生成する。オブジェクトプログラム17はコンパイルの結果である。
オブジェクトプログラム17は、複数のサブオブジェクトプログラム171を含む。サブオブジェクトプログラム171は、大きな1個のオブジェクトプログラム17の一部であり、サブソースプログラム121が独立にコンパイルされるために、コンパイルの単位毎に生成される。従って、サブオブジェクトプログラム171は、サブソースプログラム121に対応して生成される。
サブオブジェクトプログラム171は、各々、関数定義部分173を含む。関数定義部分173は、テンプレート122に対応して、1又は複数生成される。関数定義部分173は、テンプレート122及び型パラメータの指定に基づいて生成された、複数の関数定義コードの列、換言すれば、関数定義コードの集合である。なお、この時点での関数定義部分173は、共通化されていない。また、1個のサブオブジェクトプログラム171に含まれる関数定義部分173の数は、1個には限られない。
サブオブジェクトプログラム171は、各々、1個のプロファイルデータ生成部172を含む。プロファイルデータ生成部172は、本来、ソースプログラム12には存在しないコードであり、プロファイル処理部14により、サブオブジェクトプログラム171に付加されたコードである。
ここで、関数定義部分173は、プロファイル機能付加モードでのコンパイルのみならず通常モードでのコンパイルにおいても、テンプレート122及び型パラメータの指定に基づいて生成される。従って、プロファイル処理部14は、通常モードでのコンパイル処理を実行すると共に、プロファイルデータ生成部172を付加する処理を実行する。
オブジェクトプログラム17は、例えば、コンピュータ2に入力されコンピュータ2により実行される。コンピュータ2は、例えばオペレータにより入力された指示に従って、オブジェクトプログラム17をコンピュータ1の格納部11から読み出して実行する。この実行により、プロファイルデータ18が得られる。この場合、格納部11は、実際には、コンピュータ1とコンピュータ2とが共有する記憶手段である。従って、プロファイルデータ18も、格納部11に格納される。なお、コンピュータ2は、コンパイルを実行したコンピュータ1であっても良い。
オブジェクトプログラム17の実行により、各々のサブオブジェクトプログラム171に付加されたプロファイルデータ生成部172も実行される。これにより、プロファイルデータ18が得られる。前述したように、サブオブジェクトプログラム171はサブソースプログラム121に対応する。従って、プロファイルデータ生成部172は、自己の属するサブオブジェクトプログラム171の対応するサブソースプログラム121のテンプレート122について、プロファイルデータ18を生成する。換言すれば、プロファイルデータ生成部172は、テンプレート122及び型パラメータの指定に基づいて関数定義部分173が生成される都度に、プロファイルデータ18を生成する。生成されたプロファイルデータ18は、1個のソースプログラム12についての1個のプロファイルデータ18とされる。
プロファイルデータ18は重要度情報である。重要度情報は、オブジェクトプログラム17の全体の実行性能における、各関数定義部分173の実行性能が占める重要性を示す指標である。換言すれば、プロファイルデータ18は、オブジェクトプログラム17におけるテンプレート122又はテンプレート122のインスタンスの重要度を示す。
プロファイルデータ18としては、例えば、テンプレート122に基づいて生成される関数定義部分173の実行の頻度を示すデータが用いられる。具体的には、オブジェクトプログラム17の全体におけるその関数定義部分173の実行回数、換言すれば、呼出回数が用いられる。プロファイルデータ18として、オブジェクトプログラム17の全体における各関数定義部分173の実行時間を用いるようにしても良い。
なお、プロファイルデータ18は、ソースプログラム12のコンパイルにより生成したオブジェクトプログラム17の実行以外の手段により、得るようにしても良い。例えば、オペレータが類似のソースプログラムの設計から経験的に得たデータを、プロファイルデータ18として格納部11に格納するようにしても良い。換言すれば、プロファイルデータ18は、インスタンス共通化モードにおけるコンパイル処理に先立って得ることができる重要度情報であれば良い。
プロファイル機能付加モードにおけるコンパイル処理は、インスタンス共通化モードにおけるコンパイル処理を最適に実行するために十分なプロファイルデータ18が得られるまで、繰り返し実行される。例えば、プロファイル機能付加モードにおけるコンパイル処理は、1回〜数100回実行される。これに対して、インスタンス共通化モードにおけるコンパイル処理は、例えば1回実行されるのみである。
図3は、コンパイラによるテンプレートコンパイル処理の説明図であり、特に、インスタンス共通化モードにおけるコンパイル処理の一例を示す。
インスタンス共通化モードは、コンパイラ13に、インスタンス共通化モードでのコンパイルを指示する命令である。インスタンス共通化モードにおいて、コンパイルの対象であるソースプログラム12が指定される。また、インスタンス共通化モードにおいて、指定されたソースプログラム12についてのプロファイルデータ18が読み出され、ソースプログラム12と共に、コンパイルに用いられる。
インスタンス共通化モードが指定されると、コンパイラ13の共通化処理部15が、指定されたソースプログラム12を格納部11から読み出してコンパイルすることにより、オブジェクトプログラム17を生成する。前述したように、サブソースプログラム121が独立にコンパイルされるために、オブジェクトプログラム17は、複数のサブオブジェクトプログラム171を含む。
複数のサブオブジェクトプログラム171は、例えば、図3に示すように、複数の関数定義部分173に代えて、複数のサブオブジェクトプログラム171に共通の1個の共通化関数定義部分174を含む。共通化関数定義部分174は、複数のテンプレート122に対応して、1又は複数生成される。共通化関数定義部分174は、テンプレート122及び型パラメータの指定に基づいて生成された、複数の関数定義コードの列、換言すれば、関数定義コードの集合である。
なお、共通化関数定義部分174の数は、1個には限られない。また、複数のサブオブジェクトプログラム171の関数定義部分173を全て共通化する必要はない。従って、実際には、1個のオブジェクトプログラム17には、共通化関数定義部分174と、関数定義部分173とが混在する。この場合、共通化関数定義部分174の数は1個には限られず、関数定義部分173の数も1個には限られない。
1個のオブジェクトプログラム17において、共通化関数定義部分174及び関数定義部分173がどのように存在するかは、インスタンス共通化モードでのコンパイル処理に依存する。このために、前述したように、プロファイル機能付加モードにおけるコンパイル処理を例えば数100回実行して十分なプロファイルデータ18を得ることにより、オブジェクトプログラム17が最適化される。
前述したように、複数のサブオブジェクトプログラム171の関数定義部分173を全て共通化する必要はない。換言すれば、共通化によりオブジェクトプログラム17の処理性能が低下する場合には、関数定義部分173は共通化されない。
共通化による処理性能の低下を回避するために、プロファイルデータ18が用いられる。換言すれば、プロファイルデータ18に基づいて、共通化される関数定義部分173と、共通化されない関数定義部分173とが決定される。プロファイルデータ18としては、例えば、後述するように、実行回数が用いられる。
例えば、実行回数又は頻度が少ないテンプレート122のインスタンス、換言すれば、関数は、共通化される。これにより、オブジェクトプログラム17のサイズ、換言すれば、コードの数を大幅に少なくすることができ、一方、実行速度が大きく低下することは無い。また、実行回数が多いテンプレート122は、共通化されない。これにより、オブジェクトプログラム17のサイズは減少しないが、実行速度の低下も無い。このように、複数の関数定義部分173を共通化した共通化関数定義部分174と、複数の関数定義部分173とを混在させることにより、オブジェクトプログラム17のサイズを大幅に小さくすることができ、かつ、実行速度が大きく低下することを回避することができる。従って、実際には、オブジェクトプログラム17は、少なくとも1個の共通化関数定義部分174と、少なくとも1個の関数定義部分173とを含む。
なお、図3におけるサブオブジェクトプログラム171は、プロファイルデータ生成部172を含まない。換言すれば、インスタンス共通化モードでのコンパイル処理においては、プロファイルデータ生成部172を付加する処理は実行されない。
オブジェクトプログラム17は、例えば、コンピュータ2に入力されコンピュータ2により実行される。このオブジェクトプログラム17は、関数定義部分173に代えて共通化関数定義部分174を含むので、処理速度が高速であり、かつ、小さいサイズを有する。
図2及び図3とは異なり、通常モードは、コンパイラ13に、通常モードでのコンパイルを指示する命令である。通常モードにおいて、コンパイルの対象であるソースプログラム12が指定される。
通常モードが指定されると、コンパイラ13の通常処理部16が、指定されたソースプログラム12を格納部11から読み出してコンパイルすることにより、オブジェクトプログラム17を生成する。前述したように、サブソースプログラム121が独立にコンパイルされるために、オブジェクトプログラム17は、複数のサブオブジェクトプログラム171を含む。
通常モードの場合、サブオブジェクトプログラム171は、複数の関数定義部分173を含む。換言すれば、通常モードにおいては、関数定義部分173は共通化されない。従って、通常モードのコンパイルにより得られたオブジェクトプログラム17は、例えば、図2において、各々のサブオブジェクトプログラム171におけるプロファイルデータ生成部172を省略したものと等しい。
次に、図1〜図3のテンプレートコンパイル処理の一例について、図4〜図8を参照して詳細に説明する。
コンパイラ13は、前述したように、図4に示すデータ構造を有するプロファイルデータ生成部172をサブオブジェクトプログラム171に追加することにより、図5に示すプロファイルデータ18を生成する。更に、コンパイラ13は、図6に示す基準により共通化の判定処理を実行して、共通化するテンプレート122のインスタンス、換言すれば、関数定義部分173を決定する。なお、共通化するインスタンスは中間コードの時点で決定されるので、決定の時点では、実際には、関数定義部分173は生成されていない。従って、共通化される関数定義部分173は、厳密には、共通化するインスタンスであり、共通化されなければ関数定義部分173となる部分である。
この後、コンパイラ13は、ソースプログラム12を、図7に示すように書き換えた後にコンパイルして、図8に示すオブジェクトプログラム17を得る。なお、実際には、ソースプログラム12ではなく、ソースプログラムから生成された中間コードが書き換えられる。
図4は、プロファイルデータ生成部のデータ構造の説明図である。
コンパイラ13は、プロファイル処理部14において、各々のサブオブジェクトプログラム171に、図4に示すデータ構造を有するプロファイルデータ生成部172を追加する。これにより、例えば図20に示すオブジェクトプログラム600に図4に示すプロファイルデータ生成部172を追加したサブオブジェクトプログラム171が得られる。サブオブジェクトプログラム171においてプロファイルデータ生成部172が追加される位置は、コンパイラ13に依存する。
プロファイルデータ生成部172は、例えば、テンプレート122に基づいて定義される関数の実行回数を記録する。具体的には、1つの関数名に対して、その実行回数がカウントされる。この処理は、プロファイルデータ生成部172の第1行〜第5行の命令により実行される。また、プロファイルデータ生成部172は、例えば、前記関数名を有する1群の関数について、その実行回数の合計を記録する。この処理は、プロファイルデータ生成部172の第6行〜第9行の命令により実行される。
具体的には、コンパイラ13は、プロファイルデータ生成部172として、具現化されたテンプレート、換言すれば、関数定義部分173となる部分毎に、カウンタ領域を設ける命令「char*function name」を追加する。これにより、カウンタ領域は、サブオブジェクトプログラム171の実行時において、サブオブジェクトプログラム171が使用するデータ領域内に設けられ、「0」に初期化される。
また、コンパイラ13は、プロファイルデータ生成部172として、関数定義部分173となる部分の入口に、カウンタ領域の値を「+1」だけ増加させる命令「long long exec count」を追加する。これにより、関数定義部分173が実行されると、その都度、対応するカウンタ領域の値が「+1」される。
また、コンパイラ13は、プロファイルデータ生成部172として、全てのサブオブジェクトプログラム171の全てのカウンタ領域の値を、テーブル形式のプロファイルデータ18のファイルとして、オブジェクトプログラム17の実行終了時に、出力する命令を追加する。この命令は、プロファイルデータ生成部172の第7行〜第8行に示される。これにより、テンプレート122の重要度情報として、テンプレート122のインスタンス、換言すれば、関数定義部分173の実行回数を得ることができる。具体的には、1個のオブジェクトプログラム17について、1個のプロファイルデータ18のファイルが得られる。
以上により、プロファイルデータ生成部172が付加された複数のサブオブジェクトプログラム171をオブジェクトプログラム17が、コンピュータ2により実行される。これにより、オブジェクトプログラム17についてのプロファイルデータ18が、格納部11に得られる。
更に、コンパイラ13は、インスタンス共通化モードでのコンパイルにおいて、生成されたプロファイルデータ18を読み出して、読み出したプロファイルデータ18に基づいて、テンプレート122から具現化されたインスタンスを、その重要度順にソートする。これにより、図5に示すソートの結果としての実行回数テーブル181が得られる。この後、コンパイラ13は、実行回数テーブル181に基づいて、図6に示すように、割合テーブル182を生成する。更に、コンパイラ13は、実行回数テーブル181及び割合テーブル182に基づいて、テンプレート122のインスタンスを、共通化関数定義部分174とするか、独立関数定義部分173とするかを決定する。独立関数定義部分173は関数定義部分173と同一である。
なお、実行回数テーブル181及び割合テーブル182の生成処理は、インスタンス共通化モードでのコンパイルにおいて実行されるが、オブジェクトプログラム17がコンピュータ2により実行された後に実行するようにしても良い。実行回数テーブル181及び割合テーブル182は、プロファイルデータ18であると考えて良い。
図5は、プロファイルデータ及びプロファイルデータによる共通化対象の判定の説明図である。
プロファイルデータ18として、前述したように、例えばテンプレート122のインスタンスの実行回数を格納するテーブル形式のプロファイルデータ18のファイルが得られる。コンパイラ13の共通化処理部15は、テーブル形式のプロファイルデータ18のファイルを格納部11から読み出して、読み出したテーブル形式のプロファイルデータ18のファイルについて、実行回数の多い順にソートする。これにより、図5に示す実行回数テーブル181が得られる。従って、実行回数テーブル181は、テンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報である。ここで、重要度は実行回数である。
なお、テーブル形式のプロファイルデータ18のファイルは、実行回数の順にソートされていない。また、実行回数テーブル181において、テンプレート122のインスタンスの他に、一般の関数の実行回数も格納されている。
図5において、例えば、テンプレート 「get_id」 のインスタンスの内、「get_id<X>」 の実行回数は、このソースプログラム12の中で最も多く実行された関数 func1 の実行回数の7割以上に相当する。一方、「get_id<A>」の実行回数及び「get_id<B>」 の実行回数は、各々、関数 func1 の実行回数の1万分の1未満である。
そこで、例えば、閾値を、当該ソースプログラム12中で最も多く実行される関数の実行回数の100分の1とする。閾値は、経験的に定めることができ、コンパイラ13の共通化処理部15が予め保持する。コンパイラ13の共通化処理部15は、共通化インスタンスの対象を、実行回数が閾値未満であるインスタンスとする。この場合、「get_id<A>」 と「get_id<B>」は共通化インスタンスの対象となるが、「get_id<X>」は共通化インスタンスの対象とならない。
以上に加えて、コンパイラ13の共通化処理部15は、テンプレート122を解析し、図6の割合テーブル182に示すように、テンプレート122の中間コードの中で、型パラメータに依存する中間コードがそのテンプレート122の全体に占める割合を求める。これは、以下の理由による。
例えば、型パラメータに依存する中間コード(以下、依存部分ともいう)の割合がある量を越えると、依存部分の切り分け処理の追加によるサイズの増加が、共通化によるサイズ削減を上回るようになる。換言すれば、重要度の高い、又は、実行回数の多いインスタンスを共通化すると、依存部分を切り分ける処理の追加による実行性能の悪化が無視できなくなる。
図6は、型パラメータに依存する処理の割合による共通化の判定の説明図である。
コンパイラ13による構文解析と中間コード生成の結果、テンプレート122毎に、そのテンプレート122から生成された中間コードの行数Aと、その中間コードの中で型パラメータに依存する処理の行数Bが求まる。これにより、そのテンプレート122における、型パラメータに依存する処理の割合B/Aが求まる。換言すれば、図6に示す割合テーブル182が得られる。従って、割合テーブル182は、テンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報である。ここで、重要度は型パラメータに依存する処理の割合B/Aである。
例えば、図6において、テンプレート「get_id 」では、型パラメータに依存する処理の割合は、中間コードの5割である。これに対して、テンプレート「id_distinct」では、型パラメータに依存する処理の割合は、3%未満である。
そこで、例えば、閾値を5%とする。換言すれば、型パラメータに依存する処理の割合が5%以上の場合に、そのテンプレートを共通化することとする。閾値は、経験的に定めることができ、コンパイラ13の共通化処理部15が予め保持する。コンパイラ13の共通化処理部15は、テンプレート「get_id」は共通化の対象とするが、テンプレート「id_distinct」は共通化の対象としない。
以上の例では、コンパイラ13の共通化処理部15は、まず、図5に示す実行回数テーブル181に基づいて、共通化インスタンスの対象となる「get_id<A>」 と「get_id<B>」を選択する。この後、コンパイラ13の共通化処理部15は、選択した「get_id<A>」 と「get_id<B>」について、更に、図6に示す割合テーブル182に基づいて、共通化インスタンスの対象となるか否かを判定する。これにより、以上の例では、最終的に、「get_id<A>」 と「get_id<B>」が共通化インスタンスの対象と判断される。
図7は、テンプレートコンパイル処理の説明図であり、特に、変換されたソースプログラムを示す。
コンパイラ13は、共通化処理部15において、共通化すると判断されたテンプレート122を共通化するように、当該テンプレート122の中間コードを生成する。具体的には、テンプレート122が共通化の対象であるような場合に、テンプレート122のソースコードを、以下のような中間コードに変換する。
具体的には、コンパイラ13の共通化処理部15は、図19に示すソースプログラム12を読み込む。図19に示すソースプログラム12において、前述したように、テンプレート122は、最初の8行であり、残りの複数の行はテンプレート122に型パラメータ<struct A>と型パラメータ<struct B>とを与える部分である。
テンプレート122において、処理#1は、型パラメータT及びaに関する情報を参照しない、換言すれば、依存しないが、数1000行のコードを含む長い処理である。また、処理#2は、処理#1とは異なる処理であって、型パラメータT及びaに関する情報を参照しない、換言すれば、依存しないが、数1000行のコードを含む長い処理である。処理#1及び処理#2の各々が、関数定義部分173又は共通化関数定義部分174となる部分である。
この後、コンパイラ13の共通化処理部15は、読み込んだ図19に示すソースプログラム12のテンプレート122における「int id;」及び「id=a−>id;」の2行を、図7における第2行〜第7行に示す部分#122に変換する。換言すれば、メンバidへの処理を記述する行が、メンバidへの処理を型によって別ける処理となるように、書き換えられる。これにより、テンプレート122により定まるコードを含むソースコード#121が得られる。
部分#122は、メンバidへの処理を型によって別ける処理である。換言すれば、部分#122により、TがAならば第4行の処理が実行され、TがA以外(即ち、B)ならば第6行の処理が実行される。
なお、図7は、変換後の中間コードの集合である中間プログラム12’を、ソースコードの集合であるソースプログラム12における概念として表したものである。
部分#122への変換のために、コンパイラ13の共通化処理部15は、型パラメータTに関する処理を検出し、それをPとする。例えば、sizeof (T) 式のように型Tそのものの性質を問う処理や、型がTやTの派生型であるような変数やパラメータに関する処理などが検出される。そして、コンパイラ13は、検出した処理に対して、この処理と、型パラメータTに対して共通化の対象となる具現化された型T1、T2、・・・Tnとを比較する条件式を追加する。追加された条件式は、図7の第3行及び第5行に示される。
また、コンパイラ13の共通化処理部15は、型T1、T2、・・・Tnに応じて、PをP1、P2、・・・Pnとして具現化し、各条件式のthen節に挿入する。挿入されたPは、図7の第4行のthen以下、及び、第6行のthen以下に示される。第4行の処理は、型Aに対して具現化された処理である。第6行の処理は、型Bに対して具現化された処理である。
図7においては、テンプレート122に型パラメータ<struct A>と型パラメータ<struct B>とを与える部分が、同一のサブソースプログラム121に存在する。しかし、テンプレート122に型パラメータ<struct A>と型パラメータ<struct B>とを与える部分が、異なるサブソースプログラム121に存在しても良い。換言すれば、あるサブソースプログラム121にテンプレート122及び型パラメータ<struct A>を与える部分が存在し、他のサブソースプログラム121に同一のテンプレート122及び型パラメータ<struct B>を与える部分が存在しても良い。
これは、以下の理由による。前述したように、複数のサブソースプログラム121は個々にコンパイルされるが、1個のオブジェクトプログラム17について、1個のプロファイルデータ18としての実行回数テーブル181が得られる。また、複数のサブオブジェクトプログラム171において、その部分を共通化することはできないが、同一のオブジェクトプログラム17であることは知ることができるので、1個のプロファイルデータ18としての割合テーブル182を得ることができる。
図8は、テンプレートコンパイル処理における共通化インスタンスを含むオブジェクトプログラムの一例を示す。
コンパイラ13は、共通化処理部15において、共通化されたインスタンス、換言すれば、共通化関数定義部分174が存在する場合、部分#171に示すように、元となるインスタンスの全てのラベル、例えば「A」及び「B」を追加する。ラベルは、前述した、型T1、T2、・・・Tnに応じて具現化されたP1、P2、・・・Pnである。これにより、コンパイル単位が異なっていても、換言すれば、共通化関数定義部分174を含むサブオブジェクトプログラム171が、共通化されたことを認識しなくても、当該共通化関数定義部分174を実行することができる。
また、コンパイラ13の共通化処理部15は、前述した追加された条件式に従って、部分#172、部分#173、部分#174を生成する。なお、図8に示すオブジェクトプログラム17は、図20に示すオブジェクトプログラム600と、各々に含まれるコードが少し異なるが、同一の処理を実行する。各々に含まれるコードが少し異なる理由は、前述したように、ソースプログラム12を図7に示すように書き換えたことに起因する。
数1000行の長い処理である処理#1及び処理#2は、部分#174において、各々、1回出現するだけであり、重複していない。これにより、オブジェクトプログラム17のサイズを小さくすることができる。
前述したように、処理#1は、型パラメータT及びaに依存しないが、数1000行のコードを含む長い処理である。処理#2は、処理#1とは異なる処理であって、型パラメータT及びaに依存しないが、数1000行のコードを含む長い処理である。処理#1及び処理#2の各々が、共通化関数定義部分174である。従って、図8に示すオブジェクトプログラム17は、処理#1を実行する第1の共通化関数定義部分174と、処理#2を実行する第2の共通化関数定義部分174とを含む。
図8に示すオブジェクトプログラム17は、図20に示すオブジェクトプログラム600よりも長いように見受けられる。しかし、前述したように、処理#1及び処理#2の各々は、数1000行のコードを含む。従って、処理#1及び処理#2の各々を1回しか含まない図8に示すオブジェクトプログラム17は、処理#1及び処理#2の各々を2回含む図20に示すオブジェクトプログラム600よりも極めて短い。
なお、テンプレート122が共通化の対象であっても、具現化の対象となった型が共通化するインスタンスとして具現化する対象でなければ、独立のインスタンスとして具現化する。
図8においては、例えば、共通化関数定義部分174である処理#1が、あるサブオブジェクトプログラム171に存在する。しかし、あるサブオブジェクトプログラム171に存在する共通化関数定義部分174である処理#1は、他のサブオブジェクトプログラム171からも実行することができる。これは、前述したように、元となるインスタンスの全てのラベル、例えば「A」及び「B」を部分#171に保持しているためである。
次に、図1〜図3のテンプレートコンパイル処理について、図9〜図14を参照して説明する。
図9は、テンプレートコンパイル処理のフローチャートである。
コンパイルの実行に先立って、オペレータが、コンパイラ13に対して、プロファイルデータ18を取得するために、コンパイラ13の動作モードをプロファイル機能付加モード、換言すれば、プロファイル機能組み込みモードに設定し、ソースプログラム12を指定して、コンパイルの実行を指示する。なお、プロファイル機能付加モードを指定することにより、プロファイル機能組み込みモード及びインスタンス共通化モードの双方が指定されるようにしても良い。
コンパイラ13は、プロファイル機能付加モードが指定されているか否かを判断する(ステップS1)。プロファイル機能付加モードが指定されている場合(ステップS1 YES)、コンパイラ13は、プロファイル処理部14により、プロファイル機能組み込みモードでソースプログラム12をコンパイルして(ステップS2)、オブジェクトプログラム17を生成する。
なお、ステップS1において、コンパイラ13は、実際には、何らかのモードが指定されているか、換言すれば、プロファイル機能付加モード又はインスタンス共通化モードが指定されているか否かを判断する。
ステップS2の後、コンピュータ2が、生成されたオブジェクトプログラム17を実行すると、プロファイルデータ18が得られる(ステップS3)。
この後、オペレータは、プロファイルデータ18を参照して、十分なプロファイルデータ18が取得できたか否かを判断する(ステップS4)。十分なプロファイルデータ18が取得できない場合(ステップS4 NO)、ステップS3を繰り返す。十分なプロファイルデータ18が取得できた場合(ステップS4 YES)、オペレータが、コンパイラ13に対して、コンパイラ13の動作モードをインスタンス共通化モードに設定し、ソースプログラム12を指定して、コンパイルの実行を指示する。
なお、ステップS3の繰り返しの回数を予めコンパイラ13に与え、コンパイラ13が当該繰り返しの回数だけステップS3を実行し、ステップS4において、当該繰り返しの回数の分の実行が終了したかを否かを判断するようにしても良い。この場合、更に、コンパイラ13の動作モードが、当該繰り返しの回数だけステップS3を実行した後に、プロファイル機能付加モードからインスタンス共通化モードに切り替わるようにしても良い。
コンパイラ13は、インスタンス共通化モードが指定されているか否かを判断する(ステップS5)。インスタンス共通化モードが指定されている場合(ステップS5 YES)、コンパイラ13は、共通化処理部15により、プロファイルデータ18を読み出して、これを用いてインスタンス共通化モードでソースプログラム12をコンパイルして(ステップS6)、オブジェクトプログラム17を生成する。
インスタンス共通化モードが指定されていない場合(ステップS5 NO)、コンパイラ13は、通常処理部16により、通常モードでソースプログラム12をコンパイルして(ステップS7)、オブジェクトプログラム17を生成する。
ステップS1において、プロファイル機能付加モードが指定されていない場合(ステップS1 NO)、コンパイラ13は、ステップS7を実行する。
図10は、プロファイル機能付加モードにおけるコンパイル処理のフローチャートである。
コンパイラ13は、ソースプログラム12のファイルであるソースファイルを格納部11から読み出し(ステップS11)、読み出したソースプログラム12の構文を解析して(ステップS12)、解析の結果に基づいてソースコードを中間コードに変換することにより中間コードのファイルを生成する(ステップS13)。
この後、コンパイラ13は、生成した中間コードのファイルに、プロファイル生成コード、換言すれば、プロファイルデータ生成部172となる中間コードを挿入する(ステップS14)。
この後、コンパイラ13は、中間コードを最適化した後に(ステップS15)、中間コードをオブジェクトコードに変換することによりオブジェクトプログラム17を生成して(ステップS16)、生成したオブジェクトプログラム17を出力する(ステップS17)。
図11は、インスタンス共通化モードにおけるコンパイル処理のフローチャートである。
コンパイラ13に、ソースプログラム12のファイルであるソースファイルを格納11から読み出し(ステップS21)、プロファイルデータ18のファイルであるプロファイル履歴ファイルを格納11から読み出す(ステップS22)。
この後、コンパイラ13は、読み出したプロファイルデータ18を解析する(ステップS23)。これにより、図5に示す実行回数テーブル181が生成される。プロファイルデータ18の解析処理については、図12を参照して後述する。
この後、コンパイラ13は、読み出したソースプログラム12の構文を解析する(ステップS24)。これにより、図6に示す割合テーブル182が生成される。コンパイラ13は、構文の解析の結果、換言すれば、割合テーブル182に基づいて、ソースコードを中間コードに変換することにより、中間コードのファイルを生成する(ステップS25)。
この後、コンパイラ13は、テンプレート122のインスタンス、換言すれば、関数定義部分173に相当する部分を、プロファイルデータ18の解析の結果、換言すれば、実行回数テーブル181に基づいて、共通化するか否かを判断する(ステップS26)。共通化の判断処理については、図13を参照して後述する。
この後、コンパイラ13は、共通化すると判断した、テンプレート122のインスタンス、換言すれば、関数定義部分173に相当する部分を、共通化する(ステップS27)。インスタンスの共通化処理については、図14を参照して後述する。
この後、コンパイラ13は、中間コードを最適化した後に(ステップS28)、中間コードをオブジェクトコードに変換することによりオブジェクトプログラム17を生成して(ステップS29)、生成したオブジェクトプログラム17を出力する(ステップS210)。
図12は、プロファイル解析処理の詳細のフローチャートである。
コンパイラ13は、プロファイルデータ18のファイルであるプロファイル履歴ファイルを格納部11から読み出す(ステップS31)。更に、コンパイラ13は、実行回数テーブル181を生成する(ステップS32)。実行回数テーブル181は、プロファイルデータ18において記述されたテンプレート122に基づいて生成される関数定義部分173の数だけの欄を持つ。これらの欄は生成時には空である。この後、コンパイラ13は、読み込んだプロファイルデータ18から、テンプレート122に基づいて生成される関数定義部分173の実行回数を読み出し、読み出した実行回数を、実行回数テーブル181に記入する(ステップS33)。これにより、実行回数テーブル181が得られる。
図13は、テンプレートインスタンス共通化判定準備処理のフローチャートである。
コンパイラ13は、ステップS23において作成した実行回数テーブル181から、同一の関数名を持つテンプレート122のインスタンス、換言すれば、関数定義部分173についてだけ、その実行回数データを抜き出して、抽出テーブルを作成する(ステップS41)。更に、コンパイラ13は、作成した抽出テーブルを、インスタンスの実行回数の多い順にソートする(ステップS42)。この後、コンパイラ13は、予め定められた閾値より少ない実行回数を持つインスタンス、換言すれば、関数定義部分173を生成したテンプレート122を共通化の対象としてマークする(ステップS43)。マークは、例えばテンプレート122の中間コードの入り口において後述する入り口ラベルの次に付加される。これにより、共通化処理の対象となるインスタンス、換言すれば、テンプレート122が決定される。
図14は、テンプレートインスタンス共通化処理のフローチャートである。
コンパイラ13は、ソースプログラム12の先頭から順に1個のテンプレート122を取り出して、当該テンプレート122が共通化インスタンス生成済みとしてマークされているか否かを判断する(ステップS51)。テンプレート122が共通化インスタンス生成済みとしてマークされている場合(ステップS51 YES)、コンパイラ13は、そのテンプレート122についての処理を終了する。
テンプレート122が共通化インスタンス生成済みとしてマークされていない場合(ステップS51 NO)、コンパイラ13は、テンプレート122のインスタンス、換言すれば、テンプレート122が共通化の対象としてマークされているか否かを判断する(ステップS52)。
テンプレート122が共通化の対象としてマークされている場合(ステップS52 YES)、コンパイラ13は、テンプレート122の中間コードのうち、型パラメータに依存する中間コードの割合が予め定めた基準より少ないか否かを判断する(ステップS53)。
型パラメータに依存する中間コードの割合が予め定めた基準よりも少ない場合(ステップS53 YES)、コンパイラ13は、テンプレート122の中間コードの型パラメータに依存する中間コードについて、当該型パラメータに依存する処理を挿入する(ステップS54)。この後、コンパイラ13は、更に、テンプレート122の、共通化の対象としてマークされたインスタンスの全ての入口ラベルを、インスタンスの先頭に挿入し(ステップS55)、テンプレート122を共通化インスタンス生成済みとしてマークする(ステップS56)。マークは、例えばテンプレート122の中間コードの入り口において前記入り口ラベルの次に付加される。
ステップS52において、テンプレート122のインスタンス、換言すれば、テンプレート122が共通化の対象としてマークされていない場合(ステップS52 NO)、コンパイラ13は、テンプレート122を、通常通りに具現化する(ステップS57)。
また、ステップS53において、型パラメータに依存する中間コードの割合が予め定めた基準以上である場合(ステップS53 NO)、コンパイラ13は、ステップS57を実行する。
1 コンパイル処理装置
11 格納部
12 ソースプログラム
13 コンパイラ
14 プロファイル処理部
15 共通化処理部
16 通常処理部
17 オブジェクトプログラム
18 プロファイルデータ
121 サブソースプログラム
122 テンプレート
171 サブオブジェクトプログラム
172 プロファイルデータ生成部
173 関数定義部分
174 共通化関数定義部分

Claims (8)

  1. 高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、前記複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納部に格納するステップと、
    コンパイラが、前記複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、前記重要度情報に基づいて決定するステップと、
    前記コンパイラが、前記決定に基づいて、前記共通化関数定義部分、又は、前記独立関数定義部分を含むオブジェクトプログラムを生成するステップとを含む
    ことを特徴とするテンプレートコンパイル方法。
  2. 前記重要度情報は、生成された前記オブジェクトプログラムを実行することにより得られる情報である
    ことを特徴とする請求項1に記載のテンプレートコンパイル方法。
  3. 前記重要度情報は、前記テンプレートに基づいて生成される関数定義部分の実行の頻度を示すプロファイルデータである
    ことを特徴とする請求項2に記載のテンプレートコンパイル方法。
  4. 前記コンパイラが、前記プロファイルデータと、前記テンプレートに基づいて生成される関数定義部分の中間コードに対する、前記中間コードの中の型パラメータに依存する処理の中間コードの割合とに基づいて、前記決定を行う
    ことを特徴とする請求項2に記載のテンプレートコンパイル方法。
  5. 前記コンパイラが、前記テンプレートに基づいて生成される関数定義部分を前記プロファイルデータにおける実行の頻度の順にソートして、前記テンプレートに基づいて生成される関数定義部分の中で、前記実行の頻度が予め定められた基準値より少ない関数定義部分を抽出し、抽出された前記関数定義部分を共通化する
    ことを特徴とする請求項4に記載のテンプレートコンパイル方法。
  6. 前記コンパイラが、前記実行の頻度が予め定められた基準値より少ない関数定義部分の中で、前記割合が予め定められた閾値より低い関数定義部分を抽出し、抽出された前記関数定義部分を共通化する
    ことを特徴とする請求項5に記載のテンプレートコンパイル方法。
  7. 前記コンパイラは、前記重要度情報を取得するモードと、少なくとも1個の前記共通化関数定義部分を含む前記オブジェクトプログラムを生成するモードとを備える
    ことを特徴とする請求項1に記載のテンプレートコンパイル方法。
  8. 高級言語で記述され、複数のサブソースプログラムを含むソースプログラムがコンパイルされて得られるオブジェクトプログラムに含まれ、前記複数のサブソースプログラムの各々に含まれるテンプレートに基づいて生成される関数定義部分の重要度を示す重要度情報を格納する格納部と、
    前記複数のサブソースプログラムを独立にコンパイルすることにより生成される複数のサブオブジェクトプログラムの各々に含めるべき関数定義部分を、他の関数定義部分と共通のコードにより定義される共通化関数定義部分とするか、又は、他の関数定義部分から独立したコードにより定義される独立関数定義部分とするかを、前記重要度情報に基づいて決定し、前記決定に基づいて、前記共通化関数定義部分、又は、前記独立関数定義部分を含むオブジェクトプログラムを生成するコンパイラとを含む
    ことを特徴とするテンプレートコンパイル装置。
JP2010069971A 2010-03-25 2010-03-25 テンプレートコンパイル方法及びテンプレートコンパイル装置 Pending JP2011203960A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2010069971A JP2011203960A (ja) 2010-03-25 2010-03-25 テンプレートコンパイル方法及びテンプレートコンパイル装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010069971A JP2011203960A (ja) 2010-03-25 2010-03-25 テンプレートコンパイル方法及びテンプレートコンパイル装置

Publications (1)

Publication Number Publication Date
JP2011203960A true JP2011203960A (ja) 2011-10-13

Family

ID=44880545

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010069971A Pending JP2011203960A (ja) 2010-03-25 2010-03-25 テンプレートコンパイル方法及びテンプレートコンパイル装置

Country Status (1)

Country Link
JP (1) JP2011203960A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015210740A (ja) * 2014-04-28 2015-11-24 富士通株式会社 コンパイル方法、コンパイル装置およびコンパイルプログラム

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6182243A (ja) * 1984-09-29 1986-04-25 Toshiba Corp オブジエクトプログラム生成方法
JPH0380327A (ja) * 1989-08-24 1991-04-05 Mitsubishi Electric Corp プログラムの同一箇所検出方式
JPH0731606B2 (ja) * 1988-09-20 1995-04-10 ディジタル イクイプメント コーポレーション デジタルデータ処理システム用総称コード共用化装置及び方法
JPH08263299A (ja) * 1995-03-27 1996-10-11 Sanyo Electric Co Ltd プログラム変換方法
JP2005141380A (ja) * 2003-11-05 2005-06-02 Matsushita Electric Ind Co Ltd テンプレートコンパイル方法
JP2007018254A (ja) * 2005-07-07 2007-01-25 Toshiba Corp 言語処理装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6182243A (ja) * 1984-09-29 1986-04-25 Toshiba Corp オブジエクトプログラム生成方法
JPH0731606B2 (ja) * 1988-09-20 1995-04-10 ディジタル イクイプメント コーポレーション デジタルデータ処理システム用総称コード共用化装置及び方法
JPH0380327A (ja) * 1989-08-24 1991-04-05 Mitsubishi Electric Corp プログラムの同一箇所検出方式
JPH08263299A (ja) * 1995-03-27 1996-10-11 Sanyo Electric Co Ltd プログラム変換方法
JP2005141380A (ja) * 2003-11-05 2005-06-02 Matsushita Electric Ind Co Ltd テンプレートコンパイル方法
JP2007018254A (ja) * 2005-07-07 2007-01-25 Toshiba Corp 言語処理装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
CSNA201100868001; IBM XL C/C++ for AIX,V11.1 最適化およびプログラミング・ガイド バージョン11. 第1版, 201002, p.50,55, 日本アイ・ビー・エム株式会社 *
CSNB200200467001; ケイシャフ・ダッタトリ著/滝沢 徹、牧野祐子 訳: C++実践オブジェクト指向プログラミング 初版, 20001130, p.537, 株式会社ピアソン・エデュケーション *
JPN6013053210; IBM XL C/C++ for AIX,V11.1 最適化およびプログラミング・ガイド バージョン11. 第1版, 201002, p.50,55, 日本アイ・ビー・エム株式会社 *
JPN6013053211; ケイシャフ・ダッタトリ著/滝沢 徹、牧野祐子 訳: C++実践オブジェクト指向プログラミング 初版, 20001130, p.537, 株式会社ピアソン・エデュケーション *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015210740A (ja) * 2014-04-28 2015-11-24 富士通株式会社 コンパイル方法、コンパイル装置およびコンパイルプログラム

Similar Documents

Publication Publication Date Title
US10324695B2 (en) Method for transforming first code instructions in a first programming language into second code instructions in a second programming language
US7958493B2 (en) Type inference system and method
US9535664B1 (en) Computerized software development process and management environment
US20080104096A1 (en) Software development system
US20080250231A1 (en) Program code conversion apparatus, program code conversion method and recording medium
US20090313600A1 (en) Concurrent code generation
US20040268330A1 (en) Intermediate representation for multiple exception handling models
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
US20110035746A1 (en) job network auto-generation apparatus, a method and a program recording medium
JPH1040114A (ja) C++プログラムのコンパイル方法及びコンパイラ
US7747991B2 (en) Program converting method
US11294665B1 (en) Computerized software version control with a software database and a human database
Hamilton Distillation: extracting the essence of programs
US8117604B2 (en) Architecture cloning for power PC processors
JP2005141380A (ja) テンプレートコンパイル方法
US8516467B2 (en) Method and apparatus for enhancing comprehension of code time complexity and flow
US20090187897A1 (en) Compiling method and compiling program
Garzón et al. Reverse engineering of object-oriented code into Umple using an incremental and rule-based approach.
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
US8434076B2 (en) Efficient compilation and execution of imperative-query languages
JP2011203960A (ja) テンプレートコンパイル方法及びテンプレートコンパイル装置
US8510342B1 (en) Automatic conversion of build processes to use streaming input
Appeltauer et al. Towards concrete syntax patterns for logic-based transformation rules
Ali et al. Identification and Optimisation of Type-Level Model Queries
Gupta et al. Optimal code compiling in C

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20130924

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20131029

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20140304