(57)【特許請求の範囲】
【請求項１】
ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出する抽出部と、
前記抽出部により抽出されたクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定する特定部と、
前記特定部により特定された呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する算出部と、
前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記算出部により算出されたアクセス回数を比較し、前記算出部により算出されたアクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する生成部と
を有することを特徴とする情報処理装置。
【請求項２】
前記算出部は、前記特定部により特定された呼び出しより前においては、前記コピー処理のコピー元のメンバ変数を対象とし、前記特定部により特定された呼び出しより後においては、前記コピー処理のコピー元及びコピー先のメンバ変数を対象としてアクセス回数を算出することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記抽出部は、他のクラスを継承していないクラスであり、メンバ変数の型が全て基本型であり、かつ、メンバ変数の数が所定の上限値以下であるクラスを抽出することを特徴とする請求項１又は２に記載の情報処理装置。
【請求項４】
コンピュータが、
ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出し、
抽出したクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定し、
特定した呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出し、
前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記アクセス回数を比較し、前記アクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する
処理を実行することを特徴とするコンパイル方法。
【請求項５】
コンピュータに、
ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出し、
抽出したクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定し、
特定した呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出し、
前記呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と前記アクセス回数を比較し、前記アクセス回数が小さいと判定した場合に、前記コピーコンストラクタ及び前記代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成すると共に、前記呼び出しについて追加した定義を用いる中間コードを生成する
処理を実行させることを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイル方法及びコンパイラプログラムに関する。
【背景技術】
【０００２】
Ｃ＋＋等のオブジェクト指向言語では、コピーコンストラクタ又は代入演算子が用いられるとコピー処理が行われる。図１４は、コピーコンストラクタ又は代入演算子が用いられたときのコピー処理を説明するための図である。
【０００３】
図１４に示すように、コピーコンストラクタとは、変数を定義する際、同じ型の別の変数を元に定義するものであり、代入演算子とは、同じ型の別の変数を元に値を更新するものである。例えば、ａをクラスがＣｌａｓｓ＿Ｃである変数とすると、Ｃｌａｓｓ＿Ｃ  ｂ（ａ）は、変数ｂを同じＣｌａｓｓ＿Ｃの変数ａを元に定義するコピーコンストラクタである。このとき、変数ｂは変数ａで初期化される。すなわち、変数ｂの値として変数ａの値がコピーされる。
【０００４】
また、ａ、ｂをクラスがＣｌａｓｓ＿Ｃである変数とすると、ｂ＝ａは、変数ａを元にｂの値を更新する代入演算子である。このとき、変数ｂは変数ａで更新される。すなわち、変数ｂの値として変数ａの値がコピーされる。
【０００５】
なお、コンパイル技術に関して、文字操作手続きのインライン展開に用いるオブジェクトとして文字操作手続きの実行時間を最小にするスカラ命令又はベクトル命令の一方を選択することで、ベクトル演算機能を持つ計算機のコンパイル性能を向上させる技術がある。
【０００６】
また、コンパイル段階でプログラムの構造の特徴を解析してロード命令に先立ってデータキャッシュに必要なメモリの内容をコピーしておくようにすることで、実行時性能を向上するコンパイル装置がある。
【０００７】
また、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ値渡し引数が該値渡し引数を持つ関数の定義内で更新されない場合に、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換するコンパイル技術がある。このコンパイル技術により、コードサイズを小さくすることができる。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平６−２１４８００号公報
【特許文献２】特開平１１−２１２８０２号公報
【特許文献３】特開２００５−１８２５６２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
図１４に示した変数間コピーには、無駄なメモリアクセスがあるという問題がある。図１５は、図１４に示した変数間コピーの問題を説明するための図である。図１５において、Ｃｌａｓｓ＿Ｃは、１６ビット整数型の変数ｍ、ｎ、ｏ、ｐをメンバ変数とするクラスであり、ａ、ｂは、型がＣｌａｓｓ＿Ｃである変数である。そして、ｂ＝ａのように代入演算子が用いられると、ａ．ｍ、ａ．ｎ、ａ．ｏ及びａ．ｐの値がｂ．ｍ、ｂ．ｎ、ｂ．ｏ及びｂ．ｐにそれぞれコピーされる。このコピーはデフォルトのコピー処理ではバイト単位に行われる。
【００１０】
ｂ＝ａのすぐ後でｃ＝ｂ．ｍ＋ｂ．ｎ＋ｂ．ｏ＋ｂ．ｐの計算が行われる場合、ｂ＝ａの処理でメモリから読み出されたａ．ｍ、ａ．ｎ、ａ．ｏ及びａ．ｐの値を用いることができれば、無駄なメモリアクセスを減らすことができる。しかしながら、ｂ．ｍ、ｂ．ｎ、ｂ．ｏ及びｂ．ｐは２バイト単位でメモリ読み出しが行われるため、バイト単位でメモリから読み出されたａ．ｍ、ａ．ｎ、ａ．ｏ及びａ．ｐの値を用いることはできない。したがって、ｂ．ｍ、ｂ．ｎ、ｂ．ｏ及びｂ．ｐが再度メモリから読み出され、メモリへの無駄なアクセスが発生し、メモリアクセス数が増加する。
【００１１】
本発明は、１つの側面では、メモリアクセス数を減らすことを目的とする。
【課題を解決するための手段】
【００１２】
１つの態様では、情報処理装置は、抽出部と特定部と算出部と生成部とを有する。抽出部は、ソースコード上の暗黙のコピーコンストラクタ及び暗黙の代入演算子の少なくともいずれかを用いるクラスを抽出する。特定部は、抽出部により抽出されたクラスに含まれるクラスのコピーコンストラクタ及び代入演算の少なくともいずれかの呼び出しを特定する。算出部は、特定部により特定された呼び出し及び該呼び出しの周辺における、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する。生成部は、該呼び出しにより実行されるデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス数と算出部により算出されたアクセス回数を比較する。そして、生成部は、算出部により算出されたアクセス回数が小さいと判定した場合に、コピーコンストラクタ及び代入演算子の少なくともいずれかについてメンバ変数単位でコピー処理を行う定義を追加する中間コードを生成する。また、生成部は、該呼び出しについて追加した定義を用いる中間コードを生成する。
【発明の効果】
【００１３】
１つの側面では、メモリアクセス数を減らすことができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施例に係るコンパイラによる最適化を説明するための図である。
【図２Ａ】図２Ａは、最適化の第１の条件を説明するための図である。
【図２Ｂ】図２Ｂは、最適化の第２の条件を説明するための図である。
【図３】図３は、実施例に係る情報処理装置の構成を示す図である。
【図４】図４は、ＡＳＴの一例を示す図である。
【図５Ａ】図５Ａは、周辺探索を説明するための第１の図である。
【図５Ｂ】図５Ｂは、周辺探索を説明するための第２の図である。
【図５Ｃ】図５Ｃは、周辺探索を説明するための第３の図である。
【図５Ｄ】図５Ｄは、周辺探索を説明するための第４の図である。
【図５Ｅ】図５Ｅは、周辺探索を説明するための第５の図である。
【図５Ｆ】図５Ｆは、周辺探索を説明するための第６の図である。
【図５Ｇ】図５Ｇは、周辺探索を説明するための第７の図である。
【図６Ａ】図６Ａは、最適化コピーコンストラクタ及び最適化コピーメソッドの定義例を示す図である。
【図６Ｂ】図６Ｂは、最適化コピーコンストラクタ及び最適化コピーメソッドへの置き換え例を示す図である。
【図７】図７は、最適化処理のフローを示すフローチャートである。
【図８】図８は、対象クラス取得処理のフローを示すフローチャートである。
【図９】図９は、周辺探索処理のフローを示すフローチャートである。
【図１０】図１０は、代入演算子最適化処理のフローを示すフローチャートである。
【図１１】図１１は、コピーコンストラクタ最適化処理のフローを示すフローチャートである。
【図１２】図１２は、メソッドＭ追加処理のフローを示すフローチャートである。
【図１３】図１３は、実施例に係るコンパイラプログラムを実行するコンピュータのハードウェア構成を示す図である。
【図１４】図１４は、コピーコンストラクタ又は代入演算子が用いられたときのコピー処理を説明するための図である。
【図１５】図１５は、図１４に示した変数間コピーの問題を説明するための図である。
【発明を実施するための形態】
【００１５】
以下に、本願の開示する情報処理装置、コンパイル方法及びコンパイラプログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１６】
まず、実施例に係るコンパイラによる最適化について説明する。図１は、実施例に係るコンパイラによる最適化を説明するための図である。図１に示すように、実施例に係るコンパイラは、例えば、ｂ＝ａの直後にｃ＝ｂ．ｍ＋ｂ．ｎ＋ｂ．ｏ＋ｂ．ｐのように、メモリから読み出したデータを再利用する文（statement）があることを検出する。そして、実施例に係るコンパイラは、ｂ＝ａにより実行されるコピー処理に関して、ｃ＝ｂ．ｍ＋ｂ．ｎ＋ｂ．ｏ＋ｂ．ｐにおいてメモリから読み出す形式と同じ形式でメモリを読み出すコードを生成する。
【００１７】
すなわち、ｃ＝ｂ．ｍ＋ｂ．ｎ＋ｂ．ｏ＋ｂ．ｐでは２バイト単位でデータが読み出されるため、実施例に係るコンパイラは、ｂ＝ａにより実行されるコピー処理においても２バイト単位すなわちメンバ変数単位でメモリからデータを読み出すコードを生成する。
【００１８】
したがって、実施例に係るコンパイラは、コピー処理においてメモリから読み出されてレジスタにあるデータを使いまわすことを可能とし、メモリアクセス回数を減らすことができる。
【００１９】
実施例に係るコンパイラは、最適化を行う場合に、２つの条件を確認する。図２Ａは、最適化の第１の条件を説明するための図である。図２Ａに示すように、実施例に係るコンパイラは、ｂ＝ａの前後に同じ変数の要素（メンバ変数）へのアクセスがあるか否かを確認し、同じ変数の要素へのアクセスがない場合には、ｂ＝ａにより実行されるコピー処理において要素単位のコピーを行うコードは生成しない。なお、多バイト長コピー命令がある場合には、ｂ＝ａのコピー処理において多バイト長コピー命令を使用した方がコピー速度は速くなる。
【００２０】
図２Ｂは、最適化の第２の条件を説明するための図である。図２Ｂに示すように、実施例に係るコンパイラは、ｂ＝ａの前後に同じ変数の要素へのアクセスがある場合でも、アクセス数が多くなる場合には、ｂ＝ａのコピー処理において要素単位のコピーを行うコードは生成しない。図２Ｂにおいて、ｂ＝ａの直後にｃ＝ｂ．ｍ＋ｂ．ｎがあると、要素単位のコピーにおけるメモリアクセス回数は、４回となる。一方、８バイト長コピー命令を使用できる場合、メモリアクセス回数は、ａへのアクセス、ｂ．ｍへのアクセス、ｂ．ｎへのアクセスの３回である。
【００２１】
このように、実施例に係るコンパイラは、図２Ａ及び図２Ｂに示した２つの条件を確認して最適化を行うことによって、最適化によるメモリアクセス数の増加を防ぐことができる。
【００２２】
なお、コピーコンストラクタ及び代入演算子には、ユーザーが処理を定義するユーザー指定コピーコンストラクタ及びユーザー指定代入演算子があるが、ここでは、ユーザー指定コピーコンストラクタ及びユーザー指定代入演算子は対象としない。実施例に係るコンパイラは、ユーザーの定義がない暗黙のコピーコンストラクタ及び暗黙の代入演算子を最適化の対象とする。
【００２３】
また、以下では、暗黙のコピーコンストラクタ及び暗黙の代入演算子であることが明らかである場合には、暗黙のコピーコンストラクタ及び暗黙の代入演算子をそれぞれ単にコピーコンストラクタ及び代入演算子と呼ぶことがある。
【００２４】
次に、実施例に係る情報処理装置の構成について説明する。図３は、実施例に係る情報処理装置の構成を示す図である。図３に示すように、実施例に係る情報処理装置１は、情報を処理する装置であり、コンパイル部１ａを有する。コンパイル部１ａは、ソースファイル２を読み込んで、実行コード７を生成する。
【００２５】
コンパイル部１ａは、フロントエンド部１０と、最適化処理部２０と、バックエンド部３０とを有する。フロントエンド部１０は、ソースファイル２を読み込み、語彙解析、構文解析等を行って、ＡＳＴ（Abstract  Syntax  Tree：抽象構文木）３を出力する。
【００２６】
最適化処理部２０は、ＡＳＴ３を入力し、コピーコンストラクタ及び代入演算子に関する最適化を行ってＡＳＴ３を修正し、修正ＡＳＴ４を出力する。また、最適化処理部２０は、最適化の処理中に、最適化の対象となるクラスを示す対象クラス５を作成する。また、最適化処理部２０は、最適化の処理中に、最適化の対象となるクラスのコピーコンストラクタ呼び出し及び代入演算呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス個所を示す変更箇所リスト６を作成する。
【００２７】
なお、最適化処理部２０は、ＡＳＴ３から手続き間最適化及びインライン化を適用したＡＳＴを作成し、作成したＡＳＴを用いてコピーコンストラクタ及び代入演算子に対する最適化を行ってもよい。
【００２８】
最適化処理部２０は、コピーコンストラクタ及び代入演算子を用いるクラスを特定し、コピーコンストラクタ及び代入演算子を用いる箇所を特定する。そして、最適化処理部２０は、最適化条件を確認し、コピーコンストラクタ及び代入演算子の最適化を実施する。そして、最適化処理部２０は、ＡＳＴ３を修正して修正ＡＳＴ４を作成する。
【００２９】
なお、最適化処理部２０は、修正ＡＳＴ４を作成する前に他の最適化を行ってもよい。また、最適化処理部２０は、ＡＳＴ３の代わりに他のＩＲ（Intermediate  Representation：中間表現）やビットコードのレベルでコピーコンストラクタ及び代入演算子の最適化を実施してもよい。
【００３０】
バックエンド部３０は、修正ＡＳＴ４を入力し、情報処理装置１又は他の情報処理装置で実行される実行コード７を出力する。なお、コンパイル部１ａは、実行コード７の実行速度等を向上させるために、フロントエンド部１０及びバックエンド部３０において様々な最適化を行ってもよい。
【００３１】
最適化処理部２０は、取得部２１と、特定部２２と、周辺探索部２３と、生成部２４とを有する。取得部２１は、ＡＳＴ３を解析し、暗黙のコピーコンストラクタ又は暗黙の代入演算子を用いるクラスを最適化の対象となるクラスとして取得する。図４は、ＡＳＴ３の一例を示す図である。図４は、ｔｅｓｔ．ｃｃという名前のソースファイル２に対応するＡＳＴ３を示す。
【００３２】
図４に示すように、ＡＳＴ３は、ソースファイル２の構文解析結果を示す木であり、ソースファイル２に対応するファイルをルートとする。各ノードは構文要素を示し、ノード間のリンクは構文要素の親子関係を示す。例えば、ｔｅｓｔ．ｃｃという名前のファイルは、Ｃという名前のクラス定義とｍａｉｎという名前の関数定義から構成される。
【００３３】
ノード間のリンクについて、親ノード及び子ノードがそれぞれ子ノード及び親ノードへのポインタを有し、親ノードと子ノードのどちらからもリンクをたどることができる。また、図４において、リンクのエッジの番号は、親のリスト中の子ノードの番号であり、ソースファイル２における出現順につけられる。
【００３４】
取得部２１は、ＡＳＴ３のノードをルートから順にたどることによって、最適化の対象となるクラスを取得し、対象クラス５を作成する。取得部２１は、他のクラスを継承しているクラス、メンバ変数に基本型以外の型を含むクラス、メンバ変数の数が所定の上限値を超えるクラスは最適化の対象としない。
【００３５】
特定部２２は、ＡＳＴ３を解析し、最適化対象クラスのコピーコンストラクタ呼び出し及び代入演算呼び出しを特定する。
【００３６】
周辺探索部２３は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出し及び当該呼び出しの周辺を探索し、当該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス数を計算する。ここで、周辺とは、例えば、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しを含む文の前後の所定の数の文である。
【００３７】
周辺探索部２３は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しの前の文については、コピー元インスタンスの要素へのアクセスに関してアクセス数を算出する。また、周辺探索部２３は、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しの後の文については、コピー元インスタンスの要素及びコピー先インスタンスの要素へのアクセスに関してアクセス数を算出する。
【００３８】
なお、最適化対象クラスのコピーコンストラクタ又は代入演算の呼び出しを含む文の前後の文は、制御フローグラフとデータフローグラフの解析により特定することが可能である。分岐が含まれる場合には、周辺探索部２３は、分岐確率に基づいてアクセス数を算出してもよい。
【００３９】
図５Ａ〜図５Ｇは、周辺探索を説明するための図である。図５Ａは、周辺探索が行われるｆｏｒ文の例と対応するＡＳＴ３を示す。図５Ａに示すｆｏｒ文では、｛で始まる本体に含まれる４番目の文Ｃ  ｂ(ａ)がコピーコンストラクタの呼び出しであり、ｎはＡＳＴ３においてＣ  ｂ(ａ)に対応するノードである。
【００４０】
図５Ｂは、型がＣであり、名前がｂである変数定義文がｎとして特定されたことを示す。ｎが文でない場合には、周辺探索部２３は、ＡＳＴ３を文までさかのぼるが、この例では、ｎは文なので、さかのぼる必要はない。図５Ｃに示すように、周辺探索部２３は、アクセスリストを空にする。ここで、アクセスリストは、最適化の対象となるクラスの変数のメンバ変数へのアクセス個所を示すリストであり、図３に示した変更箇所リスト６に対応する。
【００４１】
ここでは、ｎの周辺をｎの前後の２文ずつとすると、周辺探索部２３は、図５Ｄに示すように、ｎの前の２文として、ａ．ｍａ＝５とａ．ｍｂ＝５＋ａ．ｍａを特定する。そして、周辺探索部２３は、図５Ｅに示すように、ＡＳＴ３上で番号２が付けられた式文の子ノードをたどり、コピー元の変数のメンバ変数へのアクセスを見つける。図５Ｅでは、番号２が付けられた式文の子ノードとして、代入演算、ドット演算、名前がａの変数参照、名前がｍａのメンバ変数参照のノードが順にたどられてコピー元の変数のメンバ変数ａ．ｍａが見つけられる。
【００４２】
そして、周辺探索部２３は、図５Ｆに示すように、アクセスリストにコピー元のｍａへのアクセスを追加する。なお、周辺探索部２３は、見つけたメンバ変数がアクセスリストに登録されている場合には、アクセスリストへの追加は行わない。
【００４３】
そして、周辺探索部２３は、図５Ｇに示すように、ＡＳＴ３上で番号３が付けられた式文に対しても同様の処理を行って、コピー元の変数のメンバ変数ａ．ｍｂを見つけ、アクセスリストに追加する。そして、周辺探索部２３は、図５Ｇでは後続の文として示される式文（番号５及び番号６が付けられた文）に対しても同様の処理を行う。
【００４４】
生成部２４は、周辺探索部２３が算出したアクセス数とデフォルトのコピー処理の場合のメモリアクセス数を比較し、周辺探索部２３が算出したアクセス数が小さい場合に最適化を実施し、修正ＡＳＴ４を生成する。
【００４５】
なお、実行コード７を実行するＣＰＵ（Central  Processing  Unit）がＳＩＭＤ（Single  Instruction  Multiple  Data）命令を有する場合には、生成部２４は、デフォルトのコピー処理の場合のメモリアクセス数を、ＳＩＭＤ命令の利用に基づく数としてもよい。また、ソフトウェアパイプラインが組める場合には、生成部２４は、デフォルトのコピー処理の場合のメモリアクセス数を、長いレジスタ＋シフト命令の利用に基づく数としてもよい。
【００４６】
最適化として、具体的には、生成部２４は、メンバ変数単位でコピーするメソッドを追加し、定義部分に関し、最適化対象のクラスに最適化コピーコンストラクタの定義及び最適化コピーメソッドの定義を追加する。そして、生成部２４は、利用部分に関し、最適化対象のコピーコンストラクタを最適化コピーコンストラクタで置き換え、最適化対象の代入演算を最適化コピーメソッドで置き換える。
【００４７】
図６Ａは、最適化コピーコンストラクタ及び最適化コピーメソッドの定義例を示す図である。図６Ａに示すように、コピーコンストラクトの場合には、ＡＳＴ３において、型がＣであり、最適化コピーコンストラクタが用いられるメソッド定義文を親とする部分木がクラス定義中に追加される。また、代入演算子の場合には、ＡＳＴ３において、最適化コピーメソッド定義文を親とする部分木がクラス定義中に追加される。
【００４８】
図６Ｂは、最適化コピーコンストラクタ及び最適化コピーメソッドへの置き換え例を示す図である。図６Ｂに示すように、コピーコンストラクタについては、ＡＳＴ３において、変数定義文のコピーコンストラクタが、最適化コピーコンストラクタに置き換えられる。また、代入演算子については、ＡＳＴ３において、代入演算が最適化コピーメソッドに置き換えられる。
【００４９】
次に、最適化処理のフローについて説明する。図７は、最適化処理のフローを示すフローチャートである。図７に示すように、最適化処理部２０は、最適化対象のクラスを取得する対象クラス取得処理を実行する（ステップＳ１）。対象クラス取得処理の実行によって、Ｌｃに暗黙のコピーコンスラクタに関して最適化対象クラスのリストが代入され、Ｌａに暗黙の代入演算子に関して最適化対象クラスのリストが代入される。なお、「←」は、代入を表す。また、Ｌｃ及びＬａは、図３に示した対象クラス５に対応する。
【００５０】
そして、最適化処理部２０は、ＡＳＴ３のルートから順番にノードを取り出してｎに代入し、ステップＳ２とステップＳ１３で挟まれる処理すなわちステップＳ３〜ステップＳ１２の処理を繰り返す。
【００５１】
ステップＳ３〜ステップＳ１２の処理では、最適化処理部２０は、ｎはコピーコンストラクタ呼び出しであるか否かを判定し（ステップＳ３）、コピーコンストラクタ呼び出しである場合には、Ｌｃにｎのクラスが登録されているか否かを判定する（ステップＳ４）。その結果、Ｌｃにｎのクラスが登録されていない場合には、最適化処理部２０は、次のノードをｎに代入してステップＳ３へ戻る。
【００５２】
一方、Ｌｃにｎのクラスが登録されている場合には、最適化処理部２０は、ｎ及びｎの周辺を探索して対象要素へのアクセス回数を算出する周辺探索処理を実行する（ステップＳ５）。ここで、対象要素とは、ｎに代入されているコピーコンストラクタ又は代入演算子の呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数である。周辺探索処理の実行によって、Ｎａにｎ及びｎの周辺での対象要素へのアクセス回数が代入される。
【００５３】
そして、最適化処理部２０は、暗黙のコピーコンストラクタに関してデフォルトのコピー処理を行った場合のｎ及びｎの周辺のコピー元及びコピー先に関するメモリアクセス回数よりＮａが小さいか否かを判定する（ステップＳ６）。その結果、小さくない場合には、最適化処理部２０は、次のノードをｎに代入してステップＳ３へ戻る。一方、小さい場合には、最適化処理部２０は、コピーコンストラクタに関する最適化を行うコピーコンストラクタ最適化処理を実行し（ステップＳ７）、次のノードをｎに代入してステップＳ３へ戻る。
【００５４】
また、ｎがコピーコンストラクタ呼び出しでない場合には、最適化処理部２０は、ｎは代入演算呼び出しであるか否かを判定し（ステップＳ８）、代入演算呼び出しでない場合には、次のノードをｎに代入してステップＳ３へ戻る。一方、ｎが代入演算呼び出しである場合には、最適化処理部２０は、Ｌａにｎのクラスが登録されているか否かを判定する（ステップＳ９）。その結果、Ｌａにｎのクラスが登録されていない場合には、最適化処理部２０は、次のノードをｎに代入してステップＳ３へ戻る。
【００５５】
一方、Ｌａにｎのクラスが登録されている場合には、最適化処理部２０は、周辺探索処理を実行する（ステップＳ１０）。そして、最適化処理部２０は、暗黙の代入演算子に関してデフォルトのコピー処理を行った場合のｎ及びｎの周辺のコピー元及びコピー先に関するメモリアクセス回数よりＮａが小さいか否かを判定し（ステップＳ１１）、小さくない場合には、次のノードをｎに代入してステップＳ３へ戻る。一方、Ｎａが小さい場合には、最適化処理部２０は、代入演算子に関する最適化を行う代入演算子最適化処理を実行し（ステップＳ１２）、次のノードをｎに代入してステップＳ３へ戻る。
【００５６】
このように、最適化処理部２０は、最適化対象のコピーコンストラクタ又は代入演算の呼び出し及び該呼び出しの周辺の対象要素へのアクセス数を算出する。そして、最適化処理部２０は、算出したアクセス数がコピーコンストラクタ又は代入演算子に関してデフォルトのコピー処理を行った場合のｎ及びｎの周辺のコピー元及びコピー先に関するメモリアクセス回数より小さいか否かを判定する。そして、最適化処理部２０は、算出したアクセス数が小さい場合に、コピーコンストラクタ又は代入演算子の最適化を行う。したがって、コンパイル部１ａは、実行時にメモリアクセス数を減らす実行コード７を生成することができる。
【００５７】
次に、対象クラス取得処理のフローについて説明する。図８は、対象クラス取得処理のフローを示すフローチャートである。図８に示すように、取得部２１は、リストＬｃとリストＬａを空に初期化する（ステップＳ２１）。
【００５８】
そして、取得部２１は、ＡＳＴ３のルートから順番にノードを取り出してｎに代入し、ステップＳ２２とステップＳ３６で挟まれる処理すなわちステップＳ２３〜ステップＳ３５の処理を繰り返す。ステップＳ２３〜ステップＳ３５の処理では、取得部２１は、ｎはクラス宣言か否かを判定し（ステップＳ２３）、クラス宣言でない場合には、ｎはクラス定義か否かを判定する（ステップＳ２４）。その結果、クラス定義でない場合には、取得部２１は、次のノードをｎに代入してステップＳ２３へ戻る。
【００５９】
一方、ｎがクラス定義である場合には、取得部２１は、ｎをｍに代入し（ステップＳ２５）、ステップＳ２８へ進む。また、ｎがクラス宣言である場合には、取得部２１は、ｎのクラス定義があるか否かを判定し（ステップＳ２６）、ｎのクラス定義がない場合には、次のノードをｎに代入してステップＳ２３へ戻る。一方、ｎのクラス定義がある場合には、取得部２１は、ｎのクラス定義をｍに代入し（ステップＳ２７）、ステップＳ２８へ進む。
【００６０】
そして、取得部２１は、ｍは他のクラスを継承しているか否かを判定し（ステップＳ２８）、他のクラスを継承している場合には、次のノードをｎに代入してステップＳ２３へ戻る。一方、ｍが他のクラスを継承していない場合には、取得部２１は、ｍのメンバ変数は全て基本型であるか否かを判定し（ステップＳ２９）、ｍのメンバ変数に基本型でないものがある場合には、次のノードをｎに代入してステップＳ２３へ戻る。
【００６１】
一方、ｍのメンバ変数が全て基本型である場合には、取得部２１は、Ｎｖにｍの基本型のメンバ変数の数を代入し（ステップＳ３０）、Ｎｖは予め与えられた上限以下か否かを判定する（ステップＳ３１）。その結果、Ｎｖがあらかじめ与えられた上限を超える場合には、取得部２１は、次のノードをｎに代入してステップＳ２３へ戻る。
【００６２】
一方、Ｎｖが予め与えられた上限以下である場合には、取得部２１は、ユーザー定義のコピーコンストラクタがあるか否かを判定し（ステップＳ３２）、ない場合には、Ｌｃにｍを追加する（ステップＳ３３）。そして、取得部２１は、ユーザー定義の代入演算子があるか否かを判定し（ステップＳ３４）、ない場合には、Ｌａにｍを追加する（ステップＳ３５）。
【００６３】
このように、取得部２１がＡＳＴ３のノードを順番にたどって最適化対象のクラスのリストを作成することによって、最適化処理部２０はリストに含まれるクラスを対象として最適化を行うことができる。
【００６４】
次に、周辺探索処理のフローについて説明する。図９は、周辺探索処理のフローを示すフローチャートである。図９に示すように、周辺探索部２３は、ｎは文のノードか否かを判定する（ステップＳ４１）。そして、周辺探索部２３は、ｎが文のノードである場合には、ｓにｎを代入し（ステップＳ４２）、ｎが文のノードでない場合には、ｎからＡＳＴ３をさかのぼって、最初に出てきた文をｓに代入する（ステップＳ４３）。
【００６５】
そして、周辺探索部２３は、アクセスリストを空に初期化し（ステップＳ４４）、ｓの親が持つ子リストのうち、ｓとｓの前後ｒ個のノードのリストをＬに代入する（ステップＳ４５）。そして、周辺探索部２３は、Ｌの要素の文を順番にｐに代入してステップＳ４６とステップＳ５４で挟まれる処理すなわちステップＳ４７〜ステップＳ５３の処理を繰り返す。
【００６６】
ステップＳ４７〜ステップＳ５３の処理では、周辺探索部２３は、ｐ以下のノードを順番にｑに代入して、ステップＳ４７とステップＳ５３で挟まれる処理すなわちステップＳ４８〜ステップＳ５２の処理を繰り返す。ステップＳ４８〜ステップＳ５２の処理では、周辺探索部２３は、ｑはｎのコピー元のメンバ変数へのアクセスか否かを判定し（ステップＳ４８）、ｎのコピー元のメンバ変数へのアクセスである場合には、ステップＳ５１へ進む。
【００６７】
一方、ｎのコピー元のメンバ変数へのアクセスでない場合には、周辺探索部２３は、ｐはｓよりも前にある文であるか否かを判定し（ステップＳ４９）、ｐがｓよりも前にある文である場合には、次のノードをｑに代入してステップＳ４８へ戻る。一方、ｐがｓよりも前にある文でない場合には、周辺探索部２３は、ｑはｎのコピー先のメンバ変数へのアクセスか否かを判定し（ステップＳ５０）、ｑがｎのコピー先のメンバ変数へのアクセスでない場合には、次のノードをｑに代入してステップＳ４８へ戻る。一方、ｑがｎのコピー先のメンバ変数へのアクセスである場合には、周辺探索部２３は、ステップＳ５１へ進む。
【００６８】
そして、周辺探索部２３は、アクセスされるメンバ変数が、アクセスリストに登録されたメンバ変数か否かを判定し（ステップＳ５１）、アクセスリストに登録されたメンバ変数である場合には、次のノードをｑに代入してステップＳ４８へ戻る。一方、アクセスリストに登録されたメンバ変数でない場合には、周辺探索部２３は、アクセスリストにメンバ変数を追加し（ステップＳ５２）、次のノードをｑに代入してステップＳ４８へ戻る。
【００６９】
次のノードをｑに代入する際に、ｐ以下の全ノードについてステップＳ４８〜ステップＳ５２の処理を終了した場合には、周辺探索部２３は、Ｌの次の要素をｐに代入して、ステップＳ４７〜ステップＳ５３の処理を実行する。
【００７０】
そして、ステップＳ４７〜ステップＳ５３の処理を全てのＬの要素に対して実行すると、周辺探索部２３は、アクセスリストの要素数をアクセス数Ｎａとして返却する（ステップＳ５５）。
【００７１】
このように、周辺探索部２３がｎ及びｎの周辺でコピー元及びコピー先のメンバ変数へのアクセス数を算出することで、最適化処理部２０は、最適化によりメモリアクセス数が増加することを防ぐことができる。
【００７２】
次に、代入演算子最適化処理のフローについて説明する。図１０は、代入演算子最適化処理のフローを示すフローチャートである。図１０に示すように、生成部２４は、ｎのクラスで、最適化コピーメソッドを定義したか否かを判定する（ステップＳ６１）。
【００７３】
その結果、生成部２４は、定義していない場合には、メンバ変数単位でコピーするメソッドＭを追加するメソッドＭ追加処理を実行し（ステップＳ６２）、ｎのクラスＣＬＡＳＳに以下の最適化コピーメソッドＡの定義を追加する（ステップＳ６３）。
【００７４】
ｐｕｂｌｉｃ：
ＣＬＡＳＳ＆  Ａ（ｃｏｎｓｔ  ＣＬＡＳＳ＆  ｓｒｃ）｛
Ｍ（ｓｒｃ）；
ｒｅｔｕｒｎ  ＊  ｔｈｉｓ；
｝
【００７５】
そして、生成部２４は、ｎの代入演算子を最適化コピーメソッドＡで置き換える（ステップＳ６４）。
【００７６】
このように、生成部２４が、ｎのクラスにメソッドＭ及び最適化コピーメソッドＡの定義を追加し、ｎの代入演算子を最適化コピーメソッドＡで置き換えることで、最適化処理部２０は、代入演算子の最適化を行うことができる。
【００７７】
次に、コピーコンストラクタ最適化処理のフローについて説明する。図１１は、コピーコンストラクタ最適化処理のフローを示すフローチャートである。図１１に示すように、生成部２４は、ｎのクラスで、最適化コピーコンストラクタを定義したか否かを判定する（ステップＳ７１）。
【００７８】
その結果、生成部２４は、定義していない場合には、メソッドＭ追加処理を実行し（ステップＳ７２）、ｎのクラスＣＬＡＳＳに以下の最適化コピーコンストラクタＣの定義を追加する（ステップＳ７３）。
【００７９】
ｐｕｂｌｉｃ：
Ｃ（ｃｏｎｓｔ  ＣＬＡＳＳ＆  ｓｒｃ，
ｃｏｎｓｔ  ＣＬＡＳＳ＊  ｄｕｍｍｙ）｛
Ｍ（ｓｒｃ）；
｝
【００８０】
そして、生成部２４は、ｎのコピーコンストラクタを最適化コピーコンストラクタＣで置き換える（ステップＳ７４）。
【００８１】
このように、生成部２４が、ｎのクラスにメソッドＭ及び最適化コピーコンストラクタＣの定義を追加し、ｎのコピーコンストラクタを最適化コピーコンストラクタＣで置き換えることで、最適化処理部２０は、コピーコンストラクタの最適化を行うことができる。
【００８２】
次に、メソッドＭ追加処理のフローについて説明する。図１２は、メソッドＭ追加処理のフローを示すフローチャートである。図１２に示すように、生成部２４は、ｎのクラスに、すでにメンバ変数単位でコピーするメソッドＭの定義を追加したか否かを判定し（ステップＳ８１）、追加した場合には、処理を終了する。
【００８３】
一方、メソッドＭを追加していない場合には、生成部２４は、ｎのクラスＣＬＡＳＳに以下のメッドＭの定義を追加する（ステップＳ８２）。
ｐｒｉｖａｔｅ：
ｖｏｉｄ  Ｍ（ｃｏｎｓｔ  ＣＬＡＳＳ＆  ｓｒｃ）｛
／＊  ＣＯＰＹ  ＳＴＡＴＥＭＥＮＴ  ＰＬＡＣＥ  ＊／
｝
【００８４】
そして、生成部２４は、ｎのクラスのメンバ変数を順にｖに代入し、ステップＳ８３とステップＳ８５で挟まれた処理すなわちステップＳ８４の処理を繰り返す。ステップＳ８４では、生成部２４は、以下の文をメソッドＭの定義の／＊  ＣＯＰＹ  ＳＴＡＴＥＭＥＮＴ  ＰＬＡＣＥ  ＊／の直前に追加する（ステップＳ８４）。
ｖ＝ｓｒｃ．ｖ；
【００８５】
このように、生成部２４は、メンバ変数単位でコピーするメソッドＭの定義を追加することで、最適化コピーコンストラクタ及び最適化コピーメソッドでメソッドＭを使用することができる。
【００８６】
上述してきたように、実施例では、取得部２１が、ＡＳＴ３を解析し、暗黙のコピーコンストラクタ及び暗黙の代入演算子を用いるクラスを最適化対象のクラスとして取得する。そして、特定部２２が、ＡＳＴ３を解析し、最適化対象クラスのコピーコンストラクタ及び代入演算の呼び出しを特定する。
【００８７】
そして、周辺探索部２３が、最適化対象クラスのコピーコンストラクタ及び代入演算の呼び出し並びに該呼び出しの周辺を探索し、該呼び出しにより実行されるコピー処理のコピー元及びコピー先のメンバ変数へのアクセス回数を算出する。
【００８８】
そして、生成部２４が、コピーコンストラクタ及び代入演算の呼び出しに関してデフォルトのコピー処理を行った場合の該呼び出し及び該呼び出しの周辺のコピー元及びコピー先に関するメモリアクセス回数と周辺探索部２３により算出されたアクセス回数とを比較する。そして、生成部２４は、周辺探索部２３により算出されたアクセス回数が小さい場合に、コピーコンストラクタ又は代入演算子についてメンバ変数単位でコピー処理を行う定義をＡＳＴ３に追加する。そして、生成部２４は、コピーコンストラクタ又は代入演算の呼び出しについて追加した定義を用いるようにＡＳＴ３を修正する。
【００８９】
したがって、コンパイル部１ａは、コピーコンストラクタ又は代入演算の呼び出しに関してデフォルトのコピー処理を行う場合と比較してメモリアクセス回数を減らす実行コード７を生成することができる。
【００９０】
また、実施例では、周辺探索部２３は、周辺を探索する際に、コピーコンストラクタ又は代入演算の呼び出しの前では、コピー元のメンバ変数を対象とし、コピーコンストラクタ又は代入演算の呼び出しの後では、コピー元及びコピー先のメンバ変数を対象としてアクセス回数を算出する。したがって、周辺探索部２３は、コピーコンストラクタ又は代入演算の呼び出しに関するアクセス回数を正確に算出することができる。
【００９１】
また、実施例では、取得部２１は、他のクラスの継承がなく、メンバ変数の型が全て基本型であり、かつ、メンバ変数の数が所定の上限値以下のクラスを最適化対象のクラスとするので、複雑な処理を行うことなく、最適化対象のクラスを取得することができる。
【００９２】
なお、実施例では、コンパイル部１ａについて説明したが、コンパイル部１ａが有する構成をソフトウェアによって実現することで、同様の機能を有するコンパイラプログラムを得ることができる。そこで、コンパイラプログラムを実行するコンピュータについて説明する。なお、コンパイラプログラムを実行するコンピュータは、情報処理装置１であっても、情報処理装置１とは異なるコンピュータであってもよい。
【００９３】
図１３は、実施例に係るコンパイラプログラムを実行するコンピュータのハードウェア構成を示す図である。図１３に示すように、コンピュータ６０は、メモリ６１と、ＣＰＵ６２と、ＬＡＮ（Local  Area  Network）インタフェース６３と、ＨＤＤ（Hard  Disk  Drive）６４とを有する。また、コンピュータ６０は、スーパーＩＯ（Input  Output）６５と、ＤＶＩ（Digital  Visual  Interface）６６と、ＯＤＤ（Optical  Disk  Drive）６７とを有する。
【００９４】
メモリ６１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。ＣＰＵ６２は、メモリ６１からプログラムを読出して実行する中央処理装置である。ＣＰＵ６２は、メモリコントローラを有するチップセットを含む。
【００９５】
ＬＡＮインタフェース６３は、コンピュータ６０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ６４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ６５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ６６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ６７は、ＤＶＤの読み書きを行う装置である。
【００９６】
ＬＡＮインタフェース６３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ６２に接続され、ＨＤＤ６４及びＯＤＤ６７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ６２に接続される。スーパーＩＯ６５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ６２に接続される。
【００９７】
そして、コンピュータ６０において実行されるデータ処理プログラムは、ＤＶＤに記憶され、ＯＤＤ６７によってＤＶＤから読出されてコンピュータ６０にインストールされる。あるいは、データ処理プログラムは、ＬＡＮインタフェース６３を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読出されてコンピュータ６０にインストールされる。そして、インストールされたデータ処理プログラムは、ＨＤＤ６４に記憶され、メモリ６１に読出されてＣＰＵ６２によって実行される。
【符号の説明】
【００９８】
１    情報処理装置
１ａ    コンパイル部
２    ソースファイル
３    ＡＳＴ
４    修正ＡＳＴ
５    対象クラス
６    変更箇所リスト
７    実行コード
１０    フロントエンド部
２０    最適化処理部
２１    取得部
２２    特定部
２３    周辺探索部
２４    生成部
３０    バックエンド部
６０    コンピュータ
６１    メモリ
６２    ＣＰＵ
６３    ＬＡＮインタフェース
６４    ＨＤＤ
６５    スーパーＩＯ
６６    ＤＶＩ
６７    ＯＤＤ
【図１】
0006651974.tif 000002
【図２Ａ】
0006651974.tif 000003
【図２Ｂ】
0006651974.tif 000004
【図３】
0006651974.tif 000005
【図４】
0006651974.tif 000006
【図５Ａ】
0006651974.tif 000007
【図５Ｂ】
0006651974.tif 000008
【図５Ｃ】
0006651974.tif 000009
【図５Ｄ】
0006651974.tif 000010
【図５Ｅ】
0006651974.tif 000011
【図５Ｆ】
0006651974.tif 000012
【図５Ｇ】
0006651974.tif 000013
【図６Ａ】
0006651974.tif 000014
【図６Ｂ】
0006651974.tif 000015
【図７】
0006651974.tif 000016
【図８】
0006651974.tif 000017
【図９】
0006651974.tif 000018
【図１０】
0006651974.tif 000019
【図１１】
0006651974.tif 000020
【図１２】
0006651974.tif 000021
【図１３】
0006651974.tif 000022
【図１４】
0006651974.tif 000023
【図１５】
0006651974.tif 000024