JP2017204201A - 情報処理装置、コンパイル方法、およびコンパイルプログラム - Google Patents

情報処理装置、コンパイル方法、およびコンパイルプログラム Download PDF

Info

Publication number
JP2017204201A
JP2017204201A JP2016096559A JP2016096559A JP2017204201A JP 2017204201 A JP2017204201 A JP 2017204201A JP 2016096559 A JP2016096559 A JP 2016096559A JP 2016096559 A JP2016096559 A JP 2016096559A JP 2017204201 A JP2017204201 A JP 2017204201A
Authority
JP
Japan
Prior art keywords
argument
function
dummy
actual
arguments
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.)
Granted
Application number
JP2016096559A
Other languages
English (en)
Other versions
JP6651977B2 (ja
Inventor
昌浩 荒川
Masahiro Arakawa
昌浩 荒川
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 JP2016096559A priority Critical patent/JP6651977B2/ja
Priority to US15/485,852 priority patent/US10013244B2/en
Publication of JP2017204201A publication Critical patent/JP2017204201A/ja
Application granted granted Critical
Publication of JP6651977B2 publication Critical patent/JP6651977B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/311Functional or applicative languages; Rewrite languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】可変個引数を有するテンプレート関数のコンパイルの際における不要な関数の生成を抑制すること。
【解決手段】情報処理装置101は、図1の(1)で示すように、関数func()の処理を、関数func()の関数の演算子「...」に基づき定義されたいずれかの仮引数に対応する関数func()の呼び出し元の実引数列に含まれる実引数の数分複製する。次に、情報処理装置101は、図1の(2)で示すように、複製した数分の処理の各処理内における関数func()の仮引数のうちの仮引数args以外の他の仮引数を、各作成仮引数に置換する。そして、情報処理装置101は、図1の(3)で示すように、関数func()の処理内の再帰呼び出し部分に、置換した数分の処理のうちの実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入する。
【選択図】図1

Description

本発明は、情報処理装置、コンパイル方法、およびコンパイルプログラムに関する。
従来、ソースコード内にテンプレートと呼ばれる記載に従ったテンプレート関数を定義することがある。コンパイラは、テンプレート関数の呼び出し元の実引数の型に基づいて仮引数の型を決定し、決定した型を仮引数とする関数を生成する。さらに、可変個引数を有するテンプレート関数を定義することがある。また、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する、インライン最適化と呼ばれる技術がある。
関連する先行技術として、例えば、コンストラクタ関数の処理を仮想関数ポインタ設定文とそれ以外の文にわけ、仮想関数ポインタ設定文をクラス変数宣言の直後にインライン展開し、それ以外の文を関数の呼び元に展開するものがある。また、関数定義コードとテンプレートパラメタとの依存性を解析し、依存性がない場合には、共通関数を定義し、共通化前の複数の関数定義を削除し、共通化前の関数呼び出しを共通関数への呼び出しに置換する技術がある。
特開2002−140198号公報 特開2005−141380号公報
しかしながら、従来技術によれば、可変個引数を有するテンプレート関数をコンパイルする際に、不要な関数が生成されることがある。具体的には、可変個引数を有するテンプレート関数から生成された関数の処理をインライン最適化により呼び出し元に挿入した場合、生成された関数は他から呼び出されることがなく不要となるにも関わらず残ってしまうことがある。そして、不要な関数が多くなる分、コンパイラが使用するメモリ量が増大したり、コンパイルにかかる時間が増大したりすることになる。
1つの側面では、本発明は、可変個引数を有するテンプレート関数のコンパイルの際における不要な関数の生成を抑制することができる情報処理装置、コンパイル方法、およびコンパイルプログラムを提供することを目的とする。
本発明の一側面によれば、ソースコードに含まれる可変個の引数を有する対象のテンプレート関数の処理を、対象のテンプレート関数の可変個の引数をまとめる演算子に基づき定義されたいずれかの仮引数に対応する対象のテンプレート関数の呼び出し元の実引数列に含まれる実引数の数分複製し、複製した数分の処理の各処理内における対象のテンプレート関数の仮引数のうちのいずれかの仮引数以外の他の仮引数を、実引数列に含まれる各実引数を受け入れるために作成した各作成仮引数に置換し、各処理内における他の仮引数が対象のテンプレート関数とは異なる他の関数の実引数である場合、他の仮引数の型に合致する関数を検索する検索処理またはソースコードに含まれるテンプレート関数に基づき他の仮引数の型に合致する関数を生成する生成処理を実行し、他の関数の呼び出しを検索処理または生成処理で得られた関数の呼び出しに置換し、対象のテンプレート関数の処理内の再帰呼び出し部分に、置換した数分の処理のうちの実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入し、各処理内の再帰呼び出し部分に、各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理を挿入する情報処理装置、コンパイル方法、およびコンパイルプログラムが提案される。
本発明の一態様によれば、可変個引数を有するテンプレート関数のコンパイルの際における不要な関数の生成を抑制することができるという効果を奏する。
図1は、本実施の形態にかかる情報処理装置101の動作例を示す説明図である。 図2は、テンプレート関数のインスタンシェートの一例を示す説明図である。 図3は、情報処理装置101のハードウェア構成例を示す説明図である。 図4は、情報処理装置101の機能構成例を示す説明図である。 図5は、ソースコードsrcの一例を示す説明図である。 図6は、ソースコードsrcのインスタンシェートの結果の一例を示す説明図である。 図7は、ソースコードsrcの中間言語1情報421の一例を示す説明図である。 図8は、関数パラメタパック展開の過程を示す説明図(その1)である。 図9は、関数パラメタパック展開の過程を示す説明図(その2)である。 図10は、関数パラメタパック展開の過程を示す説明図(その3)である。 図11は、関数パラメタパック展開の過程を示す説明図(その4)である。 図12は、関数パラメタパック展開後の中間言語1情報422の一例を示す説明図である。 図13は、関数パラメタパック展開後のソースイメージの一例を示す説明図である。 図14は、コンパイル処理手順の一例を示すフローチャートである。 図15は、関数パラメタパック展開処理手順の一例を示すフローチャート(その1)である。 図16は、関数パラメタパック展開処理手順の一例を示すフローチャート(その2)である。
以下に図面を参照して、開示の情報処理装置、コンパイル方法、およびコンパイルプログラムの実施の形態を詳細に説明する。
図1は、本実施の形態にかかる情報処理装置101の動作例を示す説明図である。図1に示す情報処理装置101は、コンパイルを行うコンピュータである。例えば、情報処理装置101は、利用者が用意したソースコードをコンパイルして、実行可能なプログラムを作成する。以下、実行可能なプログラムを、「オブジェクトプログラム」と称する。ここで、作成したオブジェクトプログラムは、情報処理装置101をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。また、情報処理装置101は、例えば、ハイ・パフォーマンス・コンピューティング(HPC:High Performance Computing)分野で使用されるコンピュータである。
利用者が用意したソースコードは、プログラム言語に従って記述される。プログラム言語としては、C++がある。C++では、テンプレートと呼ばれる記載に従ったテンプレート関数を定義することができる。C++の規格に従ったコンパイラは、テンプレート関数の呼び出し元の実引数の型に基づいて仮引数の型を決定し、決定した型を仮引数とする関数を生成するという、テンプレート関数のインスタンシェートと呼ばれる処理を実行する。テンプレート関数のインスタンシェートの一例については、図2で説明する。ここで、仮引数とは、関数で定義される変数のうち、実行時に呼び出し元から渡される値を受け入れる変数である。これに対し、実引数とは、関数を呼び出す際に、関数に渡す値である。仮引数と実引数とを総称して、「引数」と呼ばれる。
さらに、C++11(ISO(International Organization for Standardization)/IEC(International Electrotechnical Commission) 14882:2011)から採用された可変個引数テンプレートには、引数の可変個部分を一括して処理するためのパラメタパックが導入されている。テンプレート引数には、型情報リストを一括して処理するテンプレートパラメタパックがある。また、テンプレート関数の引数には、テンプレートパラメタパックの型情報が適用された引数リストを一括して処理するための関数パラメタパックがある。具体的には、可変個の引数をまとめる演算子「...」に基づき定義された仮引数は、その仮引数の関数の呼び出し元の実引数列が渡される。「...」は、pack演算子やunpack演算子と呼ばれる。例えば、下記のように、テンプレート関数が定義されているとする。
template <class TH,class... Args>
void func(TH head,Args... args)


上述の定義では、仮引数argsは、「Args...」というunpack演算子「...」が付与された型で定義されている。これに対し、例えば、「func(1,2L,3u);」という呼び出しがある場合、仮引数argsには、{2L,3u}というように、呼び出し元の実引数がまとめられた実引数列が渡される。また、他の例として「func(1,2L,3u,4.0F,5.0);」という呼び出しがある場合、仮引数argsには、{2L,3u,4.0F,5.0}というような実引数列が渡される。すなわち、上述の定義では、仮引数argsは、関数func()の第二引数であるため、呼び出し元の実引数列のうちの二番目以降の実引数列が渡される。このように、呼び出し元の実引数列のうち、テンプレート関数における関数パラメタパックとなる仮引数の位置に応じた実引数を先頭とした実引数列が、関数パラメタパックとなる仮引数に渡されることになる。
また、関数の読み出し元に、呼び出された関数の処理を挿入することにより、関数の呼び出しにかかるオーバヘッドを削減する、インライン最適化と呼ばれる技術がある。
このように、C++では、クラスやテンプレート等により生産性の向上が図られている。しかしながら、可変個引数を有するテンプレート関数をコンパイルする際に、不要な関数が生成されることがある。具体的には、可変個引数を有するテンプレート関数から生成された関数の処理をインライン最適化により呼び出し元に挿入した場合、生成された関数は他から呼び出されることがなく不要となるにも関わらず残ってしまうことがある。そして、不要な関数が多くなる分、コンパイラが使用するメモリ量が増大したり、コンパイルにかかる時間が増大したりすることになる。
すなわち、インライン最適化を使わないと、再帰呼び出し関数のコードを展開することができないが、インライン最適化を行ったとしても不要関数が残ってしまうと、翻訳性能に悪影響を及ぼすことになる。
そこで、本実施の形態では、可変個の仮引数を持つテンプレート関数のコンパイル時、可変個の仮引数に渡す実引数分、関数の処理を複製した各処理内の仮引数を実引数の受け入れ用の仮引数に置換し、関数の再帰呼び出し部分に順次挿入することについて説明する。
図1を用いて、情報処理装置101の動作例について説明する。情報処理装置101は、ソースコードsrcを記憶する。ソースコードsrcには、コード102として、可変個の引数を有するテンプレート関数func()と、コード103として、関数func()を呼び出す関数main()とを含む。また、コード102には、関数func()の処理として、コード104が含まれる。
本実施の形態では、テンプレート関数func()が、可変個の引数、すなわち、関数パラメタパックを有するので、関数パラメタパックの展開を行う。ここで、情報処理装置101は、各関数について、関数パラメタパックの展開を行う対象となるか判定する。具体的な判定基準については、図7で説明する。図1の例では、情報処理装置101は、関数funcを、パラメタパックの展開を行う対象のテンプレート関数であると判定する。以下、パラメタパックの展開を行う対象のテンプレート関数を、「対象の関数」と呼称する場合がある。
情報処理装置101は、図1の(1)で示すように、関数func()の処理を、関数func()の関数の「...」に基づき定義されたいずれかの仮引数に対応する関数func()の呼び出し元の実引数列に含まれる実引数の数分複製する。図1の場合、関数パラメタパックとなるいずれかの仮引数は、演算子「...」に基づき定義されたargsとなる。そして、仮引数argsに対応する実引数列は、コード103内で関数func()を呼び出している「func(1,2L,3u)」のうちの{2L,3u}となり、その実引数列に含まれる実引数の数は、2つとなる。また、関数パラメタパックに渡される実引数の個数は、下記(1)式で算出することができる。
関数パラメタパックに渡される実引数の個数=関数呼び出しの実引数の数−関数パラメタパックの位置+1 …(1)
従って、情報処理装置101は、関数func()の処理となるコード104を、2つ分複製する。コード104を複製することにより、情報処理装置101は、コード111、112を得る。
次に、情報処理装置101は、図1の(2)で示すように、複製した数分の処理の各処理内における関数func()の仮引数のうちの仮引数args以外の他の仮引数を、各作成仮引数に置換する。ここで、関数func()の仮引数のうちの仮引数args以外の他の仮引数は、第一引数であるheadとなる。他の仮引数は、1つである場合もあるし、複数である場合もある。また、作成仮引数は、仮引数argsに対応する実引数列{2L,3u}に含まれる各実引数を受け入れるために作成した仮引数である。具体的には、情報処理装置101は、情報処理装置101のメモリ上に、(1)式で得られた数分の作成仮引数を生成する。このとき、各作成仮引数の名称は、その各作成仮引数が参照される範囲内で他の仮引数、他の作成仮引数、ローカル変数等と区別がつけばどのような名称でもよい。そして、各作成仮引数の型は、対応する各実引数の型と同じとする。また、各作成仮引数は、情報処理装置101のメモリ上に作成されるが、各作成仮引数の順番はどのようなものでもよい。以下では、説明を簡略化するため、各作成仮引数の順番は、対応する各実引数の順番と同一であるものとする。
具体的には、情報処理装置101は、コード111内における「head」を、実引数列の一番目の実引数2Lを受け入れるために作成した作成仮引数args1に置換する。作成仮引数args1の型は、実引数2Lに対応するlongとなる。さらに、情報処理装置101は、コード112内における「head」を、実引数列の二番目の実引数3uを受け入れるために作成した作成仮引数args2に置換する。作成仮引数args2の型は、実引数3uに対応するunsigned intとなる。
さらに、情報処理装置101は、コード111、112内の仮引数argsと「...」とが結合した文字列「args...」を、各作成仮引数に受け入れられる実引数より後ろ全ての実引数のそれぞれを受け入れる作成仮引数に置換する。ここで、「args...」の意味は、argsにまとめられた実引数列を展開することを示す。具体的には、コード111では、情報処理装置101は、文字列「args...」を、コード111における作成仮引数「args1」に受け入れられる実引数2Lより後ろ全ての実引数として、3uを受け入れる作成仮引数args2に置換する。また、コード112では、情報処理装置101は、コード111における作成仮引数「args1」に受け入れられる実引数3uより後ろの実引数はないので、この場合、文字列「args...」を空文字列“”に置換する。
ここで、情報処理装置101は、複製した各処理内における他の仮引数が関数func()とは異なる他の関数の実引数である場合、検索処理または生成処理を実行し、他の関数の呼び出しを検索処理または生成処理で得られた関数の呼び出しに置換する。ここで、検索処理は、他の仮引数の型に合致する関数を検索する処理である。また、生成処理は、ソースコードsrcに含まれるテンプレート関数に基づき他の仮引数の型に合致する関数を生成する、テンプレート関数のインスタンシェートである。図1の例では、他の仮引数となるheadが、関数func()とは異なる他の関数の実引数とはなっていないため、情報処理装置101は、検索処理または生成処理で得られた関数の呼び出しに置換する処理を行わない。検索処理または生成処理で得られた関数の呼び出しに置換する処理の一例については、図11で説明する。
そして、情報処理装置101は、図1の(3)で示すように、関数func()の処理内の再帰呼び出し部分に、置換した数分の処理のうちの実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入する。さらに、情報処理装置101は、各処理内の再帰呼び出し部分に、各処理の次の処理を挿入する。ここで、各処理の次の処理を、実引数の順番を用いて説明すると、次の処理とは、各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理となる。
具体的には、関数func()の再帰呼び出し部分に、コード121を挿入する。さらに、情報処理装置101は、コード121の再帰呼び出し部分に、コード121の作成仮引数args1に受け入れられる実引数2Lの次の位置の実引数3uを受け入れる作成仮引数args2に置換したコード122を挿入する。
以上により、情報処理装置101は、不要となる関数の作成を抑制することができる。そして、不要となる関数の作成が抑制されることにより、最適化の入力となるコードを削減し、最適化の処理時間や必要なメモリ量を削減することができる。次に、テンプレート関数のインスタンシェートの一例を、図2を用いて説明する。
図2は、テンプレート関数のインスタンシェートの一例を示す説明図である。テンプレート関数のインスタンシェートによる実体生成では、実引数の情報に基づいて仮引数の情報を生成する。例えば、図2で示すソースコード201は、テンプレート関数foo()を含むプログラムである。テンプレート関数foo()は、仮引数として、テンプレート引数paramを含む。
そして、コンパイラは、テンプレート関数foo()の呼び出しを検出した場合、テンプレート関数foo()のインスタンシェートを行う。この際、コンパイラは、実引数10から仮引数の型intを決定し、コード202として「void foo(int param){}」というように、実引数に対応した関数foo()を生成する。このように、本実施の形態では、型情報を用いたテンプレート関数のインスタンシェートを対象とする。次に、情報処理装置101のハードウェア構成図について、図3を用いて説明する。
(情報処理装置101のハードウェア構成図)
図3は、情報処理装置101のハードウェア構成例を示す説明図である。図3において、情報処理装置101は、CPU(Central Processing Unit)301と、ROM(Read−Only Memory)302と、RAM(Random Access Memory)303と、を含む。また、情報処理装置101は、ディスクドライブ304およびディスク305と、通信インターフェース306と、を含む。また、CPU301〜ディスクドライブ304、通信インターフェース306はバス307によってそれぞれ接続される。
CPU301は、情報処理装置101の全体の制御を司る演算処理装置である。また、情報処理装置101は、複数のCPUを有してもよい。ROM302は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。RAM303は、CPU301のワークエリアとして使用される揮発性メモリである。
ディスクドライブ304は、CPU301の制御に従ってディスク305に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ304には、例えばディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク305は、ディスクドライブ304の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ304が磁気ディスクドライブである場合、ディスク305には、磁気ディスクを採用することができる。また、ディスクドライブ304が光ディスクドライブである場合、ディスク305には、光ディスクを採用することができる。また、ディスクドライブ304がソリッドステートドライブである場合、ディスク305には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
通信インターフェース306は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース306は、通信回線を通じてネットワークを介して情報処理装置101を利用する利用者端末等の他の装置に接続される。通信インターフェース306には、例えば、モデムやLAN(Local Area Network)アダプタなどを採用することができる。
また、情報処理装置101の管理者が、情報処理装置101を直接操作する場合、情報処理装置101は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
(情報処理装置101の機能構成図)
図4は、情報処理装置101の機能構成例を示す説明図である。情報処理装置101は、制御部400を有する。制御部400は、構文・意味解析部401と、関数パラメタパック展開部402と、中間言語変換部403と、最適化・コード生成部404と、を含む。制御部400は、記憶装置に記憶されたプログラムをCPU301が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図3に示したROM302、RAM303、ディスク305などである。また、各部の処理結果は、RAM303や、CPU301のレジスタ、CPU301のキャッシュメモリ等に格納される。
ここで、コンパイルの工程には、字句解析、構文解析、意味解析を行うフロントエンドと、最適化処理やコード生成を行うバックエンドとがある。フロントエンドは、プログラム言語の仕様に依存する処理であり、ターゲットのアーキテクチャには依存しない。一方、バックエンドは、プログラム言語の仕様には依存せず、ターゲットのアーキテクチャに依存する処理である。構文・意味解析部401〜中間言語変換部403は、フロントエンドに含まれる。また、最適化・コード生成部404は、バックエンドに含まれる。
また、情報処理装置101は、ソースコードsrc、中間言語1情報421、関数パラメタパック展開後の中間言語1情報422、中間言語2情報423、オブジェクトプログラムobjにアクセス可能である。ソースコードsrc、中間言語1情報421〜中間言語2情報423は、RAM303、ディスク305といった記憶装置に格納されている。
構文・意味解析部401は、ソースコードsrcを読み込んで、構文解析、意味解析を行い、中間言語1情報421を生成する。ソースコードsrcの一例を、図5で示す。また、中間言語1情報421の一例を、図7で示す。
関数パラメタパック展開部402は、中間言語1情報421から、関数パラメタパックを展開し、関数パラメタパック展開後の中間言語1情報422を生成する。関数パラメタパック展開後の中間言語1情報422の一例を、図12で示す。また、関数パラメタパック展開部402は、複製部411と、置換部412と、挿入部413とを含む。図4の説明では、関数パラメタパックを有する対象のテンプレート関数を、対象の関数と呼ぶ。
複製部411は、ソースコードsrcに含まれる対象の関数の処理を、unpack演算子「...」に基づき定義されたいずれかの仮引数に対応する対象の関数の呼び出し元の実引数列に含まれる実引数の数分複製する。
置換部412は、複製部411が複製した数分の処理の各処理内における対象の関数の仮引数のうちのいずれかの仮引数以外の他の仮引数を、実引数列に含まれる各実引数を受け入れるために作成した各作成仮引数に置換する。
また、置換部412は、各処理内における他の仮引数が対象の関数とは異なる他の関数の実引数である場合、検索処理または生成処理を実行し、他の関数の呼び出しを検索処理または生成処理で得られた関数の呼び出しに置換する。
また、置換部412は、各処理内における他の仮引数を各作成仮引数に置換するとともに、各処理内におけるいずれかの仮引数を、各作成仮引数に受け入れられる実引数より後ろ全ての実引数のそれぞれを受け入れる作成仮引数に置換する。
挿入部413は、対象の関数の処理内の再帰呼び出し部分に、置換した数分の処理のうちの実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入する。さらに挿入部413は、各処理内の再帰呼び出し部分に、各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理を挿入する。
ここで、ソースコードsrcには、仮引数がなく対象のテンプレート関数と同一名称の関数が含まれる。そして、挿入部413は、置換部412が置換した数分の処理のうちの実引数列の末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分に、前述の同一名称の関数の処理を挿入する。
また、ソースコードには、仮引数がなく対象のテンプレート関数と同一名称の第1の関数と、仮引数が1つであり対象のテンプレート関数と同一名称の第2の関数とが含まれてもよい。そして、挿入部413は、置換した数分の処理のうちの実引数列の末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分に、第1の関数または第2の関数のうちの当該再帰呼び出し部分の実引数に応じた関数の処理を挿入する。例えば、挿入部413は、末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分において、実引数が0個であれば第1の関数の処理を挿入し、実引数が1個であれば第2の関数の処理を挿入する。
中間言語変換部403は、関数パラメタパック展開後の中間言語1情報422から、中間言語2情報423を生成する。最適化・コード生成部404は、中間言語2情報423からオブジェクトプログラムobjを生成する。
図5は、ソースコードsrcの一例を示す説明図である。図5では、関数パラメタパックを使用したソースコードsrcを示す。ソースコードsrc内のコード501は、引数なし復帰値なしの関数func()を記載したコードである。また、ソースコードsrc内のコード502は、テンプレート関数func()を記載したコードである。また、ソースコードsrc内のコード503は、引数なし復帰値int型の関数main()を記載したコードである。
さらに、コード502の1行目には、テンプレート引数が定義されており、具体的には、テンプレートパラメタパック「Args」が定義されている。また、コード502の2行目には、関数パラメタパックが適用された関数func()が定義されており、さらに、テンプレートパラメタパックの型情報「Args」が適用された仮引数「args」が定義されている。ここで、仮引数「args」等の前に付与された「...」は、pack演算子と呼ばれる。また、コード502の5行目には、コード511として、関数パラメタパックが適用された関数func()の参照が定義されている。このように、コード502は、再帰呼び出しがある。
コード503の3行目には、コード512として、関数パラメタパックが適用された関数func()への引数渡しが定義されている。次に、ソースコードsrcのインスタンシェートの結果を、図6を用いて説明する。
図6は、ソースコードsrcのインスタンシェートの結果の一例を示す説明図である。図2で示したテンプレート関数のインスタンシェートと同様に、関数パラメタパックを有するテンプレート関数の場合にも、同様に仮引数の情報が生成される。図6のインスタンシェート結果600が示すように、ソースコードsrcのインスタンシェートの結果、関数601〜605が生成される。なお、図6に示すインスタンシェート結果600は、処理系が生成する中間言語をソースイメージで表現したものである。
関数601は、コード511、すなわち、「func(1,2L,3u,4.0F,5.0);」の呼び出しから生成された関数func()である。関数601は、コード611として、func()の再帰呼び出しがある。
関数602は、コード611、すなわち、「func(args1,args2,args3,args4);」の呼び出しから生成された関数func()である。関数602は、コード612として、func()の再帰呼び出しがある。
関数603は、コード612、すなわち、「func(args1,args2,args3);」の呼び出しから生成された関数func()である。関数603は、コード613として、func()の再帰呼び出しがある。
関数604は、コード613、すなわち、「func(args1,args2);」の呼び出しから生成された関数である。関数func()604は、コード614として、func()の再帰呼び出しがある。
関数605は、コード614、すなわち、「func(args1);」の呼び出しから生成された関数func()である。関数605は、コード615として、func()の再帰呼び出しがある。
関数601〜605のうち、関数602〜605は、コード511に記載された関数パラメタパックの参照から間接的に生成されるものであるため、関数602〜605の呼び出し箇所は、翻訳単位に閉じている。
このように、ソースコードsrcのインスタンシェートの結果、関数601〜605が生成されるが、コード511から直接呼び出されるのは関数601であり、関数602〜605は、関数601から呼び出される。ここで、関数602〜605の処理を、関数601内に展開することができれば、関数602〜605を削除することが可能である。図7〜図13を用いて、関数602〜605を生成しないようにする方法について説明する。まず、パラメタパック展開前となる中間言語1情報421の一例を、図7を用いて説明する。
図7は、ソースコードsrcの中間言語1情報421の一例を示す説明図である。図7に示す中間言語1情報421は、テンプレート関数func情報701と、関数main情報702とを含む。
テンプレート関数func情報701は、仮引数情報711と、テンプレート関数func内のfuncの呼び出し式情報712とを含む。仮引数情報711は、第一引数がheadであり、第二引数がargsであることを示す。また、仮引数情報711は、仮引数headのパラメタパックがFALSEであり、型がテンプレートパラメタとなることを示す。同様に、仮引数情報711は、仮引数argsのパラメタパックがTRUEであり、型がテンプレートパラメタとなることを示す。
テンプレート関数func内のfuncの呼び出し式情報712は、関数情報funcの呼び出しに用いる情報として、実引数情報721を含む。実引数情報721は、第一引数として、型が、第二引数のテンプレートパラメタであり、パラメタパックの展開がTRUEとなることを示す。
関数main情報702は、main関数内のfuncの呼び出し式情報731を含む。main関数内のfuncの呼び出し式情報731は、関数情報funcの呼び出しに用いる情報として、実引数情報741を含む。実引数情報741は、第一引数の型がint型であり、第一引数の値が1であることを示す。また、実引数情報741は、第二引数の型がlong型であり、第二引数の値が2Lであることを示す。また、実引数情報741は、第三引数の型がunsigned int型であり、第三引数の値が3uであることを示す。また、実引数情報741は、第四引数の型がfloat型であり、第四引数の値が4.0Fであることを示す。また、実引数情報741は、第五引数の型がdouble型であり、第五引数の値が5.0であることを示す。
次に、テンプレート関数func()について、関数パラメタパックを利用した再帰呼び出し関数の展開方法について、図8〜図11を用いて説明する。まず、情報処理装置101は、パラメタパックの展開を行うか否かの判定のため、以下の4つの条件を全て満たすかを判断する。この条件の具体的なフローチャートは、図15で示す。
1つ目の条件は、パラメタパックの展開を行うか否かの判定対象となる関数が、テンプレート関数であることである。2つ目の条件は、前述の判定対象の関数内に、再帰呼び出しがあることである。3つ目の条件は、その再帰呼び出しの実引数が、関数パラメタパックの仮引数であることである。4つ目の条件は、その再帰呼び出しの実引数以外で、関数パラメタパックの仮引数が参照されていないことである。4つ目の条件が満たされない場合、インライン展開が複雑となるため、本実施の形態では、インライン最適化を行わないものとする。
コード502に含まれるテンプレート関数func()は、上述した4つの条件全てを満たすため、関数パラメタパックの展開を行う対象のテンプレート関数となる。次に、図8〜図11を用いて、関数パラメタパック展開の過程を示す。
図8は、関数パラメタパック展開の過程を示す説明図(その1)である。まず、情報処理装置101は、テンプレート関数func()の本体の中間言語情報、すなわち、テンプレート関数func情報701を複製する。次に、情報処理装置101は、テンプレート関数func()の関数パラメタパックに渡される実引数の個数を算出する。具体的には、情報処理装置101は、(1)式に従って、関数パラメタパックに渡される実引数の個数を算出する。(1)式における関数パラメタパックの位置は、コード502の例では、「args」の位置は左から2番目であるため、2となる。従って、コード502では、関数パラメタパックに渡される実引数の個数は、5−2+1=4となる。また、関数パラメタパックに渡される実引数列は、{2L,3u,4.0F,5.0}となる。
そして、情報処理装置101は、算出した実引数の個数分の仮引数の中間言語情報を作成する。ここで、作成の元となる情報は、関数パラメタパックの仮引数の中間言語情報である。図8の例では、情報処理装置101は、仮引数情報711の第二引数の中間言語情報に基づいて、4つ分の仮引数の中間言語情報801〜804を作成する。ここで、中間言語情報801〜804の4つの仮引数は、関数パラメタパックに渡される実引数を受け入れる引数であり、図1で前述した作成仮引数となる。情報処理装置101は、作成した中間言語情報801〜804を、複製したテンプレート関数func情報701に登録する。
また、中間言語情報801〜804の作成仮引数の型は、関数呼び出しの実引数の型と同じとする。具体的には、中間言語情報801の作成仮引数の型は、関数呼び出しの実引数のうち、関数パラメタパックの仮引数の位置の実引数の型であるlongとなる。また、中間言語情報802の型は、関数パラメタパックの仮引数の位置を基準として2番目に位置する実引数の型であるunsigned intとなる。また、中間言語情報803の型は、関数パラメタパックの仮引数の位置を基準として3番目に位置する実引数の型であるfloatとなる。また、中間言語情報804の型は、関数パラメタパックの仮引数の位置を基準として4番目に位置する実引数の型であるdoubleとなる。また、中間言語情報801〜804の作成仮引数の名称は、図1で説明したように、その作成仮引数が参照される範囲内で他の仮引数や変数と区別がつけばどのような名称でもよい。図8の例では、中間言語情報801〜804の作成仮引数の名称は、それぞれ、関数パラメタパックの仮引数「args」に番号を付与したargs1〜4とする。
図9は、関数パラメタパック展開の過程を示す説明図(その2)である。次に、情報処理装置101は、算出した実引数の個数分の対象の関数本体の処理、具体的には文、式といったコードを複製する。図9の例では、情報処理装置101は、テンプレート関数func()の本体の処理であるコード900を、4つ分複製し、複製コード901〜904を得る。
そして、情報処理装置101は、複製コード901〜904のそれぞれについて、複製コード内で参照している関数パラメタパックの仮引数ではない他の仮引数を、作成した中間言語情報の作成仮引数に置換する。さらに、情報処理装置101は、複製コード901〜904のそれぞれについて、複製コード内で参照している関数パラメタパックの仮引数を、置換した作成仮引数に受け入れられる実引数より後ろ全ての実引数のそれぞれを受け入れる作成仮引数に置換する。
ここで、関数パラメタパックの仮引数ではない他の仮引数は、図9の例では、headとなる。例えば、複製コード901の場合、情報処理装置101は、複製コード901内のheadを、中間言語情報801の作成仮引数args1に置換する。さらに、情報処理装置101は、複製コード901内のargs...を、仮引数args1に受け入れられる実引数より後ろの全ての実引数を受け入れる各作成仮引数、すなわちargs2、args3、args4に置換し、置換後の複製コード911を得る。
同様に、情報処理装置101は、複製コード902内のheadを、中間言語情報802の仮引数args2に置換し、複製コード902内のargs...を、作成仮引数args3、args4に置換する。置換後、情報処理装置101は、置換後の複製コード912を得る。同様に、情報処理装置101は、複製コード903内のheadを、中間言語情報803の仮引数args3に置換し、複製コード903内のargs...を、作成仮引数args4に置換する。置換後、情報処理装置101は、置換後の複製コード913を得る。
また、複製コード904の置換において、args4に受け入れられる実引数より後ろの実引数はない。従って、情報処理装置101は、複製コード904内のheadを、中間言語情報804の仮引数args4に置換し、複製コード904内のargs...を、引数なしとして“”に置換する。
ここで、関数パラメタパックの仮引数ではない仮引数が、対象の関数とは異なる他の関数の実引数となる場合もある。この場合の処理については、図11で説明する。
図10は、関数パラメタパック展開の過程を示す説明図(その3)である。次に、情報処理装置101は、対象の関数本体にある再帰呼び出し部分に、置換した複製コードを順次挿入する。ここで、挿入する複製コードは、図9で、仮引数を置換した複製コードとなることもあるし、図11で説明する、関数を置換した複製コードとなることもある。例えば、図10の例では、情報処理装置101は、コード900の再帰呼び出し部分となる「func(args...);」に、複製コード911を挿入する。そして、情報処理装置101は、複製コード911の再帰呼び出し部分となる「func(args2,args3,args4);」に、複製コード912を挿入する。このように、情報処理装置101は、対象の関数本体にある再帰呼び出し部分に、置換した複製コードを順次挿入する。図10の上部に示す結果が、コード900の再帰呼び出し部分に、置換後の複製コード911〜914を順次挿入した結果となる。
ただし、対象の関数が復帰値を返す場合、情報処理装置101は、複製コード内にある再帰呼び出しの結果の値を、元の再帰呼び出しの結果の値として利用できるように代入処理を追加する。例えば、対象の関数の最後が、「return a+b;」となっているとする。この場合、情報処理装置101は、複製コード内の「return」を削除するとともに、a+bの結果を一時変数に記憶するコードを生成し、さらに、元の再帰呼び出しの結果が格納される変数に、一時変数の値を代入する代入処理を追加する。
対象の関数本体にある再帰呼び出し部分に、置換した複製コードを順次挿入した後、最後の複製コード内の再帰呼び出しについては、予め用意してある引数なしの関数本体の処理で置換する。図10の例では、複製コード914の「func();」に、コード501の処理で置換する。また、復帰値がある場合には、情報処理装置101は、前述の処理と同様に、代入処理を行う。図10下部に示す結果が、複製コード914の再帰呼び出し部分に、コード501の処理を挿入した結果となる。
また、図10の例では、最後の複製コード内の再帰呼び出しが実引数なしとなっているが、実引数ありとなる場合もある。例えば、テンプレート関数の中間言語情報に、3つの仮引数の情報があり、1つ目と2つ目との仮引数のパラメタパックがFALSEとなり、3つ目の仮引数のパラメタパックがTRUEとなる場合である。この場合、関数呼び出しの実引数の数が奇数個である場合、最後の複製コード内の再帰呼び出しの実引数が1個となる場合と、実引数が0個となる場合とがありえる。従って、プログラムの作成者は、予め、仮引数がない第1の関数と仮引数が1個の第2の関数とを用意しておく。なお、関数呼び出しの実引数の数が偶数個である場合、最後の複製コード内の再帰呼び出しの実引数は0となる。
そして、情報処理装置101は、最後の複製コード内の再帰呼び出しの実引数が0個であれば、第1の関数の処理を挿入し、実引数が1個であれば、第2の関数の処理を挿入する。
次に、関数パラメタパックの仮引数ではない仮引数が、対象の関数とは異なる他の関数の実引数となる場合について、図11を用いて説明する。
図11は、関数パラメタパック展開の過程を示す説明図(その4)である。図11で示すソースコードsrc1の処理では、コード1101に示すように、ソースコードsrcの処理に加え、対象の関数とは異なる他の関数として、func1()関数の呼び出しと、func2()関数の呼び出しとを含むものである。複製コード1111、1112は、コード1101を複製したものである。さらに、ソースコードsrc1には、コード1102として「void func1(long param)」という関数の処理と、コード1103として「void func1(unsigned int param)」という関数の処理とを含む。さらに、ソースコードsrc1には、コード1104として「template <class T>void func2(T param)」というテンプレート関数の定義を含む。
また、情報処理装置101は、図8で示した手順に従って作成した中間言語情報1121、1122を有する。中間言語情報1121は、作成仮引数の名称がargs1であり、作成仮引数の型がlong型であることを示す。また、中間言語情報1122は、作成仮引数の名称がargs2であり、作成仮引数の型がunsigned int型であることを示す。
情報処理装置101は、関数パラメタパックの仮引数ではない仮引数が、対象の関数とは異なる他の関数の実引数となる場合、中間言語情報の型に基づいて、他の関数を検索する検索処理または、インスタンシェートにより関数を生成する生成処理を実行する。図11の場合、情報処理装置101は、複製コード1111について、検索処理として、関数名がfunc1であり、args1の型であるlongを仮引数に持つ関数を、ソースコードsrc1から検索する。この場合、情報処理装置101は、コード1102を検出し、複製コード1111内のfunc1(head);を、検索処理により検出したfunc1(args1);に変換する。
また、情報処理装置101は、複製コード1111について、検索処理として、関数名がfunc2であり、longを仮引数に持つ関数を検索する。この場合、情報処理装置101は、条件にあった関数を見つけることができないが、コード1104で定義したテンプレート関数func2を検出することができる。従って、情報処理装置101は、生成処理として、コード1104から、longを仮引数に持つ関数func2を生成する。そして、情報処理装置101は、複製コード1111内のfunc2(head);を、生成処理により検出したfunc2(args1);に変換する。情報処理装置101は、複製コード1112についても同様に、検索処理または生成処理を実行する。
図12は、関数パラメタパック展開後の中間言語1情報422の一例を示す説明図である。図12に示す関数パラメタパック展開後の中間言語1情報422は、関数func情報1201と、関数main情報702とを含む。関数main情報702は、図7と同一の情報であるため、説明を省略する。
関数func情報1201は、仮引数情報1211を有する。仮引数情報1211は、第一引数がheadであり、第一引数の型がintであることを示す。また、仮引数情報1211は、第二引数がargs1であり、第二引数の型がlongであることを示す。また、仮引数情報1211は、第三引数がargs2であり、第三引数の型がunsigned intであることを示す。また、仮引数情報1211は、第四引数がargs3であり、第四引数の型がfloatであることを示す。また、仮引数情報1211は、第五引数がargs4であり、第五引数の型がdoubleであることを示す。
図13は、関数パラメタパック展開後のソースイメージの一例を示す説明図である。図13に示すプログラム1301は、本実施の形態を実施することにより生成される関数パラメタパック展開後の中間言語1情報422を、ソースイメージで表現したものである。
次に、情報処理装置101が行うコンパイル処理のフローチャートについて、図14〜図16を用いて説明する。
図14は、コンパイル処理手順の一例を示すフローチャートである。情報処理装置101は、ソースコードsrcを読み込んで解析し、中間言語1情報421を生成する(ステップS1401)。次に、情報処理装置101は、関数パラメタパックを持つテンプレート関数か否かを判断する(ステップS1402)。関数パラメタパックを持つテンプレート関数である場合(ステップS1402:Yes)、情報処理装置101は、関数パラメタパック展開処理を実行する(ステップS1403)。関数パラメタパック展開処理については、図15、図16で説明する。
ステップS1403の処理終了後、または、関数パラメタパックを持つテンプレート関数でない場合(ステップS1402:No)、情報処理装置101は、中間言語変換部以降を実施してオブジェクトプログラムobjを生成する(ステップS1404)。ステップS1404の処理終了後、情報処理装置101は、コンパイル処理を終了する。
図15は、関数パラメタパック展開処理手順の一例を示すフローチャート(その1)である。また、図16は、関数パラメタパック展開処理手順の一例を示すフローチャート(その2)である。情報処理装置101は、テンプレート関数内に再帰呼び出しがあるか否かを判断する(ステップS1501)。
テンプレート関数内に再帰呼び出しがない場合(ステップS1501:No)、情報処理装置101は、関数パラメタパック展開による中間言語1情報422を生成する(ステップS1505)。ステップS1505の処理を行うと、情報処理装置101は、図6に相当する中間言語1情報を生成する。ステップS1505の処理終了後、情報処理装置101は、関数パラメタパック展開処理を終了する。
一方、テンプレート関数内に再帰呼び出しがある場合(ステップS1501:Yes)、情報処理装置101は、呼び出し時の実引数が関数パラメタパックの仮引数か否かを判断する(ステップS1502)。呼び出し時の実引数が関数パラメタパックの仮引数である場合(ステップS1502:Yes)、情報処理装置101は、関数パラメタパックの仮引数の参照が呼び出しの実引数だけか否かを判断する(ステップS1503)。関数パラメタパックの仮引数の参照が呼び出しの実引数だけである場合(ステップS1503:Yes)、情報処理装置101は、テンプレート関数と同一名称の引数を持たない関数があるか否かを判断する(ステップS1504)。
呼び出し時の実引数が関数パラメタパックの仮引数でない場合(ステップS1502:No)、または、関数パラメタパックの仮引数の参照が呼び出しの実引数以外にある場合(ステップS1503:No)、テンプレート関数と同一名称の引数を持たない関数がない場合(ステップS1504:No)、情報処理装置101は、ステップS1505の処理に移行する。
テンプレート関数と同一名称の引数を持たない関数がある場合(ステップS1504:Yes)、情報処理装置101は、再帰呼び出し以外のテンプレート関数の呼び出し式を探索する(ステップS1601)。次に、情報処理装置101は、呼び出し式が見つかったか否かを判断する(ステップS1602)。
呼び出し式が見つかった場合(ステップS1602:Yes)、情報処理装置101は、テンプレート関数本体の中間言語情報を複製する(ステップS1603)。次に、情報処理装置101は、関数パラメタパックに渡される実引数の数を算出する(ステップS1604)。そして、情報処理装置101は、「関数パラメタパックに渡される実引数の数」の個数分の作成仮引数を表す中間言語情報を作成する(ステップS1605)。ステップS1605の処理を実行すると、情報処理装置101は、図8相当の中間言語情報を作成する。
次に、情報処理装置101は、作成した中間言語情報を、複製したテンプレート関数本体の仮引数情報の関数パラメタパックの仮引数情報に置換する(ステップS1606)。ステップS1606の処理について、図7、図8を用いて説明する。情報処理装置101は、複製したテンプレート関数本体の仮引数情報711の第二引数の部分を、図8で作成した中間言語情報801〜804に置換する。
そして、情報処理装置101は、「関数パラメタパックに渡される実引数の数」の個数分、テンプレート関数のコードを複製する(ステップS1607)。次に、情報処理装置101は、複製した複製コード内で参照されている関数パラメタパックの仮引数情報を、複製した仮引数情報に順次置換する(ステップS1608)。
そして、情報処理装置101は、複製コードを、再帰呼び出しの式の箇所に順次挿入する(ステップS1609)。ここで、具体的には、情報処理装置101は、複製したテンプレート関数本体の再帰呼び出しの式の箇所に、関数パラメタパックの仮引数に対応する実引数群の先頭の実引数を受け入れる作成仮引数に置換した置換コードを挿入する。そして、情報処理装置101は、実引数群の順番に従って、複製コードを、1つまえの複製コードの箇所に挿入する。次に、情報処理装置101は、最後の複製コードで関数パラメタパックを使用している箇所を、引数なしの同名関数のコードに置き換えて挿入する(ステップS1610)。そして、情報処理装置101は、ステップS1601の処理に移行する。
呼び出し式が見つからなかった場合(ステップS1602:No)、情報処理装置101は、テンプレート関数および引数なしの同名関数の中間言語情報を削除する(ステップS1611)。ステップS1611の処理終了後、情報処理装置101は、関数パラメタパック展開処理を終了する。
以上説明したように、情報処理装置101は、可変個の仮引数を持つテンプレート関数のコンパイル時、可変個の仮引数に渡す実引数分、関数の処理を複製した各処理内の仮引数を実引数の受け入れ用の仮引数に置換し、関数の再帰呼び出し部分に順次挿入する。これにより、情報処理装置101は、不要となる関数の作成を抑制することができる。そして、不要となる関数の作成が抑制されることにより、最適化の入力となるコードを削減し、最適化の処理時間や必要なメモリ量を削減することができる。また、関数のコードが削減されるため、情報処理装置101は、不要な最適化処理を行わなくなり、翻訳性能の改善を図ることができる。
また、情報処理装置101は、unpack演算子に基づいて定義された仮引数に対応する実引数列の末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分に、ソースコードsrc内のテンプレート関数と同一名称の関数の処理を挿入する。これにより、情報処理装置101は、本実施の形態による関数パラメタパックを展開した後のコードに対しても、同一名称の関数に対してインライン最適化を行う場合と同等の最適化を行うことができる。
また、情報処理装置101は、複製した各処理内における他の仮引数を各作成仮引数に置換するとともに、各処理内におけるいずれかの仮引数を、各作成仮引数に受け入れられる実引数より後ろ全ての実引数のそれぞれを受け入れる作成仮引数に置換する。これにより、情報処理装置101は、複製した各処理について、インスタンシェートを行った場合と同一の処理結果を得ることができる。より具体的には、例えば、図9に示した複製コード911は、図6に示した関数602内の処理と同一のものとなる。同様に、図9に示した複製コード912は、図6に示した関数603内の処理と同一のものとなる。
また、ソースコードsrcに、仮引数が0個の対象のテンプレート関数と同一名称である第1の関数と、仮引数が1つの対象のテンプレート関数と同一名称である第2の関数があってもよい。このとき、情報処理装置101は、最後の置換コードの再帰呼び出し部分に、第1の関数または第2の関数のうち、最後の置換コードの再帰呼び出し部分の実引数に応じた関数の処理を挿入する。これにより、情報処理装置101は、最後の複製コード内の再帰呼び出しの実引数が1つとなる場合と、実引数が0個となる場合とが起こる場合であっても、適切な関数の処理を挿入することができる。
なお、本実施の形態で説明したコンパイル方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、CD−ROM(Compact Disc−Read Only Memory)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
101 情報処理装置
400 制御部
401 構文・意味解析部
402 パラメタパック展開部
403 中間言語変換部
404 最適化・コード生成部
411 複製部
412 置換部
413 挿入部

Claims (6)

  1. ソースコードに含まれる可変個の引数を有する対象のテンプレート関数の処理を、前記対象のテンプレート関数の可変個の引数をまとめる演算子に基づき定義されたいずれかの仮引数に対応する前記対象のテンプレート関数の呼び出し元の実引数列に含まれる実引数の数分複製し、
    複製した前記数分の処理の各処理内における前記対象のテンプレート関数の仮引数のうちの前記いずれかの仮引数以外の他の仮引数を、前記実引数列に含まれる各実引数を受け入れるために作成した各作成仮引数に置換し、
    前記各処理内における前記他の仮引数が前記対象のテンプレート関数とは異なる他の関数の実引数である場合、前記他の仮引数の型に合致する関数を検索する検索処理または前記ソースコードに含まれるテンプレート関数に基づき前記他の仮引数の型に合致する関数を生成する生成処理を実行し、前記他の関数の呼び出しを前記検索処理または前記生成処理で得られた関数の呼び出しに置換し、
    前記対象のテンプレート関数の処理内の再帰呼び出し部分に、置換した前記数分の処理のうちの前記実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入し、前記各処理内の再帰呼び出し部分に、前記各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理を挿入する、
    制御部を有することを特徴とする情報処理装置。
  2. 前記ソースコードは、仮引数がなく前記対象のテンプレート関数と同一名称の関数を含み、
    前記制御部は、
    置換した前記数分の処理のうちの前記実引数列の末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分に、前記同一名称の関数の処理を挿入する、
    ことを特徴とする請求項1に記載の情報処理装置。
  3. 前記制御部は、
    前記各処理内における前記他の仮引数を前記各作成仮引数に置換するとともに、前記各処理内における前記いずれかの仮引数と前記演算子とが結合した文字列を、前記各作成仮引数に受け入れられる実引数より後ろ全ての実引数のそれぞれを受け入れる作成仮引数に置換する、
    ことを特徴とする請求項1または2に記載の情報処理装置。
  4. 前記ソースコードは、仮引数がなく前記対象のテンプレート関数と同一名称の第1の関数と、仮引数が1つであり前記対象のテンプレート関数と同一名称の第2の関数とを含み、
    前記制御部は、
    置換した前記数分の処理のうちの前記実引数列の末尾の実引数を受け入れる作成仮引数に置換した処理の再帰呼び出し部分に、前記第1の関数または前記第2の関数のうちの当該再帰呼び出し部分の実引数に応じた関数の処理を挿入する、
    ことを特徴とする請求項3に記載の情報処理装置。
  5. コンピュータが、
    ソースコードに含まれる可変個の引数を有する対象のテンプレート関数の処理を、前記対象のテンプレート関数の可変個の引数をまとめる演算子に基づき定義されたいずれかの仮引数に対応する前記対象のテンプレート関数の呼び出し元の実引数列に含まれる実引数の数分複製し、
    複製した前記数分の処理の各処理内における前記対象のテンプレート関数の仮引数のうちの前記いずれかの仮引数以外の他の仮引数を、前記実引数列に含まれる各実引数を受け入れるために作成した各作成仮引数に置換し、
    前記各処理内における前記他の仮引数が前記対象のテンプレート関数とは異なる他の関数の実引数である場合、前記他の仮引数の型に合致する関数を検索する検索処理または前記ソースコードに含まれるテンプレート関数に基づき前記他の仮引数の型に合致する関数を生成する生成処理を実行し、前記他の関数の呼び出しを前記検索処理または前記生成処理で得られた関数の呼び出しに置換し、
    前記対象のテンプレート関数の処理内の再帰呼び出し部分に、置換した前記数分の処理のうちの前記実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入し、前記各処理内の再帰呼び出し部分に、前記各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理を挿入する、
    処理を実行することを特徴とするコンパイル方法。
  6. コンピュータに、
    ソースコードに含まれる可変個の引数を有する対象のテンプレート関数の処理を、前記対象のテンプレート関数の可変個の引数をまとめる演算子に基づき定義されたいずれかの仮引数に対応する前記対象のテンプレート関数の呼び出し元の実引数列に含まれる実引数の数分複製し、
    複製した前記数分の処理の各処理内における前記対象のテンプレート関数の仮引数のうちの前記いずれかの仮引数以外の他の仮引数を、前記実引数列に含まれる各実引数を受け入れるために作成した各作成仮引数に置換し、
    前記各処理内における前記他の仮引数が前記対象のテンプレート関数とは異なる他の関数の実引数である場合、前記他の仮引数の型に合致する関数を検索する検索処理または前記ソースコードに含まれるテンプレート関数に基づき前記他の仮引数の型に合致する関数を生成する生成処理を実行し、前記他の関数の呼び出しを前記検索処理または前記生成処理で得られた関数の呼び出しに置換し、
    前記対象のテンプレート関数の処理内の再帰呼び出し部分に、置換した前記数分の処理のうちの前記実引数列の先頭の実引数を受け入れる作成仮引数に置換した処理を挿入し、前記各処理内の再帰呼び出し部分に、前記各処理の作成仮引数に受け入れられる実引数の次の位置の実引数を受け入れる作成仮引数に置換した処理を挿入する、
    処理を実行させることを特徴とするコンパイルプログラム。
JP2016096559A 2016-05-12 2016-05-12 情報処理装置、コンパイル方法、およびコンパイルプログラム Active JP6651977B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016096559A JP6651977B2 (ja) 2016-05-12 2016-05-12 情報処理装置、コンパイル方法、およびコンパイルプログラム
US15/485,852 US10013244B2 (en) 2016-05-12 2017-04-12 Apparatus and method to compile a variadic template function

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016096559A JP6651977B2 (ja) 2016-05-12 2016-05-12 情報処理装置、コンパイル方法、およびコンパイルプログラム

Publications (2)

Publication Number Publication Date
JP2017204201A true JP2017204201A (ja) 2017-11-16
JP6651977B2 JP6651977B2 (ja) 2020-02-19

Family

ID=60294623

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016096559A Active JP6651977B2 (ja) 2016-05-12 2016-05-12 情報処理装置、コンパイル方法、およびコンパイルプログラム

Country Status (2)

Country Link
US (1) US10013244B2 (ja)
JP (1) JP6651977B2 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10114624B1 (en) * 2017-10-12 2018-10-30 Devfactory Fz-Llc Blackbox matching engine
CN108446122B (zh) * 2018-03-22 2021-10-29 中国银行股份有限公司 一种参数一致性验证方法及装置
CN109035037A (zh) * 2018-06-29 2018-12-18 渤海人寿保险股份有限公司 保险产品可视化配置方法、装置、存储介质及终端
US11416224B1 (en) * 2021-03-02 2022-08-16 Capital One Services, Llc Augmented intelligence for creating software development artifacts

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002140198A (ja) 2000-11-02 2002-05-17 Hitachi Ltd インライン展開方法
JP2005141380A (ja) 2003-11-05 2005-06-02 Matsushita Electric Ind Co Ltd テンプレートコンパイル方法
US8645248B2 (en) * 2010-10-27 2014-02-04 Hsbc Technology & Services (Usa) Inc. Integrated customer communications computer system and process for implementing same

Also Published As

Publication number Publication date
JP6651977B2 (ja) 2020-02-19
US20170329585A1 (en) 2017-11-16
US10013244B2 (en) 2018-07-03

Similar Documents

Publication Publication Date Title
US7571427B2 (en) Methods for comparing versions of a program
US9645803B2 (en) Methods and systems for forming an adjusted perform range
JP6651977B2 (ja) 情報処理装置、コンパイル方法、およびコンパイルプログラム
JP2004362249A (ja) 翻訳知識最適化装置、翻訳知識最適化のためのコンピュータプログラム、コンピュータ及び記憶媒体
JP4638484B2 (ja) データ処理装置におけるデータ整合性
JP4041248B2 (ja) コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
US11960867B1 (en) Using natural language latent representation in automated conversion of source code from base programming language to target programming language
US11487522B1 (en) Training and/or using neural network model to generate target source code from lower-level representation
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
US11556317B2 (en) Instruction translation support method and information processing apparatus
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
JP6481515B2 (ja) 情報処理装置、コンパイル方法、及びコンパイラプログラム
US20170344351A1 (en) Information processing apparatus, compiling management method, and recording medium
GB2420638A (en) Method of substituting code fragments in Internal Representation
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
JP3551352B2 (ja) ループ分割方法
JP7333889B2 (ja) ソフトウェア設計支援システム、ソフトウェア設計支援方法およびソフトウェア設計支援プログラム
JP2008071065A (ja) インライン展開を行うコンパイル装置、方法、プログラム、記憶媒体
US20240202522A1 (en) Device and method for generating deep learning model graph and abstract syntax tree for integrated compiler
JP2002082811A (ja) コンパイル方法および記録媒体
Cséri et al. Rule-based assignment of comments to AST nodes in C++ programs
JP2008015665A (ja) プログラム解析方法及びプログラム解析装置
Sumimoto et al. MPI-Adapter2: An Automatic ABI Translation Library Builder for MPI Application Binary Portability
JP2008123249A (ja) コンパイル装置、および、ループの高速化方法
JP6447358B2 (ja) ソースコード生成プログラム、ソースコード生成方法およびコンピュータ

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190212

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20191216

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20191224

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200106

R150 Certificate of patent or registration of utility model

Ref document number: 6651977

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150