JP2005141380A - テンプレートコンパイル方法 - Google Patents

テンプレートコンパイル方法 Download PDF

Info

Publication number
JP2005141380A
JP2005141380A JP2003375776A JP2003375776A JP2005141380A JP 2005141380 A JP2005141380 A JP 2005141380A JP 2003375776 A JP2003375776 A JP 2003375776A JP 2003375776 A JP2003375776 A JP 2003375776A JP 2005141380 A JP2005141380 A JP 2005141380A
Authority
JP
Japan
Prior art keywords
function
template
definition
same
parameter
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.)
Withdrawn
Application number
JP2003375776A
Other languages
English (en)
Inventor
Shinobu Asao
忍 浅尾
Hiroji Nakajima
廣二 中嶋
Hirohisa Tanaka
裕久 田中
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2003375776A priority Critical patent/JP2005141380A/ja
Priority to CNB200410056064XA priority patent/CN1313926C/zh
Priority to US10/914,108 priority patent/US20050097530A1/en
Publication of JP2005141380A publication Critical patent/JP2005141380A/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Abstract

【課題】 テンプレートコンパイル方法において、テンプレートから生成される複数の関数定義コードのうち、同一コードとなるものの関数定義コードの共有化を図って、テンプレート機構により増加するコードサイズを縮小する。
【解決手段】 同一関数定義生成判定ステップS105により、関数定義コードとテンプレートパラメータとの依存性を解析し、その依存性がない場合には、関数定義共通化ステップS106により、共通関数を定義し、共通化前の複数の関数定義を削除する。その後、関数呼び出し置換ステップS107により、共通化前の関数呼び出しを共通関数への呼び出しに置換する。
【選択図】図1

Description

本発明は、テンプレート機構を有する高級言語で記述されたプログラムを目的コードに変換するコンパイル方法に関する。
近年のソフトウェア開発においては、プログラムの規模が大規模化してきており、それに伴って保守性、再利用性の高いオブジェクト指向言語が注目されている。
代表的なオブジェクト指向言語にC++言語が挙げられる。C++言語はテンプレート機構を有しており、保守性、再利用性の高いジェネリックプログラミングが可能となっている。また、STLとよばれる標準テンプレートライブラリが通常コンパイラに提供されており、今後更にテンプレート機構を利用したプログラミングが増加すると思われる。
図12にテンプレート機構を利用したC++プログラムをコンパイルした場合の生成コード例を示す。
図12のソースコード(a)及び(b)のように、C++ではクラス群及び関数群を表すテンプレートを定義し、テンプレートパラメータを与えることによって容易に関数定義を生成することが可能である。ソースコード(c)では、(a)や(b)のテンプレートに対して、テンプレートパラメータint及びlongを与えることでA<int>型、A<long>型のクラス、及び戻り値がvoid型、引数がint型及びlong型である関数A<int>::f、A<long>::fを生成させると同時に、A<int>型のオブジェクト’a’、A<long>型のオブジェクト’b’を定義している。ソースコード(d)では、生成したメンバ関数A<int>::fやA<long>::fの呼び出しを行なっている。
図12の生成コードは、ソースコードに対して従来のコンパイル方法でコンパイルを行なった結果である。テンプレートにパラメータint、longを与えた結果生成された関数A<int>::fの定義コード(f)や関数A<long>::fの定義コード(g)がそれぞれ生成され、また関数hの定義コード(e)において、(f)、(g)の定義がcall文によって呼び出されているのが判る。ここで、call命令のオペランドであるラベルは、関数定義の先頭アドレスを表すラベルである。以上のように、テンプレートを定義し、テンプレートパラメータを与えることにより、容易に複数のクラス、関数を生成することができる。
従来のコンパイルでは、テンプレートに対して異なるテンプレートパラメータを与えると、必ずそれぞれのパラメータ値に対する関数(静的関数、外部関数、仮想、非仮想メンバ関数を含む)は別の定義としてコード生成されている。例えば、前記の図12では、テンプレートパラメータ intに対して、(f)の定義コード、longに対して、(g)の定義コードが生成されている。このため、「テンプレートから生成される関数定義のコードサイズ」×「テンプレートパラメータの種類」に従って、全体のコードサイズは著しく増大する。
しかし、テンプレートから生成される関数は、テンプレートパラメータが異なるからといって全て異なるコードが生成されるわけではなく、同一コードが生成される場合がある。前記した図12の例では、A<int>::fとA<long>::fはテンプレートパラメータが異なるが、生成されている定義コード(f)と(g)は全く同じである。
従来の技術として、このようなコードサイズ増加を防ぐため、プログラムの共通部分を、型指定されないインプリメンテーションクラスとして、仮引数化されたテンプレートを有する型指定されたインターフェースクラスから分離するプログラム記述方法が提案されている(例えば、特許文献1参照)。
特開平9−231077号公報(図8)
しかしながら、前記従来の技術では、プログラマーが意識してプログラムの共通部分を型指定されないインプリメンテーションクラスとしてプログラムを記述することを強制させるものであり、プログラマーに対する負担が大きい。
本発明の目的は、テンプレートコンパイル方法において、プログラマーに最適なプログラム記述を意識させることなく、テンプレート機構により増加するコードサイズを縮小する方法を提供することにある。
前記目的を達成するために、本発明では、テンプレートから生成される複数の関数定義コードのうち、同一コードとなる複数の関数定義コードをCPUにより自動判定して、それらの同一コードとなる複数の関数定義コードの共有化を図ることとする。
すなわち、請求項1記載の発明のテンプレートコンパイル方法は、テンプレート機構を有する高級言語で記述された入力プログラムを目的コードに変換するテンプレートコンパイル方法であって、前記入力プログラムに含まれる複数の関数定義において、テンプレートが異なるテンプレートパラメータに対して同一の関数定義を生成するかどうかを判定する同一関数定義生成判定ステップと、前記同一関数定義生成判定ステップにより同一の関数定義を生成すると判定されたとき、その同一の関数定義を生成する複数の関数定義をただ一つの共通関数定義に置換する関数定義共通化ステップと、前記関数定義共通化ステップにより共通関数定義への置換が行われたとき、その共通化される前の前記複数の関数の呼び出しを前記共通関数定義の呼び出しに置換する関数呼び出し置換ステップとを備えたことを特徴とする。
請求項2記載の発明は、前記請求項1記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記複数の関数定義において、前記テンプレートが関数テンプレートであり、且つ、関数定義部分にテンプレートパラメータ依存箇所が存在するかどうかを解析することを特徴とする。
請求項3記載の発明は、前記請求項2記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記解析の結果、テンプレートが関数テンプレートである前記複数の関数定義において、関数定義部分にテンプレートパラメータ依存箇所が存在しない場合には、少なくともファイル名、テンプレート関数名、及びインスタンス化関数名を含む非依存関数情報を生成することを特徴とする。
請求項4記載の発明は、前記請求項1記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記複数の関数定義において、前記テンプレートがクラステンプレートであり、且つ、メンバ関数定義部分にテンプレートパラメータ依存箇所が存在するかどうかを解析することを特徴とする。
請求項5記載の発明は、前記請求項4記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記解析の結果、テンプレートがクラステンプレートである前記複数の関数定義において、メンバ関数定義部分にテンプレートパラメータ依存箇所が存在しない場合には、少なくともファイル名、テンプレート関数名、及びインスタンス化関数名を含む非依存関数情報を生成することを特徴とする。
請求項6記載の発明は、前記請求項1記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記複数の関数定義において、前記テンプレートが関数テンプレートであり且つ関数定義部分にテンプレートパラメータ依存の型変換が存在するかどうか、テンプレートパラメータ依存の引数による関数呼び出しが存在するかどうか、及び、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在するかどうかを各々解析することを特徴とする。
請求項7記載の発明は、前記請求項6記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記解析の結果、関数定義部分にテンプレートパラメータ依存の型変換が存在せず、テンプレートパラメータ依存の引数による関数呼び出しが存在せず、且つ、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在する場合には、ファイル名、テンプレート関数名、パラメータサイズ、及びインスタンス関数名を含む特定パラメータ同一関数情報を生成することを特徴とする。
請求項8記載の発明は、前記請求項1記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記複数の関数定義において、前記テンプレートがクラステンプレートであり且つメンバ関数定義部分にテンプレートパラメータ依存の型変換が存在するかどうか、テンプレートパラメータ依存の引数による関数呼び出しが存在するかどうか、及び、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在するかどうかを各々解析することを特徴とする。
請求項9記載の発明は、前記請求項8記載のテンプレートコンパイル方法において、前記同一関数定義生成判定ステップは、前記解析の結果、メンバ関数定義部分にテンプレートパラメータ依存の型変換が存在せず、テンプレートパラメータ依存の引数による関数呼び出しが存在せず、且つ、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在する場合には、ファイル名、テンプレート関数名、パラメータサイズ、及びインスタンス関数名を含む特定パラメータ同一関数情報を生成することを特徴とする。
請求項10記載の発明は、前記請求項3又は5記載のテンプレートコンパイル方法において、前記関数定義共通化ステップは、前記同一関数定義生成判定ステップが生成した非依存関数情報を受け、前記非依存関数情報のうち、同一テンプレートから生成されているインスタンス化関数名に対して共通関数名を登録し、前記同一テンプレートから生成されているインスタンス化関数の関数定義コードを、前記共通関数の関数定義コードに変更することを特徴とする。
請求項11記載の発明は、請求項7又は9記載のテンプレートコンパイル方法において、前記関数定義共通化ステップは、前記同一関数定義生成判定ステップが生成した特定パラメータ同一関数情報を受け、前記特定パラメータ同一関数情報のうち、同一テンプレートの同一パラメータサイズから生成されているインスタンス化関数名に対して共通関数名を登録し、前記同一テンプレートの同一パラメータサイズから生成されているインスタンス化関数の関数定義コードを、前記共通関数の関数定義コードに変更することを特徴とする。
請求項12記載の発明は、前記請求項1記載のテンプレートコンパイル方法において、前記関数呼び出し置換ステップは、共通化される前の関数の先頭アドレスを使用した関数呼び出し命令を、前記関数定義共通化ステップでの共通関数定義の先頭アドレスを使用した関数呼び出し命令に置換することを特徴とする。
請求項13記載の発明は、請求項1記載のテンプレートコンパイル方法において、前記関数呼び出し置換ステップは、関数呼び出しが仮想関数呼び出しである場合には、仮想関数のテーブルに登録されている前記共通化される前の関数の先頭アドレスを、前記関数定義共通化ステップでの共通関数定義の先頭アドレスに置換することを特徴とする。
請求項14記載の発明は、請求項13記載のテンプレートコンパイル方法において、前記関数呼び出し置換ステップは、前記仮想関数テーブルに登録されている前記共通化される前の関数の先頭アドレスを前記共通関数定義の先頭アドレスに置換した結果、登録されている内容が等しくなる複数の仮想関数テーブルが存在する場合には、この複数の仮想関数テーブルを、登録内容が同一の一つの共通仮想関数テーブルに置換するとを特徴とする。
以上により、請求項1〜請求項14記載の発明では、先ず、入力プログラムの複数の関数定義について、テンプレートが異なるテンプレートパラメータに対して同一の関数定義を生成するかどうかを判定し、その判定の結果、同一の関数定義を生成する場合には、それらの複数の関数定義を1つの共通関数定義に置換すると共に、それらの複数の関数定義に対する呼出しを前記共通関数定義に対する呼出しに置換する。
従って、入力プログラムにおいて、テンプレートに対して与えるパラメータが相互に異なる複数の関数定義が存在する場合であっても、それらの複数の関数定義が同一の定義コードを生成するときには、得られる出力コードにおいて、それらの複数の関数定義別に同一の定義コードが重複して存在することがなく、コードサイズの少ない効率の良い目的コードを生成することができる。
以上説明したように、請求項1〜14記載の発明のテンプレートコンパイル方法によれば、入力プログラムにおいてテンプレートに対して与えるパラメータが相互に異なる複数の関数定義が存在する場合であっても、それらの複数の関数定義が同一の定義コードを生成するときには、得られる出力コードにおいて同一の定義コードが重複して存在することがないので、コードサイズの少ない効率の良い目的コードを生成することができる。
特に、請求項2記載の発明のテンプレートコンパイル方法によれば、関数テンプレートから生成されるテンプレートパラメータに依存しない関数に対しても、効率の良い目的コードを生成することができる。
また、請求項4記載の発明のテンプレートコンパイル方法によれば、クラステンプレートから生成されるテンプレートパラメータに依存しないメンバ関数に対しても、効率の良い目的コードを生成することができる。
更に、請求項6記載の発明のテンプレートコンパイル方法によれば、関数テンプレートから生成される特定のテンプレートパラメータの組み合わせにのみ依存しない関数に対しても、効率の良い目的コードを生成することができる。
加えて、請求項8記載の発明のテンプレートコンパイル方法によれば、クラステンプレートから生成される特定のテンプレートパラメータの組み合わせにのみ依存しないメンバ関数に対しても、効率の良い目的コードを生成することができる。
また、請求項12及び請求項13記載の発明のテンプレートコンパイル方法によれば、非仮想的な関数や仮想的な関数の呼び出しコードに対しても、効率の良い目的コードを生成することができる。
更に、請求項14記載の発明のテンプレートコンパイル方法によれば、仮想関数テーブルのコードに対しても、効率の良い目的コードを生成することができる。
以下、本発明のコンパイル方法の実施形態の一例について図面を参照しながら説明する。
図1は本発明の実施形態におけるコンパイルステップの構成図を示す。
図1において、このコンパイルステップは、入力ステップS102、構文解析ステップS103、同一関数定義生成判定ステップS105、関数定義共通化ステップS106、関数呼び出し置換ステップS107、中間コード生成ステップS109、最適化ステップS110、資源割付ステップS111及び出力ステップS112から構成されている。このコンパイルステップ中の各ステップは、CPUを備えたコンパイル装置がコンパイラに基づいて行なう処理である。
プログラム記憶部D101は、コンパイル対象の入力プログラムを保持している。
入力ステップS102は、プログラム記憶部D101に格納されている全てのプログラムを順次入力し、構文解析ステップS103に渡す。
構文解析ステップS103は、入力ステップS102から受け取ったプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成などを行なう。
同一関数定義生成判定ステップS105は、構文解析ステップS103で生成された情報のうち、テンプレート関連情報を抽出し、テンプレートが、異なるテンプレートパラメータに対して同一の関数定義を生成するかどうかを解析する。
関数定義共通化ステップS106は、構文解析ステップS103で生成された情報のうち、関数定義関連情報を抽出し、また同一関数定義判定ステップS105から解析結果を受け取り、異なるテンプレートパラメータに対して同一の関数定義を生成した複数の関数定義をただ一つの共通関数定義に置換を行なう。
関数呼び出し置換ステップS107は、構文解析ステップS103で生成された情報のうち、関数呼び出し関連情報を抽出し、また関数定義共通化ステップS106から置換結果を受け取り、共通化された結果に基づいて、共通化される前の関数呼び出しを共通関数定義の呼び出しへと置換を行なう。
中間コード生成ステップS109は、構文解析ステップS103で生成された構文木を基に、中間コードを生成する。テンプレートから生成される関数定義及び仮想関数テーブルに関する中間コードを生成する際には、同一関数定義生成ステップS105、関数定義共通化ステップS106、関数呼び出し置換ステップS107を実行後に置換された情報を参照して、対応する中間コードを生成する。
最適化ステップS110は、中間コード生成ステップS109によって生成された中間コードに対して、各種の最適化を実行する。
資源割付ステップS111は、最適化ステップ110によって最適化された中間コードに含まれる全ての変数に対してレジスタやメモリなどのハードウェア資源を割り付ける。
出力ステップS112は、資源割付ステップS111によって資源割付された中間コードを目的コードに変換して、生成コード記憶部D113に出力する。
生成コード記憶部D113は、前記ステップS102〜S112までのコンパイルステップによって変換された目的コードを格納しておく。
尚、入力ステップS102、構文解析ステップS103、中間コード生成ステップS109、最適化ステップS110、資源割付ステップS111、出力ステップS112については、本発明の主眼ではないため、詳細な説明は省略する。
次に、同一関数定義生成判定ステップS105の処理について、図5に示すプログラムに適用した場合を例にして、図2を参照しながら説明する。
同一関数定義生成判定ステップS105の処理は、ステップa1〜a11によって行なわれる。以下、記号の順に説明していく。
ステップa1では、構文解析ステップS103が生成した情報のうち、テンプレート関連の情報を抽出する。構文解析ステップS103によって、全ての入力ファイル中のテンプレートの情報が解析されているので、テンプレートに関する情報のみを抽出する。図5に示すプログラムでは、全ての入力ファイルtemplate1.cc、template2.ccについて、各ファイル中で定義されているテンプレートは、template1.ccでは関数テンプレートgであり、template2.ccではクラステンプレートBであるので、図6(a)のような抽出結果が得られる。尚、図5の入力ファイルtemplate1.cc、template2.ccの1行目の「#include」文は、その場所に“”で括られたファイルの内容を展開するという意味のプログラムである。
ステップa2では、抽出した全テンプレート情報のうち、クラステンプレートのメンバ関数について、ループ1(ステップa2〜a6)の処理を繰り返す。図6(a)では[2]と[3]がクラステンプレートのメンバ関数であるので、このメンバ関数[2]及び[3]についてループ1の処理を繰り返す。
ステップa3では、メンバ関数のコードが、テンプレートパラメータに全く依存しないテンプレートコードを持つかどうかを調べる。Noの場合はステップa4に、Yesの場合はステップa5に移行する。図6(a)のメンバ関数[2]についてステップa3の判定を行なうと、メンバ関数[2]のコードは、テンプレートパラメータTの値に関わらず、return b;となり、Tの値に全く依存しないので、ステップa3の判定はYesとなり、ステップa5へと移行する。メンバ関数[3]のコードも、テンプレートパラメータTの値に関わらず、return y;となり、Tの値に全く依存しないので、ステップa3の判定はYesとなり、ステップa5へと移行する。
ステップa4では、特定のテンプレートパラメータ値の組み合わせのみについて同一のコードが生成される関数が存在するかどうかを調べる。後述するステップa7のループ2で行なわれる処理であるステップa9とステップa4との処理は同じである。図6(a)のメンバ関数[2]及び[3]は、ステップa3でYesと判定されているので、ステップa4の処理は行なわれない。処理の詳細はステップa9の説明時に行なう。
ステップa5では、ステップa4でYesと判定されたメンバ関数に対するパラメータ非依存関数情報を生成する。図6(a)のメンバ関数[2]及び[3]は、パラメータ非依存関数であるので、少なくともファイル名、テンプレート関数名、テンプレートパラメータによって実体化(インスタンス化)されたインスタンス化関数名で構成される図6(b)のパラメータ非依存関数情報が生成される。
ステップa6では、ステップa2に処理を移行し、ループ1の処理を繰り返す。
ステップa7では、抽出した全テンプレート情報のうち、関数テンプレートについて、ループ2の処理を繰り返す。図6(a)では[1]が関数テンプレートである。この関数テンプレート[1]についてループ2の処理を実行する。
ステップa8では、関数のコードが、テンプレートパラメータに全く依存しないテンプレートコードを持つかどうかを調べる。Noの場合はステップa9、Yesの場合はステップa10へ移行する。図6(a)の関数テンプレート[1]についてステップa8の判定を行なうと、[1]のコードは、テンプレートパラメータTの値によって、仮引数a、bの型が異なるため、テンプレートパラメータに依存する。従って、ステップa8の判定はNoとなり、ステップa9へと移行する。
ステップa9は、特定のテンプレートパラメータ値の組み合わせのみについて同一のコードが生成される関数が存在するかどうかを調べる。ステップa2のループ1で行なわれる処理であるステップa4とステップa9との処理は同じである。
前記ステップa4及びステップa9の処理は、ステップb1〜b4によって行なわれる。以下記号の順に説明していく。
ステップb1では、関数コードの中に、明示的又は暗黙的な型変換が存在しないかどうかを判定する。Yesの場合はステップb2に、Noの場合はステップa4又はステップa9の処理を抜ける。図6(a)の関数テンプレート[1]についてステップb1の判定を行なうと、関数テンプレート[1]のコード、return a+b;には型変換が存在しないので、ステップb1の判定はYesとなり、ステップb2へと移行する。
ステップb2では、関数コードの中に、パラメータ依存の引数による関数呼び出しが存在しないかどうかを判定する。Yesの場合はステップb3に移動し、Noの場合はステップa4又はステップa9の処理を抜ける。図6(a)の[1]についてステップb2の判定を行なうと、[1]のコード、return a+b;の中には関数呼び出しが存在しないので、ステップb2の判定はYesとなり、ステップb3へと移行する。
ステップb3では、インスタンス化されたパラメータ値の中で、型サイズが同じであるパラメータで生成された関数定義が存在するかどうかを判定する。Yesの場合はステップb4に移動し、Noの場合はステップa4又はステップa9の処理を抜ける。図6(a)の[1]についてステップb3の判定を行なうと、[1]のテンプレートに対してインスタンス化されているテンプレートパラメータはint型とlong型である。コンパイル環境によっては、これらの型は同じサイズを持つ。ここでは、共に4byteのサイズを持つと仮定する。型サイズが同じであるパラメータで生成された関数定義が存在するので、ステップb4へと移行する。
ステップb4では、ステップb1〜ステップb3までの判定で全てYesと判定された関数定義をもとに特定パラメータ同一関数情報を生成する。図6(a)の[1]は、ステップb1からステップb3までの判定で全てYesと判定され、テンプレートパラメータ値がintの場合とlongの場合とで同一のコードが生成される。少なくともファイル名、テンプレート関数名、パラメータサイズ、インスタンス化関数名で構成される図6(c)の特定パラメータ同一関数情報が生成される。
ステップa10では、ステップa8でYesと判定された関数に対するパラメータ非依存関数情報を生成する。図6(a)の[1]は、ステップa8でNoと判定されているので、ステップa10の処理は行なわれない。
ステップa11では、ステップa7に処理を移行し、ループ2の処理を繰り返す。
以上、同一関数定義生成判定ステップS105の処理を図10に示すプログラムに適用した場合、図6(b)に示すパラメータ非依存関数情報及び図6(c)に示す特定パラメータ同一関数情報が生成される。これらの結果が関数定義共通化ステップS106に渡される。
次に、関数定義共通化ステップS106の処理について、図3を参照しながら説明する。
関数定義共通化ステップS106の処理は、ステップc1〜c8によって行なわれる。以下記号の順に説明していく。
ステップc1では、同一関数定義生成ステップS105から受け取った情報のうち、パラメータ非依存関数情報について、ループ1(ステップc1〜c4)の処理を繰り返す。すなわち、本例では、図6(b)のパラメータ非依存関数情報について、前記ループ1の処理を繰り返す。
ステップc2では、同一テンプレートから生成されているインスタンス化関数名に対して共通関数名を登録し、ステップc3へ移行する。例えば、図6(b)に対してステップc2を実行することにより、図7(a)の[x]の部分が登録される。
ステップc3では、各インスタンス化関数の定義を構文解析結果から削除し、共通関数の定義を構文解析結果に登録し、ステップc4へ移行する。図7(a)の関数定義名情報[x]に対してステップc3を実行することにより、図7(b)の[x]の部分で表現されている通り、インスタンス化関数の関数定義コードは削除され、共通関数の関数定義コードが新たに登録される。
ステップc4では、ステップc1に処理を移行し、ループ1の処理を繰り返す。
ステップc5では、同一関数定義生成ステップS105から受け取った情報のうち、特定パラメータ同一関数情報について、ループ2(ステップc5〜c8)の処理を繰り返す。図6(c)の特定パラメータ同一関数情報についてループ2の処理を繰り返す。
ステップc6では、同一テンプレートの同一パラメータサイズから生成されているインスタンス化関数名に対して共通関数名を登録し、ステップc7へ移行する。図6(c)に対してステップc6を実行することにより、図7(a)に示した[y]の部分が登録される。
ステップc7では、各インスタンス化関数の定義を構文解析結果から削除し、共通関数の定義を関数定義部に登録し、ステップc8へ移行する。図7(a)に示した共通関数の定義名情報[y]に対してステップc7を実行することにより、図7(b)の[y]の部分で表現されている通り、インスタンス化関数の関数定義コードは削除され、共通関数の関数定義コードが新たに構文解析結果に登録される。
ステップc8では、ステップc5に処理を移行し、ループ2の処理を繰り返す。
以上、関数定義共通化ステップS106の処理を図6(b)及び図6(c)に適用した場合、図7(a)に示す関数定義名及び図7(b)に示す関数定義コードが生成され、これらの結果が関数呼び出し置換ステップS107に渡される。
次に、関数呼び出し置換ステップS107の処理について、図4を参照しながら説明する。
関数呼び出し置換ステップS107の処理は、ステップd1〜d13によって行なわれる。以下記号の順に説明していく。
ステップd1では、構文解析ステップS103で生成される情報のうち、関数呼び出し関連の情報を抽出する。また、各クラスに対する仮想関数テーブル情報が存在する場合には、この情報も抽出する。構文解析ステップS103によって、全ての入力ファイル中の関数呼び出し情報が解析されているので、関数呼び出しに関する情報及び仮想関数テーブル情報のみを抽出する。図5に示すプログラムでは、template1.ccにおいて関数func1が、テンプレートから生成される関数を呼び出しており、template2.ccにおいても関数func2がテンプレートから生成されるクラスのメンバ関数を呼び出しているので、図8(a)のような関数呼び出し情報の抽出結果が得られる。また、関数func2において、クラスAに継承されているクラスの仮想的な関数呼び出しを行なっているので、図8(b)のような仮想関数テーブル情報の抽出結果が得られる。
ステップd2では、テンプレート生成関数を呼び出している全ての関数呼び出し情報について、ループ1の処理を繰り返す。図8(a)では関数func1、func2共にテンプレートから生成される関数を呼び出しているので、それぞれについてループ1の処理を繰り返す。
ステップd3では、共通関数名が登録された関数の呼び出しを共通関数呼び出しに置換する。図8(a)では符号(#1)の関数呼出しが符号(#2)の共通関数呼出しに、符号(#3)の関数呼出しが符号(#4)の共通関数呼出しに、符号(#5)の関数呼出しが符号(#6)の共通関数呼出しに、それぞれ置換される。
ステップd4では、関数呼び出しが仮想的な関数呼び出しであるかどうかの判定を行なう。Yesの場合はステップd5に、Noの場合はステップd13に移行する。図8(a)では、符号(#4)が仮想的な関数呼び出しであるので、ステップd5に移行する。符号(#2)や符号(#6)は通常の呼び出しであるので、ステップd13に移行する。
ステップd5では、仮想関数テーブルのうち、共通関数名が登録された関数を登録している仮想関数テーブルの全てについて、ループ2の処理を繰り返す。図8(b)では、クラスB<int>の仮想関数テーブル及びクラスB<long>の仮想関数テーブルに対して、ループ2の処理を繰り返す。
ステップd6では、仮想関数テーブルに登録されている共通化された関数を共通関数に置換する。実際には関数へのアドレスが登録されているが、ここでは説明を簡易にするため単に関数としておく。図8(b)では、符号(#7)や符号(#9)で登録されている関数は、関数定義共通化ステップS106で共通関数が登録されているので、符号(#8)や符号(#10)で示したように、それぞれ共通関数に置換される。
ステップd7では、ステップd5に処理を移行し、ループ2の処理を繰り返す。
ステップd8では、置換が実行された仮想関数テーブルについて、ループ3の処理を繰り返す。図8(b)では、仮想関数テーブルvtbl_B<int>やvtbl_B<long>についてループ3の処理を繰り返す。
ステップd9では、仮想関数テーブルに登録されている内容が、ステップd6の置換処理によって等しくなるものが存在するかどうかの判定を行なう。Yesの場合はステップd10に、Noの場合はステップd12に移行する。図8(b)では、vtbl_B<int>とvtbl_B<long>とに登録されている内容が全く等しくなったので、ステップd10に移行する。
ステップd10では、等しくなった各仮想関数テーブルを削除し、共通仮想関数テーブルを生成する。図8(b)の仮想関数テーブルvtbl_B<int>やvtbl_B<long>は、図9(b)で示すように削除され、新たに共通仮想関数テーブルvtbl_Bが生成される。
ステップd11では、仮想的関数呼び出し時に参照する仮想関数テーブルを共通仮想関数テーブルに置換する。図8(a)の仮想的呼び出しで参照していたvtbl_B<int>及びvtbl_B<long>は、図9(a)に示すように共通仮想関数テーブルvtbl_Bを参照するように置換される。
ステップd12では、ステップd8に処理を移行し、ループ3の処理を繰り返す。
以上、同一呼び出し置換ステップS107の処理を図5に示すプログラムに適用した場合には、図9(a)に示す関数呼び出し情報及び図9(b)に示す仮想関数テーブル情報が生成される。
中間コード生成ステップS109は、構文解析ステップS103で生成されたものに加えて、同一関数定義判定ステップS105、関数定義共通化ステップS106、関数呼び出し置換ステップS107で新たに生成されたものを含む全ての構文解析データを読み込み、最終的に生成コード記憶部D113に目的コードが生成され、格納される。
以上のように、本実施形態のコンパイルステップに、図5に示すプログラムを適用した結果として得られる出力コードを図10に示す。また、比較のために、従来の方法でコンパイルを行なった結果得られる出力コードを図11に示す。図11の(c)と(d)、(f)と(g)、(l)と(m)、(n)と(o)のように重複していたコードが、本発明のコンパイルステップを適用することにより、図10の(c)、(e)、(j)、(k)のように共通化されていることが判る。本実施形態のコンパイルステップを用いることにより、テンプレートに対して与えるパラメータが異なる場合でも、同一コードが生成される場合はコードサイズ及び実行ステップ数の少ない効率の良い目的コードを生成することができる。
以上説明したように、本発明は、入力プログラムにおいてテンプレートに対して与えるパラメータが相互に異なる複数の関数定義が存在する場合であっても、それらの複数の関数定義が同一の定義コードを生成するときには、得られる出力コードにおいて、その同一の1つの定義コードのみを存在させるので、コードサイズの少ない効率の良い出力コードを生成することができるテンプレートコンパイル方法等として有用である。
本発明の実施形態のテンプレートコンパイル方法におけるコンパイルステップを示す図である。 同コンパイルステップにおける同一関数定義生成ステップの処理フローチャートを示す図である。 同コンパイルステップにおける関数定義共通化ステップの処理フローチャートを示す図である。 同コンパイルステップにおける関数呼び出し置換ステップの処理フローチャートを示す図である。 プログラム記憶部に格納されるプログラムを示す図である。 (a)は同一関数定義ステップ内において抽出されるテンプレート情報を示す図、(b)は同一関数定義ステップ内で生成されるパラメータ非依存関数情報を示す図、(c)は同一関数定義ステップ内で生成される特定パラメータ同一関数情報を示す図である。 (a)は関数定義共通化ステップ内において共通関数名が登録された関数定義名情報を示す図、(b)は関数定義共通化ステップ内において共通化前の関数定義コードが削除されて共通関数定義コードが登録された関数定義コード情報を示す図である。 (a)は関数呼び出し置換ステップ内において抽出される関数呼び出し情報と、共通関数への置換を示す図、(b)は関数呼び出し置換ステップ内において抽出される仮想関数テーブル情報と、共通関数への置換を示す図である。 (a)は関数呼び出し置換ステップ内において仮想的呼び出し時の参照先を仮想関数テーブルから共通仮想関数テーブルへ置換させることを示す図、(b)は関数呼び出し置換ステップ内において仮想関数テーブルの実体を共通仮想関数テーブルに置換させることを示す図である。 本発明の実施形態のテンプレートコンパイル方法を用いた場合の出力結果を示す図である。 従来のコンパイル方法を用いた場合の出力結果を示す図である。 テンプレートを使用したプログラム例と、その出力コードを示す図である。
符号の説明
D101 プログラム記憶部
S102 入力ステップ
S103 構文解析ステップ
S105 同一関数定義生成判定ステップ
S106 関数定義共通化ステップ
S107 関数呼び出し置換ステップ
S109 中間コード生成ステップ
S110 最適化ステップ
S111 資源割り付けステップ
S112 出力ステップ
D113 生成コード記憶部

Claims (14)

  1. テンプレート機構を有する高級言語で記述された入力プログラムを目的コードに変換するテンプレートコンパイル方法であって、
    前記入力プログラムに含まれる複数の関数定義において、テンプレートが異なるテンプレートパラメータに対して同一の関数定義を生成するかどうかを判定する同一関数定義生成判定ステップと、
    前記同一関数定義生成判定ステップにより同一の関数定義を生成すると判定されたとき、その同一の関数定義を生成する複数の関数定義をただ一つの共通関数定義に置換する関数定義共通化ステップと、
    前記関数定義共通化ステップにより共通関数定義への置換が行われたとき、その共通化される前の前記複数の関数の呼び出しを前記共通関数定義の呼び出しに置換する関数呼び出し置換ステップとを備えた
    ことを特徴とするテンプレートコンパイル方法。
  2. 請求項1記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記複数の関数定義において、前記テンプレートが関数テンプレートであり、且つ、関数定義部分にテンプレートパラメータ依存箇所が存在するかどうかを解析する
    ことを特徴とするテンプレートコンパイル方法。
  3. 請求項2記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記解析の結果、テンプレートが関数テンプレートである前記複数の関数定義において、関数定義部分にテンプレートパラメータ依存箇所が存在しない場合には、少なくともファイル名、テンプレート関数名、及びインスタンス化関数名を含む非依存関数情報を生成する
    ことを特徴とするテンプレートコンパイル方法。
  4. 請求項1記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記複数の関数定義において、前記テンプレートがクラステンプレートであり、且つ、メンバ関数定義部分にテンプレートパラメータ依存箇所が存在するかどうかを解析する
    ことを特徴とするテンプレートコンパイル方法。
  5. 請求項4記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記解析の結果、テンプレートがクラステンプレートである前記複数の関数定義において、メンバ関数定義部分にテンプレートパラメータ依存箇所が存在しない場合には、少なくともファイル名、テンプレート関数名、及びインスタンス化関数名を含む非依存関数情報を生成する
    ことを特徴とするテンプレートコンパイル方法。
  6. 請求項1記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記複数の関数定義において、前記テンプレートが関数テンプレートであり且つ関数定義部分にテンプレートパラメータ依存の型変換が存在するかどうか、テンプレートパラメータ依存の引数による関数呼び出しが存在するかどうか、及び、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在するかどうかを各々解析する
    ことを特徴とするテンプレートコンパイル方法。
  7. 請求項6記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記解析の結果、関数定義部分にテンプレートパラメータ依存の型変換が存在せず、テンプレートパラメータ依存の引数による関数呼び出しが存在せず、且つ、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在する場合には、ファイル名、テンプレート関数名、パラメータサイズ、及びインスタンス関数名を含む特定パラメータ同一関数情報を生成する
    ことを特徴とするテンプレートコンパイル方法。
  8. 請求項1記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記複数の関数定義において、前記テンプレートがクラステンプレートであり且つメンバ関数定義部分にテンプレートパラメータ依存の型変換が存在するかどうか、テンプレートパラメータ依存の引数による関数呼び出しが存在するかどうか、及び、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在するかどうかを各々解析する
    ことを特徴とするテンプレートコンパイル方法。
  9. 請求項8記載のテンプレートコンパイル方法において、
    前記同一関数定義生成判定ステップは、
    前記解析の結果、メンバ関数定義部分にテンプレートパラメータ依存の型変換が存在せず、テンプレートパラメータ依存の引数による関数呼び出しが存在せず、且つ、型サイズが同じであるテンプレートパラメータでインスタンス化された関数定義が既に存在する場合には、ファイル名、テンプレート関数名、パラメータサイズ、及びインスタンス関数名を含む特定パラメータ同一関数情報を生成する
    ことを特徴とするテンプレートコンパイル方法。
  10. 請求項3又は5記載のテンプレートコンパイル方法において、
    前記関数定義共通化ステップは、
    前記同一関数定義生成判定ステップが生成した非依存関数情報を受け、
    前記非依存関数情報のうち、同一テンプレートから生成されているインスタンス化関数名に対して共通関数名を登録し、
    前記同一テンプレートから生成されているインスタンス化関数の関数定義コードを、前記共通関数の関数定義コードに変更する
    ことを特徴とするテンプレートコンパイル方法。
  11. 請求項7又は9記載のテンプレートコンパイル方法において、
    前記関数定義共通化ステップは、
    前記同一関数定義生成判定ステップが生成した特定パラメータ同一関数情報を受け、
    前記特定パラメータ同一関数情報のうち、同一テンプレートの同一パラメータサイズから生成されているインスタンス化関数名に対して共通関数名を登録し、
    前記同一テンプレートの同一パラメータサイズから生成されているインスタンス化関数の関数定義コードを、前記共通関数の関数定義コードに変更する
    ことを特徴とするテンプレートコンパイル方法。
  12. 請求項1記載のテンプレートコンパイル方法において、
    前記関数呼び出し置換ステップは、
    共通化される前の関数の先頭アドレスを使用した関数呼び出し命令を、前記関数定義共通化ステップでの共通関数定義の先頭アドレスを使用した関数呼び出し命令に置換する
    ことを特徴とするテンプレートコンパイル方法。
  13. 請求項1記載のテンプレートコンパイル方法において、
    前記関数呼び出し置換ステップは、
    関数呼び出しが仮想関数呼び出しである場合には、仮想関数のテーブルに登録されている前記共通化される前の関数の先頭アドレスを、前記関数定義共通化ステップでの共通関数定義の先頭アドレスに置換する
    ことを特徴とするテンプレートコンパイル方法。
  14. 請求項13記載のテンプレートコンパイル方法において、
    前記関数呼び出し置換ステップは、
    前記仮想関数テーブルに登録されている前記共通化される前の関数の先頭アドレスを前記共通関数定義の先頭アドレスに置換した結果、登録されている内容が等しくなる複数の仮想関数テーブルが存在する場合には、この複数の仮想関数テーブルを、登録内容が同一の一つの共通仮想関数テーブルに置換する
    ことを特徴とするテンプレートコンパイル方法。
JP2003375776A 2003-11-05 2003-11-05 テンプレートコンパイル方法 Withdrawn JP2005141380A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2003375776A JP2005141380A (ja) 2003-11-05 2003-11-05 テンプレートコンパイル方法
CNB200410056064XA CN1313926C (zh) 2003-11-05 2004-08-10 模板编译方法
US10/914,108 US20050097530A1 (en) 2003-11-05 2004-08-10 Template compilation method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2003375776A JP2005141380A (ja) 2003-11-05 2003-11-05 テンプレートコンパイル方法

Publications (1)

Publication Number Publication Date
JP2005141380A true JP2005141380A (ja) 2005-06-02

Family

ID=34544297

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003375776A Withdrawn JP2005141380A (ja) 2003-11-05 2003-11-05 テンプレートコンパイル方法

Country Status (3)

Country Link
US (1) US20050097530A1 (ja)
JP (1) JP2005141380A (ja)
CN (1) CN1313926C (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011203960A (ja) * 2010-03-25 2011-10-13 Fujitsu Ltd テンプレートコンパイル方法及びテンプレートコンパイル装置
US10013244B2 (en) 2016-05-12 2018-07-03 Fujitsu Limited Apparatus and method to compile a variadic template function
CN112905164A (zh) * 2019-12-04 2021-06-04 北京沃东天骏信息技术有限公司 一种项目代码处理方法和装置

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7464370B2 (en) * 2003-12-04 2008-12-09 International Business Machines Corporation Creating a method from a block of code
JP4768984B2 (ja) * 2004-12-06 2011-09-07 パナソニック株式会社 コンパイル方法、コンパイルプログラムおよびコンパイル装置
US8291395B2 (en) * 2006-03-31 2012-10-16 Apple Inc. Fast function call dispatching
KR101455777B1 (ko) * 2007-02-28 2014-10-28 루돌프 테크놀로지스 인코퍼레이티드 부식 가능성이 있는 샘플의 금속부에 대한 피코초 초음파를 이용한 특성화
US8191038B1 (en) * 2007-10-09 2012-05-29 Google Inc. Using a templating language to produce a host language factory for a safe subset of a templated language
JP2009169864A (ja) * 2008-01-18 2009-07-30 Panasonic Corp コンパイル方法およびコンパイルプログラム
US20110010696A1 (en) * 2009-07-09 2011-01-13 Sun Microsystems, Inc. Duplicate virtual function table removal
JP2011028648A (ja) * 2009-07-28 2011-02-10 Renesas Electronics Corp オブジェクトコード生成システム、及びオブジェクトコード生成方法
EP2883133A4 (en) * 2012-08-08 2016-03-23 Intel Corp ISA BREAKDOWN WITH SUPPORT FOR VIRTUAL CALL TO OVERRIDING FEATURES
CN103176801B (zh) * 2013-03-18 2016-11-23 北京首开世纪科技有限公司 一种表项操作接口函数的生成方法及装置
US10296307B2 (en) * 2017-05-16 2019-05-21 International Business Machines Corporation Method and system for template extraction based on source code similarity
US10698791B2 (en) * 2018-07-28 2020-06-30 International Business Machines Corporation Handling request data with type safety in a remote service
CN109933365B (zh) * 2018-12-28 2022-08-19 蜂巢能源科技有限公司 一种函数调用树的生成方法及装置
CN110389753B (zh) * 2019-06-06 2024-01-23 五八有限公司 原生应用的链式调用方法、装置、电子设备及存储介质
CN115686459B (zh) * 2022-10-31 2023-07-25 北京力控元通科技有限公司 基于Java语言的模型生成方法、装置、设备及可读存储介质

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE19535519C2 (de) * 1995-09-25 1999-03-04 Ibm Verfahren zur Reduzierung des Umfanges von Computerprogrammen
CA2178898C (en) * 1996-06-12 2000-02-01 David Joseph Streeter Sequencing and error detection of template instantiations during compilation of c++ programs
US6519768B1 (en) * 1999-03-04 2003-02-11 International Computers Limited Instruction translation method
US6405368B1 (en) * 1999-04-16 2002-06-11 Brian Freyburger Method for separate compilation of templates
JP2001273150A (ja) * 2000-03-27 2001-10-05 Matsushita Electric Ind Co Ltd プログラム変換装置
US6760905B1 (en) * 2000-09-21 2004-07-06 Curl Corporation Lazy compilation of template-generated classes in dynamic compilation execution environments
US6968541B1 (en) * 2000-10-04 2005-11-22 International Business Machines Corporation Apparatus and method for template instantiation with a cross compiler
CA2355989A1 (en) * 2001-08-27 2003-02-27 Ibm Canada Limited-Ibm Canada Limitee Compiling source code files having multiple

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011203960A (ja) * 2010-03-25 2011-10-13 Fujitsu Ltd テンプレートコンパイル方法及びテンプレートコンパイル装置
US10013244B2 (en) 2016-05-12 2018-07-03 Fujitsu Limited Apparatus and method to compile a variadic template function
CN112905164A (zh) * 2019-12-04 2021-06-04 北京沃东天骏信息技术有限公司 一种项目代码处理方法和装置

Also Published As

Publication number Publication date
US20050097530A1 (en) 2005-05-05
CN1313926C (zh) 2007-05-02
CN1614563A (zh) 2005-05-11

Similar Documents

Publication Publication Date Title
KR101150003B1 (ko) 소프트웨어 개발 툴 생성 방법
JP2005141380A (ja) テンプレートコンパイル方法
US7962904B2 (en) Dynamic parser
US6738967B1 (en) Compiling for multiple virtual machines targeting different processor architectures
JP4057938B2 (ja) コンパイラ、コンパイル方法、及びプログラム開発ツール
US20050055681A1 (en) Compiling source code using generic classes
US5367683A (en) Smart recompilation of performing matchup/difference after code generation
US5838980A (en) Compilation and virtual machine arrangement and process for source code including pre-runtime executable language structure constructs
US20090328016A1 (en) Generalized expression trees
US6675377B1 (en) Program conversion apparatus
US20050055682A1 (en) Authoring and using generic classes in JAVA language code
JP4806158B2 (ja) マークアップ内でサブクラスを宣言的に定義し、使用するためのシステムおよび方法
US5446899A (en) Hint generation in smart recompilation
JP2009169864A (ja) コンパイル方法およびコンパイルプログラム
CN111190585A (zh) 基于字节码增强技术实现java模式匹配特性的方法
Inostroza et al. Modular interpreters for the masses: Implicit context propagation using object algebras
EP2122464A1 (en) A computer implemented translation method
Ferrarotti et al. Stepwise abstraction of high-level system specifications from source code
Seco et al. Nested OSTRICH: hatching compositions of low-code templates
JP2007122187A (ja) プログラム・コード生成装置
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
JP2022522880A (ja) プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品
WO2008015110A2 (en) Methods, apparatus and computer programs for modelling computer programs
CN114489683B (zh) 一种类java语言基于JVM的函数式编程语法实现方法
George et al. Programming language inter-conversion

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20061006

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20080630