(57)【要約】【課題】Ｃ＋＋などのオブジェクト指向言語を用いたプログラムのプログラム変換方法において、不要な関数をより多く削除する方法を提供する。【解決手段】本発明のプログラム変換ステップＳ１００では、オブジェクト解析ステップＳ１０４において、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録し、不要関数解析ステップＳ１０５において、解析情報記憶部１２に保持されている情報を受けてオブジェクトが生成されないクラスについての関数（不要関数）を解析し、その結果を解析情報記憶部１２に記録し、不要関数削除ステップＳ１０６において、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する。【選択図】        図１
2005018425.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換する変換ステップを備えるプログラム変換方法であって、
上記変換ステップは、
上記入力プログラムを入力する入力ステップと、
上記入力プログラムにおける上記クラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、
上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析ステップと、
上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除ステップと、
目的プログラムを出力する出力ステップと
を備えることを特徴とするプログラム変換方法。
【請求項２】
請求項１に記載のプログラム変換方法であって、
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、
上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスに関連する関数を抽出することを特徴とするプログラム変換方法。
【請求項３】
請求項１に記載のプログラム変換方法であって、
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、
上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することを特徴とするプログラム変換方法。
【請求項４】
請求項１または２に記載のプログラム変換方法であって、
上記変換ステップは、上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップをさらに備え、
上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することを特徴とするプログラム変換方法。
【請求項５】
請求項４に記載のプログラム変換方法であって、
上記葉のクラスは第１の葉のクラスであって、
上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理をさらに抽出することを特徴とするプログラム変換方法。
【請求項６】
請求項１または２に記載のプログラム変換方法であって、
上記変換ステップは、
上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップと、
上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、
上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることを特徴とするプログラム変換方法。
【請求項７】
請求項６に記載のプログラム変換方法であって、
上記不要処理解析ステップは、特定不要処理解析ステップをさらに備え、
上記特定不要処理解析ステップでは、上記クラスの仮想関数が全て不要であるか否かを判定し、上記クラスの仮想関数が全て不要であると判定された場合には、上記不要な処理として、コンストラクタ内に自動的に生成される処理を抽出することを特徴とするプログラム変換方法。
【請求項８】
請求項６に記載のプログラム変換方法であって、
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、
上記特定不要データ解析ステップでは、上記クラスの仮想関数が全て不要であるか否かを判定し、上記クラスの仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの仮想関数に関連するデータを抽出することを特徴とするプログラム変換方法。
【請求項９】
請求項１〜８のうちいずれか１つに記載のプログラム変換方法であって、
上記変換ステップは、ユーザからの削除処理指定に基づいて、上記削除処理指定により指定された処理を解析する削除指定処理解析ステップをさらに備えることを特徴とするプログラム変換方法。
【請求項１０】
請求項９に記載のプログラム変換方法であって、
上記削除処理指定は、上記入力プログラム中に記述された削除処理指定記述であることを特徴とするプログラム変換方法。
【請求項１１】
請求項９に記載のプログラム変換方法であって、
上記削除処理指定はコマンドラインオプションであることを特徴とするプログラム変換方法。
【請求項１２】
請求項１〜１１のうちのいずれか１項に記載のプログラム変換方法であって、
上記変換ステップは複数回繰り返されることを特徴とするプログラム変換方法。
【請求項１３】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換するプログラム変換方法であって、
上記入力プログラムを入力する入力ステップと、上記クラスについてオブジェクトに関連する処理を抽出するオブジェクト関連関数抽出ステップと、上記クラスについて、オブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、上記オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力ステップとを備える翻訳ステップと、
上記翻訳ステップにおける上記出力ステップの出力に基づいて、不要な処理を抽出する不要処理解析ステップと、上記不要処理解析ステップの解析結果に応じて、リンク対象をリンクするリンクステップとを備える結合ステップと
を備えることを特徴とするプログラム変換方法。
【請求項１４】
請求項１３に記載のプログラム変換方法であって、
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、
上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することを特徴とするプログラム変換方法。
【請求項１５】
請求項１３に記載のプログラム変換方法であって、
上記翻訳ステップは、さらに上記クラスの継承関係を解析するクラス解析ステップを備え、
上記出力ステップでは、上記クラス解析ステップの解析結果もさらに出力し、
上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、
上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することを特徴とするプログラム変換方法。
【請求項１６】
請求項１５に記載のプログラム変換方法であって、
上記葉のクラスは第１の葉のクラスであって、
上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理を抽出することを特徴とするプログラム変換方法。
【請求項１７】
請求項１３に記載のプログラム変換方法であって、
上記翻訳ステップは、
上記クラスの継承関係を解析するクラス解析ステップと、
上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、
上記出力ステップでは、上記クラス解析ステップおよび上記仮想関数解析ステップの解析結果もさらに出力し、
上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることを特徴とするプログラム変換方法。
【請求項１８】
請求項１７に記載のプログラム変換方法であって、
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、
上記特定不要データ解析ステップでは、
上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの上記仮想関数に関連するデータを抽出することを特徴とするプログラム変換方法。
有無を解析することを特徴とするプログラム変換方法。
【請求項１９】
オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換するプログラム変換方法であって、
上記入力プログラムを入力する第１の入力ステップと、上記入力プログラムにおける上記クラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析ステップとを備えるプリコンパイルステップと、
上記入力プログラムおよび上記不要処理解析ステップの解析結果を入力する第２の入力ステップと、上記不要処理解析ステップの上記解析結果に応じて不要な処理を削除する不要処理削除ステップとを備える変換ステップと
を備えることを特徴とするプログラム変換方法。
【請求項２０】
請求項１９に記載のプログラム変換方法であって、
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、
上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することを特徴とするプログラム変換方法。
【請求項２１】
請求項１９に記載のプログラム変換方法であって、
上記プリコンパイルステップは、上記第１の入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップをさらに備え、
上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することを特徴とするプログラム変換方法。
【請求項２２】
請求項２１に記載のプログラム変換方法であって、
上記葉のクラスは第１の葉のクラスであって、
上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理を抽出することを特徴とするプログラム変換方法。
【請求項２３】
請求項１９に記載のプログラム変換方法であって、
上記プリコンパイルステップは、
上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップと、
上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、
上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることを特徴とするプログラム変換方法。
【請求項２４】
請求項２３に記載のプログラム変換方法であって、
上記不要処理解析ステップは、特定不要処理解析ステップをさらに備え、
上記特定不要処理解析ステップでは、上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、コンストラクタ内に自動的に生成される処理を抽出することを特徴とするプログラム変換方法。
【請求項２５】
請求項２３に記載のプログラム変換方法であって、
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、
上記特定不要データ解析ステップでは、上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの上記仮想関数に関連するデータを抽出することを特徴とするプログラム変換方法。
【請求項２６】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、
上記入力プログラムを入力する手段と、
上記入力プログラムに含まれるクラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、
上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析手段と、
上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除手段と
を備えることを特徴とするプログラム。
【請求項２７】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、
上記入力プログラムを入力する入力手段と、上記入力プログラムについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力手段とを備える翻訳手段と、
上記翻訳手段における上記出力手段の出力に基づいて、不要な処理を抽出する不要処理解析手段と、上記不要処理解析手段の解析結果に応じて、リンク対象をリンクするリンク手段とを備える結合手段と
を備えることを特徴とするプログラム。
【請求項２８】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、
入力プログラムを入力する第１の入力手段と、上記入力プログラムにおけるオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析手段とを備えるプリコンパイル手段と、
上記入力プログラムおよび上記不要処理解析手段の解析結果を入力する第２の入力手段と、上記不要処理解析結果の解析結果に応じて不要な処理を削除する不要処理削除手段とを備える変換手段と
を備えることを特徴とするプログラム。
【請求項２９】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、
上記プログラムは、
上記入力プログラムを入力する手段と、
上記入力プログラムに含まれるクラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、
上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析手段と、
上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除手段と
を備えることを特徴とする、コンピュータ読み取り可能な記録媒体。
【請求項３０】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、
上記プログラムは、
上記入力プログラムを入力する入力手段と、上記入力プログラムについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力手段とを備える翻訳手段と、
上記翻訳手段における上記出力手段の出力に基づいて、不要な処理を抽出する不要処理解析手段と、上記不要処理解析手段の解析結果に応じて、リンク対象をリンクするリンク手段とを備える結合手段と
を備えることを特徴とする、コンピュータ読み取り可能な記録媒体。
【請求項３１】
オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、
上記プログラムは、
入力プログラムを入力する第１の入力手段と、上記入力プログラムにおけるオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析手段とを備えるプリコンパイル手段と、
上記入力プログラムおよび上記不要処理解析手段の解析結果を入力する第２の入力手段と、上記不要処理解析結果の解析結果に応じて不要な処理を削除する不要処理削除手段とを備える変換手段と
を備えることを特徴とする、コンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト指向言語により記述されたプログラムを目的プログラムに変換するプログラム変換方法、そのプログラム変換方法をコンピュータに実行させるためのプログラムおよびそのプログラムを記録する記録媒体に関する。
【０００２】
【従来の技術】
近年、プログラムの大規模化に伴い、プログラムの開発効率を高めるため、再利用化をはかるため、あるいはプログラムの保守性を向上させるために、Ｃ＋＋やＪａｖａ（Ｒ）などのオブジェクト指向言語によるプログラム開発が注目されている。
【０００３】
従来の手続き型言語では、手続きに注目して、手続き呼び出しの組み合わせによって所望の処理を実行するのに対し、オブジェクト指向言語では、データとそのデータに対する操作とをまとめたクラスというものに注目して、クラスオブジェクトとその操作の組み合わせにより所望の処理を実行する。なお、この操作は、Ｃ＋＋ではメンバ関数と呼ばれ、Ｊａｖａ（Ｒ）ではメソッドと呼ばれる。
【０００４】
一般に、１つのプログラム中で使用されるクラスの数は多数にのぼるため、メンバ関数（メソッド）の数も膨大な数となる。そのため、プログラムが大規模になると、どのメンバ関数（メソッド）が実際に使用されているかをプログラマが把握することが困難となり、実際に呼び出されることのないメンバ関数（メソッド）のコードが目的プログラム中に含まれることも多くなる。そのため、オブジェクト指向言語で作成されたプログラムを目的プログラムに変換するコンパイラでは、メンバ関数（メソッド）の数をできるだけ少なくするための技術が重要となっている。
【０００５】
メンバ関数（メソッド）を削除する従来技術として、メンバ関数（メソッド）が実際に使用されているかどうかを全プログラムに渡って調べ、使用されていないとわかったメンバ関数（メソッド）を削除するという技術がある（例えば、特許文献１参照）。
【０００６】
ところで、オブジェクト指向言語では、プログラム実行時のオブジェクトの実体に応じて振舞いが変わる多態性という概念があり、Ｃ＋＋では、多態性を有するメンバ関数のことを仮想関数と呼んでいる。Ｊａｖａ（Ｒ）では全てのメソッドが多態性を有している。
【０００７】
仮想関数を使用すると、プログラムが実行されるときに、オブジェクトの実際の型に応じて呼び出されるメンバ関数が変わるため、コンパイル時に、どのメンバ関数が呼び出されるのかを静的に解析することは困難である。しかし、仮想関数を使用した場合でも、ある条件の下では決して呼び出されることがないメンバ関数を解析することが可能である。
【０００８】
呼び出されることのない仮想関数を削除する方法として、仮想関数の呼び出しに注目し、その呼び出しによって呼び出される可能性のあるメンバ関数に印をつけていく方法がある（例えば、特許文献２参照）。この方法では、全ての仮想関数の呼び出しについて呼び出される可能性のある関数に印をつけることにより、印のついていない関数は呼び出されないものと解析する。
【０００９】
【特許文献１】
特開２００１−１４１７１号公報
【特許文献２】
特開平９−２６９８９８号公報
【００１０】
【発明が解決しようとする課題】
しかしながら、従来の技術では、実際には呼び出されることはないが解析が不十分であるため仮想関数を削除できないような場合があった。
【００１１】
特許文献１に開示された技術では、メンバ関数のアドレスが参照されているが、呼び出されることのないメンバ関数が必要であると解析されることがあり、冗長なコードが生成されてしまう場合があった。メンバ関数が実際に呼び出されているかどうかを知るためには、メンバ関数のアドレスがどのように使用されているかをプログラム全体に渡って解析しなければならないため、膨大な解析時間が必要となってしまう。
【００１２】
また、特許文献２に開示された技術では、呼び出される可能性のない仮想関数を呼び出される可能性があると誤って解析してしまい、冗長なコードを削除することができない場合があった。
【００１３】
本発明は、不要なメンバ関数（メソッド）をより多く削除する手段を講ずることにより、より効率的なプログラム変換方法を提供することを目的とする。そのために、オブジェクトが生成されていなければ、それに対応するメンバ関数が不要となる点に着目した。
【００１４】
【課題を解決するための手段】
本発明の第１のプログラム変換方法は、オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換する変換ステップを備えるプログラム変換方法であって、上記変換ステップは、上記入力プログラムを入力する入力ステップと、上記入力プログラムにおける上記クラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析ステップと、上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除ステップと、目的プログラムを出力する出力ステップとを備える。
【００１５】
これにより、クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００１６】
なお、クラスの一種として、構造体や共用体なども解析対象となり、汎用性の高いプログラムにおいても効率のよいコードを作成することができる。
【００１７】
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスに関連する関数を抽出することにより、関数群を処理対象とすることができる。
【００１８】
なお、「オブジェクト未生成クラスに関連する関数群」とは、オブジェクト未生成クラスそのものの関数だけでなく、オブジェクト未生成クラスと継承関係にあるクラスの関数のことをいい、これらの関数には仮想関数も含まれる。
【００１９】
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することにより、呼び出されることのない関数を削除することができる。
【００２０】
上記変換ステップは、上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップをさらに備え、上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することにより、クラスの継承関係を考慮した解析が可能となる。具体的には、クラスツリーに含まれるクラスのうちのいずれかでオブジェクトが生成されている場合でも、葉のクラスについての不要な処理を単独で削除することができる。
【００２１】
上記葉のクラスは第１の葉のクラスであって、上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理をさらに抽出することにより、解析の途中で新たに葉となるクラスも削除することができる。
【００２２】
上記変換ステップは、上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップと、上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることにより、呼び出されることのない仮想関数も削除することができる。
【００２３】
上記不要処理解析ステップは、特定不要処理解析ステップをさらに備え、上記特定不要処理解析ステップでは、上記クラスの仮想関数が全て不要であるか否かを判定し、上記クラスの仮想関数が全て不要であると判定された場合には、上記不要な処理として、コンストラクタ内に自動的に生成される処理を抽出することにより、あるクラスの全ての仮想関数が削除されることによって新たに不要となる処理を削除することができ、コードサイズをより削減することができる。
【００２４】
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、
上記特定不要データ解析ステップでは、上記クラスの仮想関数が全て不要であるか否かを判定し、上記クラスの仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの仮想関数に関連するデータを抽出することにより、あるクラスの全ての仮想関数が削除されることによって新たに不要となるデータを削除することができ、コードサイズをより削減することができる。
【００２５】
上記変換ステップは、ユーザからの削除処理指定に基づいて、上記削除処理指定により指定された処理を解析する削除指定処理解析ステップをさらに備えることにより、変換ステップで自動的に検出することができない処理を削除指定することで削除することができ、コードサイズをより削減することができる。
【００２６】
上記削除処理指定は、上記入力プログラム中に記述された削除処理指定記述であることにより、プログラムの記述容易性を保つことができる。
【００２７】
上記削除処理指定はコマンドラインオプションであることにより、入力プログラムの変更が必要なく、変換ステップの実行時に削除指定することができる。
【００２８】
上記変換ステップは複数回繰り返されることが好ましい。
【００２９】
本発明の第２のプログラム変換方法は、オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換するプログラム変換方法において、上記入力プログラムを入力する入力ステップと、上記クラスについてオブジェクトに関連する処理を抽出するオブジェクト関連関数抽出ステップと、上記クラスについて、オブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、上記オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力ステップとを備える翻訳ステップと、上記翻訳ステップにおける上記出力ステップの出力に基づいて、不要な処理を抽出する不要処理解析ステップと、上記不要処理解析ステップの解析結果に応じて、リンク対象をリンクするリンクステップとを備える結合ステップとを備える。
【００３０】
これにより、クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００３１】
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することにより、呼び出されることのない関数を削除することができる。
【００３２】
上記翻訳ステップは、さらに上記クラスの継承関係を解析するクラス解析ステップを備え、上記出力ステップでは、上記クラス解析ステップの解析結果もさらに出力し、上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することにより、クラスの継承関係を考慮した解析が可能となる。具体的には、クラスツリーに含まれるクラスのうちのいずれかでオブジェクトが生成されている場合でも、葉のクラスについての不要な処理を単独で削除することができる。
【００３３】
上記葉のクラスは第１の葉のクラスであって、上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理を抽出することにより、解析の途中で新たに葉となるクラスも削除することができる。
【００３４】
上記翻訳ステップは、上記クラスの継承関係を解析するクラス解析ステップと、上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、上記出力ステップでは、上記クラス解析ステップおよび上記仮想関数解析ステップの解析結果もさらに出力し、上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることにより、呼び出されることのない仮想関数も削除することができる。
【００３５】
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、上記特定不要データ解析ステップでは、上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの上記仮想関数に関連するデータを抽出することにより、あるクラスの全ての仮想関数が削除されることによって新たに不要となるデータを削除することができ、コードサイズをより削減することができる。
【００３６】
本発明の第３のプログラム変換方法は、オブジェクト指向言語で記述され、少なくとも１つのクラスを有する入力プログラムを変換するプログラム変換方法であって、上記入力プログラムを入力する第１の入力ステップと、上記入力プログラムにおける上記クラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析ステップと、上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析ステップとを備えるプリコンパイルステップと、上記入力プログラムおよび上記不要処理解析ステップの解析結果を入力する第２の入力ステップと、上記不要処理解析ステップの上記解析結果に応じて不要な処理を削除する不要処理削除ステップとを備える変換ステップとを備える。
【００３７】
これにより、クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００３８】
上記オブジェクト解析ステップで、上記クラスがオブジェクトを生成しないオブジェクト未生成クラスであると解析された場合には、上記不要処理解析ステップでは、上記不要な処理として、上記オブジェクト未生成クラスの関数を抽出することにより、呼び出されることのない関数を削除することができる。
【００３９】
上記プリコンパイルステップは、上記第１の入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップをさらに備え、上記不要処理解析ステップでは、上記クラスのクラスツリーに含まれる葉のクラスについてオブジェクトが生成されているか否かを解析し、上記葉のクラスについてオブジェクトが生成されていない場合には、上記不要な処理として、上記葉のクラスの処理を抽出することにより、クラスの継承関係を考慮した解析が可能となる。具体的には、クラスツリーに含まれるクラスのうちのいずれかでオブジェクトが生成されている場合でも、葉のクラスについての不要な処理を単独で削除することができる。
【００４０】
上記葉のクラスは第１の葉のクラスであって、上記不要処理解析ステップでは、上記第１の葉のクラスの削除によって新たに葉となる第２の葉のクラスがある場合であって、かつ、上記第２の葉のクラスについてオブジェクトが生成されない場合には、上記不要な処理として、上記第２の葉のクラスの処理を抽出することにより、解析の途中で新たに葉となるクラスも削除することができる。
【００４１】
上記プリコンパイルステップは、上記入力ステップの後で上記不要処理解析ステップの前に、上記クラスの継承関係を解析するクラス解析ステップと、上記クラスの仮想関数を解析する仮想関数解析ステップをさらに備え、上記不要処理解析ステップは、上記クラスを継承し、かつ、上記クラスの仮想関数を上書きしない非上書き仮想関数保有クラスを抽出するステップと、上記クラスと上記非上書き仮想関数保有クラスとについてオブジェクトが生成されていない場合には、上記不要な処理として上記クラスの上記仮想関数を抽出するステップとを備えることにより、呼び出されることのない仮想関数も削除することができる。
【００４２】
上記不要処理解析ステップは、特定不要処理解析ステップをさらに備え、上記特定不要処理解析ステップでは、上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、コンストラクタ内に自動的に生成される処理を抽出することにより、あるクラスの全ての仮想関数が削除されることによって新たに不要となる処理を削除することができ、コードサイズをより削減することができる。
【００４３】
上記不要処理解析ステップは、特定不要データ解析ステップをさらに備え、上記特定不要データ解析ステップでは、上記クラスの上記仮想関数が全て不要であるか否かを判定し、上記クラスの上記仮想関数が全て不要であると判定された場合には、上記不要な処理として、上記クラスの上記仮想関数に関連するデータを抽出することにより、あるクラスの全ての仮想関数が削除されることによって新たに不要となるデータを削除することができ、コードサイズをより削減することができる。
【００４４】
本発明の第１のプログラムは、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、上記入力プログラムを入力する手段と、上記入力プログラムに含まれるクラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析手段と、上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除手段とを備える。
【００４５】
このプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００４６】
本発明の第２のプログラムは、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、上記入力プログラムを入力する入力手段と、上記入力プログラムについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力手段とを備える翻訳手段と、上記翻訳手段における上記出力手段の出力に基づいて、不要な処理を抽出する不要処理解析手段と、上記不要処理解析手段の解析結果に応じて、リンク対象をリンクするリンク手段とを備える結合手段とを備える。
【００４７】
このプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００４８】
本発明の第３のプログラムは、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムであって、入力プログラムを入力する第１の入力手段と、上記入力プログラムにおけるオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析手段とを備えるプリコンパイル手段と、上記入力プログラムおよび上記不要処理解析手段の解析結果を入力する第２の入力手段と、上記不要処理解析結果の解析結果に応じて不要な処理を削除する不要処理削除手段とを備える変換手段とを備える。
【００４９】
このプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００５０】
本発明の第１の記憶媒体は、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、上記プログラムは、上記入力プログラムを入力する手段と、上記入力プログラムに含まれるクラスについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、上記オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出し、解析結果を不要処理情報記憶部に記録する不要処理解析手段と、上記不要処理情報記憶部の上記解析結果に応じて、上記不要な処理を削除する不要処理削除手段とを備える、コンピュータ読み取り可能な記録媒体である。
【００５１】
この記録媒体に記録されたプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００５２】
本発明の第２の記録媒体は、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、上記プログラムは、上記入力プログラムを入力する入力手段と、上記入力プログラムについてオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果および上記入力プログラムの変換結果を出力する出力手段とを備える翻訳手段と、上記翻訳手段における上記出力手段の出力に基づいて、不要な処理を抽出する不要処理解析手段と、上記不要処理解析手段の解析結果に応じて、リンク対象をリンクするリンク手段とを備える結合手段とを備えることを特徴とする、コンピュータ読み取り可能な記録媒体である。
【００５３】
この記録媒体に記録されたプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００５４】
本発明の第３の記録媒体は、オブジェクト指向言語で記述された入力プログラムをコンピュータに変換させるためのプログラムを記録する記録媒体であって、上記プログラムは、入力プログラムを入力する第１の入力手段と、上記入力プログラムにおけるオブジェクト生成の有無を解析し、解析結果をオブジェクト解析情報記憶部に記録するオブジェクト解析手段と、オブジェクト解析情報記憶部の上記解析結果に応じて、不要な処理を抽出する不要処理解析手段とを備えるプリコンパイル手段と、上記入力プログラムおよび上記不要処理解析手段の解析結果を入力する第２の入力手段と、上記不要処理解析結果の解析結果に応じて不要な処理を削除する不要処理削除手段とを備える変換手段とを備えることを特徴とする、コンピュータ読み取り可能な記録媒体である。
【００５５】
この記録媒体に記録されたプログラムがコンピュータによって実行されると、入力プログラムのクラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００５６】
【発明の実施の形態】
オブジェクト指向言語では、データとそのデータに対応するメンバ関数とが対になっている。本発明では、データを保持するクラスオブジェクトがない場合には、そのデータに対応するメンバ関数は、操作対象を有さないため不要となる点に着目した。
【００５７】
なお、本明細書および図面においては、クラスＣ１、クラスＣ２といった用語を用いている。これらは、処理を受ける各クラスのことを一般化して示したものである。関数Ｆ１、クラスツリーＴ１、パスＰ１およびリンク対象Ｌ１についても同様である。
【００５８】
（第１の実施形態）
以下に、本発明の第１の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図１は、第１の実施形態におけるプログラム変換ステップＳ１００の構成を示すフローチャート図である。
【００５９】
図１に示すように、本実施形態のプログラム変換ステップＳ１００は、変換の対象となるプログラムを入力する入力ステップＳ１０１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ１０２と、プログラム中に含まれるクラスの情報を解析情報記憶部１２に記録するクラス抽出ステップＳ１０３と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録するオブジェクト解析ステップＳ１０４と、解析情報記憶部１２に保持されている情報を受けてオブジェクトが生成されないクラスについての関数（不要関数）を解析し、その結果を解析情報記憶部１２に記録する不要関数解析ステップＳ１０５と、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する不要関数削除ステップＳ１０６と、不要関数が削除された後のプログラム（以下では、目的プログラムと呼ぶ）を生成コード記憶部１３に出力する出力ステップＳ１０７とを備えている。クラス抽出ステップＳ１０３〜不要関数削除ステップＳ１０６は、出力される各コードに変化がなくなるまで繰り返す。
【００６０】
なお、不要関数解析ステップＳ１０５では、解析情報記憶部１２から、クラス抽出ステップＳ１０３において抽出されたクラスの情報と、オブジェクト解析ステップＳ１０４において解析されたクラスの情報とに基づいて、不要な関数を解析する。
【００６１】
次に、プログラム変換ステップＳ１００における入力ステップＳ１０１〜出力ステップＳ１０７のより詳細な動作について、プログラム例を参照しながら説明する。図３はプログラムの例を示す図である。
【００６２】
まず、プログラム変換ステップＳ１００が開始されると、入力ステップＳ１０１、構文解析ステップＳ１０２において処理が行われるが、これらのステップは本発明の主眼ではないため、それについての詳細な説明は省略する。
【００６３】
次に、クラス抽出ステップＳ１０３の処理について、図２（ａ）、図３および図４（ａ）を参照しながら説明する。図２（ａ）は、クラス抽出ステップＳ１０３の構成を示すフローチャート図である。
【００６４】
図２（ａ）に示すように、クラス抽出ステップＳ１０３では、構文解析ステップＳ１０２において解析されたプログラムに含まれる全てのクラスＣ１について、ステップａ１〜ステップａ４に示すループを繰り返す。
【００６５】
図３に示すプログラムにおいては、クラスＣ１となるのはクラスＡおよびクラスＢである。図３に示すプログラムがクラス抽出ステップＳ１０３に係ると、ステップａ１で例えばクラスＡを抽出し、ステップａ２においてクラスＡが解析情報記憶部１２にすでに登録されているか否かを判定する。クラスＡについての判定がはじめての場合には、判定結果はＮｏとなり、ステップａ３に処理を移行する。ここで、クラスＡについての判定が２度目以降である場合には、すでにクラスＡが解析情報記憶部１２に登録されているので、判定結果はＹｅｓとなり、ステップａ４に処理を移行する。
【００６６】
ステップａ３では、クラスＡを解析情報記憶部１２に登録し、クラスＡに対応する生成フラグを初期化してＯＦＦとし、処理をステップａ４に移行する。
【００６７】
処理がステップａ４に移行されると、クラスＡとは異なるクラス、この場合にはクラスＢについて、ステップａ１〜ステップａ４のループを繰り返す。以上の処理が終了すると、解析情報記憶部１２における生成フラグの状態は図４（ａ）に示す状態となる。なお、図４（ａ）は、クラス抽出ステップＳ１０３において抽出されるクラスの情報を示す表の図である。
【００６８】
次に、オブジェクト解析ステップＳ１０４の処理について、図２（ｂ）および図３を参照しながら説明する。図２（ｂ）は、オブジェクト解析ステップＳ１０４の構成を示すフローチャート図である。
【００６９】
図２（ｂ）に示すように、オブジェクト解析ステップＳ１０４では、プログラムに含まれる全ての処理（関数の本体）について、ステップｂ１〜ステップｂ４に示すループを繰り返す。
【００７０】
図３に示すプログラムで解析の対象となる処理としては、例えば、ファイル「ａ．ｃｃ」内の文「ａ＝１；」やファイル「ｍａｉｎ．ｃｃ」  内の文「Ｂ  ｏｂｊ＿ｂ；」などがある。図３に示すプログラムがオブジェクト解析ステップＳ１０４に係ると、ステップｂ１で例えば文「ａ＝１；」を抽出し、ステップｂ２で文「ａ＝１；」がクラスオブジェクトを生成する処理か否かを判定する。文「ａ＝１；」はクラスオブジェクトを生成しないので、判定結果はＮｏとなり、ステップｂ４に処理を移行する。ここで、クラスオブジェクトを生成する処理とは、クラス型の変数の生成、メンバの生成またはクラス型への型変換によってオブジェクトが生成されるような場合の処理を意味する。本実施形態では、派生クラス内の基底クラスのようなサブオブジェクトについては対象外とする。
【００７１】
処理がステップｂ４に移行されると、プログラム中に含まれる他の処理について、ステップｂ１〜ステップｂ４のループを繰り返す。図３に示すプログラムのうちで、クラスオブジェクトを生成する処理はファイル「ｍａｉｎ．ｃｃ」の文「Ｂ  ｏｂｊ＿ｂ；」のみであるので、これがステップｂ２で判定されると結果はＹｅｓとなり、ステップｂ３に処理を移行する。
【００７２】
ステップｂ３では、文「Ｂ  ｏｂｊ＿ｂ；」において生成されるオブジェクトの対象となるクラスＢに関するクラス情報を解析情報記憶部１２から取得し、クラスＢの生成フラグをＯＮに設定する。以上の処理が終了すると、解析情報記憶部１２における生成フラグの状態は図４（ｂ）に示す状態となる。ここで、図４（ｂ）は、オブジェクト解析ステップＳ１０４において解析されるクラス情報を示す表の図である。
【００７３】
次に、不要関数解析ステップＳ１０５の処理について、図２（ｃ）、図３および図４（ｃ）を参照しながら説明する。図２（ｃ）は、不要関数解析ステップＳ１０５の構成を示すフローチャート図である。
【００７４】
図２（ｃ）に示すように、不要関数解析ステップＳ１０５では、まずステップｃ１において削除関数集合Ｓ１を初期化して空集合にする。そして、解析情報記憶部１２に記憶されている全てのクラスＣ２について、ステップｃ２〜ステップｃ５に示すループを繰り返す。
【００７５】
図３に示すプログラムにおいては、クラスＣ２となるのはクラスＡおよびクラスＢである。図３に示すプログラムが不要関数解析ステップＳ１０５に係ると、ステップｃ２でクラスＡを抽出し、ステップｃ３でクラスＡの生成フラグがＯＦＦであるかどうかを判定する。図４（ｂ）に示すように、クラスＡの生成フラグはＯＦＦであるため、処理はステップｃ４に移行される。
【００７６】
ステップｃ４では、クラスＡについての全ての非静的メンバ関数が削除関数集合Ｓ１に加えられる。その結果、図４（ｃ）に示すように、削除関数集合Ｓ１には、クラスＡについての非静的メンバ関数である「Ａ：：Ａ（）」、「Ａ：：ｆ（ｖｏｉｄ）」および「Ａ：：ｇ（ｉｎｔ）」  が加えられる。ここで、図４（ｃ）は、不要関数解析ステップＳ１０５において解析される削除関数集合Ｓ１を示す表の図である。その後、処理をステップｃ５に移行する。
【００７７】
処理がステップｃ５に移行されると、クラスＡとは異なるクラス、この場合にはクラスＢについて、ステップｃ２〜ステップｃ５のループを繰り返す。このとき、図４（ｂ）に示すように、クラスＢの生成フラグはＯＮであるので、ステップｃ３における判定結果がＮｏとなり、処理をステップｃ５に移行する。
【００７８】
次に、不要関数削除ステップＳ１０６の処理について、図２（ｄ）、図３を参照しながら説明する。図２（ｄ）は、不要関数削除ステップＳ１０６の構成を示すフローチャート図である。
【００７９】
図２（ｄ）に示すように、不要関数削除ステップＳ１０６では、削除関数集合Ｓ１に含まれる全ての関数Ｆ１について、ステップｄ１〜ステップｄ３のループが繰り返される。
【００８０】
図３に示すプログラムにおいて、関数Ｆ１となるのは、「Ａ：：Ａ（）」、「Ａ：：ｆ（ｖｏｉｄ）」および「Ａ：：ｇ（ｉｎｔ）」である。図３に示すプログラムが不要関数削除ステップＳ１０６に係ると、ステップｄ１では例えば関数本体（関数定義）「Ａ：：Ａ（）」を抽出し、ステップｄ２では「Ａ：：Ａ（）」を消去する。その後、処理をステップｄ４に移行し、ステップｄ１〜ステップｄ３の処理を繰り返すことにより、「Ａ：：ｆ（ｖｏｉｄ）」および「Ａ：：ｇ（ｉｎｔ）」  を順に削除する。
【００８１】
本実施形態では、オブジェクトが生成されていない場合には、それに対応する関数も呼び出されることがないことに着目した。プログラム中の各クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な関数を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【００８２】
なお、本実施形態では、クラス抽出ステップＳ１０３〜不要関数削除ステップＳ１０６を、出力コードに変化がなくなるまで繰り返すとしている。これにより、関数定義を削除することによって新たに不要となった関数をも確実に削除することができるので、より効率的にプログラムを変換することができる。しかしながら、本発明では、コンパイル時間を短縮するために、クラス抽出ステップＳ１０３から不要関数削除ステップＳ１０６までの一連の処理を、あらかじめ決められた一定の回数のみ行ってもよいし、１回のみ実行してもよい。
【００８３】
（第２の実施形態）
以下に、本発明の第２の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図５は、第２の実施形態におけるプログラム変換ステップＳ２００の構成を示すフローチャート図である。
【００８４】
図５に示すように、本実施形態のプログラム変換ステップＳ２００は、変換の対象となるプログラムを入力する入力ステップＳ１０１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成が行われる構文解析ステップＳ１０２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記憶するクラス解析ステップＳ２０１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録するオブジェクト解析ステップＳ１０４と、解析情報記憶部１２に保持されている情報を受けてオブジェクトが生成されないクラスについての関数（不要関数）を解析し、その結果を解析情報記憶部１２に保持する不要関数解析ステップＳ２０２と、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する不要関数削除ステップＳ１０６と、不要関数が削除された後のプログラム（以下では、目的プログラムと呼ぶ）を生成コード記憶部１３に出力する出力ステップＳ１０７とを備えている。クラス解析ステップＳ２０１〜不要関数削除ステップＳ１０６は、出力される各コードに変化がなくなるまで繰り返す。
【００８５】
本実施形態では、クラス解析ステップＳ２０１において、プログラム中に含まれるクラスの情報を抽出するだけではなく、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記録する。そして、不要関数解析ステップＳ２０２においては、解析情報記憶部１２から、クラス解析ステップＳ２０１において抽出されたクラスおよびクラス間の継承関係の情報と、オブジェクト解析ステップＳ１０４において解析されたクラスの情報とに基づいて、不要な関数を解析し、解析情報記憶部１２に保持する。
【００８６】
ここで、入力ステップＳ１０１〜不要関数削除ステップＳ１０６における詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第１の実施形態と同様のものについては、詳細な説明を省略する。図８はプログラムの例を示す図である。
【００８７】
まず、入力ステップＳ１０１および構文解析ステップＳ１０２では、第１の実施形態と同様の方法により処理が行われる。
【００８８】
次に、クラス解析ステップＳ２０１の処理について、図６を参照しながら説明する。図６は、クラス解析ステップＳ２０１の構成を示すフローチャート図である。図６に示すように、クラス解析ステップＳ２０１では、プログラムに含まれる全てのクラスＣ１について、ステップｅ１〜ステップｅ７に示すループを繰り返す。
【００８９】
図８に示すプログラムでは、クラスＣ１となるのは、クラスＡ、クラスＢ、クラスＣ，クラスＤおよびクラスＥである。図８に示すプログラムがクラス解析ステップＳ２０１に係ると、ステップｅ１で例えばクラスＡを抽出し、ステップｅ２でクラスＡが解析情報記憶部１２にすでに登録されているか否かを判定する。クラスＡについての判定がはじめての場合には、判定結果はＮｏとなり、ステップｅ３に処理を移行する。ここで、クラスＡについての判定が２度目以降である場合には、すでにクラスＡが解析情報記憶部１２に登録されているので、判定結果はＹｅｓとなり、ステップｅ７に処理を移行する。
【００９０】
ステップｅ３では、クラスＡを解析情報記憶部１２に登録し、クラスＡに対応する生成フラグを初期化してＯＦＦとし、処理をステップｅ４に移行する。
【００９１】
ステップｅ４では、クラスＡが基底クラスＣ２を有するかどうかを判定する。図８に示すように、クラスＡは基底クラスを有していないため、ステップｅ４の判定結果はＮｏとなり、ステップｅ６へと処理を移行する。
【００９２】
ステップｅ６では、クラスＡのクラスツリーＴｒを新たに生成し、それを解析情報記憶部１２に保持し、ステップｅ７に処理を移行する。ここで、クラスツリーとはクラス間の継承関係を示すツリーのことをいう。この時点におけるクラスのクラスツリーＴｒにはクラスＡのみが含まれている。
【００９３】
処理がステップｅ７に移行されると、クラスＡとは異なるクラス、例えばクラスＢについて、ステップｅ１〜ｅ７のループが繰り返される。図８に示すように、クラスＢはクラスＡから派生している。つまり、クラスＢの基底クラスはクラスＡであるので、ステップｅ４における判定結果はＹｅｓとなり、処理はステップｅ５に移行する。ステップｅ５では、解析情報記憶部１２に保持されているクラスＡのクラスツリーＴｒに派生クラスとしてクラスＢを追加して、処理をステップｅ７に移行する。
【００９４】
その後、クラスＣ、クラスＤおよびクラスＥについて、ステップｅ１〜ｅ７のループが繰り返される。このとき、図８に示すように、クラスＣの基底クラスはクラスＡであり、クラスＤおよびクラスＥの基底クラスはクラスＣであるため、クラスＣ、クラスＤおよびクラスＥは、ステップｅ５でクラスＡを基底クラスとするクラスツリーＴｒに追加される。以上の処理が終了すると、解析情報記憶部１２における生成フラグは図９（ａ）に示す状態となり、クラスＡを基底クラスとするクラスツリーＴｒは、図９（ｂ）に示す状態となる。なお、図９（ａ）は、クラス解析ステップＳ２０１において抽出されるクラスの情報を示す表の図であり、図９（ｂ）は、クラス解析ステップＳ２０１において解析されるクラスのクラスツリーＴｒを示す図である。
【００９５】
次に、オブジェクト解析ステップＳ１０４では、第１の実施形態と同様の方法（図２（ｂ）に示す）によってオブジェクトを生成するクラスが解析される。その結果、クラスＡ〜Ｅのうちでオブジェクトを生成するのはクラスＡおよびクラスＢであるので、解析情報記憶部１２における生成フラグの状態は図９（ｃ）に示す状態となる。図９（ｃ）は、オブジェクト解析ステップＳ１０４において解析されるクラス情報を示す表の図である。
【００９６】
次に、不要関数解析ステップＳ２０２の処理について、図７、図８を参照しながら説明する。図７は、不要関数解析ステップＳ２０２の構成を示すフローチャート図である。
【００９７】
図７に示すように、不要関数解析ステップＳ２０２では、まずステップｆ１において削除関数集合Ｓ１を初期化して空集合にする。そして、ステップｆ２では、葉のクラス集合Ｓ２に、クラスツリーＴｒ内の葉のクラスを追加する。葉のクラスとは、クラスツリー内において子（派生クラス）を有さないクラスのことをいい、図９（ｂ）に示すクラスツリーＴｒ内では、クラスＢ、クラスＤおよびクラスＥに該当する。このとき、削除関数集合Ｓ１および葉のクラス集合Ｓ２は、図１０（ａ）に示す状態となる。図１０（ａ）〜（ｅ）は、削除関数集合Ｓ１および葉のクラス集合Ｓ２の状態の変化を示す表の図である。そして、葉のクラス集合Ｓ２に含まれる各クラスについて、ステップｆ３からｆ１０のループを繰り返す。
【００９８】
まず、ステップｆ４でクラスＢを抽出し、葉のクラス集合Ｓ２からクラスＢを削除する。次に、ステップｆ５では、クラスＢの生成フラグがＯＦＦであるかどうかを判定する。図９（ｃ）に示すように、クラスＢの生成フラグはＯＮであるため、判定結果はＮｏとなり、処理はステップｆ１０に移行される。このときの削除関数集合Ｓ１および葉のクラス集合Ｓ２は、図１０（ｂ）に示す状態となる。
【００９９】
次に、葉のクラス集合Ｓ２に含まれる他のクラス、例えばクラスＤについて、ステップｆ３〜ステップｆ１０のループを繰り返す。まず、ステップｆ４でクラスＤを抽出し、葉のクラス集合Ｓ２からクラスＤを削除する。次に、ステップｆ５では、クラスＤの生成フラグはＯＦＦである（図９（ｃ）に示す）ので、ステップｆ６に処理を移行する。ステップｆ６では、クラスＤについての全ての非静的メンバ関数を削除関数集合Ｓ１に追加する。このときの削除関数集合Ｓ１および葉のクラス集合Ｓ２は、図１０（ｃ）に示す状態となる。ステップｆ７では、クラスＤを、図９（ｂ）に示すクラスツリーＴｒから削除する。
【０１００】
ステップｆ８では、クラスツリーＴｒに新たに葉となるクラスがあるかどうかを判定する。図９（ｂ）に示すように、クラスＤを削除しても新たに葉となるクラスはないので、判定結果はＮｏとなり、ステップｆ１０に処理を移行する。
【０１０１】
次に、葉のクラス集合Ｓ２に含まれる他のクラスであるクラスＥについて、ステップｆ３〜ステップｆ１０のループを繰り返す。まず、ステップｆ４でクラスＥを抽出し、葉のクラス集合Ｓ２からクラスＥを削除する。次に、ステップｆ５では、クラスＥの生成フラグはＯＦＦである（図９（ｃ）に示す）ので、ステップｆ６に処理を移行する。ステップｆ６では、クラスＥについての全ての非静的メンバ関数を削除関数集合Ｓ１に追加する。ステップｆ７では、クラスＥを、図９（ｂ）に示すクラスツリーＴｒから削除する。
【０１０２】
ステップｆ８では、クラスツリーＴｒに新たに葉となるクラスがあるかどうかを判定する。図９（ｂ）に示すように、クラスＥを削除することによってクラスＣが新たに葉のクラスとなるので判定結果はＹｅｓとなり、ステップｆ９に処理を移行する。ステップｆ９では、新たに葉となったクラスＣを葉のクラスの集合Ｓ２に追加して、ステップｆ１０に処理を移行する。このときの削除関数集合Ｓ１および葉のクラス集合Ｓ２は、図１０（ｄ）に示す状態となる。
【０１０３】
次に、新たに葉のクラス集合Ｓ２に追加されたクラスＣについて、ステップｆ３〜ステップｆ１０のループを繰り返す。
【０１０４】
まず、ステップｆ４でクラスＣを抽出し、葉のクラス集合Ｓ２からクラスＣを削除する。次に、ステップｆ５では、クラスＣの生成フラグはＯＦＦである（図９（ｃ）に示す）ので、処理はステップｆ６に移行される。ステップｆ６では、クラスＣについての全ての非静的メンバ関数を削除関数集合Ｓ１に追加する。ステップｆ７では、クラスＣを、図９（ｂ）に示すクラスツリーＴｒから削除する。
【０１０５】
ステップｆ８では、クラスツリーＴｒに新たに葉となるクラスがあるかどうかを判定する。図９（ｂ）に示すように、クラスＣを削除しても新たに葉となるクラスはないので、判定結果はＮｏとなり、ステップｆ１０に処理を移行する。このときの削除関数集合Ｓ１および葉のクラス集合Ｓ２は、図１０（ｅ）に示す状態となり、葉のクラス集合Ｓ２が空集合になっているので、不要関数解析ステップＳ２０２の処理は終了する。
【０１０６】
以上のステップを経た後に、不要関数削除ステップＳ１０６において、第１の実施形態と同様の方法（図２（ｄ）に示す）によって、削除関数集合Ｓ１に含まれる関数定義（図８に示す関数（Ｂ））を削除する。
【０１０７】
本実施形態では、プログラム中のクラスが継承関係を有する場合には、その継承関係を解析してクラスツリーを作成する。そして、クラスツリーにおける葉のクラスがオブジェクトを生成するか否かを判定する。これにより、その葉のクラスについての関数を削除することができる。さらに、その葉のクラスの削除によって、新たに葉となるクラスがあるか否かを判定し、新たに葉となるクラスがオブジェクトを生成するか否かを判定することにより、新たに葉となるクラスについての関数も削除することができる。つまり、解析の途中で新たに葉となったクラスも削除することができる。
【０１０８】
本実施形態では、継承関係を考慮した解析が可能となり、クラスツリーのうちで、削除可能な関数と削除不可能な関数とを的確に判断することができ、より効果的に関数を削除することができる。したがって、従来よりも容易に多くコードサイズを削減することができる。
【０１０９】
なお、本実施形態では、クラス解析ステップＳ２０１〜不要関数削除ステップＳ１０６を、出力コードに変化がなくなるまで繰り返すとしている。これにより、関数定義を削除することによって新たに不要となった関数をも確実に削除することができるので、より効率的にプログラムを変換することができる。しかしながら、本発明では、コンパイル時間を短縮するために、クラス解析ステップＳ２０１から不要関数削除ステップＳ１０６までの一連の処理を、あらかじめ決められた一定の回数のみ行ってもよいし、１回のみ実行してもよい。
【０１１０】
（第３の実施形態）
以下に、本発明の第３の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図１１は、第３の実施形態におけるプログラム変換ステップＳ３００の構成を示すフローチャート図である。
【０１１１】
図１１に示すように、本実施形態のプログラム変換ステップＳ３００は、変換の対象となるプログラムを入力する入力ステップＳ１０１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成が行われる構文解析ステップＳ１０２と、プログラム中に含まれるクラスの情報を抽出し、さらに、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記憶するクラス解析ステップＳ２０１と、仮想関数の解析を行う仮想関数解析ステップＳ３０１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録するオブジェクト解析ステップＳ１０４と、解析情報記憶部１２に保持されている情報を受けてオブジェクトが生成されないクラスについての関数（不要関数）を解析し、その結果を解析情報記憶部１２に保持する不要関数解析ステップＳ３０２と、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する不要関数削除ステップＳ１０６と、不要関数が削除された後のプログラム（以下では、目的プログラムと呼ぶ）を生成コード記憶部１３に出力する出力ステップＳ１０７とを備えている。クラス解析ステップＳ２０１〜不要関数削除ステップＳ１０６は、出力される各コードに変化がなくなるまで繰り返す。
【０１１２】
本実施形態では、仮想関数解析ステップＳ３０１において、プログラム中に含まれるクラスについての仮想関数の解析を行う。そのクラスが他のクラスを継承する派生クラスである場合には、派生クラスの仮想関数は、基底クラスの仮想関数を上書きする場合と上書きしない場合とがある。そのため、仮想関数解析ステップＳ３０１では、派生クラスの仮想関数が基底クラスの仮想関数を上書きするか否かを解析する。
【０１１３】
そして、不要関数解析ステップＳ３０２においては、解析情報記憶部１２から、クラス解析ステップＳ２０１、仮想関数解析ステップＳ３０１およびオブジェクト解析ステップＳ１０４からの情報に基づいて、不要な関数を解析し、解析結果を解析情報記憶部１２に保持する。
【０１１４】
次に、入力ステップＳ１０１〜不要関数削除ステップＳ１０６における詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第１または第２の実施形態と同様のものについては、詳細な説明を省略する。図１５は、プログラムの例を示す図である。
【０１１５】
まず、入力ステップＳ１０１および構文解析ステップＳ１０２では、第１の実施形態と同様の方法により処理が行われる。
【０１１６】
次に、クラス解析ステップＳ２０１では、第２の実施形態と同様の方法（図６に示す）によって、プログラム中に含まれるクラスＣ１の情報とその継承関係についての解析を行い、その解析結果を解析情報記憶部１２に格納する。その結果、図１６（ａ）に示すように、解析情報記憶部１２におけるクラスＦ、クラスＧおよびクラスＨの生成フラグは初期化されてＯＦＦになる。また、図１５に示すプログラム中において、クラスＧおよびクラスＨはクラスＦから派生しているため、クラスＦを基底クラスとするクラスツリーＴｒは、図１６（ｂ）に示す状態となる。なお、図１６（ａ）は、クラス解析ステップＳ２０１において抽出されるクラスの情報を示す表の図であり、図１６（ｂ）は、クラス解析ステップＳ２０１において解析されるクラスのクラスツリーＴｒを示す図である。
【０１１７】
次に、仮想関数解析ステップＳ３０１の処理について、図１２および図１５を参照しながら説明する。図１２は、仮想関数解析ステップＳ３０１の構成を示すフローチャート図である。
【０１１８】
図１２に示すように、仮想関数解析ステップＳ３０１では、プログラム中に含まれる全てのクラスＣ１について、ステップｇ１〜ステップｇ１０に示すループを繰り返す。
【０１１９】
図１５に示すプログラムでは、クラスＣ１となるのは、クラスＦ、クラスＧおよびクラスＨである。図１５に示すプログラムが仮想関数解析ステップＳ３０１に係ると、ステップｇ１で例えばクラスＦを抽出し、ステップｇ２でクラスＦが解析情報記憶部１２に登録されているか否かを判定する。クラスＦの判定がはじめてである場合には、判定結果はＮｏとなり、ステップｇ３に処理を移行する。ここで、クラスＦについての判定が２度目以降である場合には、すでにクラスＦが解析情報記憶部１２に登録されているので、判定結果はＹｅｓとなり、ステップｇ１０に処理を移行する。
【０１２０】
ステップｇ３では、クラスＦの情報を仮想関数集合Ｓ２に登録する。さらに、仮想関数集合Ｓ２内におけるクラスＦについての仮想関数定義集合および上書き仮想関数定義集合を初期化して空集合にする。ここで、仮想関数集合Ｓ２は解析情報記憶部１２内に記憶されている。次に、ステップｇ４では、クラスＦが仮想関数定義を有するか否かを判定する。図１５に示すように、クラスＦは仮想関数定義を有しているので、判定結果はＹｅｓとなり、ステップｇ５に処理を移行する。
【０１２１】
次に、クラスＦが有する全ての仮想関数定義Ｆ１について、ステップｇ５〜ステップｇ９のループを繰り返す。
【０１２２】
ステップｇ６では、クラスＦが有する仮想関数定義「Ｆ：ｍ１」を、仮想関数集合Ｓ２内におけるクラスＦについての仮想関数定義集合に追加し、ステップｇ７では、仮想関数定義「Ｆ：ｍ１」が基底クラスの仮想関数定義を上書きするか否かを判定する。このとき、クラスＦは基底クラスを有さないので、この判定結果はＮｏとなり、ステップｇ９に処理を移行する。クラスＦは他の仮想関数定義を有さないので、クラスＦについてのステップｇ５〜ステップｇ９の処理は終了し、ステップｇ１０に処理は移行する。
【０１２３】
その後、クラスＦとは異なるクラス、例えばクラスＧについて、ステップｇ１〜ステップｇ９の処理を繰り返す。図１５に示すように、クラスＧは仮想関数定義を有しているので、ステップｇ４の判定結果はＹｅｓとなり、ステップｇ６では、クラスＧの仮想関数定義「Ｇ：ｍ１」を仮想関数集合Ｓ２における仮想関数定義集合が登録される。また、図１６（ｂ）に示すように、クラスＧの基底クラスはクラスＦであるので、クラスＧの仮想関数定義は、クラスＦの仮想関数定義を上書きする。したがって、ステップｇ７の判定結果はＹｅｓとなり、処理はステップｇ８に移行される。ステップｇ８では、仮想関数定義「Ｇ：ｍ１」によって上書きされる仮想関数定義「Ｆ：ｍ１」を仮想関数集合Ｓ２における上書き仮想関数定義集合に記録する。
【０１２４】
その後、クラスＨについても、ステップｇ１〜ｇ９の処理が繰り返される。図１５に示すように、クラスＨは仮想関数定義を有しているので、ステップｇ４の判定結果はＹｅｓとなり、ステップｇ６では、クラスＨの仮想関数定義「Ｈ：ｍ１」を仮想関数集合Ｓ２における仮想関数定義集合に登録する。また、図１６（ｂ）に示すように、クラスＨの基底クラスはクラスＦであるので、クラスＨの仮想関数定義は、クラスＦの仮想関数定義を上書きする。したがって、ステップｇ７の判定結果はＹｅｓとなり、処理はステップｇ８に移行される。ステップｇ８では、仮想関数定義「Ｈ：ｍ１」によって上書きされる仮想関数定義（「Ｆ：ｍ１」）を仮想関数集合Ｓ２における上書き仮想関数定義集合に記録する。以上のステップにより、クラスＦ、クラスＧおよびクラスＨにおける仮想関数定義集合と上書き仮想関数定義集合とは、図１７（ａ）に示す状態となる。図１７（ａ）〜（ｄ）は、仮想関数集合Ｓ２の状態を示す表の図である。
【０１２５】
次に、オブジェクト解析ステップＳ１０４では、第１の実施形態と同様の方法（図２（ｂ）に示す）によってオブジェクトを生成するクラスを解析する。クラスＦ、クラスＧおよびクラスＨのうちでオブジェクトを生成するのはクラスＧおよびクラスＨであるので、解析情報記憶部１２における生成フラグは図１６（ｃ）に示す状態となる。図１６（ｃ）は、オブジェクト解析ステップＳ１０４において解析されるクラス情報を示す表の図である。
【０１２６】
次に、不要関数解析ステップＳ３０２の処理について、図１３、図１４および図１７（ａ）〜（ｄ）を参照しながら説明する。図１３は、不要関数解析ステップＳ３０２の構成を示すフローチャート図であり、図１４は、不要関数解析ステップＳ３０２のステップｈ６の構成を示すフローチャート図である。
【０１２７】
図１３に示すように、不要関数解析ステップＳ３０２では、解析情報記憶部１２に格納されている全てのクラスツリーＴ１について、ステップｈ１〜ステップｈ１２のループを繰り返す。
【０１２８】
図１５に示すプログラムにおいては、クラスツリーＴ１となるのは図１６（ｂ）に示すクラスツリーＴｒの１つだけである。ステップｈ１でクラスツリーＴｒが抽出されると、ステップｈ２では、クラスツリーＴｒに含まれるクラスについて、根のクラスから葉のクラスに向かう順で、ステップｈ２〜ステップｈ１１のループを繰り返す。つまり、まず、根のクラスであるクラスＦの処理を行った後、葉のクラスであるクラスＧおよびクラスＨの処理を行う。
【０１２９】
クラスＦがステップｈ３の処理に係ると、クラスＦは他の仮想関数定義を上書きしていない仮想関数定義を有するか否かを判定する。図１７（ａ）に示すように、クラスＦは仮想関数定義として「Ｆ：ｍ１」を有しており、クラスＦについての上書き仮想関数定義集合は空集合であるため、「Ｆ：ｍ１」は他の仮想関数定義を上書きしていないと判定される。したがって、判定結果はＹｅｓとなり、ステップｈ４へ処理を移行する。
【０１３０】
次に、クラスＦの全ての仮想関数定義について、ステップｈ４〜ステップｈ１０のループを繰り返す。クラスＦについての仮想関数定義は「Ｆ：ｍ１」のみであるので、「Ｆ：ｍ１」について処理を行う。
【０１３１】
ステップｈ５では、解析情報記憶部１２内におけるクラス集合Ｓ３をクラスＦで初期化する。このとき、図１７（ｅ）に示すように、クラス集合Ｓ３内にはクラスＦのみが含まれる。図１７（ｅ）〜（ｈ）は、クラス集合Ｓ３および削除関数集合Ｓ１の状態の変化を示す表の図である。ステップｈ６では、非上書きクラスの解析を行う。この処理については後述する。
【０１３２】
ステップｈ７では、クラス集合Ｓ３に含まれる全てのクラスの生成フラグがＯＦＦかどうかを調べる。クラス集合Ｓ３にはクラスＦのみが含まれており、図１６（ｃ）に示すようにクラスＦの生成フラグはＯＦＦであるため、判定結果はＹｅｓとなり、ステップｈ８へ処理を移行する。
【０１３３】
ステップｈ８では、Ｆについての仮想関数定義「Ｆ：ｍ１」を、削除関数集合Ｓ１に追加する。このときのクラス集合Ｓ３および削除関数集合Ｓ１は、図１７（ｆ）に示す状態となる。
【０１３４】
ステップｈ９では、図１７（ｂ）に示すように、仮想関数集合Ｓ２から仮想関数定義「Ｆ：ｍ１」に関する情報を削除する。このとき、仮想関数定義「Ｆ：ｍ１」に関する情報として、仮想関数定義集合に格納されている「Ｆ：ｍ１」と、上書き仮想関数定義集合に格納されている「Ｆ：ｍ１」とを削除する。その後、ステップｈ１０に処理を移行する。クラスＦは、「Ｆ：ｍ１」の他に仮想関数定義を有さないので、クラスＦについてのステップｈ４〜ステップｈ１０のループは終了する。
【０１３５】
その後、ステップｈ１１からステップｈ２に処理が戻り、クラスツリーＴｒ内の葉のクラスＧおよびクラスＨについて、ステップｈ２〜ステップｈ１１のループを繰り返す。
【０１３６】
クラスＧが処理に係ると、ステップｈ３では、クラスＧが、他の仮想関数定義を上書きしていない仮想関数定義を有するか否かが判定される。この時点では、図１７（ｂ）に示すように、クラスＧについての上書き仮想関数定義集合は空集合であるので、判定結果はＹｅｓとなり、ステップｈ４に処理を移行する。ステップｈ５では、クラス集合Ｓ３をクラスＧで初期化する。また、ステップｈ７では、図１６（ｃ）に示すようにクラスＧの生成フラグはＯＮであるので判定結果がＮｏとなり、ステップｈ１０に処理を移行する。このとき、図１７（ｃ）に示すように仮想関数集合Ｓ２は前の状態のままとなり、一方、クラス集合Ｓ３および削除関数集合Ｓ１は図１７（ｇ）に示す状態となる。クラスＧについてのステップｈ２〜ステップｈ１１の処理が終了すると、クラスＨについても同様の処理が行われる。その結果、図１７（ｄ）に示すように仮想関数集合Ｓ２は前の状態のままであり、一方、クラス集合Ｓ３および削除関数集合Ｓ１は図１７（ｈ）に示す状態となる。
【０１３７】
次に、不要関数解析ステップＳ３０２におけるステップｈ６（非上書きクラス解析ステップ）の処理について、図１４を参照しながら説明する。図１４は、不要関数解析ステップＳ３０２のステップｈ６の構成を示すフローチャート図である。
【０１３８】
クラスＦ、クラスＧおよびクラスＨがこの処理に係るが、以下ではクラスＦが処理に係る場合を例にして説明する。
【０１３９】
図１４に示すように、まずステップｉ１で、クラス集合Ｓ３内に格納されているクラスを取得する。クラスＦが処理に係っている時点では、図１７（ｅ）に示すように、クラス集合Ｓ３内にはクラスＦのみが含まれるので、クラスＦを取得する。ステップｉ２では、クラスＦから葉のクラスに至る全てのパスＰ１を、パス集合ＰＳ（図示せず）内に含める。クラスＦはクラスツリーＴｒ（図１６（ｂ）に示す）に含まれており、葉のクラスはクラスＧおよびクラスＨであるので、クラスＦからクラスＧに至るパス「ＦＧ」と、クラスＦからクラスＨに至るパス「ＦＨ」とを、パス集合ＰＳ内に含める。
【０１４０】
次に、パス集合ＰＳ内の全てのパスＰ１について、ステップｉ３〜ステップｉ８のループを繰り返す。パス「ＦＧ」が処理に係った場合には、クラスＦ、クラスＧの順で、ステップｉ４〜ステップｉ７に示す処理を繰り返す。
【０１４１】
クラスＦがステップｉ５に係ると、判定結果はＮｏとなり、ステップｉ６に処理を移行する。ステップｉ６では、クラス集合Ｓ３内にクラスＦが含まれていない場合にはクラスＦが追加されるが、図１７（ｅ）に示すように、クラス集合Ｓ３内にはすでにクラスＦが含まれているので、そのままの状態が保たれる。
【０１４２】
次に、クラスＧがステップｉ５に係ると、この時点におけるクラスＧについての上書き仮想関数定義集合には「Ｆ：ｍ１」が含まれている（図１７（ｂ）に示す）ため、ステップｉ５の判定結果はＹｅｓとなり、ステップｉ５〜ｉ７の処理が終了する。その後、ステップｉ８に処理が進行する。
【０１４３】
ステップｉ８からステップｉ３に処理が戻ると、パス集合ＰＳ内において、パス「ＦＧ」の他のパスである「ＦＨ」についても同様の処理が行われる。これにより、クラスＦについての非上書きクラス解析ステップｈ６の処理が終了する。
【０１４４】
次に、図１１に示す不要関数削除ステップＳ１０６では、第１の実施形態（図２（ｄ）に示す）と同様の方法により、削除関数集合Ｓ１に登録されている関数の本体を削除する。図１５に示すプログラムでは、関数（Ｃ）で示す関数定義を削除することができる。
【０１４５】
本実施形態では、プログラム中のクラスが継承関係を有する場合には、その継承関係を解析してクラスツリーを作成する。そして、クラスツリーにおける派生クラスの仮想関数のうちの少なくとも１つが、その基底クラスの仮想関数を上書きしない場合には、この派生クラスと基底クラスとの両方でオブジェクトが生成されていない場合に、その基底クラスの仮想関数を削除する。
【０１４６】
一方、クラスツリーにおける派生クラスの仮想関数のうちの全てが、その基底クラスの仮想関数を上書きする場合には、基底クラスのオブジェクトが生成されていない場合に、その基底クラスの仮想関数を削除する。この削除の判定には、派生クラスのオブジェクトが生成されているか否かは関係しない。
【０１４７】
以上のことから、仮想関数を有するプログラムにおいても、削除可能な関数と削除不可能な関数とを的確に判断することができ、より効果的に関数を削除することができる。したがって、従来よりも容易に多くコードサイズを削減することができる。
【０１４８】
なお、本実施形態では、クラス解析ステップＳ２０１〜不要関数削除ステップＳ１０６を、出力コードに変化がなくなるまで繰り返すとしている。これにより、関数定義を削除することによって新たに不要となった関数をも確実に削除することができるので、より効率的にプログラムを変換することができる。しかしながら、本発明では、コンパイル時間を短縮するために、クラス解析ステップＳ２０１から不要関数削除ステップＳ１０６までの一連の処理を、あらかじめ決められた一定の回数のみ行ってもよいし、１回のみ実行してもよい。
【０１４９】
（第４の実施形態）
以下に、本発明の第４の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図１８は、第４の実施形態におけるプログラム変換ステップＳ４００の構成を示すフローチャート図である。
【０１５０】
図１８に示すように、本実施形態のプログラム変換ステップＳ４００は、変換の対象となるプログラムを入力する入力ステップＳ１０１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成が行われる構文解析ステップＳ１０２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記憶するクラス解析ステップＳ２０１と、仮想関数の解析を行う仮想関数解析ステップＳ３０１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録するオブジェクト解析ステップＳ１０４と、解析情報記憶部１２に保持されている情報を受けて不要な関数を解析し、その不要な関数を有するクラスを抽出し、その結果を解析情報記憶部１２に保持する不要処理・不要データ解析ステップＳ４０１と、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する不要関数削除ステップＳ１０６と、解析情報記憶部１２に格納されている解析情報から、不要な処理とデータを削除する不要処理・不要データ削除ステップＳ４０２と、不要処理および不要データが削除された後のプログラム（以下では、目的プログラムと呼ぶ）を生成コード記憶部１３に出力する出力ステップＳ１０７とを備えている。クラス解析ステップＳ２０１〜不要処理・不要データ削除ステップＳ４０２は、出力される各コードに変化がなくなるまで繰り返す。
【０１５１】
本実施形態では、不要処理・不要データ解析ステップＳ４０１において、第３の実施形態と同様の方法で不要な関数を解析するのに加えて、さらに、全ての仮想関数定義が削除可能であると判定されたクラスを抽出する。
【０１５２】
そして、不要処理・不要データ削除ステップＳ４０２において、全ての仮想関数定義が削除可能であると判定されたクラスについての仮想関数表と、アドレス設定処理とを削除する。
【０１５３】
次に、入力ステップＳ１０１〜不要処理・不要データ削除ステップＳ４０２における詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第１〜第３の実施形態と同様のものについては詳細な説明を省略する。なお、プログラム例として、第３の実施形態で用いた図１５を再度参照する。また、解析情報記憶部１２に格納される情報についても、第３の実施形態で用いた図１６および図１７を再度参照する。
【０１５４】
まず、入力ステップＳ１０１および構文解析ステップＳ１０２では、第１の実施形態と同様の方法により処理が行われる。
【０１５５】
次に、クラス解析ステップＳ２０１では、第２の実施形態と同様の方法（図６に示す）によってプログラム中に含まれるクラスの情報と、その継承関係についての解析を行い、その解析結果を解析情報記憶部１２に格納する。その結果、図１６（ａ）に示すように、解析情報記憶部１２におけるクラスＦ、クラスＧおよびクラスＨの生成フラグは初期化されてＯＦＦになる。また、図１５に示すプログラム中において、クラスＧおよびクラスＨはクラスＦから派生しているため、クラスＦを基底クラスとするクラスツリーＴｒは、図１６（ｂ）に示す状態となる。
【０１５６】
次に、仮想関数解析ステップＳ３０１では、第３の実施形態と同様の方法（図１２に示す）によって、仮想関数定義および上書きする仮想関数定義の解析を行い、その解析結果を解析情報記憶部１２に格納する。その結果、仮想関数定義集合と上書き仮想関数定義集合とは、図１７（ａ）に示す状態となる。
【０１５７】
次に、オブジェクト解析ステップＳ１０４では、第１の実施形態と同様の方法（図２（ｂ）に示す）によってオブジェクトを生成するクラスが解析される。クラスＦ、クラスＧおよびクラスＨのうちでオブジェクトを生成するのはクラスＧおよびクラスＨであるので、解析情報記憶部１２における生成フラグは図１６（ｃ）に示す状態となる。
【０１５８】
次に、不要処理・不要データ解析ステップＳ４０１の処理について、図１９を参照しながら説明する。図１９は、不要処理・不要データ解析ステップＳ４０１の構成を示すフローチャート図である。
【０１５９】
図１９に示すように、不要処理・不要データ解析ステップＳ４０１では、ステップｈ１〜ステップｈ１２と、ステップｊ１〜ステップｊ２との処理を行う。
これらの処理のうち第３の実施形態と同様のステップｈ１〜ステップｈ１２の説明を省略し、ステップｊ１〜ｊ２について説明する。図１５に示すプログラムでは、根のクラスであるクラスＦ、葉のクラスであるクラスＧおよびクラスＨの順にステップｊ１〜ステップｊ２の処理が進行する。
【０１６０】
まず、クラスＦがステップｊ１に係った時点では、図１７（ｆ）に示すように、すでにクラスＦについての仮想関数定義「Ｆ：ｍ１」が削除関数集合Ｓ１に追加されている。したがって、ステップｊ１の判定結果はＹｅｓとなり、ステップｊ２に処理が移行する。ステップｊ２では、図２１（ａ）に示すように、削除クラス集合Ｓ４内にクラスＦを追加して、ステップｈ１１に処理を移行する。なお、削除クラス集合Ｓ４は解析情報記憶部１２に保持されている。図２１（ａ）は、削除クラス集合Ｓ４の状態を示す表の図である。
【０１６１】
次に、クラスＧがステップｊ１に係った時点では、図１７（ｇ）に示すように、クラスＧの仮想関数定義は削除関数集合Ｓ１に追加されていない。したがって、ステップｊ１の判定結果はＮｏとなり、ステップｈ１１に処理を移行する。クラスＨについても同様の処理が行われる。
【０１６２】
次に、不要処理・不要データ削除ステップＳ４０２の処理について、図２０を参照しながら説明する。図２０は、不要処理・不要データ削除ステップＳ４０２の構成を示すフローチャート図である。
【０１６３】
図２０に示すように、不要処理・不要データ削除ステップＳ４０２では、ステップｋ１〜ステップｋ４のループが繰り返される。
【０１６４】
ステップｋ１で、削除クラス集合Ｆ４に含まれるクラスＦが抽出されると、ステップｋ２で、図２１（ｂ）に示すようなクラスＦの仮想関数表のデータ（Ｄ）を削除する。図２１（ｂ）は、クラスＦの仮想関数表を示す表の図である。次に、ステップｋ３では、図２１（ｃ）に示すようなコンストラクタ内の仮想関数表のアドレス設定処理のうちで、クラスＦに関する処理（Ｅ）を削除する。図２１（ｃ）は、クラスＦに関する仮想関数表のアドレス設定処理を示す図である。その後、ステップｋ４に処理を移行する。その後、図１８に示す出力ステップＳ１０７に移行する。
【０１６５】
本実施形態では、第３の実施形態と同様の効果を得ることができる。さらに、コンパイラが自動的に生成するデータ（Ｄ）および処理（Ｅ）を削除することができる。アドレスを設定する処理が削除されるので、コードサイズおよび実行ステップ数の少ないコードを生成することができる。
【０１６６】
なお、本実施形態では、クラス解析ステップＳ２０１〜不要処理・不要データ削除ステップＳ４０２を、出力コードに変化がなくなるまで繰り返すとしている。これにより、関数定義を削除することによって新たに不要となった関数をも確実に削除することができるので、より効率的にプログラムを変換することができる。しかしながら、本発明では、コンパイル時間を短縮するために、クラス解析ステップＳ２０１から不要関数削除ステップＳ１０６までの一連の処理を、あらかじめ決められた一定の回数のみ行ってもよいし、１回のみ実行してもよい。
【０１６７】
（第５の実施形態）
以下では、本発明の第５の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図２２は、第５の実施形態におけるプログラム変換ステップＳ５００の構成を示すフローチャート図である。
【０１６８】
図２２に示すように、本実施形態のプログラム変換ステップＳ５００は、変換の対象となるプログラムを入力する入力ステップＳ１０１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成が行われる構文解析ステップＳ１０２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記憶するクラス解析ステップＳ２０１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部１２に記録するオブジェクト解析ステップＳ１０４と、解析情報記憶部１２に保持されている情報を受けてオブジェクトが生成されないクラスについての関数（不要関数）を解析し、その結果を解析情報記憶部１２に保持する不要関数解析ステップＳ２０２と、削除指定されているクラスについての関数を解析する削除指定関数解析ステップＳ５０１と、解析情報記憶部１２に保持されている情報を受けて不要関数の定義を削除する不要関数削除ステップＳ１０６と、不要関数が削除された後のプログラム（以下では、目的プログラムと呼ぶ）を生成コード記憶部１３に出力する出力ステップＳ１０７とを備えている。クラス解析ステップＳ２０１〜不要関数削除ステップＳ１０６は、出力される各コードに変化がなくなるまで繰り返す。
【０１６９】
次に、入力ステップＳ１０１〜不要関数削除ステップＳ１０６における詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第１または第２の実施形態と同様のものについては、詳細な説明を省略する。なお、プログラム例として、第２の実施形態で用いた図８を再度参照する。
【０１７０】
まず、入力ステップＳ１０１では、プログラム記憶部１１に格納されている全てのプログラムを順次入力する。このとき、コマンドラインオプションによって削除関数を指定した場合には、オプションを認識し、指定された関数を記憶しておく。例えば、ユーザがコマンドラインオプションによってクラスＢの削除を指定した場合には「−ｄｅｌｅｔｅ＿ｍｅｍｆｕｎｃ＝Ｂ」  とオプションが記述されている。このオプションを認識し、クラスＢについての関数を記憶しておく。
【０１７１】
次に、構文解析ステップＳ１０２では、入力ステップＳ１０１から受けとったプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成などを行い、その結果をクラス解析ステップＳ２０１に渡す。このとき、ユーザがプログラム中に削除指定記述によって削除関数を指定した場合には、削除指定記述を認識し、指定された関数を記憶しておく。図８に示すプログラムでは、ユーザが、削除指定記述（Ｇ）によってクラスＢの非静的メンバ関数の削除を指定しているので、この関数を記憶しておく。
【０１７２】
クラス解析ステップＳ２０１では、第２の実施形態と同様の方法（図６に示す）によって、プログラム中に含まれるクラスの情報と、その継承関係についての解析を行い、その解析結果を解析情報記憶部１２に格納する。その結果、クラスＡ〜クラスＥの生成フラグおよびクラスツリーＴｒは、第２の実施形態の図９（ａ），  （ｂ）に示す状態となる。
【０１７３】
次に、オブジェクト解析ステップＳ１０４では、第１の実施形態と同様の方法（図２（ｂ）に示す）によってオブジェクトを生成するクラスを解析する。その結果、クラスＡ〜クラスＥの生成フラグは、第２の実施形態の図９（ｃ）に示す状態となる。
【０１７４】
次に、不要関数解析ステップＳ２０２では、第２の実施形態と同様の方法（図７に示す）によって不要な関数を解析する。その結果、図２４（ａ）に示すように、削除関数集合Ｓ１には、クラスＣ、クラスＤおよびクラスＥについての関数が格納される。なお、図２４（ａ）に示す削除関数集合Ｓ１には、図１０（ｅ）と同様の関数が格納されている。図２４（ａ），  （ｂ）は、削除関数集合の状態の変化を示す表の図である。
【０１７５】
次に、削除指定関数解析ステップＳ５０１の処理について、図２３を参照しながら説明する。図２３は、削除指定関数解析ステップＳ５０１の構成を示すフローチャート図である。
【０１７６】
図２３に示すように、削除指定関数解析ステップＳ５０１では、解析情報記憶部１２に保持されている全てのクラスＣ１について、ステップｍ１〜ステップｍ６のループを繰り返す。
【０１７７】
図８に示すプログラムでは、クラスＣ１となるのはクラスＡ〜クラスＥである。図８に示すプログラムが削除指定関数解析ステップＳ５０１に係ると、ステップｍ１で例えばクラスＡを抽出し、ステップｍ２で、クラスＡが削除指定されているか否かを判定する。図８のファイル「ｍａｉｎ．ｃｃ」  に示すように、削除指定記述（Ｇ）によってクラスＢが削除指定されており、クラスＡは削除指定されていないので、判定結果はＮｏとなりステップｍ６に処理を移行する。
【０１７８】
ステップｍ６からステップｍ１に処理が移行されると、次にクラスＢを抽出し、クラスＢが削除指定されているか否かを判定する。図８のファイル「ｍａｉｎ．ｃｃ」に示すように、クラスＢは削除指定されているので判定結果はＹｅｓとなり、ステップｍ３に処理を移行する。
【０１７９】
ステップｍ３では、クラスＢの生成フラグがＯＦＦであるか否かを判定する。クラスＢの生成フラグはＯＮである（第２の実施形態の図９（ｃ）に示す）ため、判定結果はＮｏとなり、ステップｍ５に処理を移行する。
【０１８０】
ステップｍ５では、クラスＢについての関数のうちでコンストラクタや代入演算子などの特殊関数以外の非静的メンバ関数を削除関数集合Ｓ１に追加する。このとき、特殊関数が削除関数集合Ｓ１に追加されないのは、クラスＢはオブジェクトが生成されるクラスであるので、オブジェクトを生成するためのコンストラクタが必要であるためである。具体的には、図２４（ｂ）に示すように、クラスＢについて特殊関数以外の非静的メンバ関数である「Ｂ：：ｇ１」  を削除関数集合Ｓ１に追加する。その後、ステップｍ６に処理を移行する。
【０１８１】
ステップｍ３において、もしクラスＢの生成フラグがＯＦＦであれば、判定結果はＹｅｓとなり、ステップｍ４に処理を移行する。ステップｍ４では、クラスＢの全ての非静的メンバ関数を削除関数集合Ｓ１に追加する。その後、ステップｍ６に処理を移行する。
【０１８２】
ステップｍ６からステップｍ１に処理が戻ると、クラスＣ〜クラスＥについても同様の処理を繰り返す。なお、クラスＣ〜クラスＥは削除指定されていないので、ステップｍ２における判定結果はＮｏとなるため、クラスＣ〜クラスＥについての関数は削除関数集合Ｓ１に追加されない。
【０１８３】
次に、不要関数削除ステップＳ１０６において、第１の実施形態と同様の方法（図２（ｄ）に示す）によって、削除関数集合Ｓ１に含まれる関数定義を削除する。以上の処理により、図８に示す関数（Ｂ）だけではなく、第２の実施形態で自動的には削除可能と判定できなかった関数（Ｆ）を削除することができる。
【０１８４】
本実施形態では、第２の実施形態と同様の効果を得ることができる。さらに、ユーザによって削除指定されているクラスについての関数を削除することができる。このとき、削除指定されているクラスについてのオブジェクトが生成される場合には、特殊関数を削除せずに残す。これにより、より効果的にコードサイズを削減することができる。
【０１８５】
なお、本実施形態では、削除指定されているクラスについてのオブジェクトが生成される場合には、ステップｍ５において、そのクラスについての特殊関数を削除関数集合Ｓ１に追加せずに残している。しかし、本発明では、特殊関数のうちオブジェクトの生成に必要なコンストラクタのみを残し、代入演算子を削除してもよい。
【０１８６】
なお、本実施形態では、クラス解析ステップＳ２０１〜不要処理・不要データ削除ステップＳ４０２を、出力コードに変化がなくなるまで繰り返すとしている。これにより、関数定義を削除することによって新たに不要となった関数をも確実に削除することができるので、より効率的にプログラムを変換することができる。しかしながら、本発明では、コンパイル時間を短縮するために、クラス解析ステップＳ２０１から不要関数削除ステップＳ１０６までの一連の処理を、あらかじめ決められた一定の回数のみ行ってもよいし、１回のみ実行してもよい。
【０１８７】
（第６の実施形態）
以下では、本発明の第６の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図２５は、第６の実施形態における翻訳ステップＳ６１０および結合ステップＳ６２０と、各ステップＳ６１０，  Ｓ６２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【０１８８】
図２５に示すように、本実施形態では、プログラム記憶部２１に保持されているプログラムを翻訳ステップＳ６１０において翻訳することにより目的コードを生成し、その目的コードを、目的コード記憶部２３に保持する。そして、結合ステップＳ６２０においてリンク処理を行った後に実行コード記憶部２４に保持する。
【０１８９】
プログラム記憶部２１では、変換の対象となるプログラムが、ソースファイル２１ａ，  ２１ｂ，  ２１ｃに分けられて保持される。
【０１９０】
翻訳ステップＳ６１０は、変換の対象となるプログラムを入力する入力ステップＳ６１１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ６１２と、プログラム中に含まれるクラスの情報を解析情報記憶部２２に記録するクラス抽出ステップＳ６１３と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部２２に記録するオブジェクト解析ステップＳ６１４と、各ステップによって変換されたプログラムおよび解析情報記憶部２２に格納されている解析情報を目的コードとして目的コード記憶部２３に出力する出力ステップＳ６１５とを備えている。
【０１９１】
目的コード記憶部２３では、目的コードが、オブジェクトファイル２３ａ，  ２３ｂ，  ２３ｃに分けられて保持される。
【０１９２】
結合ステップＳ６２０は、目的コード記憶部２３に格納されているオブジェクトファイル２３ａ〜２３ｃを読み込み、そのオブジェクトファイル２３ａ〜２３ｃ中の解析情報を抽出して不要な関数を解析する不要関数解析ステップＳ６２１と、不要関数解析ステップＳ６２１の解析結果を用いて必要なコードあるいはデータのみをリンクし、実行コード記憶部２４に出力するリンクステップＳ６２２とを備えている。
【０１９３】
実行コード記憶部２４では、結合ステップＳ６２０によって結合された実行コードが、実行形式ファイル２４ａとして保持される。
【０１９４】
次に、翻訳ステップＳ６１０および結合ステップＳ６２０における各ステップのより詳細な動作について、プログラム例を参照しながら説明する。なお、プログラムの例として、第１の実施形態で用いた図３を再度参照する。
【０１９５】
まず、翻訳ステップＳ６１０が開始されると、入力ステップＳ６１１、構文解析ステップＳ６１２において処理が行われるが、これらのステップは本発明の主眼ではないため、詳細な説明は省略する。
【０１９６】
次に、クラス抽出ステップＳ６１３の処理について、図２６（ａ）を参照しながら説明する。図２６（ａ）は、クラス抽出ステップＳ６１３の構成を示すフローチャート図である。
【０１９７】
図２６（ａ）に示すように、クラス抽出ステップＳ６１３では、構文解析ステップＳ６１２において解析されたプログラムに含まれる全てのクラスＣ１について、ステップｎ１〜ステップｎ５のループを繰り返す。
【０１９８】
図３に示すプログラムにおいて、例えばファイル「ａ．ｃｃ」が処理に係ると、ステップｎ１でファイル「ａ．ｃｃ」に含まれるクラスＡを抽出し、ステップｎ２においてクラスＡが解析情報記憶部２２にすでに登録されているか否かを判定する。クラスＡについての判定がはじめての場合には、判定結果はＮｏとなり、ステップｎ３に処理を移行する。ここで、クラスＡについての判定が２度目以降である場合には、すでにクラスＡが解析情報記憶部２２に登録されているので、判定結果はＹｅｓとなり、ステップｎ５に処理を移行する。
【０１９９】
ステップｎ３では、クラスＡを、解析情報記憶部２２におけるクラス集合Ｓ１に登録して、ステップｎ４に処理を移行する。
【０２００】
ステップｎ４では、クラスＡの全ての非静的メンバ関数定義を検出し、解析情報記憶部１２におけるメンバ関数定義集合Ｓ２に登録する。つまり、ファイル「ａ．ｃｃ」におけるクラスＡの非静的メンバ関数「Ａ：：Ａ（）」、「Ａ：：ｆ（ｖｏｉｄ）」および「Ａ：：ｇ（ｉｎｔ）  」をメンバ関数定義集合Ｓ２に登録する。その後、ステップｎ５からステップｎ１に処理を移行する。
【０２０１】
次に、ファイル「ｂ．ｃｃ」がクラス抽出ステップＳ６１３に係ると、クラスＢについて同様の処理を行う。次に、ファイル「ｍａｉｎ．ｃｃ  」がクラス抽出ステップＳ６１３に係ると、クラスＡおよびクラスＢについて同様の処理を行う。
【０２０２】
次に、オブジェクト解析ステップＳ６１４の処理について、図２６（ｂ）を参照しながら説明する。図２６（ｂ）は、オブジェクト解析ステップＳ６１４の構成を示すフローチャート図である。
【０２０３】
図２６（ｂ）に示すように、オブジェクト解析ステップＳ６１４では、プログラム中に含まれる処理について、ステップｐ１〜ステップｐ５に示すループを繰り返す。
【０２０４】
図３に示すプログラムで解析の対象となる処理としては、ファイル「ａ．ｃｃ」内では文「ａ＝１；」などがある。ファイル「ａ．ｃｃ」がオブジェクト解析ステップＳ１０４に係ると、ステップｎ１で例えば文「ａ＝１；」を抽出し、ステップｐ２で、文「ａ＝１；」がクラスオブジェクトを生成する処理か否かを判定する。文「ａ＝１；」はクラスオブジェクトを生成しないので、判定結果はＮｏとなり、ステップｐ５に処理を移行する。
【０２０５】
ステップｐ５に処理が移行されると、プログラム中に含まれる他の処理について、ステップｐ１〜ｐ５のループを繰り返す。図３に示すプログラムにおけるファイル「ｂ．ｃｃ」内には、オブジェクトを生成する処理は含まれていない。ファイル「ｍａｉｎ．ｃｃ」内には、オブジェクトを生成する文「Ｂ  ｏｂｊ＿ｂ；」  が含まれているので、これをステップｐ２で判定すると結果はＹｅｓとなり、ステップｐ３に処理を移行する。
【０２０６】
ステップｐ３では、文「Ｂ  ｏｂｊ＿ｂ；」において生成されるオブジェクトの対象となるクラスＢが、解析情報記憶部２２におけるオブジェクト生成クラス集合Ｓ３にすでに登録されているか否かを判定する。クラスＢについての判定がはじめての場合には、判定結果はＮｏとなり、ステップｐ４に処理を移行する。ここで、クラスＢについての判定が２度目以降である場合には、すでにクラスＢが解析情報記憶部１２に登録されているので、判定結果はＹｅｓとなり、ステップｐ５に処理を移行する。
【０２０７】
ステップｐ４では、クラスＢを、解析情報記憶部１２におけるオブジェクト生成クラス集合Ｓ３に登録し、ステップｐ５に処理を移行する。
【０２０８】
これらの解析の結果、解析情報記憶部１２におけるファイル「ａ．ｃｃ」，  「ｂ：ｃｃ」および「ｍａｉｎ．ｃｃ」  についての解析情報は、図２８（ａ）〜（ｃ）に示す状態となる。図２８（ａ）〜（ｃ）は、ファイル「ａ．ｃｃ」，  「ｂ：ｃｃ」および「ｍａｉｎ．ｃｃ」について解析情報記憶部２２に格納される解析データを示す表の図である。
【０２０９】
次に、出力ステップＳ６１５では、プログラムを変換した結果および解析情報記憶部２２に格納されている解析データを目的コード記憶部２３に出力する。目的コード記憶部２３では、ファイル「ａ．ｃｃ」，  「ｂ：ｃｃ」および「ｍａｉｎ．ｃｃ」についての変換結果および解析情報を、ファイル「ａ．ｏｂｊ」，  「ｂ．ｏｂｊ」，「ｍａｉｎ．ｏｂｊ」として保持する。
【０２１０】
次に、結合ステップＳ６２０について、図２７を参照しながら説明する。図２７は、結合ステップＳ６２０における不要関数解析ステップＳ６２１およびリンクステップＳ６２２の構成を示すフローチャート図である。
【０２１１】
図２７に示すように、不要関数解析ステップＳ６２１では、ステップｑ１で、目的コード記憶部２３に保持されている解析情報に基づいて、クラス集合Ｓ１’、非静的メンバ関数定義集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を計算する。これにより、ファイルごとに保持されていたクラス集合Ｓ１、非静的メンバ関数定義集合Ｓ２およびオブジェクト生成クラス集合Ｓ３は、図２８（ｄ）に示すように１つにまとめられる。図２８（ｄ）は、不要関数解析ステップＳ６２１における解析結果を示す表の図である。
【０２１２】
ステップｑ２では、図２８（ｄ）に示すように、クラス集合Ｓ１’に含まれるクラスＡ，  Ｂから、オブジェクト生成クラス集合Ｓ３’に含まれるクラスＢを除いたクラスであるクラスＡを、オブジェクト未生成クラスＳ４に登録する。その後、ステップｑ３に処理を移行し、不要関数集合Ｓ５を初期化して空集合とする。
【０２１３】
オブジェクト未生成クラスＳ４に含まれる全てのクラスについて、ステップｑ４〜ステップｑ６のループを繰り返す。
【０２１４】
クラスＡが処理に係ると、ステップｑ５では、クラスＡについての全ての非静的メンバ関数を図２８（ｄ）に示す非静的メンバ関数定義集合Ｓ２’から取得して、不要関数集合Ｓ５に追加する。その後、ステップｑ６に処理を移行する。オブジェクト未生成クラス集合Ｓ４にはクラスＡのみしか含まれていないので、ステップｑ４〜ステップｑ６の処理は終了する。
【０２１５】
その後、リンクステップＳ６２２に処理が移行されると、プログラム中の全てのリンク対象Ｌ１について、ステップｑ７〜ステップｑ１０に示す処理を繰り返す。
【０２１６】
図３に示すプログラムがステップｑ７に係ると、ステップｑ８で、例えば「Ａ：：Ａ（）」がリンク対象である場合には、「Ａ：：Ａ（）」が不要関数集合Ｓ５に含まれる関数かどうかを判定する。「Ａ：：Ａ（）」は不要関数集合Ｓ５に含まれるので、ステップｑ１０に処理を移行する。「Ａ：：ｆ（ｖｏｉｄ）」および「Ａ：：ｇ（ｉｎｔ）  」も不要関数集合Ｓ５に含まれるので、同様の処理が行われる。
【０２１７】
このとき、例えば、不要関数集合Ｓ５に含まれない「Ｂ：Ｂ（）」  などの非静的メンバ関数がリンク対象である場合には、ステップｑ８の判定結果はＮｏとなり、ステップｑ９へと処理を移行する。この場合には、ステップｑ９では、「Ｂ：Ｂ（）」に対して通常のリンク処理を行い、ステップｑ１０に処理を移行する。この処理の結果は、実行コード記憶部２４に出力される。
【０２１８】
本実施形態では、プログラム中の各クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な関数を削除することができる。したがって、従来よりも容易に、より多くコードサイズを削減することができる。
【０２１９】
（第７の実施形態）
以下では、本発明の第７の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図２９は、第７の実施形態における翻訳ステップＳ７１０および結合ステップＳ７２０と、各ステップＳ７１０，  Ｓ７２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【０２２０】
図２９に示すように、本実施形態では、プログラム記憶部２１に保持されているプログラムを翻訳ステップＳ７１０において翻訳することにより目的コードを生成し、その目的コードを目的コード記憶部２３に保持する。そして、結合ステップＳ７２０においてリンク処理を行った後に実行コード記憶部２４に保持する。
【０２２１】
プログラム記憶部２１では、変換の対象となるプログラムが、ソースファイル２１ａ，  ２１ｂ，  ２１ｃに分けられて保持される。
【０２２２】
翻訳ステップＳ７１０は、変換の対象となるプログラムを入力する入力ステップＳ６１１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ６１２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部２２に記憶するクラス解析ステップＳ７１１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部２２に記録するオブジェクト解析ステップＳ６１４と、各ステップによって変換されたプログラムおよび解析情報記憶部２２に格納されている解析情報を目的コードとして目的コード記憶部２３に出力する出力ステップＳ６１５とを備えている。
【０２２３】
目的コード記憶部２３では、目的コードが、オブジェクトファイル２３ａ，  ２３ｂ，  ２３ｃに分けられて保持される。
【０２２４】
結合ステップＳ７２０は、目的コード記憶部２３に格納されているオブジェクトファイル２３ａ〜２３ｃを読み込み、そのオブジェクトファイル２３ａ〜２３ｃ中の解析情報を抽出して不要な関数を解析する不要関数解析ステップＳ７２１と、不要関数解析ステップＳ７２１の解析結果を用いて必要なコードあるいはデータのみをリンクし、実行コード記憶部２４に出力するリンクステップＳ６２２とを備えている。
【０２２５】
実行コード記憶部２４では、結合ステップＳ７２０によって結合された実行コードが、実行形式ファイル２４ａとして保持される。
【０２２６】
本実施形態では、クラス解析ステップＳ７１１において、プログラム中に含まれるクラスの情報を抽出するだけではなく、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部２２に記録する。そして、不要関数解析ステップＳ７２１においては、クラス間の継承関係の情報とオブジェクト生成の有無の情報とに基づいて、不要な関数を解析する。
【０２２７】
次に、翻訳ステップＳ７１０および結合ステップＳ７２０における各ステップのより詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第６の実施形態と同様のものについては、詳細な説明を省略する。なお、プログラムの例として、第２の実施形態で用いた図８を再度参照する。
【０２２８】
まず、入力ステップＳ６１１および構文解析ステップＳ６１２では、第６の実施形態と同様の方法により処理が行われる。
【０２２９】
次に、クラス解析ステップＳ７１１の処理について、図３０を参照しながら説明する。図３０は、クラス解析ステップＳ７１１の構成を示すフローチャート図である。図３０に示すように、クラス解析ステップＳ７１１では、構文解析ステップＳ６１２において解析されたプログラムに含まれる全てのクラスＣ１について、ステップｒ１〜ステップｒ６に示すループを繰り返す。
【０２３０】
図８に示すプログラムにおいて、例えばファイル「ａ．ｃｃ」が処理に係ると、ステップｒ１でファイル「ａ．ｃｃ」に含まれるクラスＡを抽出し、ステップｒ２でクラスＡが解析情報記憶部２２にすでに登録されているか否かを判定する。クラスＡについての判定がはじめての場合には、判定結果はＮｏとなり、ステップｒ３に処理を移行する。ここで、クラスＡについての判定が２度目以降である場合には、すでにクラスＡが解析情報記憶部２２に登録されているので、判定結果はＹｅｓとなり、ステップｒ６に処理を移行する。
【０２３１】
ステップｒ３では、クラスＡを解析情報記憶部２２におけるクラス集合Ｓ１に登録し、処理をステップｒ４に移行する。
【０２３２】
ステップｒ４では、クラスＡが基底クラスを有するか否かを判定し、基底クラスを有する場合には、クラスＡについての全ての基底クラスをクラス集合Ｓ１における基底クラスの欄に登録する。クラスＡは基底クラスを有さないため、クラス集合Ｓ１における基底クラスの欄には何も登録されない。つまり、クラス集合Ｓ１における基底クラス集合は空集合となる。
【０２３３】
ステップｒ５では、クラスＡの全ての非静的メンバ関数定義を検出し、解析情報記憶部２２における非静的メンバ関数定義集合Ｓ２に登録する。ファイル「ａ．ｃｃ」におけるクラスＡの非静的メンバ関数は、「Ａ：：Ａ（）」、「Ａ：：ｆ１」  であるので、これらが非静的メンバ関数集合Ｓ２に登録される。
【０２３４】
その後、ステップｒ６からステップｒ１に処理が移行されると、ファイル「ａ．ｃｃ」の他のファイルについて、ステップｒ１〜ステップｒ６のループが繰り返される。ファイル「ｂ．ｃｃ」に含まれるクラスＢはクラスＡから派生しているので、ステップｒ４では、クラス集合Ｓ１におけるクラスＢの基底クラスの欄にクラスＡを登録する。その後、ファイル「ｃ．ｃｃ」，  「ｄ．ｃｃ」，  「ｅ．ｃｃ」および「ｍａｉｎ．ｃｃ」についても、同様の処理を行う。
【０２３５】
次に、オブジェクト解析ステップＳ６１４では、第６の実施形態と同様の方法（図２６（ｂ）に示す）によって、オブジェクトを生成するクラスを解析し、オブジェクトを生成するクラスをオブジェクト生成クラス集合Ｓ３に登録する。各ファイルの中で、オブジェクトを生成するのはファイル「ｍａｉｎ．ｃｃ」  におけるクラスＡおよびクラスＢのみであるので、ファイル「ａ．ｃｃ」，  「ｂ．ｃｃ」，  「ｃ．ｃｃ」，  「ｄ．ｃｃ」，および「ｅ．ｃｃ」のオブジェクト生成クラス集合Ｓ３は空集合となり、ファイル「ｍａｉｎ．ｃｃ」  のオブジェクト生成クラス集合Ｓ３にはクラスＡおよびクラスＢが登録される。
【０２３６】
以上のクラス解析ステップＳ７１１およびオブジェクト解析ステップＳ６１４における解析の結果、解析情報記憶部２２におけるクラス集合Ｓ１、非静的メンバ関数集合Ｓ２およびオブジェクト生成クラス集合Ｓ３は、図３２（ａ）〜（ｆ）に示す状態となる。図３２（ａ）〜（ｆ）は、ファイル「ａ．ｃｃ」〜「ｍａｉｎ．ｃｃ」について解析情報記憶部２２に格納される解析データを示す表の図である。
【０２３７】
次に、出力ステップＳ６１５では、第６の実施形態と同様の方法により、プログラムを変換した結果および解析情報記憶部２２に格納されている解析データを目的コード記憶部２３に出力する。
【０２３８】
目的コード記憶部２３では、ファイル「ａ．ｃｃ」，  「ｂ．ｃｃ」，  「ｃ．ｃｃ」，  「ｄ．ｃｃ」，  「ｅ．ｃｃ」および「ｍａｉｎ．ｃｃ」  についての変換結果および解析情報を、ファイル「ａ．ｏｂｊ」，  「ｂ．ｏｂｊ」，  「ｃ．ｏｂｊ」，「ｄ．ｏｂｊ」，  「ｅ．ｏｂｊ」および「ｍａｉｎ．ｏｂｊ」として保持する。
【０２３９】
次に、不要関数解析ステップＳ７２１の処理について、図３１（ａ）を参照しながら説明する。図３１（ａ）は、不要関数解析ステップＳ７２１の構成を示すフローチャート図である。
【０２４０】
図３１（ａ）に示すように、不要関数解析ステップＳ７２１では、まず、ステップｓ１でクラスツリー集合Ｓ１’の計算処理を行う。ステップｓ１については後述する。この処理により、図３３（ａ）に示すクラスツリー集合Ｓ１が得られる。図３３（ａ）は、不要関数解析ステップＳ７２１のステップｓ１において計算されるクラスツリー集合Ｓ１’を示す表の図である。
【０２４１】
ステップｓ２では、目的コード記憶部２３に保持されている解析情報に基づいて、図３３（ｂ），  （ｃ）に示すように、非静的メンバ関数定義集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を計算する。図３３（ｂ），  （ｃ）は、不要関数解析ステップＳ７２１のステップｓ２において計算される非静的メンバ関数定義集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を示す表の図である。
【０２４２】
ステップｓ３では、削除関数集合Ｓ５を初期化して空集合にする。ステップｓ４では、クラスツリー集合Ｓ１’から、葉のクラスであるクラスＢ、クラスＤおよびクラスＥを葉のクラス集合Ｓ６に登録する。このとき、葉のクラス集合Ｓ６および削除関数集合Ｓ５は、図３４（ａ）に示す状態となる。図３４（ａ）〜（ｅ）は、不要関数解析ステップＳ７２１における葉のクラス集合Ｓ６および削除関数集合Ｓ５の状態の変化を示す表の図である。
【０２４３】
次に、葉のクラス集合Ｓ６に含まれる各クラスについて、ステップｓ５〜ステップｓ１２のループを繰り返す。このループは、葉のクラス集合Ｓ６に含まれるクラスがなくなるまで繰り返す。
【０２４４】
この時点では、クラスＢ、クラスＤおよびクラスＥが葉のクラス集合Ｓ６に含まれる。まず、クラスＢが処理に係ると、ステップｓ６で、図３４（ｂ）に示すように葉のクラス集合Ｓ６からクラスＢを削除する。そして、ステップｓ７で、クラスＢがオブジェクト未生成クラス集合Ｓ４（図示せず）に含まれるか否かを判定する。クラスＢについてのオブジェクトは生成されているので、判定結果はＮｏとなり、ステップｓ１２へ処理を移行する。
【０２４５】
ステップｓ１２からステップｓ５に処理が移行されると、葉のクラス集合Ｓ６に含まれるクラスＤについてステップｓ５〜ステップｓ１２のループを繰り返す。クラスＤについてのオブジェクトは生成されないので、ステップｓ７における判定結果はＹｅｓとなり、ステップｓ８へ処理を移行する。ステップｓ８では、図３４（ｃ）に示すように、クラスＤについての非静的メンバ関数を削除関数集合Ｓ５に追加する。その後、ステップｓ９で、クラスＤをクラスツリー集合Ｓ１から削除する。ステップｓ１０では、新たに葉となるクラスがあるか否かを判定する。新たに葉となるクラスはないので、判定結果はＮｏとなり、ステップｓ１２に処理を移行する。
【０２４６】
次に、クラスＥについてもステップｓ５〜ステップｓ１２のループを繰り返す。クラスＥについてのオブジェクトは生成されないので、ステップｓ７における判定結果はＹｅｓとなり、ステップｓ８では、クラスＥについての非静的メンバ関数を削除関数集合Ｓ５に追加する。その後、ステップｓ１０では、クラスＥをクラスツリー集合Ｓ１’から削除する。これにより、クラスＣが新たに葉のクラスとなっているので、ステップｓ１０の判定結果はＹｅｓとなり、ステップｓ１１に処理を移行する。ステップｓ１１では、図３４（ｄ）に示すように、新たに葉となったクラスＣを葉のクラス集合Ｓ６に追加する。
【０２４７】
その後、ステップｓ１２からステップｓ５に処理が移行されると、クラスＣについて、ステップｓ５〜ステップｓ１２のループが繰り返される。クラスＣについてのオブジェクトは生成されないので、ステップｓ７における判定結果はＹｅｓとなる。その後、ステップｓ８で、クラスＣについての非静的メンバ関数を削除関数集合Ｓ５に追加し、ステップｓ９で、クラスＣをクラスツリー集合Ｓ１’から削除する。クラスＣを削除しても新たに葉となるクラスはないので、ステップｓ１０の判定結果はＮｏとなる。以上の処理によって、図３４（ｅ）に示すように、葉のクラス集合Ｓ６は空集合の状態となり、削除関数集合Ｓ５には、クラスＤ、クラスＥおよびクラスＣについての非静的メンバ関数が含まれる状態となる。
【０２４８】
次に、不要関数解析ステップＳ７２１におけるステップｓ１（クラスツリー集合Ｓ１’計算ステップ）の処理について、図３１（ｂ）を参照しながら説明する。図３１（ｂ）は、不要関数解析ステップＳ７２１におけるステップｓ１（クラスツリー集合Ｓ１’計算ステップ）の構成を示すフローチャート図である。ステップｓ１においては、目的コード記憶部２３に含まれる全てのクラスについて、ステップｔ１〜ステップｔ６のループを繰り返す。
【０２４９】
クラスＡが処理に係ると、ステップｔ２で、クラスＡがクラスツリー集合Ｓ１’に登録済みかどうかを判定する。すでにクラスＡが登録済みの場合にはステップｔ６に処理を移行し、まだ登録されていない場合にはステップｔ３に処理を移行する。
【０２５０】
ステップｔ３では、クラスＡが基底クラスを有するか否かを判定する。クラスＡは基底クラスを有さないので、判定結果はＮｏとなり、ステップｔ５に処理を移行する。ステップｔ５では、クラスＡのクラスツリーを作成し、クラスツリー集合Ｓ１’に登録する。なお、この時点でクラスＡのクラスツリーに含まれるのは、クラスＡのみである。
【０２５１】
ステップｔ６からステップｔ１に処理が移行されると、クラスＢについてもステップｔ１〜ステップｔ６のループを繰り返す。クラスＢの基底クラスはクラスＡであるので、ステップｔ３における判定結果はＹｅｓとなり、ステップｔ４に処理を移行する。ステップｔ４では、クラスツリー集合Ｓ１’の中からクラスＡの属するクラスツリーを検索し、クラスＢを、クラスＡの派生クラスとしてクラスツリーに追加する。
【０２５２】
クラスＣ、クラスＤおよびクラスＥについても、クラスＢと同様に、クラスＡのクラスツリーに追加する。以上の処理により、図３３（ａ）に示すクラスツリー集合Ｓ１’が得られる。
【０２５３】
次に、リンクステップＳ６２２では、第６の実施形態と同様の方法により、プログラム中の全てのリンク対象についてリンク処理を行う。
【０２５４】
本実施形態では、プログラム中のクラスが継承関係を有する場合には、その継承関係を解析してクラスツリーを作成する。そして、クラスツリーにおける葉のクラスがオブジェクトを生成するか否かを判定する。これにより、その葉のクラスについての関数を削除することができる。さらに、その葉のクラスの削除によって、新たに葉となるクラスがあるか否かを判定し、新たに葉となるクラスがオブジェクトを生成するか否かを判定することにより、新たに葉となるクラスについての関数も削除することができる。つまり、解析の途中で新たに葉となったクラスも削除することができる。
【０２５５】
本実施形態では、継承関係を考慮した解析が可能となり、クラスツリーのうちで、削除可能な関数と削除不可能な関数とを的確に判断することができ、より効果的に関数を削除することができる。したがって、従来よりも容易に多くコードサイズを削減することができる。
【０２５６】
（第８の実施形態）
以下では、本発明の第８の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力し、実行させるものである。図３５は、第８の実施形態における翻訳ステップＳ８１０および結合ステップＳ８２０と、各ステップＳ８１０，  Ｓ８２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【０２５７】
図３５に示すように、本実施形態では、プログラム記憶部２１に保持されているプログラムを翻訳ステップＳ８１０において翻訳することにより目的コードを生成し、その目的コードを目的コード記憶部２３に保持する。そして、結合ステップＳ８２０においてリンク処理を行った後に実行コード記憶部２４に保持する。
【０２５８】
プログラム記憶部２１では、変換の対象となるプログラムが、ソースファイル２１ａ，  ２１ｂ，  ２１ｃに分けられて保持される。
【０２５９】
翻訳ステップＳ８１０は、変換の対象となるプログラムを入力する入力ステップＳ６１１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ６１２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部２２に記憶するクラス解析ステップＳ７１１と、仮想関数の解析を行う仮想関数解析ステップＳ８１１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部２２に記録するオブジェクト解析ステップＳ６１４と、各ステップによって変換されたプログラムおよび解析情報記憶部２２に格納されている解析情報を目的コードとして目的コード記憶部２３に出力する出力ステップＳ６１５とを備えている。
【０２６０】
目的コード記憶部２３では、目的コードが、オブジェクトファイル２３ａ，  ２３ｂ，  ２３ｃに分けられて保持される。
【０２６１】
結合ステップＳ８２０は、目的コード記憶部２３に格納されているオブジェクトファイル２３ａ〜２３ｃを読み込み、そのオブジェクトファイル２３ａ〜２３ｃ中の解析情報を抽出して不要な関数を解析する不要関数解析ステップＳ８２１と、不要関数解析ステップＳ８２１の解析結果を用いて必要なコードあるいはデータのみをリンクし、実行コード記憶部２４に出力するリンクステップＳ６２２とを備えている。
【０２６２】
実行コード記憶部２４では、結合ステップＳ８２０によって結合された実行コードが、実行形式ファイル２４ａとして保持される。
【０２６３】
本実施形態では、仮想関数解析ステップＳ８１１において、プログラム中に含まれるクラスについての仮想関数の解析を行う。そのクラスが他のクラスを継承する派生クラスである場合には、派生クラスの仮想関数は、基底クラスの仮想関数を上書きする場合と上書きしない場合とがある。そのため、仮想関数解析ステップＳ８１１では、派生クラスの仮想関数が基底クラスの仮想関数を上書きするか否かを解析する。
【０２６４】
そして、不要関数解析ステップＳ８２１においては、クラス解析ステップＳ７１１、仮想関数解析ステップＳ８１１およびオブジェクト解析ステップＳ６１４からの情報に基づいて、不要な関数を解析する。
【０２６５】
次に、翻訳ステップＳ８１０および結合ステップＳ８２０における各ステップのより詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第３、第６または第７の実施形態と同様のものについては、詳細な説明を省略する。なお、プログラムの例として、第３の実施形態で用いた図１５を再度参照する。
【０２６６】
まず、入力ステップＳ６１１および構文解析ステップＳ６１２では、第６の実施形態と同様の方法により処理を行う。
【０２６７】
次に、クラス解析ステップＳ７１１では、第７の実施形態と同様の方法（図３０に示す）によって、プログラム中に含まれるクラスの情報とその継承関係についての解析を行い、その解析結果を解析情報記憶部２２内のクラス集合Ｓ１に格納する。
【０２６８】
次に、仮想関数解析ステップＳ８１１では、第３の実施形態と同様の方法（図１２に示す）によって、プログラム中に含まれる全てのクラスの仮想関数定義および上書きする仮想関数の解析を行い、解析結果を解析情報記憶部２２内の仮想関数集合Ｓ２に格納する。
【０２６９】
次に、オブジェクト解析ステップＳ６１４では、第６の実施形態と同様の方法（図２６（ｂ）に示す）によって、オブジェクトを生成するクラスを解析し、オブジェクトを生成するクラスを解析情報記憶部２２内のオブジェクト生成クラス集合Ｓ３に登録する。
【０２７０】
以上のクラス解析ステップＳ７１１、仮想関数解析ステップＳ８１１およびオブジェクト解析ステップＳ６１４における解析の結果、解析情報記憶部２２では図３７（ａ）〜（ｅ）に示す情報が保持される。図３７（ａ）〜（ｅ）は、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」および「ｓｕｂ．ｃｃ」について解析情報記憶部２２に格納されるクラス集合Ｓ１、非静的メンバ関数集合Ｓ２およびオブジェクト生成クラス集合Ｓ３を示す表の図である。
【０２７１】
次に、出力ステップＳ６１５では、第６の実施形態と同様の方法により、プログラムを変換した結果および解析情報記憶部２２に格納されている解析データを目的コード記憶部２３に出力する。目的コード記憶部２３では、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，  「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」，および「ｓｕｂ．ｃｃ」についての変換結果および解析情報を、ファイル「ｆ．ｏｂｊ」，  「ｇ．ｏｂｊ」，  「ｈ．ｏｂｊ」，  「ｍａｉｎ．ｏｂｊ」  および「ｓｕｂ．ｏｂｊ」として保持する。
【０２７２】
次に、不要関数解析ステップＳ８２１の処理について、図３６を参照しながら説明する。
図３６は、不要関数解析ステップＳ８２１の構成を示すフローチャート図である。
【０２７３】
図３６に示すように、まずステップｕ１で、第７の実施形態と同様の方法（図３１（ｂ）に示す）によりクラスツリー集合Ｓ１’の計算処理を行う。この処理により、図３８（ａ）に示すように、クラスツリー集合Ｓ１’内には、クラスＦ、クラスＧ、クラスＨを含むクラスツリーＴｒが形成される。図３８（ａ）は、不要関数解析ステップＳ８２１のステップｕ１において計算されるクラスツリー集合Ｓ１’を示す表の図である。
【０２７４】
ステップｕ２では、目的コード記憶部２３に保持されている解析情報に基づいて、図３８（ｂ），  （ｃ）に示すように、仮想関数集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を計算する。図３８（ｂ），  （ｃ）は、不要関数解析ステップＳ８２１のステップｕ２において計算される仮想関数集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を示す表の図である。
【０２７５】
ステップｕ３では、削除関数集合Ｓ５を初期化して空集合にする。その後、クラスツリー集合Ｓ１’内の全てのクラスツリーＴ１について、ステップｕ４〜ステップｕ１５のループを繰り返す。図１５に示すプログラムでは、クラスツリー集合Ｓ１’に含まれるのは、クラスツリーＴｒの１つだけである。
【０２７６】
ステップｕ５に処理が移行すると、クラスツリーＴｒ内の各クラスについて、根のクラスから葉のクラスに向かう順で、ステップｕ５〜ステップｕ１４のループを繰り返す。つまり、まず根のクラスであるクラスＦの処理を行った後、葉のクラスであるクラスＧおよびクラスＨの処理を行う。
【０２７７】
クラスＦが処理に係ると、ステップｕ６で、クラスＦについての仮想関数集合Ｓ２を調べ、クラスＦは他の仮想関数定義を上書きしていない仮想関数定義を有するか否かを判定する。図３８（ｂ）に示すように、クラスＦは仮想関数定義として「Ｆ：ｍ１」を有しており、クラスＦについての上書き仮想関数定義集合は空集合であるため、「Ｆ：ｍ１」は他の仮想関数定義を上書きしていないと判定される。したがって、判定結果はＹｅｓとなり、ステップｕ７に処理を移行する。
【０２７８】
次に、クラスＦの全ての仮想関数定義について、ステップｕ７〜ステップｕ１３のループを繰り返す。
【０２７９】
ステップｕ８では、クラス集合Ｓ６をクラスＦで初期化する。ステップｕ９では、第３の実施形態と同様の方法（図１４に示す）で、非上書きクラスの解析を行う。ステップｕ１０では、クラス集合Ｓ６に含まれる全てのクラスがオブジェクト生成クラス集合Ｓ３’に含まれていないか否かを判定する。この時点では、クラス集合Ｓ６に含まれるクラスはクラスＦのみであり、クラスＦはオブジェクト生成クラス集合Ｓ３’に含まれていないため、判定結果はＹｅｓとなり、ステップｕ１１へと処理を移行する。
【０２８０】
ステップｕ１１では、クラスＦの仮想関数定義「Ｆ：ｍ１」を削除関数集合Ｓ５に追加する。ステップｕ１２では、クラスツリーＴｒに含まれるクラスＦ、クラスＧおよびクラスＨの仮想関数集合Ｓ２’からクラスＦの仮想関数定義「Ｆ：ｍ１」に関する情報を削除することにより、仮想関数集合Ｓ２’の更新を行う。このとき、仮想関数定義「Ｆ：ｍ１」に関する情報として、仮想関数定義集合に格納されている「Ｆ：ｍ１」と、上書き仮想関数定義集合に格納されている「Ｆ：ｍ１」とを削除する。以上の処理の結果、仮想関数集合Ｓ２’、削除関数集合Ｓ５およびクラス集合Ｓ６は、図３９（ａ）に示す状態となる。図３９（ａ）〜（ｃ）は、仮想関数集合Ｓ２’、削除関数集合Ｓ５およびクラス集合Ｓ６の状態の変化を示す表の図である。
【０２８１】
その後、ステップｕ１３に処理を移行すると、クラスＦは、「Ｆ：ｍ１」の他に仮想関数定義を有さないので、クラスＦについてのステップｕ７〜ステップｕ１３のループは終了する。
【０２８２】
次に、ステップｕ１４からステップｕ５に処理が戻り、クラスツリーＴｒ内の葉のクラスＧおよびクラスＨについて、ステップｕ５〜ステップｕ１４のループを繰り返す。
【０２８３】
クラスＧが処理に係ると、ステップｕ６では、クラスＧが、他の仮想関数定義を上書きしていない仮想関数定義を有するか否かが判定される。この時点では、図３９（ａ）に示すように、クラスＧについての上書き仮想関数定義集合は空集合であるので、判定結果はＹｅｓとなり、ステップｕ７に処理を移行する。その後、ステップｕ８で、クラス集合Ｓ６がクラスＧで初期化される。これによりクラス集合Ｓ６に含まれるのはクラスＧのみとなるが、クラスＧはオブジェクト生成クラス集合Ｓ３’に含まれているので、ステップｕ１０の判定結果はＮｏとなり、ステップｕ５に処理が戻る。このとき、図３９（ｂ）に示すように、仮想関数集合Ｓ２’および削除関数集合Ｓ５は前の状態のままとなる。
【０２８４】
次に、クラスＨについても同様の処理が行われる。その結果、図３９（ｃ）に示すように、仮想関数集合Ｓ２’および削除関数集合Ｓ５は前の状態のままとなる。
【０２８５】
その後、ステップｕ１５に処理を移行する。以上により、不要関数解析ステップＳ８２１の処理を終了する。
【０２８６】
次に、リンクステップＳ６２２では、第６の実施形態と同様の方法により、プログラム中の全てのリンク対象についてリンク処理を行う。
【０２８７】
本実施形態では、プログラム中のクラスが継承関係を有する場合には、その継承関係を解析してクラスツリーを作成する。そして、クラスツリーにおける派生クラスの仮想関数のうちの少なくとも１つが、その基底クラスの仮想関数を上書きしない場合には、この派生クラスと基底クラスとの両方でオブジェクトが生成されていない場合に、その基底クラスの仮想関数を削除する。
【０２８８】
一方、クラスツリーにおける派生クラスの仮想関数のうちの全てが、その基底クラスの仮想関数を上書きする場合には、基底クラスのオブジェクトが生成されていない場合に、その基底クラスの仮想関数を削除する。この削除の判定には、派生クラスのオブジェクトが生成されているか否かは関係しない。
【０２８９】
以上のことから、仮想関数を有するプログラムにおいても、削除可能な関数と削除不可能な関数とを的確に判断することができ、より効果的に関数を削除することができる。したがって、従来よりも容易に多くコードサイズを削減することができる。
【０２９０】
（第９の実施形態）
以下では、本発明の第９の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力し、実行させるものである。図４０は、第９の実施形態における翻訳ステップＳ９１０および結合ステップＳ９２０と、各ステップＳ９１０，  Ｓ９２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【０２９１】
図４０に示すように、本実施形態では、プログラム記憶部２１に保持されているプログラムを翻訳ステップＳ９１０において翻訳することにより目的コードを生成し、その目的コードを目的コード記憶部２３に保持する。そして、結合ステップＳ９２０においてリンク処理を行った後に実行コード記憶部２４に保持する。
【０２９２】
プログラム記憶部２１では、変換の対象となるプログラムが、ソースファイル２１ａ，  ２１ｂ，  ２１ｃに分けられて保持される。
【０２９３】
翻訳ステップＳ９１０は、変換の対象となるプログラムを入力する入力ステップＳ６１１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ６１２と、プログラム中に含まれるクラスの情報を抽出し、さらに、クラス定義を解析してクラス間の継承関係を解析情報記憶部１２に記憶するクラス解析ステップＳ７１１と、仮想関数の解析を行う仮想関数解析ステップＳ９１１と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部２２に記録するオブジェクト解析ステップＳ６１４と、各ステップによって変換されたプログラムおよび解析情報記憶部２２に格納されている解析情報を目的コードとして目的コード記憶部２３に出力する出力ステップＳ６１５とを備えている。
【０２９４】
目的コード記憶部２３では、目的コードが、オブジェクトファイル２３ａ，  ２３ｂ，  ２３ｃに分けられて保持される。
【０２９５】
結合ステップＳ９２０は、目的コード記憶部２３に格納されているオブジェクトファイル２３ａ〜２３ｃを読み込み、そのオブジェクトファイル２３ａ〜２３ｃ中の解析情報を抽出して不要な関数およびデータを解析する仮想関数解析ステップＳ９１１と、不要関数・不要データ解析ステップＳ９２１の解析結果を用いて必要なコードあるいはデータのみをリンクし、実行コード記憶部２４に出力するリンクステップＳ９２２とを備えている。
【０２９６】
実行コード記憶部２４では、結合ステップＳ９２０によって結合された実行コードが、実行形式ファイル２４ａとして保持される。
【０２９７】
本実施形態では、仮想関数解析ステップＳ９１１において、第８の実施形態と同様の方法で仮想関数を解析するのに加えて、さらに、仮想関数表を抽出する。
【０２９８】
そして、不要関数・不要データ削除ステップＳ９２１において、全ての仮想関数定義が削除可能であると判定されたクラスについての仮想関数表を削除仮想関数表集合に追加する。その後、リンクステップＳ９２２において、削除仮想関数表集合に追加されている仮想関数表を削除し、アドレスを無効値に変換する。
【０２９９】
次に、翻訳ステップＳ９１０および結合ステップＳ９２０における各ステップのより詳細な動作について、プログラム例を参照しながら説明する。なお、これらのステップのうちで第３、第４、第６、第７または第８の実施形態と同様のものについては、詳細な説明を省略する。なお、プログラムの例として、第３の実施形態で用いた図１５を再度参照する。
【０３００】
まず、入力ステップＳ６１１および構文解析ステップＳ６１２では、第６の実施形態と同様の方法により処理を行う。
【０３０１】
次に、クラス解析ステップＳ７１１では、第７の実施形態と同様の方法（図３０に示す）によって、プログラム中に含まれるクラスの情報とその継承関係についての解析を行い、その解析結果を解析情報記憶部２２内のクラス集合Ｓ１に格納する。
【０３０２】
次に、仮想関数解析ステップＳ９１１の処理について、図４１を参照しながら説明する。図４１は、仮想関数解析ステップＳ９１１の構成を示すフローチャート図である。
【０３０３】
図４１に示すように、仮想関数解析ステップＳ９１１では、ステップｇ１〜ステップｇ１０とステップｗ１との処理を行う。これらの処理のうち第３の実施形態と同様のステップｇ１〜ステップｇ１０（図１２に示す）の説明を省略する。
【０３０４】
ステップｗ１では、クラス集合Ｓ１にクラスＣ１の全ての仮想関数表を登録する。このとき、クラスＣ１となるのはクラスＦ、クラスＧおよびクラスＨである。例えばクラスＦが処理に係ると、クラスＦの仮想関数表「ｖｔｂｌ＿Ｆ」を、解析情報記憶部２２におけるクラス集合Ｓ１に登録する。クラスＧおよびクラスＨについても同様である。
【０３０５】
次に、オブジェクト解析ステップＳ６１４では、第６の実施形態と同様の方法（図２６（ｂ）に示す）によって、オブジェクトを生成するクラスを解析し、オブジェクトを生成するクラスをオブジェクト生成クラス集合Ｓ３に登録する。
【０３０６】
以上のクラス解析ステップＳ７１１、仮想関数解析ステップＳ９１１およびオブジェクト解析ステップＳ６１４における解析の結果、解析情報記憶部２２では図４４（ａ）〜（ｅ）に示す情報が保持される。図４４（ａ）〜（ｅ）は、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」および「ｓｕｂ．ｃｃ」について解析情報記憶部２２に格納されるクラス集合Ｓ１、非静的メンバ関数集合Ｓ２およびオブジェクト生成クラス集合Ｓ３を示す表の図である。本実施形態では、図４４（ａ）〜（ｅ）に示すように、各ファイルの仮想関数集合Ｓ２に仮想関数表が登録されている。
【０３０７】
次に、出力ステップＳ６１５では、第６の実施形態と同様の方法により、プログラムを変換した結果および解析情報記憶部２２に格納されている解析データを目的コード記憶部２３に出力する。目的コード記憶部２３では、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，  「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」，および「ｓｕｂ．ｃｃ」についての変換結果および解析情報を、ファイル「ｆ．ｏｂｊ」，  「ｇ．ｏｂｊ」，  「ｈ．ｏｂｊ」，  「ｍａｉｎ．ｏｂｊ」  および「ｓｕｂ．ｏｂｊ」として保持する。
【０３０８】
次に、不要関数・不要データ解析ステップＳ９２１の処理について、図４２を参照しながら説明する。図４２は、不要関数・不要データ解析ステップＳ９２１の構成を示すフローチャート図である。
【０３０９】
図４２に示すように、不要関数・不要データ解析ステップＳ９２１では、ステップｕ１〜ステップｕ１５と、ステップｘ１〜ステップｘ２との処理を行う。これらの処理のうち第８の実施形態と同様のステップｕ１〜ステップｕ１５（図３６に示す）の説明は省略する。
【０３１０】
なお、ステップｕ１の処理により、図４５（ａ）に示すクラスツリー集合Ｓ１’が生成され、ステップｕ２の処理により、図４５（ｂ），  （ｃ）に示す仮想関数集合ｓ２’およびオブジェクト生成クラス集合Ｓ３’が生成される。図４５（ａ）〜（ｃ）は、第９の実施形態において、クラスツリー集合Ｓ１’、仮想関数集合ｓ２’およびオブジェクト生成クラス集合Ｓ３’の状態を示す表の図である。
【０３１１】
ステップｘ１では、クラスＣ１についての全ての仮想関数定義が削除関数集合Ｓ５に追加されたか否かを判定する。このとき、クラスＣ１となるのはクラスＦ、クラスＧおよびクラスＨである。例えばクラスＦがステップｘ１の処理に係る時点では、クラスＦについての仮想関数定義「Ｆ：ｍ１」はすでに削除関数集合Ｓ５に追加されている（ステップｕ１１）。そのため、判定結果はＹｅｓとなり、ステップｘ２に処理を移行する。
【０３１２】
ステップｘ２では、削除仮想関数表集合Ｓ７に、クラスＦの全ての仮想関数表を追加する。つまり、クラスＦの仮想関数表「Ｖｔｂｌ＿Ｆ」を削除仮想関数表集合Ｓ７に追加する。以上の処理の結果、仮想関数集合Ｓ２’、クラス集合Ｓ６、削除関数集合Ｓ５および削除仮想関数表集合Ｓ７は、図４６（ａ）に示す状態となる。図４６（ａ）〜（ｃ）は、仮想関数集合Ｓ２’、クラス集合Ｓ６、削除関数集合Ｓ５および削除仮想関数表集合Ｓ７の状態の変化を示す表の図である。
【０３１３】
次に、クラスＧがステップｘ１に係る時点では、図４６（ａ）に示すように、クラスＧの仮想関数定義は削除関数集合Ｓ５に追加されていない。そのため、判定結果はＮｏとなり、ステップｕ１４に処理を移行する。これにより、図４６（ｂ）に示す解析結果が得られる。
【０３１４】
次に、クラスＨがステップｘ１に係る時点では、図４６（ｂ）に示すように、クラスＨの仮想関数定義は削除関数集合Ｓ５に追加されていない。そのため、判定結果はＮｏとなり、ステップｕ１４に処理を移行する。これにより、図４６（ｃ）に示す解析結果が得られる。
【０３１５】
次に、リンクステップＳ９２２の処理について、図４３を参照しながら説明する。図４３は、リンクステップＳ９２２の構成を示すフローチャート図である。
【０３１６】
リンクステップＳ９２２では、図４３に示すように、ステップｑ７〜ステップｑ１０と、ステップｙ１〜ステップｙ２との処理を行う。これらの処理のうち第６の実施形態におけるリンクステップＳ６２２（図２７に示す）と同様のステップｑ７〜ステップｑ１０の説明は省略する。
【０３１７】
ステップｙ１では、リンク対象Ｌ１が削除仮想関数表集合Ｓ７に含まれるデータであるか否かを判定する。例えば、「ｖｔｂｌ＿Ｆ」がリンク対象である場合について説明すると、「ｖｔｂｌ＿Ｆ」は図４６（ｃ）に示す削除仮想関数表集合Ｓ７に含まれるので、判定結果はＹｅｓとなり、ステップｙ２に処理を移行する。
【０３１８】
ステップｙ２では、「ｖｔｂｌ＿Ｆ」のアドレスを例えばヌルポインタなどの無効値に変更し、「ｖｔｂｌ＿Ｆ」のアドレスを必要とする箇所で、アドレスを無効値とするようにする。なお、アドレスを必要とする箇所とは、例えばアドレスの参照箇所である。
【０３１９】
一方、ステップｙ１において、例えば「ｖｔｂｌ＿Ｇ」がリンク対象である場合について説明すると、「ｖｔｂｌ＿Ｆ」は図４６（ｃ）に示す削除仮想関数表集合Ｓ７に含まれないので、判定結果はＮｏとなり、ステップｑ８に処理を移行する。
【０３２０】
本実施形態では、第８の実施形態と同様の効果を得ることができる。さらに、削除仮想関数表集合Ｓ７に示すデータを削除することができる。したがって、さらにコードサイズの小さい効率のよいコードを生成することができる。
【０３２１】
（第１０の実施形態）
以下では、本発明の第１０の実施形態においてコンパイラ（図示せず）が行うプログラム変換方法について、図面を参照しながら説明する。なお、このプログラム変換方法は、処理が記述されたプログラムをコンパイラに入力して実行させるものである。図４７は、第１０の実施形態におけるプリコンパイルステップＳ１０１０およびプログラム変換ステップＳ１０２０と、各ステップＳ１０１０，  Ｓ１０２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【０３２２】
プログラム記憶部３１では、変換の対象となるプログラムが、ソースファイル３１ａ，  ３１ｂ，  ３１ｃに分けられて保持される。
【０３２３】
プリコンパイルステップＳ１０１０は、変換の対象となるプログラムを入力する入力ステップＳ１０１１と、プログラムの構文を解析し、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ１０１２と、プログラム中に含まれるクラスの情報を解析情報記憶部３２に記録するクラス抽出ステップＳ１０１３と、プログラム中に含まれるクラスのうちオブジェクトが生成されているクラスを検出し、その結果を解析情報記憶部３２に記録するオブジェクト解析ステップＳ１０１４と、各ステップによって変換されたプログラムおよび解析情報記憶部３２に格納されている解析結果に基づいて不要な関数を解析し、解析情報記憶部３２に格納する不要関数解析ステップＳ１０１５とを備えている。
【０３２４】
解析情報記憶部３２は、クラス抽出ステップＳ１０１３、オブジェクト解析ステップＳ１０１４および不要関数解析ステップＳ１０１５で解析された情報を格納しておく。
【０３２５】
プログラム変換ステップＳ１０２０は、解析情報記憶部３２に格納されている解析情報、およびプログラム記憶部３１に格納されているプログラムを１つずつ順次入力する入力ステップＳ１０２１と、シンボルテーブル、構文木等の生成を行う構文解析ステップＳ１０２２と、入力ステップＳ１０２１で入力した解析情報をから不要な関数の情報を取得し、不要な関数の定義を削除する不要関数削除ステップＳ１０２３と、各ステップによって変換されたプログラムを目的プログラムとして生成コード記憶部３３に出力する出力ステップＳ１０２４とを備えている。
【０３２６】
生成コード記憶部３３では、目的プログラムが保持される。
【０３２７】
次に、プリコンパイルステップＳ１０１０およびプログラム変換ステップＳ１０２０における各ステップのより詳細な動作について説明する。なお、プログラム例として、第１の実施形態で用いた図３を再度参照する。
【０３２８】
まず、プリコンパイルステップＳ１０１０が開始されると、入力ステップＳ１０１１、構文解析ステップＳ１０１２において処理が行われるが、これらのステップは本発明の主眼ではないので、詳細な説明は省略する。
【０３２９】
次に、クラス抽出ステップＳ１０１３では、第１の実施形態と同様の方法（図２（ａ）に示す）によって、プログラム中に含まれる全てのクラスの情報を抽出する。その結果、第１の実施形態と同様の図４（ａ）に示すクラス情報が得られる。
【０３３０】
次に、オブジェクト解析ステップＳ１０１４では、第１の実施形態と同様の方法（図２（ｂ）に示す）によって、オブジェクトを生成するクラスを解析し、オブジェクトを生成するクラスを解析情報記憶部３２に格納する。その結果、第１の実施形態と同様の図４（ｂ）に示すクラス情報が得られる。
【０３３１】
次に、不要関数解析ステップＳ１０１５では、第１の実施形態と同様の方法（図２（ｃ）に示す）によって、解析情報記憶部３２に格納されている解析データに基づいて、不要な関数を解析し、解析情報記憶部３２に格納する。その結果、第１の実施形態と同様の図４（ｃ）に示す削除関数集合Ｓ１が得られる。
【０３３２】
次に、プログラム変換ステップＳ１０２０が開始されると、入力ステップＳ１０２１、構文解析ステップＳ１０２２において処理が行われるが、これらのステップは本発明の主眼ではないので、詳細な説明は省略する。
【０３３３】
次に、不要関数削除ステップＳ１０２３によって、第１の実施形態と同様の方法（図２（ｄ）に示す）によって、削除関数集合Ｓ１に基づいて、不要な関数定義（図３に示す関数（Ａ））を削除する。
【０３３４】
本実施形態では、プリコンパイルステップにおいても、従来よりも多くコードサイズを削減することができる。
【０３３５】
なお、本実施形態では、プリコンパイルステップＳ１０１０に、クラス抽出ステップＳ１０１３、オブジェクト解析ステップＳ１０１４および不要関数解析ステップＳ１０１５を含めた。しかしながら、本発明では、これらのかわりに第２の実施形態で示すクラス解析ステップＳ２０１、オブジェクト解析ステップＳ１０４、不要関数解析ステップＳ２０２をプリコンパイルステップＳ１０１０に含めてもよい。その場合には、第２の実施形態と同様の効果を得ることができる。
【０３３６】
同様に、本発明では、プリコンパイルステップＳ１０１０に、第３の実施形態で示すクラス解析ステップＳ２０１、仮想関数解析ステップＳ３０１、オブジェクト解析ステップＳ１０４、不要関数解析ステップＳ３０２を含めてもよい。その場合には、第３の実施形態と同様の効果を得ることができる。
【０３３７】
同様に、プリコンパイルステップＳ１０１０に、第４の実施形態で示すクラス解析ステップＳ２０１、仮想関数解析ステップＳ３０１、オブジェクト解析ステップＳ１０４および不要処理・不要データ解析ステップＳ４０１を含め、さらに、不要関数削除ステップＳ１０２３のかわりに、第４の実施形態で示す不要処理・不要データ削除ステップＳ４０２を含めてもよい。この場合には、第４の実施形態と同様の効果を得ることができる。
【０３３８】
同様に、プリコンパイルステップＳ１０１０に、第５の実施形態で示すクラス解析ステップＳ２０１、オブジェクト解析ステップＳ１０４、不要関数解析ステップＳ２０２および削除指定関数解析ステップＳ５０１を含めてもよい。この場合には、第５の実施形態と同様の効果を得ることができる。
【０３３９】
【発明の効果】
本発明によると、クラスについてオブジェクトを生成する処理があるか否かを判定することにより確実に不要な処理を削除することができる。したがって、従来よりも容易に、コードサイズをより多く削減することができる。
【図面の簡単な説明】
【図１】第１の実施形態におけるプログラム変換ステップＳ１００の構成を示すフローチャート図である。
【図２】（ａ），  （ｂ），  （ｃ）および（ｄ）は、それぞれ、クラス抽出ステップＳ１０３，  オブジェクト解析ステップＳ１０４，  不要関数解析ステップＳ１０５および不要関数削除ステップＳ１０６の構成を示すフローチャート図である。
【図３】プログラムの例を示す図である。
【図４】（ａ）は、クラス抽出ステップＳ１０３において抽出されるクラスの情報を示す表の図であり、（ｂ）は、オブジェクト解析ステップＳ１０４において解析されるクラスの情報を示す表の図であり、（ｃ）は、不要関数解析ステップＳ１０５において解析される削除関数集合Ｓ１を示す表の図である。
【図５】第２の実施形態におけるプログラム変換ステップＳ２００の構成を示すフローチャート図である。
【図６】クラス解析ステップＳ２０１の構成を示すフローチャート図である。
【図７】不要関数解析ステップＳ２０２の構成を示すフローチャート図である。
【図８】プログラムの例を示す図である。
【図９】（ａ）は、クラス解析ステップＳ２０１において抽出されるクラスの情報を示す表の図であり、（ｂ）は、クラス解析ステップＳ２０１において解析されるクラスのクラスツリーＴｒを示す図であり、（ｃ）は、オブジェクト解析ステップＳ１０４において解析されるクラス情報を示す表の図である。
【図１０】（ａ）〜（ｅ）は、削除関数集合Ｓ１の状態の変化を示す表の図である。
【図１１】第３の実施形態におけるプログラム変換ステップＳ３００の構成を示すフローチャート図である。
【図１２】仮想関数解析ステップＳ３０１の構成を示すフローチャート図である。
【図１３】不要関数解析ステップＳ３０２の構成を示すフローチャート図である。
【図１４】不要関数解析ステップＳ３０２のステップｈ６の構成を示すフローチャート図である。
【図１５】プログラムの例を示す図である。
【図１６】（ａ）は、クラス解析ステップＳ２０１において抽出されるクラスの情報を示す表の図であり、（ｂ）は、クラス解析ステップＳ２０１において解析されるクラスのクラスツリーＴｒを示す図であり、（ｃ）は、オブジェクト解析ステップＳ１０４において解析されるクラス情報を示す表の図である。
【図１７】（ａ）〜（ｄ）は、仮想関数集合Ｓ２の状態の変化を示す表の図であり、（ｅ）〜（ｈ）は、クラス集合Ｓ３および削除関数集合Ｓ１の状態の変化を示す表の図である。
【図１８】第４の実施形態におけるプログラム変換ステップＳ４００の構成を示すフローチャート図である。
【図１９】不要処理・不要データ解析ステップＳ４０１の構成を示すフローチャート図である。
【図２０】不要処理・不要データ削除ステップＳ４０２の構成を示すフローチャート図である。
【図２１】（ａ）は、削除クラス集合Ｓ４の状態を示す表の図であり、（ｂ）は、クラスＦの仮想関数表を示す表の図であり、（ｃ）は、クラスＦに関する仮想関数表のアドレス設定処理を示す図である。
【図２２】第５の実施形態におけるプログラム変換ステップＳ５００の構成を示すフローチャート図である。
【図２３】削除指定関数解析ステップＳ５０１の構成を示すフローチャート図である。
【図２４】（ａ），  （ｂ）は、削除関数集合の状態の変化を示す表の図である。
【図２５】第６の実施形態における翻訳ステップＳ６１０および結合ステップＳ６２０と、各ステップＳ６１０，  Ｓ６２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【図２６】（ａ）は、クラス抽出ステップＳ６１３の構成を示すフローチャート図であり、（ｂ）は、オブジェクト解析ステップＳ６１４の構成を示すフローチャート図である。
【図２７】結合ステップＳ６２０における不要関数解析ステップＳ６２１およびリンクステップＳ６２２の構成を示すフローチャート図である。
【図２８】（ａ）〜（ｃ）は、ファイル「ａ．ｃｃ」，  「ｂ：ｃｃ」および「ｍａｉｎ．ｃｃ」  について解析情報記憶部２２に格納される解析データを示す表の図であり、（ｄ）は、不要関数解析ステップＳ６２１における解析結果を示す表の図である。
【図２９】第７の実施形態における翻訳ステップＳ７１０および結合ステップＳ７２０と、各ステップＳ７１０，  Ｓ７２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【図３０】クラス解析ステップＳ７１１の構成を示すフローチャート図である。
【図３１】（ａ）は、不要関数解析ステップＳ７２１の構成を示すフローチャート図であり、（ｂ）は、不要関数解析ステップＳ７２１におけるステップｓ１（クラスツリー集合Ｓ１’計算ステップ）の構成を示すフローチャート図である。
【図３２】（ａ）〜（ｆ）は、ファイル「ａ．ｃｃ」〜「ｍａｉｎ．ｃｃ」について解析情報記憶部２２に格納される解析データを示す表の図である。
【図３３】（ａ）は、不要関数解析ステップＳ７２１のステップｓ１において計算されるクラスツリー集合Ｓ１’を示す表の図であり、（ｂ），  （ｃ）は、不要関数解析ステップＳ７２１のステップｓ２において計算される非静的メンバ関数定義集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を示す表の図である。
【図３４】（ａ）〜（ｅ）は、不要関数解析ステップＳ７２１における葉のクラス集合Ｓ６および削除関数集合Ｓ５の状態の変化を示す表の図である。
【図３５】第８の実施形態における翻訳ステップＳ８１０および結合ステップＳ８２０と、各ステップＳ８１０，  Ｓ８２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【図３６】不要関数解析ステップＳ８２１の構成を示すフローチャート図である。
【図３７】（ａ）〜（ｅ）は、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」および「ｓｕｂ．ｃｃ」について解析情報記憶部２２に格納されるクラス集合Ｓ１、非静的メンバ関数集合Ｓ２およびオブジェクト生成クラス集合Ｓ３を示す表の図である。
【図３８】（ａ）は、不要関数解析ステップＳ８２１のステップｕ１において計算されるクラスツリー集合Ｓ１’を示す表の図であり、（ｂ），  （ｃ）は、不要関数解析ステップＳ８２１のステップｕ２において計算される仮想関数集合Ｓ２’およびオブジェクト生成クラス集合Ｓ３’を示す表の図である。
【図３９】（ａ）〜（ｃ）は、仮想関数集合Ｓ２’、削除関数集合Ｓ５およびクラス集合Ｓ６の状態の変化を示す表の図である。
【図４０】第９の実施形態における翻訳ステップＳ９１０および結合ステップＳ９２０と、各ステップＳ９１０，  Ｓ９２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【図４１】仮想関数解析ステップＳ９１１の構成を示すフローチャート図である。
【図４２】不要関数・不要データ解析ステップＳ９２１の構成を示すフローチャート図である。
【図４３】リンクステップＳ９２２の構成を示すフローチャート図である。
【図４４】（ａ）〜（ｅ）は、ファイル「ｆ．ｃｃ」，  「ｇ．ｃｃ」，「ｈ．ｃｃ」，  「ｍａｉｎ．ｃｃ」および「ｓｕｂ．ｃｃ」について解析情報記憶部２２に格納されるクラス集合Ｓ１、非静的メンバ関数集合Ｓ２およびオブジェクト生成クラス集合Ｓ３を示す表の図である。
【図４５】（ａ）〜（ｃ）は、第９の実施形態において、クラスツリー集合Ｓ１’、仮想関数集合ｓ２’およびオブジェクト生成クラス集合Ｓ３’の状態を示す表の図である。
【図４６】（ａ）〜（ｃ）は、仮想関数集合Ｓ２’、クラス集合Ｓ６、削除関数集合Ｓ６および削除仮想関数表集合Ｓ７の状態の変化を示す表の図である。
【図４７】第１０の実施形態におけるプリコンパイルステップＳ１０１０およびプログラム変換ステップＳ１０２０と、各ステップＳ１０１０，  Ｓ１０２０において生成された情報を保持する記憶部との構成を示すフローチャート図である。
【符号の説明】
Ｓ１００      プログラム変換ステップ
Ｓ１０１      入力ステップ
Ｓ１０２      構文解析ステップ
Ｓ１０３      クラス抽出ステップ
Ｓ１０４      オブジェクト解析ステップ
Ｓ１０５      不要関数解析ステップ
Ｓ１０６      不要関数削除ステップ
Ｓ１０７      出力ステップ
Ｓ２００      プログラム変換ステップ
Ｓ２０１      クラス解析ステップ
Ｓ２０２      不要関数解析ステップ
Ｓ３００      プログラム変換ステップ
Ｓ３０１      仮想関数解析ステップ
Ｓ３０２      不要関数解析ステップ
Ｓ４００      プログラム変換ステップ
Ｓ４０１      不要処理・不要データ解析ステップ
Ｓ４０２      不要処理・不要データ削除ステップ
Ｓ５００      プログラム変換ステップ
Ｓ５０１      削除指定関数解析ステップ
Ｓ６１０      翻訳ステップ
Ｓ６１１      入力ステップ
Ｓ６１２      構文解析ステップ
Ｓ６１３      クラス抽出ステップ
Ｓ６１４      オブジェクト解析ステップ
Ｓ６１５      出力ステップ
Ｓ６２０      結合ステップ
Ｓ６２１      不要関数解析ステップ
Ｓ６２２      リンクステップ
Ｓ７１０      翻訳ステップ
Ｓ７１１      クラス解析ステップ
Ｓ７２０      結合ステップ
Ｓ７２１      不要関数解析ステップ
Ｓ８１０      翻訳ステップ
Ｓ８１１      仮想関数解析ステップ
Ｓ８２０      結合ステップ
Ｓ８２１      不要関数解析ステップ
Ｓ９１０      翻訳ステップ
Ｓ９１１      仮想関数解析ステップ
Ｓ９２０      結合ステップ
Ｓ９２１      不要関数・不要データ解析ステップ
Ｓ９２２      リンクステップ
Ｓ１０１０    コンパイルステップ
Ｓ１０１１    入力ステップ
Ｓ１０１２    構文解析ステップ
Ｓ１０１３    クラス抽出ステップ
Ｓ１０１４    オブジェクト解析ステップ
Ｓ１０１５    不要関数解析ステップ
Ｓ１０２０    プログラム変換ステップ
Ｓ１０２１    入力ステップ
Ｓ１０２２    構文解析ステップ
Ｓ１０２３    不要関数削除ステップ
Ｓ１０２４    出力ステップ
【図１】
2005018425.tif 000003
【図２】
2005018425.tif 000004
【図３】
2005018425.tif 000005
【図４】
2005018425.tif 000006
【図５】
2005018425.tif 000007
【図６】
2005018425.tif 000008
【図７】
2005018425.tif 000009
【図８】
2005018425.tif 000010
【図９】
2005018425.tif 000011
【図１０】
2005018425.tif 000012
【図１１】
2005018425.tif 000013
【図１２】
2005018425.tif 000014
【図１３】
2005018425.tif 000015
【図１４】
2005018425.tif 000016
【図１５】
2005018425.tif 000017
【図１６】
2005018425.tif 000018
【図１７】
2005018425.tif 000019
【図１８】
2005018425.tif 000020
【図１９】
2005018425.tif 000021
【図２０】
2005018425.tif 000022
【図２１】
2005018425.tif 000023
【図２２】
2005018425.tif 000024
【図２３】
2005018425.tif 000025
【図２４】
2005018425.tif 000026
【図２５】
2005018425.tif 000027
【図２６】
2005018425.tif 000028
【図２７】
2005018425.tif 000029
【図２８】
2005018425.tif 000030
【図２９】
2005018425.tif 000031
【図３０】
2005018425.tif 000032
【図３１】
2005018425.tif 000033
【図３２】
2005018425.tif 000034
【図３３】
2005018425.tif 000035
【図３４】
2005018425.tif 000036
【図３５】
2005018425.tif 000037
【図３６】
2005018425.tif 000038
【図３７】
2005018425.tif 000039
【図３８】
2005018425.tif 000040
【図３９】
2005018425.tif 000041
【図４０】
2005018425.tif 000042
【図４１】
2005018425.tif 000043
【図４２】
2005018425.tif 000044
【図４３】
2005018425.tif 000045
【図４４】
2005018425.tif 000046
【図４５】
2005018425.tif 000047
【図４６】
2005018425.tif 000048
【図４７】
2005018425.tif 000049