(57)【要約】      （修正有）【課題】クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法コンパイル方法およびコンパイルプログラムを提供する。【解決手段】オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップＳ１０と、前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップＳ１１と、特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップＳ６とを含む。【選択図】図１
2009169864.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、
前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、
前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、
特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを含む
ことを特徴とするコンパイル方法。
【請求項２】
前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１に記載のコンパイル方法。
【請求項３】
前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１に記載のコンパイル方法。
【請求項４】
前記仮想継承解析ステップは、
前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１に記載のコンパイル方法。
【請求項５】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうち、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項１〜４のいずれか１項に記載のコンパイル方法。
【請求項６】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項１〜５のいずれか１項に記載のコンパイル方法。
【請求項７】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項５に記載のコンパイル方法。
【請求項８】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえ前の呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項６に記載のコンパイル方法。
【請求項９】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項５に記載のコンパイル方法。
【請求項１０】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項６に記載のコンパイル方法。
【請求項１１】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイルをするためのコンパイルプログラムであって、
前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、
前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、
特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを
コンピュータに実行させるためのコンパイルプログラム。
【請求項１２】
前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１１に記載のコンパイルプログラム。
【請求項１３】
前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１１に記載のコンパイルプログラム。
【請求項１４】
前記仮想継承解析ステップは、前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する
ことを特徴とする請求項１１に記載のコンパイルプログラム。
【請求項１５】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項１１〜１４のいずれか１項に記載のコンパイルプログラム。
【請求項１６】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項１１〜１５のいずれか１項に記載のコンパイルプログラム。
【請求項１７】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項１５に記載のコンパイルプログラム。
【請求項１８】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項１６に記載のコンパイルプログラム。
【請求項１９】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
ことを特徴とする請求項１５に記載のコンパイルプログラム。
【請求項２０】
前記特殊関数共通化ステップは、
仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
ことを特徴とする請求項１６に記載のコンパイルプログラム。
【請求項２１】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法を実行するコンパイラ装置であって、
前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析手段と、
前記仮想継承解析手段で解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化手段と、
特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成手段とを備える
ことを特徴とするコンパイラ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方法およびコンパイルプログラムに関し、特にオブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法およびコンパイルプログラムに関する。
【背景技術】
【０００２】
近年のソフトウェア開発において、プログラムの規模が大規模化してきている。そのため、保守性および再利用性の高いオブジェクト指向言語が注目されている。ここで、オブジェクト指向言語とは、オブジェクトの振る舞いを記述し、そのオブジェクトの組み合わせとしてプログラムを記述する言語である。また、オブジェクトとは、データとそれを操作する手続き（メソッド）とが一体化されたひとまとまりの単位である。
【０００３】
オブジェクト指向言語として、例えば「Ｃ＋＋」がある。「Ｃ＋＋」は、また、手続き型のプログラミング言語である「Ｃ」に、オブジェクト指向的な拡張を施したプログラミング言語である。さらに、「Ｃ＋＋」は、長年プログラミングに広く使用されている「Ｃ」に替わるものとして注目されており、「Ｃ」から「Ｃ＋＋」へプログラミング移行が各所で行われている。
【０００４】
しかし「Ｃ＋＋」は、「Ｃ」と比較してさまざまな機能が強化されている一方、冗長なコードが生成されてしまう。そこで、この冗長なコードを削減するさまざまな技術が提案されている（例えば、特許文献１または特許文献２）。
【０００５】
特許文献１では、オブジェクトが生成されないクラスについての関数を削除する方法が開示されている。
【０００６】
ここで、クラスとは、オブジェクト指向プログラミングにおいて、データとその操作手順であるメソッドをまとめたオブジェクトの雛型を定義したものである。これを定義することで、同種のオブジェクトをまとめて扱うことができるようになる。
【０００７】
特許文献２では、呼び出しが行われないメソッドの関数定義を生成しない方法が開示されている。
【０００８】
ここで、関数とは、引数と呼ばれるデータを受取り、定められた通りの処理を実行して結果を返す一連の命令群である。関数は、多くのプログラミング言語でプログラムを構成する要素となっている。
【特許文献１】特開２００５−１８４２５号公報
【特許文献２】特開２００６−２８５５８４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記特許文献１で開示されている方法は、オブジェクトが生成されないクラスに限定されており、オブジェクトが生成されるクラスにおける冗長な関数を削除することはできない。また、上記特許文献２で開示されている方法では、呼び出しが行われないメソッドに限定されており、呼び出しが行われかつ冗長な関数定義が存在する場合には対応できない。
【００１０】
本発明は、かかる課題に鑑みてなされたものであり、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法およびコンパイルプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記の課題を解決するために、本発明に係るコンパイル方法は、オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを含むことを特徴とする。
【００１２】
この方法によれば、仮想継承で定義されていないクラスに対し、クラスオブジェクトの生成有無に関わらず、また呼びだしの有無に関わらず、冗長に生成される関数（特に、コンストラクタ、デストラクタ）の削除ができ、コード生成効率が向上する。それにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
【００１３】
好ましくは、前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する。
【００１４】
この方法によれば、プログラム中で定義されているクラスのうち、仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
【００１５】
さらに好ましくは、前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する。
【００１６】
この方法によれば、例えばプログラマが入力プログラムに＃ｐｒａｇｍａ指令による言語仕様制御文を記述することで、もともと入力プログラムに記述されているクラス定義を解析する必要なく、高速に仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
【００１７】
さらに好ましくは、前記仮想継承解析ステップは、前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する。
【００１８】
この方法によれば、例えばプログラマがコンパイラシステムのオプションによって言語仕様制御命令を与えることで、もともと入力プログラムに記述されているクラス定義を解析する必要なしに、高速に仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
【００１９】
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうち、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する。
【００２０】
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえ前の呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する。
【００２１】
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する。
【００２２】
これらの方法によれば、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
【００２３】
なお、本発明は、このような特徴的なステップを有するコンパイル方法として実現することができるだけでなく、当該コンパイル方法に含まれる特徴的なステップを手段とするコンパイラ装置として実現したり、当該コンパイル方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラ（コンパイルプログラム）として実現したりすることもできる。そして、そのようなコンパイラは、Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ  （ＣＤ−ＲＯＭ）などの記憶媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【発明の効果】
【００２４】
本発明によれば、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法およびコンパイルプログラムを提供することが可能となる。それにより、コード生成効率が向上する効果を奏する。
【発明を実施するための最良の形態】
【００２５】
以下、本発明の実施の形態に係るコンパイル方法について図面を参照しながら説明する。
【００２６】
なお、以下の実施の形態例は本発明を具体化した１例であって、本発明の技術範囲を限定するものではない。
【００２７】
図１は、コンパイラにより実行される処理内容の１例を示すフローチャートである。
ここで、コンパイラとは、人間がプログラミング言語で記述したソフトウェアの設計図（ソースプログラム）を、コンピュータが実行できる形式（オブジェクトコード）に変換するソフトウェア（コンパイルプログラム）である。
【００２８】
まず、コンパイラは、例えばプログラム記憶部１に記憶されているヘッダファイルおよびソースプログラムを読み込む入力ステップを行う（Ｓ１）。
【００２９】
次に、コンパイラは、入力ステップＳ１で読み込んだソースプログラムの構文を解析し、シンボルテーブルや構文木を生成する構文解析ステップを行う（Ｓ２）。
【００３０】
ここで、シンボルテーブルとは、解析時に検出されたすべての識別子とそれらのプログラム中の位置と属性とからなるリストであり、コンパイラが識別子の使い方を判断するために用いるためのリストである。また、構文木とは、プログラミング言語の構文を表す木構造である。
【００３１】
次に、コンパイラは、生成された構文木に基づいて、中間コードを生成する中間コード生成ステップを行う（Ｓ３）。
【００３２】
次に、コンパイラは、中間コード生成ステップＳ３で生成された中間コードに対して各種最適化を施す最適化ステップを行う（Ｓ４）。
【００３３】
次に、コンパイラは、最適化ステップＳ４で最適化された中間コードに含まれるすべての変数に対してレジスタやメモリなどのハードウェア資源を割り付ける資源割付ステップを行う（Ｓ５）。
【００３４】
次に、資源割付ステップＳ５で資源割付された中間コードをオブジェクトコードに変換し、オブジェクトプログラムとして生成コード記憶部２に出力する出力ステップを行う（Ｓ６）。出力ステップＳ６で出力されたオブジェクトプログラムは、生成コード記憶部２に記憶される。
【００３５】
最適化ステップＳ４は、図１に示すように、仮想継承解析ステップＳ１０と、特殊関数共通化ステップＳ１１と、その他の最適化ステップＳ１２とを含む。
【００３６】
仮想継承解析ステップＳ１０は、中間コードを解析し、プログラム中に存在するクラスが仮想継承で定義されているかどうかを解析する。
【００３７】
ここで、仮想継承とは、複数の親クラスからクラスの性質を継承する多重継承を行いつつ、基底クラスの重複継承をさけるためのクラス継承手段である。例えば、あるクラスを継承したクラスが２つあり、その２つのクラスを多重継承した場合、大元のクラス（基底クラス）を２回継承することになる。仮想継承では、２回継承した大元のクラスである基底クラスを仮想基本クラスとして宣言し、そのインスタンスを区別しないことによって継承が重複することを防いでいる。
【００３８】
特殊関数共通化ステップＳ１１は、仮想継承解析ステップＳ１０の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。
【００３９】
ここで、コンストラクタとは、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行う関数であり、構築子とも呼ばれる。また、デストラクタとはオブジェクト指向のプログラミング言語でオブジェクトを消去する際に呼び出されて後処理などを行う関数であり、消去子とも呼ばれる。
【００４０】
仮想継承解析ステップＳ１０ならびに特殊関数共通化ステップＳ１１の詳細については後述する。
【００４１】
なお、その他の最適化ステップＳ１２は、一般的な最適化ステップであり、本発明の要旨ではないため、その説明は省略する。
【００４２】
また、入力ステップＳ１、構文解析ステップＳ２、中間コード生成ステップＳ３、資源割付ステップＳ５、オブジェクト出力ステップＳ６、およびその他の最適化ステップＳ１２については、既存の処理と同様の処理であり本発明の主眼ではない。よって詳細な説明は省略する。
【００４３】
また、本発明での仮想継承解析ステップＳ１０ならびに特殊関数共通化ステップＳ１１は、必ずしも中間コード生成ステップＳ３と資源割付ステップＳ５の間の最適化ステップＳ４内に限定されるものではなく、コンパイルステップ内の区間で解析や共通化が可能な状態であれば、それぞれどの区間内（Ｓ１〜Ｓ６の区間内）で行われてもよい。
【００４４】
以下、本発明の主眼である仮想継承解析ステップＳ１０ならびに特殊関数共通化ステップＳ１１について説明する。
【００４５】
図２は、仮想継承解析ステップＳ１０で実行される処理内容の第１の例を示すフローチャートである。
【００４６】
仮想継承解析ステップＳ１０では、入力ステップＳ１で入力されたソースプログラム（入力プログラム）に対応する各クラス定義毎、すなわち中間コード生成ステップＳ３で生成された中間コード内に記述された各クラス定義毎に対して以下の処理（図２中ループＡと記載。）を繰り返す。
【００４７】
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
【００４８】
解析対象（クラス定義）が存在する場合には、中間コード内に記述されたクラス（継承元のクラスを含む）が、仮想継承によりクラス定義が行われているかどうか解析する（Ｓ１０２１）。
【００４９】
仮想継承によりクラス定義が行われていない場合には（Ｓ１０２１のＮｏの場合）、解析したそのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする（Ｓ１０２２）。それは例えば、共通化対象とする旨を示す共通化判定フラグ等で制御することができる。
【００５０】
仮想継承によりクラス定義が行われている場合には（Ｓ１０２１のＹｅｓの場合）、解析したそのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない（Ｓ１０２３）。それは例えば、共通化対象としない旨を示す共通化判定フラグ等で制御することができる。
【００５１】
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループＡを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループＡは終わりであるので、処理を終了する。
【００５２】
以上のように、仮想継承解析ステップＳ１０では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
【００５３】
なお、共通化対象であるかどうかを示す情報の形態は、特殊関数共通化ステップＳ１１において参照可能であれば、中間コード内のデータであっても、クラスと関連付けられている独立したデータであってもよい。
【００５４】
図３は、仮想継承解析ステップＳ１０で実行される処理内容の第２の例を示すフローチャートである。
【００５５】
仮想継承解析ステップＳ１０では、図２同様に、入力プログラムに対応する各クラス定義毎に対して以下の処理（図３中ループＢと記載。）を繰り返す。
【００５６】
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
【００５７】
解析対象（クラス定義）が存在する場合には、入力プログラム中の記述に、言語仕様制御文により、仮想継承を含まない言語仕様に制御されているかどうか解析する（Ｓ１０３１）。ここで、言語仕様制御文は、言語仕様に則り入力プログラム中に記述された制御文である。例えば＃ｐｒａｇｍａ指令のような言語仕様に用意されている特殊な機能を有効にするよう指示するための制御文をソースプログラムに記述することで、コンパイラに対して直接言語仕様に関する情報を与える制御をするものである。
【００５８】
言語仕様制御文により、仮想継承を含まない言語仕様に制御されている場合は（Ｓ１０３１のＮｏの場合）、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする（Ｓ１０３２）。
【００５９】
そうではない場合、すなわち、言語仕様制御文により、仮想継承を含まない言語仕様に制御されていない場合は（Ｓ１０３１のＹｅｓの場合）、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない（Ｓ１０３３）。
【００６０】
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループＢを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループＢは終わりであるので、処理を終了する。
【００６１】
以上のように、仮想継承解析ステップＳ１０では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
【００６２】
図４は、仮想継承解析ステップＳ１０で実行される処理内容の第３の例を示すフローチャートである。
【００６３】
仮想継承解析ステップＳ１０では、図３同様に、入力プログラムに対応する各クラス定義毎に対して以下の処理（図３中ループＣと記載。）を繰り返す。
【００６４】
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
【００６５】
解析対象（クラス定義）が存在する場合には、入力プログラム中の記述に、言語仕様制御命令により、仮想継承を含まない言語仕様に制御されているかどうか解析する（Ｓ１０４１）。ここで、言語仕様制御命令は、入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である。例えばコマンドラインオプションのようなコンパイラに用意されている特殊な機能を有効にするよう指示するためのコマンドをソースプログラムに記述することで、コンパイラシステムに対して直接言語仕様に関する情報を与える制御をするものである。
【００６６】
言語仕様制御命令により、仮想継承を含まない言語仕様に制御されている場合は（Ｓ１０４１のＹｅｓの場合）、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする（Ｓ１０４２）。
【００６７】
そうではない場合、すなわち、言語仕様制御命令により、仮想継承を含まない言語仕様に制御されていない場合は（Ｓ１０４１のＮｏの場合）、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない（Ｓ１０４３）。
【００６８】
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループＣを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループＣは終わりであるので、処理を終了する。
【００６９】
以上のように、仮想継承解析ステップＳ１０では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
【００７０】
なお、図２から図４で説明する仮想継承解析ステップＳ１０の第１〜第３の処理内容は、例えば優先度をつけることで図２から図４のすべてのステップを含む一つの仮想継承解析ステップＳ１０としてもよく、組み合わせも自由に選択してもよい。
【００７１】
次に、特殊関数共通化ステップＳ１１について説明する。
図５は、特殊関数共通化ステップＳ１１で実行される処理内容の第１の例を示すフローチャートである。
【００７２】
特殊関数共通化ステップＳ１１では、仮想継承解析ステップＳ１０での解析結果に応じて、中間コード生成ステップＳ３で生成された中間コード内に記述された各クラスのコンストラクタに対する処理（ループＤ）とデストラクタに対する処理（ループＥ）とを行う。
【００７３】
まず、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、コンストラクタが存在するかどうか確認する。
【００７４】
コンストラクタが存在する場合には、そのコンストラクタが共通化対象であるかどうかを判定する（Ｓ１１５１）。
【００７５】
そのコンストラクタが共通化対象であれば（Ｓ１１５１のＹｅｓの場合）、そのコンストラクタに対する完全コンストラクタと部分コンストラクタのどちらか一方の呼び出し命令を他方の呼び出し命令に置きかえる（Ｓ１１５２）。そして、置きかえられた側の（完全もしくは部分）コンストラクタのコードを削除する（Ｓ１１５３）。
【００７６】
ここで、完全コンストラクタとは、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである。また、部分コンストラクタは、クラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである。
【００７７】
次に、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、さらにコンストラクタが存在するかを確認する。さらにコンストラクタがある場合には、各クラスのコンストラクタに対してループＤで示した処理内容を繰り返す。コンストラクタがない場合には、ループＤは終わりであるので、ループＤで示す処理を終了する。
【００７８】
また、Ｓ１１５１において、そのコンストラクタ共通化対象でなければ何もしない（Ｓ１１５１のＮｏの場合）。そして、ループＤの処理を終了する。
【００７９】
次に、ループＥで示すデストラクタに対する処理を行う。
まず、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、デストラクタが存在するかどうか確認する。
【００８０】
デストラクタが存在する場合には、そのデストラクタが共通化対象であるかどうかを判定する（Ｓ１１５４）。
【００８１】
そのデストラクタが共通化対象であれば（Ｓ１１５４のＹｅｓの場合）、そのデストラクタに対する完全デストラクタと部分デストラクタのどちらか一方の呼び出し命令を他方の呼び出し命令に置きかえる（Ｓ１１５５）。そして、置きかえられた側の（完全、もしくは部分）デストラクタのコードを削除する（Ｓ１１５６）。
【００８２】
ここで、完全デストラクタとは、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである。また、部分デストラクタは、クラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである。
【００８３】
次に、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、さらにデストラクタが存在するかを確認する。さらにデストラクタがある場合には、各クラスのデストラクタに対してループＥで示した処理内容を繰り返す。デストラクタがない場合には、ループＥは終わりであるので、ループＥで示す処理を終了する。
【００８４】
また、Ｓ１１５４において、そのデストラクタが共通化対象でなければ何もしない（Ｓ１１５４のＮｏの場合）。そして、ループＥの処理を終了する。
【００８５】
以上のように、特殊関数共通化ステップＳ１１では、仮想継承解析ステップＳ１０の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。それにより、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
【００８６】
図６は、特殊関数共通化ステップＳ１１で実行される処理内容の第２の例を示すフローチャートである。
【００８７】
図５と同様に特殊関数共通化ステップＳ１１では、仮想継承解析ステップＳ１０での解析結果に応じて、中間コード生成ステップＳ３で生成された中間コード内に記述された各クラスのコンストラクタに対する処理（ループＦ）とデストラクタに対する処理（ループＧ）とを行う。
【００８８】
まず、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、コンストラクタが存在するかどうか確認する。
【００８９】
コンストラクタが存在する場合には、そのコンストラクタが共通化対象であるかどうかを判定する（Ｓ１１６１）。
【００９０】
そのコンストラクタが共通化対象であれば（Ｓ１１６１のＹｅｓの場合）、そのコンストラクタに対する完全コンストラクタと部分コンストラクタのどちらか一方のコードを削除する（Ｓ１１６２）。そして、他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルを配置する（Ｓ１１６３）。
【００９１】
次に、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、さらにコンストラクタが存在するかを確認する。さらにコンストラクタがある場合には、各クラスのコンストラクタに対してループＦで示した処理内容を繰り返す。コンストラクタがない場合には、ループＦは終わりであるので、ループＦで示す処理を終了する。
【００９２】
また、Ｓ１１６１において、そのコンストラクタが共通化対象でなければ何もしない（Ｓ１１６１のＮｏの場合）。そして、ループＤの処理を終了する。
【００９３】
次に、ループＧで示すデストラクタに対する処理を行う。
まず、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、デストラクタが存在するかどうか確認する。
【００９４】
デストラクタが存在する場合には、そのデストラクタが共通化対象であるかどうかを判定する（Ｓ１１６４）。
【００９５】
そのデストラクタが共通化対象であれば（Ｓ１１６４のＹｅｓの場合）、そのデストラクタに対する完全デストラクタと部分デストラクタのどちらか一方のコードを削除する（Ｓ１１６５）。そして他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルを配置する（Ｓ１１６５）。
【００９６】
次に、仮想継承解析ステップＳ１０で解析された中間コード内に記述された各クラスに対して、さらにデストラクタが存在するかを確認する。さらにデストラクタがある場合には、各クラスのデストラクタに対してループＧで示した処理内容を繰り返す。デストラクタがない場合には、ループＧは終わりであるので、ループＧで示す処理を終了する。
【００９７】
また、Ｓ１１６４において、そのデストラクタが共通化対象でなければ何もしない（Ｓ１１６４のＮｏの場合）。そして、ループＧの処理を終了する。
【００９８】
以上のように、特殊関数共通化ステップＳ１１では、仮想継承解析ステップＳ１０の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。それにより、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
【００９９】
以上、仮想継承解析ステップＳ１０と、特殊関数共通化ステップＳ１１を含む最適化ステップＳ４を行うことにより、仮想継承で定義されていないクラスに対し、クラスオブジェクトの生成有無に関わらず、また呼びだしの有無に関わらず、冗長に生成される関数（特に、コンストラクタ、デストラクタ）の削除ができ、コード生成効率が向上する。それにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
【０１００】
（実施例）
以下、本発明のコンパイル方法について、Ｃ＋＋言語を使用した例を示すことで詳細に説明する。
【０１０１】
図７は、プログラム記憶部１に記憶されているソースプログラムの１例を示す図である。
【０１０２】
以下では、図７で示すソースプログラムを入力した場合のコンパイル方法を説明する。ここで、前提として、＜ｅｘ．ｃｐｐ＞はＣ＋＋モードでコンパイルするものとする。
【０１０３】
図７に示すソースファイル＜ｅｘ．ｃｐｐ＞では、４つのクラス（Ｘ、Ｙ、Ｚ、Ｕ）を定義している。図７において、４つのクラス（Ｘ、Ｙ、Ｚ、Ｕ）に対してそれぞれコンストラクタを（１）〜（４）で示すように定義している。同様に、４つのクラス（Ｘ、Ｙ、Ｚ、Ｕ）に対してそれぞれデストラクタを（５）〜（６）で示すように定義している。
【０１０４】
図８〜図１０は、従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。また、図８〜図１０は、ｇｃｃバージョン３．３．６ｒｅｌｅａｓｅ  コンパイラで最適化オプション「−Ｏ」を付加させた場合のアセンブラ出力結果である。ここでは、以下の説明を容易にするため、「．Ｌ」で始まるラベルを除外している。
【０１０５】
従来の方法では、図８〜図１０に示すように、各クラスのコンストラクタ定義やデストラクタ定義は、それぞれ完全コンストラクタおよび部分コンストラクタと、完全デストラクタおよび部分デストラクタとのコードに無条件に変換される。図７で示すコンストラクタおよびデストラクタと、図８〜図１０で示す完全コンストラクタおよび部分コンストラクタと、完全デストラクタおよび部分デストラクタとの対応は以下の［表１］および［表２］で示される通りである。
【０１０６】
【表１】
2009169864.tif 000003
【０１０７】
【表２】
2009169864.tif 000004
【０１０８】
図８〜図１０から、「＿ＺＮ１ＸＣ１Ｅｖ」および「＿Ｚ１ＸＣ２Ｅｖ」のコードと、「＿ＺＮ１ＺＣ１Ｅｖ」および「＿ＺＮ１ＺＣ２Ｅｖ」とのコードと、「＿ＺＮ１ＸＤ１Ｅｖ」および「＿Ｚ１ＸＤ２Ｅｖ」のコードと、「＿ＺＮ１ＺＤ１Ｅｖ」および「＿ＺＮ１ＺＤ２Ｅｖ」のコードとは、それぞれ全く同じアセンブリコードが生成されており、コードが冗長に生成されていることがわかる。
【０１０９】
次に、本実施の形態におけるコンパイル方法について、Ｃ＋＋言語を使用した例を示す。
【０１１０】
中間コード生成ステップにより生成された中間コードは、仮想継承解析ステップＳ１０において、クラス定義毎に図２で示すループＡの処理内容が実施される。本実施例では、図７で示した４つのクラス定義（Ｘ、Ｙ、Ｚ、Ｕ）が対象となる。
【０１１１】
図７において、クラスＸは、仮想継承によりクラス定義が行われていないので、クラスＸのコンストラクタ「Ｘ：：Ｘ（）」ならびにデストラクタ「Ｘ：：〜Ｘ（）」が共通化対象であるとして記録される。
【０１１２】
図１１は、共通化対象かどうかを示す共通化対象判定フラグの内容を示す図である。
図１１に示されるように、クラスＸのコンストラクタ中間コードおよびクラスＸのデストラクタ中間コードの共通化対象判定フラグに「ＴＲＵＥ」と記録される。このように、共通化対象とする旨を示す共通化判定フラグが記録されることで、クラスＸのコンストラクタ「Ｘ：：Ｘ（）」ならびにデストラクタ「Ｘ：：〜Ｘ（）」が共通化対象であるとして記録される。
【０１１３】
また、図７において、クラスＹは、キーワード「ｖｉｒｔｕａｌ」を用いてクラスＸから仮想継承によりクラス定義が行われているので、クラスＹのコンストラクタ「Ｙ：：Ｙ（）」ならびにデストラクタ「Ｙ：：〜Ｙ（）」が共通化対象ではないとして記録される。
【０１１４】
ここで、例えば図１１に示すように、クラスＹのコンストラクタ中間コードおよびクラスＹデストラクタ中間コードの共通化対象判定フラグに「ＦＡＬＳＥ」と記録されることで、共通化対象でない旨が記録される。
【０１１５】
また、図７において、クラスＺは、クラスＸから継承されているが、仮想継承ではなく、また継承元のクラスＸも仮想継承によりクラス定義が行われていないので、クラスＺのコンストラクタ「Ｚ：：Ｚ（）」ならびにデストラクタ「Ｚ：：〜Ｚ（）」が共通化対象であるとして記録される。
【０１１６】
ここで、例えば図１１に示すように、クラスＺのコンストラクタ中間コードおよびクラスＺのデストラクタ中間コードの共通化対象判定フラグに「ＴＲＵＥ」と記録されることで、共通化対象である旨が記録される。
【０１１７】
また、図７において、クラスＵは、クラスＹとクラスＺから継承されており仮想継承は行われていないが、継承元であるクラスＹが仮想継承により定義されている。したがって、クラスＵのコンストラクタ「Ｕ：：Ｕ（）」ならびにデストラクタ「Ｕ：：〜Ｕ（）」が共通化対象ではないとして記録される。
【０１１８】
ここで、例えば図１１に示すように、クラスＵのコンストラクタ中間コードおよびクラスＵのデストラクタ中間コードの共通化対象判定フラグに「ＦＡＬＳＥ」と記録されることで、共通化対象でない旨が記録される。
【０１１９】
なお、図１１で示す共通化対象判定フラグは、共通化対象であるかどうかを示す情報の１形態であり、特殊関数共通化ステップＳ１１において参照可能であれば、上述例のような中間コード内のデータであっても、クラスと関連付けられている独立したデータであってもよい。
【０１２０】
次に、上述の仮想継承解析ステップＳ１０における解析結果に応じて特殊関数共通化ステップＳ１１が実施される。
【０１２１】
図５における特殊関数共通化ステップＳ１１で実行される処理内容の第１の例では、ループＤの処理内容とループＥの処理内容が実施される。本実施例では、特殊関数共通化ステップＳ１１において、図１１で示す共通化判定フラグを参照することにより、仮想継承解析ステップＳ１０の解析結果から冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。図１１から、クラスＸおよびクラスＺのコンストラクタとデストラクタとが共通化対象となる。
【０１２２】
よって、完全コンストラクタと部分コンストラクタとのどちらか一方の呼びだし命令を他方の呼びだし命令に置きかえた後、置きかえられたコンストラクタのコードを削除する。
【０１２３】
本実施例では、部分コンストラクタ呼び出しを完全コンストラクタ呼び出しに置き換え、部分コンストラクタを削除する（ループＤの処理）。デストラクタについても同様の処理を行う（ループＥの処理）。上記処理を行った結果を図１２〜図１４に示す。
【０１２４】
図１２〜図１４は、本発明における方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【０１２５】
図中★印および下線箇所で示されたところが置きかえられた完全コンストラクタ呼びだし命令ならびに完全デストラクタ呼び出し命令である。
【０１２６】
また、線で囲まれた部分が、特殊関数共通化ステップＳ１１において、削除された部分コンストラクタコードならびに部分デストラクタコードである。
【０１２７】
図１２〜図１４のアセンブリ出力結果から、冗長なコードが削除されていることがわかる。
【０１２８】
また、特殊関数共通化ステップＳ１１が図６の第２の例についても以下説明する。図６における特殊関数共通化ステップＳ１１で実行される処理内容の第２の例では、まず、ループＦの処理内容とループＧの処理内容が実施される。図５と同様、本実施例では、特殊関数共通化ステップＳ１１において、図１１で示す共通化判定フラグを参照することにより、仮想継承解析ステップＳ１０の解析結果から冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。図１１から、クラスＸおよびクラスＺのコンストラクタとデストラクタとが共通化対象となる。
【０１２９】
よって、完全コンストラクタと部分コンストラクタとのどちらか一方のコードを削除した後、他方のコードの先頭に、完全コンストラクタの先頭アドレスを示すラベルと部分コンストラクタの先頭アドレスを示すラベルとを配置する。本具体例では部分コンストラクタを削除する（ループＦの処理）。デストラクタについても同様の処理を行う（ループＧの処理）。上記処理を行った結果を図１５〜図１７に示す。
【０１３０】
図１５〜図１７は、本発明における方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【０１３１】
図中、線で囲まれた部分が削除された部分コンストラクタコードならびに部分デストラクタコードであり、★印および下線箇所で示されたところが新たに配置した部分コンストラクタまたは部分デストラクタの先頭アドレスを示すラベルである。
【０１３２】
図１５〜図１７のアセンブリ出力結果から、冗長なコードが削除されていることがわかる。
【０１３３】
なお、仮想継承解析ステップＳ１０が、図３および図４で示した処理内容である場合、ユーザから制御されている言語仕様が仮想継承を含むかどうかでコンストラクタやデストラクタを共通化対象とすること以外は図２の形態と変わらない。
【０１３４】
図３で示した処理内容の具体例としては、例えばプログラム中にＥＣ＋＋（ｅｍｂｅｄｄｅｄ＿ｃ＋＋）言語仕様内で記述されていることを保証するプラグマである「＃ｐｒａｇｍａ  ＿ｅｍｂｅｄｄｅｄ＿ｃ＋＋」のような言語仕様制御文が存在した場合、仮想継承はＥＣ＋＋言語仕様から外れているので、すべてのクラスのコンストラクタおよびデストラクタを共通化対象とすることになる。したがって、上述した実施例と同様に特殊関数共通化ステップＳ１１を行うことで冗長なコードが削除できる。
【０１３５】
図４で示した処理内容の具体例としては、例えばコンパイラに対してＥＣ＋＋言語モードでコンパイルを行うことを指定するオプションである「−−ｅｍｂｅｄｄｅｄ＿ｃ＋＋  」のような言語仕様制御命令が与えられた場合、仮想継承はＥＣ＋＋言語仕様から外れているので、すべてのクラスのコンストラクタおよびデストラクタを共通化対象とすることになる。したがって、上述した同様に特殊関数共通化ステップＳ１１を行うことで冗長なコードが削除できる。
【０１３６】
以上、本発明のコンパイル方法およびコンパイルプログラムによれば、仮想継承解析ステップＳ１０と、特殊関数共通化ステップＳ１１を含む最適化ステップＳ４を行うことにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
【０１３７】
以上、本発明のコンパイル方法およびコンパイルプログラムについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。本発明の趣旨を逸脱しない限り、当業者が思いつく各種変形を本実施の形態に施したものや、異なる実施の形態における処理内容を組み合わせて構築される形態も、本発明の範囲内に含まれる。
【産業上の利用可能性】
【０１３８】
本発明は、コンパイル方法およびコンパイルプログラムに利用でき、特に、携帯電話やＰＤＡ（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｔ）等のコードサイズの小さなオブジェクトコードを必要とする組み込み機器用のプログラムのコンパイル方法およびコンパイルプログラムに利用することができる。
【図面の簡単な説明】
【０１３９】
【図１】本発明の実施の形態に係るコンパイラにより実行される処理内容の１例を示すフローチャートである。
【図２】仮想継承解析ステップＳ１０で実行される処理内容の第１の例を示すフローチャートである。
【図３】仮想継承解析ステップＳ１０で実行される処理内容の第２の例を示すフローチャートである。
【図４】仮想継承解析ステップＳ１０で実行される処理内容の第３の例を示すフローチャートである。
【図５】特殊関数共通化ステップＳ１１で実行される処理内容の第１の例を示すフローチャートである。
【図６】特殊関数共通化ステップＳ１１で実行される処理内容の第２の例を示すフローチャートである。
【図７】プログラム記憶部１に記憶されているソースプログラムの１例を示す図である。
【図８】従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図９】従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１０】従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１１】共通化対象かどうかを示す共通化対象判定フラグの内容を示す図である。
【図１２】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１３】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１４】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１５】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１６】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【図１７】本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
【符号の説明】
【０１４０】
１    プログラム記憶部
２    生成コード記憶部
【図１】
2009169864.tif 000005
【図２】
2009169864.tif 000006
【図３】
2009169864.tif 000007
【図４】
2009169864.tif 000008
【図５】
2009169864.tif 000009
【図６】
2009169864.tif 000010
【図７】
2009169864.tif 000011
【図８】
2009169864.tif 000012
【図９】
2009169864.tif 000013
【図１０】
2009169864.tif 000014
【図１１】
2009169864.tif 000015
【図１２】
2009169864.tif 000016
【図１３】
2009169864.tif 000017
【図１４】
2009169864.tif 000018
【図１５】
2009169864.tif 000019
【図１６】
2009169864.tif 000020
【図１７】
2009169864.tif 000021