(57)【要約】【課題】ソースプログラムのコンパイル時間の短縮化を図ること。【解決手段】コンパイル装置１００は、ソースプログラムｓｃの構文解析および意味解析により得られる中間言語Ｉコード中のメソッド群から重複メソッド候補を抽出する。コンパイル装置１００は、抽出した重複メソッド候補それぞれの中間言語Ｉコードにより特定される処理ロジックに基づいて、重複メソッド候補のメソッド間の対応関係情報１１０を生成する。コンパイル装置１００は、生成した対応関係情報１１０に基づいて、重複メソッド候補のメソッド間で実行面での冗長性を有するか否かを判定し、メソッド間で実行面での冗長性を有する重複メソッド候補のマージ処理を行う。【選択図】図１
2015210740.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、
前記複数のマージ可能メソッドのマージ処理を行う、
処理を実行することを特徴とするコンパイル方法。
【請求項２】
前記コンピュータが、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドのメソッド間の対応関係情報を生成する処理を実行し、
前記複数のマージ可能メソッドを抽出する処理は、
前記対応関係情報に基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出することを特徴とする請求項１に記載のコンパイル方法。
【請求項３】
前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、親子関係を有するクラス間で同一名のメソッドの組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする請求項１または２に記載のコンパイル方法。
【請求項４】
前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、同一クラス内のメソッド、あるいは、いずれのクラスにも属していないメソッドのうち、同一名のメソッドの組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする請求項１〜３のいずれか一つに記載のコンパイル方法。
【請求項５】
前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、同一クラス内の演算子、あるいは、いずれのクラスにも属していない演算子のうち、同一名の演算子の組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする請求項１〜４のいずれか一つに記載のコンパイル方法。
【請求項６】
前記コンピュータが、
前記複数のマージ候補メソッドそれぞれの中間言語コード中の宣言、文、式それぞれのデータごとに、前記複数のマージ候補メソッドのメソッド間のデータを比較する処理を実行し、
前記生成する処理は、
前記データごとの比較結果に基づいて、前記複数のマージ候補メソッドそれぞれの中間言語コードのうち、前記メソッド間で意味的に同一である部分と前記メソッド間で意味的に異なる部分とを識別する対応関係情報を生成することを特徴とする請求項２に記載のコンパイル方法。
【請求項７】
前記複数のマージ可能メソッドを抽出する処理は、
前記対応関係情報を参照して、前記複数のマージ候補メソッドそれぞれの中間言語コード中の宣言、文、式それぞれのデータのうちの少なくともいずれかのデータが意味的に同一である前記複数のマージ候補メソッドを、前記複数のマージ可能メソッドとして抽出することを特徴とする請求項６に記載のコンパイル方法。
【請求項８】
前記ソースプログラムは、オブジェクト指向言語によってコーディングされたプログラムであることを特徴とする請求項１〜７のいずれか一つに記載のコンパイル方法。
【請求項９】
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、前記複数のマージ可能メソッドのマージ処理を行う制御部、
を有することを特徴とするコンパイル装置。
【請求項１０】
コンピュータに、
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、
前記複数のマージ可能メソッドのマージ処理を行う、
処理を実行させることを特徴とするコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方法、コンパイル装置およびコンパイルプログラムに関する。
【背景技術】
【０００２】
従来、計算科学の分野、とりわけＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）の世界でのソフトウェア開発は、主にＦｏｒｔｒａｎによりコーディングされてきた。しかし、近年は、計算科学の分野でも、Ｃ言語は勿論のこと、生産性・再利用性の高さの観点から、Ｃ＋＋やＪａｖａ（登録商標）といったオブジェクト指向言語によりコーディングされたソフトウェアが増えている。
【０００３】
先行技術としては、例えば、メソッドへのリファレンスをオブジェクトベースのプログラミングシステムにおいてカプセル化し、そのリファレンスが安全であることを保証するための技術がある。また、インタプリタによってオブジェクト指向プログラムを実行するスクリプト言語処理装置において、複数のオブジェクトに対して同一のメソッドを記述する場合に、グループ化した記述を可能とする技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２００２−５１７８１５号公報
【特許文献２】特開平１０−１７１６５６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、オブジェクト指向言語でコーディングされたソースプログラムには、オブジェクト指向言語の言語的特徴から大量のメソッドが含まれることが多く、ソースプログラムのコンパイル時間の増加を招くという問題がある。
【０００６】
一つの側面では、本発明は、ソースプログラムのコンパイル時間の短縮化を図るコンパイル方法、コンパイル装置およびコンパイルプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、前記複数のマージ可能メソッドのマージ処理を行うコンパイル方法、コンパイル装置およびコンパイルプログラムが提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、ソースプログラムのコンパイル時間の短縮化を図ることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるコンパイル方法の一実施例を示す説明図である。
【図２】図２は、コンパイル装置１００のハードウェア構成例を示すブロック図である。
【図３】図３は、ソースプログラムｓｃの具体例を示す説明図である。
【図４】図４は、中間言語Ｉコードの具体例を示す説明図である。
【図５】図５は、コンパイル装置１００の機能的構成例を示すブロック図である。
【図６】図６は、重複メソッド候補のメソッド間のデータの比較例を示す説明図（その１）である。
【図７】図７は、重複メソッド候補のメソッド間のデータの比較例を示す説明図（その２）である。
【図８】図８は、重複メソッド候補のメソッド間のデータの比較例を示す説明図（その３）である。
【図９】図９は、重複メソッド候補のメソッド間のデータの比較例を示す説明図（その４）である。
【図１０】図１０は、ＳｅｔＣｏｌｏｒメソッドのマージ処理を示す説明図である。
【図１１】図１１は、ＳｅｔＣｏｌｏｒメソッドをマージしたメソッド本体の中間言語Ｉコードの一例を示す説明図である。
【図１２】図１２は、重複メソッド候補をマージしないソースプログラム例を示す説明図である。
【図１３】図１３は、コンパイル装置１００のコンパイル処理手順の一例を示すフローチャートである。
【図１４】図１４は、重複メソッド候補抽出処理の具体的処理手順の一例を示すフローチャートである。
【図１５】図１５は、対応関係情報生成処理の具体的処理手順の一例を示すフローチャートである。
【図１６】図１６は、マージ処理の具体的処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、本発明にかかるコンパイル方法、コンパイル装置およびコンパイルプログラムの実施の形態を詳細に説明する。
【００１１】
（コンパイル方法の一実施例）
図１は、実施の形態にかかるコンパイル方法の一実施例を示す説明図である。図１において、コンパイル装置１００は、ソースプログラムｓｃをコンパイルするコンピュータである。ソースプログラムｓｃは、オブジェクト指向言語でコーディングされたソースコードを含む。オブジェクト指向言語としては、例えば、Ｊａｖａ、Ｃ＋＋などがある。
【００１２】
コンパイラのコンパイル処理は、大きく分けると、構文・意味解析区、最適化区およびコード生成区に区分けされる。構文・意味解析区では、ソースプログラムｓｃを入力として、ソースプログラムｓｃの構文解析および意味解析が行われ、構文・意味解析区内のインターフェースである中間言語Ｉコードが生成される。
【００１３】
中間言語Ｉコードには、ソースプログラムｓｃ内のメソッド（関数）が表現される。メソッドとは、ある処理を実現するための命令のかたまりである。また、構文・意味解析区では、中間言語Ｉコードを入力として、コンパイラ内のインターフェースである中間言語ＩＩコードが生成される。
【００１４】
最適化区では、中間言語ＩＩコードを入力として、中間言語ＩＩコードの最適化処理が行われる。最適化処理では、例えば、中間言語ＩＩコードから不要と見なされるメソッドが削除される。不要と見なされるメソッドとしては、例えば、翻訳単位に限定した静的メソッドで使用されていないメソッドが挙げられる。
【００１５】
コード生成区では、中間言語ＩＩコードを入力として、オブジェクトファイルｆが生成される。オブジェクトファイルｆは、機械語により命令とデータが表現されたオブジェクトコードを含むファイルである。オブジェクトファイルｆは、例えば、リンカと呼ばれるプログラムに渡され、最終的に実行プログラムが生成される。
【００１６】
ここで、オブジェクト指向言語は、ＦｏｒｔｒａｎやＣ言語などに比べて、高い生産性や再利用性を得ることができるプログラミング言語である。一方で、オブジェクト指向言語では、オブジェクト指向言語の言語的特徴であるカプセル化、オーバーライド、オーバーロードの概念から、データ型ごとにデータの操作や処理ロジックをまとめたメソッドが多く作成される。
【００１７】
さらに、オブジェクト指向言語のテンプレート関数では、テンプレート引数の型や値によって、処理ロジックが同じメソッドがコンパイラによって複数作成される。カプセル化とは、データとデータを操作する手続き（メソッド）を一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽することである。クラス内のメソッドは、カプセル化の概念で記述されたものであるといえる。クラスとは、オブジェクトの雛型を定義したものであり、オブジェクトがどのようなフィールド（変数）／メソッドを持っているかを記述したものである。
【００１８】
また、オーバーライドとは、基底クラス（スーパークラス）から継承された派生クラス（サブクラス）において、基底クラスで定義されたメソッドを再定義することである。また、オーバーロードとは、引数の型、数、並び順などが異なる同一名のメソッドや演算子を多重定義することである。
【００１９】
ソースプログラムｓｃに含まれるメソッドが多くなると、ソースプログラムｓｃのコンパイル時間の増加を招くとともに、生成されるオブジェクトファイルｆのデータサイズの増加を招いてしまう。すなわち、オブジェクト指向言語では、生産性・再利用性の高さと引き替えに、ソースプログラムｓｃのコンパイル時間の増加や、オブジェクトファイルｆのデータサイズの増加が問題となる。
【００２０】
ソースプログラムｓｃのコンパイル時間を短縮し、オブジェクトファイルｆのデータサイズを小さくするためには、メソッドの絶対数を減らすことが効果的である。従来のコンパイラでは、最適化区の最適化処理において、不要と見なされるメソッドを削除することが行われている。
【００２１】
ところが、従来のコンパイラでは、ソースプログラムｓｃ内のメソッドが不要と見なされない限り、全てのメソッドがコンパイル対象としてオブジェクトファイルｆに翻訳されてしまう。上述したように、オブジェクト指向言語では大量のメソッドが作成されるため、不要と見なされるメソッドの削除だけではメソッドの絶対数は大して変わらず、コンパイル時間の削減はあまり望めない。
【００２２】
ここで、データや処理ロジックについて同一性を有する、すなわち、実行面で冗長性を有する複数のメソッドを一つのメソッドにマージすることで、メソッドの絶対数を減らすことができる。例えば、オーバーライドやオーバーロードされるメソッド同士は、実行面で冗長性を有する可能性が高く、マージ対象となるメソッドとなり得る。
【００２３】
このため、最適化区の最適化処理において、不要と見なされるメソッドを削除するとともに、オブジェクト指向言語の言語的特徴から実行面で冗長性を有する複数のメソッドを判断して一つのメソッドにマージすることが考えられる。ところが、最適化区では、基本的にＦｏｒｔｒａｎ、Ｃ言語、Ｃ＋＋などの言語に依存しない言語無依存な処理が行われる。このため、最適化区では、オブジェクト指向言語固有の情報が乏しく、オブジェクト指向言語特有の最適化処理を行うことは難しい。
【００２４】
すなわち、最適化区では、オブジェクト指向言語固有の情報が乏しいために、大量のメソッドの中から、どのメソッドがオブジェクト指向言語の言語的特徴を持った実行面で冗長性のあるメソッドであるかを判断することが難しい。従って、最適化区の最適化処理において、複数のメソッドをマージしようとしても、現実的な有限時間内に効果的なメソッド数の削減を行うことはできない。
【００２５】
また、オブジェクト指向言語では、実行時のコードの冗長性は必ずしもソースプログラムｓｃに表れず、例えば、コンパイラによって実行面で冗長となるコードが生成される場合がある。さらに、カプセル化やオーバーライド、オーバーロードの判定は、ソースプログラムｓｃの字面だけでは判定することができず、構文・意味解析を行わなければ正確に判定することはできない。
【００２６】
また、ソースプログラムｓｃのコンパイル時間の多くは最適化区での最適化処理にかかっており、最適化区の入力時点でメソッド数が少なくなっていなければ、コンパイル時間の短縮は見込めない。これらのことから、コンパイル時間の短縮とオブジェクトファイルｆのデータサイズの削減のためには、最適化区での最適化処理とともに、オブジェクト指向言語の言語的特徴を判断できる構文・意味解析区でのソースプログラムレベル（よりソースプログラムｓｃに近い）での最適化が必要になっている。
【００２７】
そこで、本実施の形態では、オブジェクト指向言語の言語的特徴を判断できる構文・意味解析区において、オブジェクト指向言語の言語的特徴から、実行面で冗長性を有する複数のメソッドを判断して一つのメソッドにマージすることで、メソッドの絶対数を減らすコンパイル方法について説明する。以下、コンパイル装置１００のコンパイル処理例について説明する。
【００２８】
（１）コンパイル装置１００は、構文・意味解析区において、ソースプログラムｓｃの構文解析および意味解析を行う。ここで、構文解析とは、ソースプログラムｓｃに記述された文（ステートメント）や構造が言語仕様に沿っているか否かをチェックすることである。意味解析は、ソースプログラムｓｃに記述された変数の型や文が意味的に正しいか否かをチェックすることである。
【００２９】
ソースプログラムｓｃの構文解析および意味解析を行うことにより、構文・意味解析区内のインターフェースである中間言語Ｉコードを得ることができる。中間言語Ｉコードには、ソースプログラムｓｃ内のメソッドが表現されている。また、中間言語Ｉコードには、オブジェクト指向言語の特徴を持ったメソッドについて、オブジェクト指向言語の特徴を表す情報（図１中、（オ））が存在する。
【００３０】
（２）コンパイル装置１００は、構文・意味解析区において、ソースプログラムｓｃの構文解析および意味解析により得られる中間言語Ｉコード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出する。ここで、複数のマージ候補メソッドとは、実行面での冗長性を有する可能性がある複数のメソッドである。
【００３１】
以下の説明では、複数のマージ候補メソッドをまとめて「重複メソッド候補」と表記する場合がある。重複メソッド候補としては、例えば、オーバーライドされたメソッドやオーバーロードされたメソッドがある。
【００３２】
具体的には、例えば、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコードを参照して、親子関係を有するクラス間で同一名の複数のメソッドを重複メソッド候補として抽出する。これにより、オーバーライドされたメソッドを重複メソッド候補として抽出することができる。
【００３３】
（３）コンパイル装置１００は、構文・意味解析区において、抽出した重複メソッド候補それぞれの中間言語Ｉコードにより特定される処理ロジックに基づいて、重複メソッド候補のメソッド間の対応関係情報１１０を生成する。ここで、対応関係情報１１０は、重複メソッド候補のメソッド間の実行面での冗長性の有無を判断するための情報である。
【００３４】
具体的には、例えば、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコードから、重複メソッド候補それぞれに対応する中間言語Ｉコードを抽出する。つぎに、コンパイル装置１００は、抽出した中間言語Ｉコード中の宣言・文・式それぞれのデータごとに、メソッド間のデータを比較する。
【００３５】
そして、コンパイル装置１００は、データごとの比較結果に基づいて、重複メソッド候補それぞれに対応する中間言語Ｉコードのうち、メソッド間で意味的に同一である部分と、メソッド間で意味的に異なる部分（各メソッド固有の部分）を識別する情報を対応関係情報１１０として生成する。
【００３６】
（４）コンパイル装置１００は、構文・意味解析区において、生成した対応関係情報１１０に基づいて、重複メソッド候補のメソッド間で実行面での冗長性を有するか否かを判定する。具体的には、例えば、コンパイル装置１００は、宣言・文・式それぞれのデータのうち少なくともいずれかのデータが意味的に同一である場合に、重複メソッド候補のメソッド間で実行面での冗長性を有すると判定してもよい。メソッド間で実行面での冗長性を有する重複メソッド候補は、マージ可能な複数のマージ可能メソッドである。
【００３７】
（５）コンパイル装置１００は、構文・意味解析区において、重複メソッド候補のメソッド間で実行面での冗長性を有すると判定した場合に、対応関係情報１１０に基づいて、重複メソッド候補のマージ処理を行う。すなわち、コンパイル装置１００は、重複メソッド候補からマージ可能な複数のマージ可能メソッドを抽出して、複数のマージ可能メソッドのマージ処理を行う。ここで、マージ処理とは、重複メソッド候補である複数のメソッドを、重複メソッド候補のいずれの呼び出し元からも呼び出せる一つのメソッドとしてまとめることである。
【００３８】
例えば、メソッド間で冗長性を有するメソッドとして、メソッドＡ、メソッドＢおよびメソッドＣの３つのメソッドがあったとする。これら３つのメソッドを、例えば、メソッドＡＢＣとして１つにマージすることにより、メソッドの数を１／３にすることができる。なお、共通化できないメソッド固有の部分については、メソッド固有の情報を、マージしたメソッドに引数などで渡すことにより、メソッド固有の処理を切り分けられるようにする。
【００３９】
具体的には、例えば、コンパイル装置１００は、重複メソッド候補のメソッド間で共通する処理の中間言語Ｉコードを生成するとともに、重複メソッド候補の各メソッドで固有の処理の中間言語Ｉコードを生成する。そして、コンパイル装置１００は、生成した中間言語Ｉコードをマージすることにより、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成する。
【００４０】
（６）コンパイル装置１００は、構文・意味解析区において、マージしたメソッド本体の中間言語Ｉコードに基づいて、コンパイラ内のインターフェースである中間言語ＩＩコードを生成する。具体的には、例えば、コンパイル装置１００は、中間言語Ｉコードで表現したメソッド（マージしたメソッド本体、マージしていないメソッド）を中間言語ＩＩコードの形式に変換する。生成された中間言語ＩＩコードは最適化区に入力される。
【００４１】
図１中、最適化区に入力される中間言語ＩＩコード内の点線枠は、マージされたために削除されたメソッドを示している。図１の例では、ソースプログラムｓｃの中間言語Ｉコードの段階では１２個存在していたメソッドが、中間言語ＩＩコードの段階では５個となっており、最適化区への入力時点でメソッドの絶対数が大幅に削減されている。
【００４２】
（７）コンパイル装置１００は、最適化区において、ソースプログラムｓｃの中間言語ＩＩコードの最適化処理を行う。最適化処理では、例えば、中間言語ＩＩコードから不要と見なされるメソッドが削除される。図１の例では、中間言語ＩＩコードから、不要と見なされた１個のメソッドが削除されている。最適化処理が行われた中間言語ＩＩコードはコード生成区に入力される。
【００４３】
（８）コンパイル装置１００は、コード生成区において、最適化処理が行われた中間言語ＩＩコードに基づいて、オブジェクトファイルｆを生成する。生成されたオブジェクトファイルｆは、例えば、リンカに渡されて、最終的に実行プログラムが生成される。
【００４４】
このように、実施の形態にかかるコンパイル装置１００によれば、構文・意味解析区において、オブジェクト指向言語特有の性質にマッチした効果的な最適化を行ってメソッドの絶対数を削減することができる。これにより、最適化区の入力時点でメソッドの絶対数を削減可能となるため、最適化処理にかかる処理時間が少なくなり、結果的に、ソースプログラムｓｃのコンパイル時間を短縮することができる。また、メソッドの絶対数を削減することにより、オブジェクトファイルｆのデータサイズを縮小することができる。
【００４５】
（コンパイル装置１００のハードウェア構成例）
図２は、コンパイル装置１００のハードウェア構成例を示すブロック図である。図２において、コンパイル装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、メモリ２０２と、ディスクドライブ２０３と、ディスク２０４と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０５と、ディスプレイ２０６と、キーボード２０７と、マウス２０８と、を有する。また、各構成部はバス２００によってそれぞれ接続される。
【００４６】
ここで、ＣＰＵ２０１は、コンパイル装置１００の全体の制御を司る。メモリ２０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラム（例えば、コンパイルプログラム）を記憶し、ＲＡＭがＣＰＵ２０１のワークエリアとして使用される。メモリ２０２に記憶されるプログラムは、ＣＰＵ２０１にロードされることで、コーディングされている処理をＣＰＵ２０１に実行させる。
【００４７】
ディスクドライブ２０３は、ＣＰＵ２０１の制御に従ってディスク２０４に対するデータのリード／ライトを制御する。ディスク２０４は、ディスクドライブ２０３の制御で書き込まれたデータを記憶する。ディスク２０４としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００４８】
Ｉ／Ｆ２０５は、通信回線を通じてネットワーク２１０に接続され、ネットワーク２１０を介して他のコンピュータに接続される。そして、Ｉ／Ｆ２０５は、ネットワーク２１０と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。Ｉ／Ｆ２０５には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００４９】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０６は、例えば、ＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）、ＴＦＴ（Ｔｈｉｎ  Ｆｉｌｍ  Ｔｒａｎｓｉｓｔｏｒ）液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００５０】
キーボード２０７は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。キーボード２０７は、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２０８は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。
【００５１】
（ソースプログラムｓｃの具体例）
図３は、ソースプログラムｓｃの具体例を示す説明図である。図３において、ソースプログラム３００は、オブジェクト指向言語でコーディングされたオブジェクト指向特有のプログラム例である。
【００５２】
ソースプログラム３００では、３行目の基底クラスＣＯＬＯＲにおいて、色（カラー）の基本データと処理ロジックを定義している。１０行目には、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドが定義されている。また、２２行目の派生クラスＲＥＤは、基底クラスＣＯＬＯＲを継承したクラスである。２４行目には、ＲＥＤクラスのメソッドとして、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドをオーバーライドして定義している。
【００５３】
（中間言語Ｉコードの具体例）
図４は、中間言語Ｉコードの具体例を示す説明図である。図４において、中間言語Ｉコード４１０，４２０は、ソースプログラム３００（図３）の構文解析および意味解析により得られる中間言語Ｉコードを模式的に示したものである。
【００５４】
具体的には、中間言語Ｉコード４１０は、ソースプログラム３００内の１０行目に定義されたＳｅｔＣｏｌｏｒメソッドを表現する中間言語Ｉコードである。また、中間言語Ｉコード４２０は、ソースプログラム３００内の２４行目に定義されたＳｅｔＣｏｌｏｒメソッドを表現する中間言語Ｉコードである。
【００５５】
ここで、中間言語Ｉコード４１０は、データ４１１〜４１４を含む。データ４１１は、ソースプログラム３００に記述された基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドの宣言情報の構文、意味を表現したものである。データ４１２〜４１４は、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドの文情報の構文、意味を表現したものであり、データ４１５〜４１７をそれぞれ含む。データ４１５〜４１７は、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドの式情報の構文、意味をそれぞれ表現したものである。
【００５６】
また、中間言語Ｉコード４２０は、データ４２１〜４２４を含む。データ４２１は、ソースプログラム３００に記述された派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドの宣言情報の構文、意味を表現したものである。データ４２２〜４２４は、派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドの文情報の構文、意味を表現したものであり、データ４２５〜４２７をそれぞれ含む。データ４２５〜４２７は、派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドの式情報の構文、意味をそれぞれ表現したものである。
【００５７】
このＳｅｔＣｏｌｏｒメソッドは、オブジェクト指向言語のオーバーライド（再定義）が使われており、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドを、派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドがオーバーライドしている。このため、２つのＳｅｔＣｏｌｏｒメソッドは、メソッド間で実行面での冗長性を有する可能性があるメソッドといえる。
【００５８】
（コンパイル装置１００の機能的構成例）
図５は、コンパイル装置１００の機能的構成例を示すブロック図である。図５において、コンパイル装置１００は、取得部５０１と、解析部５０２と、抽出部５０３と、生成部５０４と、判定部５０５と、マージ処理部５０６と、最適化部５０７と、コード生成部５０８と、出力部５０９と、を含む構成である。取得部５０１〜出力部５０９は制御部となる機能であり、具体的には、例えば、図２に示したメモリ２０２、ディスク２０４などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０５により、その機能を実現する。各機能部の処理結果は、例えば、メモリ２０２、ディスク２０４などの記憶装置に記憶される。
【００５９】
取得部５０１は、ソースプログラムｓｃを取得する。ソースプログラムｓｃは、ＪａｖａやＣ＋＋などのオブジェクト指向言語でコーディングされたソースコードを含むものであり、例えば、ＦｏｒｔｒａｎやＣ言語などでコーディングされたソースコードが含まれていてもよい。
【００６０】
具体的には、例えば、取得部５０１は、キーボード２０７やマウス２０８を用いたユーザの操作入力により、ソースプログラムｓｃ（例えば、ソースプログラム３００）を取得する。また、例えば、取得部５０１は、Ｉ／Ｆ２０５により、外部のコンピュータからソースプログラムｓｃを取得することにしてもよい。
【００６１】
解析部５０２は、ソースプログラムｓｃの構文解析および意味解析を行う。具体的には、例えば、まず、解析部５０２は、ソースプログラムｓｃの字句解析を行う。字句解析とは、ソースプログラムｓｃを構成する文字の並びを、例えば、キーワード、変数、演算子などのトークンの並びに変換することである。
【００６２】
そして、解析部５０２は、字句解析により得られるトークンの並びについて、トークン間の関係を解析することにより、ソースプログラムｓｃの構文解析および意味解析を行う。これにより、例えば、図４に示したような、構文・意味解析区内のインターフェースである中間言語Ｉコードを得ることができる。
【００６３】
なお、中間言語Ｉコードでは、例えば、基底クラスと派生クラスは木構造のように表現されており、クラス間の親子関係を特定できる構造となっている。また、各クラスと各クラスに属するメソッドも木構造のように表現されており、どのクラスにどのメソッドが属しているかを特定できる構造となっている。
【００６４】
抽出部５０３は、ソースプログラムｓｃの構文解析および意味解析により得られる中間言語Ｉコード中の複数のメソッドから重複メソッド候補を抽出する。ここで、重複メソッド候補は、上述したように、メソッド間で実行面での冗長性を有する候補となる複数のマージ候補メソッドであり、例えば、オーバーライドやオーバーロードされたメソッドである。
【００６５】
具体的には、例えば、抽出部５０３は、生成された中間言語Ｉコードを参照して、親子関係を有するクラス間で同一名のメソッドの組合せを重複メソッド候補として抽出する。これにより、オーバーライドされたメソッドを重複メソッド候補として抽出することができる。
【００６６】
図３に示したソースプログラム３００を例に挙げると、基底クラスＣＯＬＯＲと派生クラスＲＥＤとが親子関係を有するクラスである。このため、抽出部５０３は、ソースプログラム３００の中間言語Ｉコード（図４に示した中間言語Ｉコード４１０，４２０を含む中間言語Ｉコード）を参照して、基底クラスＣＯＬＯＲと派生クラスＲＥＤとの間でメソッド名が同一のＳｅｔＣｏｌｏｒメソッドを重複メソッド候補として抽出する。
【００６７】
また、抽出部５０３は、例えば、生成された中間言語Ｉコードを参照して、同一クラス内のメソッド、あるいは、いずれのクラスにも属していないメソッドのうち、同一名のメソッドの組合せを重複メソッド候補として抽出することにしてもよい。これにより、オーバーロードされたメソッドを重複メソッド候補として抽出することができる。
【００６８】
また、抽出部５０３は、例えば、生成された中間言語Ｉコードを参照して、同一クラス内の演算子、あるいは、いずれのクラスにも属していない演算子のうち、同一名の演算子の組合せを重複メソッド候補として抽出することにしてもよい。これにより、オーバーロードされた演算子（多重定義演算子）を重複メソッド候補として抽出することができる。
【００６９】
なお、オーバーロードされた演算子（多重定義演算子）は、名称（メソッド名）が同一で、かつ、引数の型、数、並び順の少なくともいずれかが異なる演算子である。
【００７０】
生成部５０４は、抽出された重複メソッド候補それぞれの中間言語Ｉコードにより特定される処理ロジックに基づいて、重複メソッド候補のメソッド間の対応関係情報１１０を生成する。具体的には、例えば、生成部５０４は、ソースプログラムｓｃの中間言語Ｉコードから、重複メソッド候補それぞれに対応する中間言語Ｉコードを抽出する。
【００７１】
つぎに、生成部５０４は、抽出した中間言語Ｉコード中の宣言・文・式それぞれのデータごとに、メソッド間のデータを比較する。中間言語Ｉコードは、ソースプログラムｓｃに記述された順に従って宣言・文・式の構造が形成されている。このため、生成部５０４は、中間言語Ｉコードの構造に従って、メソッド間のデータを順次比較する。
【００７２】
なお、中間言語Ｉ中の式のデータは、文のデータに含まれる。このため、式のデータを含む文のデータ同士を比較する際は、文のデータに含まれる式のデータ同士を比較することになり、式のデータが異なると、文のデータも異なることになる。
【００７３】
そして、生成部５０４は、データごとの比較結果に基づいて、抽出した中間言語Ｉコードのうち、メソッド間で意味的に同一である部分と、メソッド間で意味的に異なる部分（各メソッド固有の部分）を識別する情報を対応関係情報１１０として生成する。なお、メソッド間のデータの比較例および対応関係情報１１０の生成例については、図６〜図９を用いて後述する。
【００７４】
判定部５０５は、生成された対応関係情報１１０に基づいて、重複メソッド候補のメソッド間で実行面での冗長性を有するか否かを判定する。具体的には、例えば、判定部５０５は、中間言語Ｉコード中の宣言・文・式それぞれのデータのうち少なくともいずれかのデータが意味的に同一である場合に、重複メソッド候補のメソッド間で実行面での冗長性を有すると判定してもよい。
【００７５】
また、例えば、判定部５０５は、中間言語Ｉコード中の宣言・文・式それぞれのデータのうちの所定数Ｘ以上のデータが意味的に同一である場合に、重複メソッド候補のメソッド間で実行面での冗長性を有すると判定してもよい。ここで、所定数Ｘは、例えば、予め任意に設定されてメモリ２０２やディスク２０４などの記憶装置に記憶されていてもよい。
【００７６】
また、所定数Ｘとして、重複メソッド候補のいずれかのメソッドに対応する中間言語Ｉコード中の宣言・文・式の全データ数に比率ｒを乗算した値を設定することにしてもよい。比率ｒは、１以下の値である。比率ｒを大きくすればするほど、メソッド間の実行面での冗長性を判定する際の判定基準を厳しくすることができる。
【００７７】
マージ処理部５０６は、対応関係情報１１０に基づいて、メソッド間で実行面での冗長性を有すると判定された重複メソッド候補のマージ処理を行う。具体的には、例えば、マージ処理部５０６は、対応関係情報１１０に基づいて、メソッド間で実行面での冗長性を有する重複メソッド候補の各メソッドの中間言語Ｉコードを走査しながら、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成する。
【００７８】
より具体的には、例えば、マージ処理部５０６は、対応関係情報１１０に基づいて、重複メソッド候補のメソッド間で共通する処理の中間言語Ｉコードを生成する。メソッド間で共通する処理は、例えば、メソッド間で意味的に同一である部分のデータから特定される。
【００７９】
また、マージ処理部５０６は、対応関係情報１１０に基づいて、重複メソッド候補の各メソッドで固有の処理の中間言語Ｉコードを生成する。各メソッドで固有の処理は、例えば、メソッド間で意味的に異なる部分のデータから特定される。そして、マージ処理部５０６は、生成した中間言語Ｉコードをマージすることにより、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成する。
【００８０】
なお、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードは、呼び出し元が呼び出すメソッドを特定するために、マージ元の各メソッドが属するクラスを特定できるようになっている。重複メソッド候補のマージ処理例については、図１０および図１１を用いて後述する。
【００８１】
また、マージ処理部５０６は、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードに基づいて、コンパイラ（コンパイルプログラム）内のインターフェースであるソースプログラムｓｃの中間言語ＩＩコードを生成する。具体的には、例えば、マージ処理部５０６は、中間言語Ｉコードで表現したメソッド（マージしたメソッド本体、マージしていないメソッド）を中間言語ＩＩコードの形式に変換する。
【００８２】
これにより、ソースプログラムｓｃの中間言語Ｉコード中の複数のメソッドのうちのマージされたメソッドの数分だけ絶対数が削減された中間言語ＩＩコードを生成することができる。なお、中間言語ＩＩコードでは、マージされた各メソッドの呼び出し元からマージしたメソッド本体を参照できる構造となっている。
【００８３】
最適化部５０７は、生成されたソースプログラムｓｃの中間言語ＩＩコードの最適化処理を行う。具体的には、例えば、最適化部５０７は、ソースプログラムの中間言語ＩＩコードから、どこからも呼び出しがないメソッドを不要なメソッドと見なして削除する。これにより、中間言語ＩＩコード中の複数のメソッドのうち使用されないメソッドを削除してメソッドの絶対数を削減することができる。
【００８４】
コード生成部５０８は、最適化処理されたソースプログラムｓｃの中間言語ＩＩコードに基づいて、ソースプログラムｓｃのオブジェクトファイルｆを生成する。具体的には、例えば、コード生成部５０８は、最適化処理された中間言語ＩＩコードを機械語の命令の列に変換することにより、ソースプログラムｓｃのオブジェクトファイルｆを生成する。
【００８５】
出力部５０９は、生成されたソースプログラムｓｃのオブジェクトファイルｆを出力する。具体的には、例えば、出力部５０９は、ソースプログラムｓｃのオブジェクトファイルｆを、リンカと呼ばれるプログラムに出力する。ここで、リンカとは、オブジェクトファイルｆを解析して、必要なライブラリなどを付け加えて実行ファイルを生成するプログラムである。これにより、ソースプログラムｓｃの実行ファイルを得ることができる。
【００８６】
なお、上述した説明では、重複メソッド候補としてメソッド名が同一のメソッドの組合せを抽出する場合を例に挙げて説明したが、メソッド名が異なっていてもメソッド間で実行面での冗長性を有する場合がある。しかし、メソッド名が異なる全てのメソッドの組合せについて実行面の冗長性を判断するのは処理時間の増大化を招いてしまう。
【００８７】
例えば、クラス間で親子関係があるメソッド同士は、それ以外のメソッド同士に比べて、メソッド間で処理ロジックが共通する部分が多い傾向にある。このため、メソッド名が異なるメソッド間の実行面での冗長性も判断する場合には、抽出部５０３は、親子関係を有するクラス間のメソッドの組合せを重複メソッド候補として抽出することにしてもよい。
【００８８】
（メソッド間のデータの比較例）
つぎに、図４に示した中間言語Ｉコード４１０，４２０を例に挙げて、重複メソッド候補のメソッド間のデータの比較例について説明する。
【００８９】
図６〜図９は、重複メソッド候補のメソッド間のデータの比較例を示す説明図である。図６において、まず、生成部５０４は、中間言語Ｉコード４１０から、Ｐａｒａｍｅｔｅｒ（宣言）のデータ４１１を選択する。つぎに、生成部５０４は、中間言語Ｉコード４２０から、データ４１１と同一種のＰａｒａｍｅｔｅｒのデータ４２１を選択する。
【００９０】
そして、生成部５０４は、選択したＰａｒａｍｅｔｅｒのデータ４１１，４２１同士を比較する。ここでは、データ４１１，４２１の間で、引数（仮引数）の型、数、並び順のいずれも異なる。このため、生成部５０４は、データ４１１，４２１が意味的に異なると判断して、メソッド間で意味的に異なる部分を識別する情報を対応関係情報１１０として生成する。図６の例では、メソッド間で意味的に異なる部分を識別する情報を、チェック記号を付与することで表現している。すなわち、中間言語Ｉコード中に付与されるチェック記号が対応関係情報１１０に相当する。
【００９１】
図７において、まず、生成部５０４は、中間言語Ｉコード４１０から、Ｓｔａｔｅｍｅｎｔ（文）のデータ４１２を選択する。つぎに、生成部５０４は、中間言語Ｉコード４２０から、データ４１２と同一種のＳｔａｔｅｍｅｎｔのデータ４２２を選択する。そして、生成部５０４は、選択したＳｔａｔｅｍｅｎｔのデータ４１２，４２２にそれぞれ含まれるＯｐｅｒａｔｏｒ（式）のデータ４１５，４２５同士を比較する。
【００９２】
ここでは、データ４１５，４２５がそれぞれ表す式が同一である。このため、生成部５０４は、データ４１２，４２２が意味的に同一であると判断して、メソッド間で意味的に同一である部分を識別する情報を対応関係情報１１０として生成する。図７の例では、メソッド間で意味的に同一である部分を識別する情報を、チェック記号を付与しないことで表現している。
【００９３】
図８において、まず、生成部５０４は、中間言語Ｉコード４１０から、Ｓｔａｔｅｍｅｎｔのデータ４１３を選択する。つぎに、生成部５０４は、中間言語Ｉコード４２０から、データ４１３と同一種のＳｔａｔｅｍｅｎｔのデータ４２３を選択する。そして、生成部５０４は、選択したＳｔａｔｅｍｅｎｔのデータ４１３，４２３にそれぞれ含まれるＯｐｅｒａｔｏｒのデータ４１６，４２６同士を比較する。
【００９４】
ここでは、データ４１６，４２６がそれぞれ表す式の一部が異なっている。このため、生成部５０４は、データ４１３，４２３が意味的に異なると判断して、メソッド間で意味的に異なる部分を識別する情報を対応関係情報１１０として生成する。図８の例では、メソッド間で意味的に異なる部分を識別する情報を、チェック記号を付与することで表現している。
【００９５】
図９において、まず、生成部５０４は、中間言語Ｉコード４１０から、Ｓｔａｔｅｍｅｎｔのデータ４１４を選択する。つぎに、生成部５０４は、中間言語Ｉコード４２０から、データ４１４と同一種のＳｔａｔｅｍｅｎｔのデータ４２４を選択する。そして、生成部５０４は、選択したＳｔａｔｅｍｅｎｔのデータ４１４，４２４にそれぞれ含まれるＯｐｅｒａｔｏｒのデータ４１７，４２７同士を比較する。
【００９６】
ここでは、データ４１７，４２７がそれぞれ表す式が同一である。このため、生成部５０４は、データ４１４，４２４が意味的に同一であると判断して、メソッド間で意味的に同一である部分を識別する情報を対応関係情報１１０として生成する。図９の例では、メソッド間で意味的に同一である部分を識別する情報を、チェック記号を付与しないことで表現している。
【００９７】
（重複メソッド候補のマージ処理例）
つぎに、ソースプログラム３００内の基底クラスＣＯＬＯＲと派生クラスＲＥＤとの間でメソッド名が同一のＳｅｔＣｏｌｏｒメソッドを重複メソッド候補として、重複メソッド候補のマージ処理例について説明する。まず、ソースプログラム３００を用いて、ＳｅｔＣｏｌｏｒメソッドのマージ処理のイメージについて説明する。
【００９８】
図１０は、ＳｅｔＣｏｌｏｒメソッドのマージ処理を示す説明図である。図１０において、ソースプログラム３００内の１０行目から１４行目のコード１００１は、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドに関する記述である。また、ソースプログラム３００内の２４行目から２９行目のコード１００２は、派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドに関する記述である。
【００９９】
マージ処理部５０６は、コード１００１に対応する中間言語Ｉコードとコード１００２に対応する中間言語Ｉコードとをマージして、イメージ１０１０で示すような中間言語Ｉコードを生成することになる。ここで、コード１００１とコード１００２とを比較すると、１０行目と２４行目の引数、および１２行目と２６行目の式が、それぞれのＳｅｔＣｏｌｏｒメソッドで固有のものとなっている。
【０１００】
このため、マージ処理部５０６は、イメージ１０１０内のコード１０１１〜１０１５のように、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッド間で共通する処理の中間言語Ｉコードと、各ＳｅｔＣｏｌｏｒメソッドで固有の処理の中間言語Ｉコードを生成する。
【０１０１】
コード１０１１は、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのいずれのＳｅｔＣｏｌｏｒメソッドに応じた処理を行うのかを選択するためのものであり、呼び出し元から第１引数として与えられる情報が定義される。コード１０１２は、ＳｅｔＣｏｌｏｒメソッドの引数を表す。
【０１０２】
コード１０１３，１０１５は、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッド間で共通する処理の中間言語Ｉコードに対応する。一方、コード１０１４は、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤの各ＳｅｔＣｏｌｏｒメソッドで固有の処理の中間言語Ｉコードに対応する。コード１０１４には、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのいずれのＳｅｔＣｏｌｏｒメソッドであるかを判定する判定文（ｉｆ）が含まれている。
【０１０３】
また、ソースプログラム３００内の３６行目は、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドを呼び出すための記述である。また、ソースプログラム３００内の３７行目は、派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドを呼び出すための記述である。このため、マージ処理部５０６は、基底クラスＣＯＬＯＲまたは派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドを呼び出すために、イメージ１０２０のような中間言語Ｉコードを合わせて生成する。
【０１０４】
ここで、イメージ１０１０に対応する中間言語Ｉコードについて説明する。
【０１０５】
図１１は、ＳｅｔＣｏｌｏｒメソッドをマージしたメソッド本体の中間言語Ｉコードの一例を示す説明図である。図１１において、中間言語Ｉコード１１００は、基底クラスＣＯＬＯＲのＳｅｔＣｏｌｏｒメソッドと派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッドとをマージしたメソッド本体の中間言語Ｉコードを模式的に示したものであり、図１０に示したイメージ１０１０に対応する。
【０１０６】
中間言語Ｉコード１１００において、データ１１０１は、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのいずれのＳｅｔＣｏｌｏｒメソッドに応じた処理を行うのかを選択するための中間言語Ｉコードである。データ１１０１は、図１０に示したイメージ１０１０内のコード１０１１に対応する。
【０１０７】
データ１１０２は、ＳｅｔＣｏｌｏｒメソッドの引数を表す中間言語Ｉコードである。データ１１０２は、イメージ１０１０内のコード１０１２に対応する。データ１１０３は、基底クラスＣＯＬＯＲおよび派生クラスＲＥＤのＳｅｔＣｏｌｏｒメソッド間で共通する処理の中間言語Ｉコードである。データ１１０３は、イメージ１０１０内のコード１０１３に対応する。
【０１０８】
データ１１０４は、各ＳｅｔＣｏｌｏｒメソッドで固有の処理の中間言語Ｉコードである。データ１１０４は、イメージ１０１０内のコード１０１４に対応する。データ１１０５は、ＳｅｔＣｏｌｏｒメソッド間で共通する処理の中間言語Ｉコードである。データ１１０５は、イメージ１０１０内のコード１０１５に対応する。
【０１０９】
（重複メソッド候補をマージしないソースプログラム例）
つぎに、重複メソッド候補をマージしない場合のソースプログラムｓｃについて説明する。ここでは、オーバーロードされたメソッドを重複メソッド候補として抽出する場合を例に挙げて説明する。
【０１１０】
図１２は、重複メソッド候補をマージしないソースプログラム例を示す説明図である。図１２において、ソースプログラム１２００は、オブジェクト指向言語でコーディングされたオブジェクト指向特有のプログラム例である。
【０１１１】
ソースプログラム１２００の４行目には、ｐｒｉｎｔメソッドが定義されている。また、ソースプログラム１２００の９行目には、４行目のｐｒｉｎｔメソッドと同一名のｐｒｉｎｔメソッドが定義されている。すなわち、ｐｒｉｎｔメソッドがオーバーロードされている。
【０１１２】
ソースプログラム１２００内の４行目から６行目のコード１２０１は、４行目のｐｒｉｎｔメソッドに関する記述である。また、ソースプログラム１２００内の９行目から２２行目のコード１２０２は、９行目のｐｒｉｎｔメソッドに関する記述である。ここで、コード１２０１とコード１２０２とを比較すると、メソッド名以外で、メソッド間で意味的に同一である部分は存在しない。
【０１１３】
このように、メソッド間で意味的に同一である部分が少なく、メソッド間で実行面での冗長性が低い場合には、ｐｒｉｎｔメソッドをマージしてメソッドの絶対数を削減しても、ソースプログラムｓｃのコンパイル時間の短縮は見込めない。このため、コンパイル装置１００は、ソースプログラム１２００内のｐｒｉｎｔメソッドのようなメソッドについてはマージ対象としない。
【０１１４】
（コンパイル装置１００のコンパイル処理手順）
つぎに、コンパイル装置１００のコンパイル処理手順について説明する。
【０１１５】
図１３は、コンパイル装置１００のコンパイル処理手順の一例を示すフローチャートである。図１３のフローチャートにおいて、まず、コンパイル装置１００は、ソースプログラムｓｃを読み込む（ステップＳ１３０１）。
【０１１６】
つぎに、コンパイル装置１００は、ソースプログラムｓｃの字句解析を行う（ステップＳ１３０２）。そして、コンパイル装置１００は、字句解析により得られるトークンの並びについて、トークン間の関係を解析することにより、ソースプログラムｓｃの構文解析および意味解析を行う（ステップＳ１３０３）。
【０１１７】
つぎに、コンパイル装置１００は、ソースプログラムｓｃの構文解析および意味解析により得られる中間言語Ｉコード中の複数のメソッドから重複メソッド候補を抽出する重複メソッド候補抽出処理を行う（ステップＳ１３０４）。重複メソッド候補抽出処理の具体的な処理内容については、図１４を用いて後述する。
【０１１８】
つぎに、コンパイル装置１００は、抽出された重複メソッド候補のうち未選択の重複メソッド候補を選択する（ステップＳ１３０５）。そして、コンパイル装置１００は、重複メソッド候補のメソッド間の対応関係情報１１０を生成する対応関係情報生成処理を行う（ステップＳ１３０６）。対応関係情報生成処理の具体的な処理手順については、図１５を用いて後述する。
【０１１９】
つぎに、コンパイル装置１００は、生成した重複メソッド候補の対応関係情報に基づいて、重複メソッド候補のメソッド間で実行面での冗長性を有するか否かを判定する（ステップＳ１３０７）。ここで、実行面での冗長性を有さないと判定した場合（ステップＳ１３０７：Ｎｏ）、コンパイル装置１００は、ステップＳ１３０９に移行する。
【０１２０】
一方、実行面での冗長性を有すると判定した場合（ステップＳ１３０７：Ｙｅｓ）、コンパイル装置１００は、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成するマージ処理を行う（ステップＳ１３０８）。マージ処理の具体的な処理手順については、図１６を用いて後述する。
【０１２１】
つぎに、コンパイル装置１００は、抽出された重複メソッド候補のうち未選択の重複メソッド候補があるか否かを判断する（ステップＳ１３０９）。ここで、未選択の重複メソッド候補がある場合（ステップＳ１３０９：Ｙｅｓ）、コンパイル装置１００は、ステップＳ１３０５に戻る。
【０１２２】
一方、未選択の重複メソッド候補がない場合は（ステップＳ１３０９：Ｎｏ）、コンパイル装置１００は、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードと、マージしていないメソッドの中間言語Ｉコードとに基づいて、ソースプログラムｓｃの中間言語ＩＩコードを生成する（ステップＳ１３１０）。
【０１２３】
そして、コンパイル装置１００は、生成されたソースプログラムｓｃの中間言語ＩＩコードの最適化処理を行う（ステップＳ１３１１）。つぎに、コンパイル装置１００は、最適化処理されたソースプログラムｓｃの中間言語ＩＩコードに基づいて、ソースプログラムｓｃのオブジェクトファイルｆを生成する（ステップＳ１３１２）。
【０１２４】
そして、コンパイル装置１００は、生成したソースプログラムｓｃのオブジェクトファイルｆを出力して（ステップＳ１３１３）、本フローチャートによる一連の処理を終了する。
【０１２５】
これにより、コンパイラの構文・意味解析区において、メソッド間で実行面での冗長性を有する複数のメソッドを一つのメソッドにマージすることができ、最適化区の入力時点でメソッドの絶対数を削減することができる。
【０１２６】
＜重複メソッド候補抽出処理手順＞
つぎに、図１３に示したステップＳ１３０４の重複メソッド候補抽出処理の具体的な処理手順について説明する。
【０１２７】
図１４は、重複メソッド候補抽出処理の具体的処理手順の一例を示すフローチャートである。図１４のフローチャートにおいて、まず、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコードを参照して、親子関係を有するクラス間で同一名のメソッドが存在するか否かを判断する（ステップＳ１４０１）。
【０１２８】
ここで、親子関係を有するクラス間で同一名のメソッドが存在する場合（ステップＳ１４０１：Ｙｅｓ）、コンパイル装置１００は、親子関係を有するクラス間で同一名のメソッドの組合せを重複メソッド候補として抽出する（ステップＳ１４０２）。そして、コンパイル装置１００は、ステップＳ１４０１に戻る。
【０１２９】
一方、親子関係を有するクラス間で同一名のメソッドが存在しない場合（ステップＳ１４０１：Ｎｏ）、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコードを参照して、同一名のメソッドまたは多重定義演算子が存在するか否かを判断する（ステップＳ１４０３）。
【０１３０】
ここで、同一名のメソッドまたは多重定義演算子が存在する場合（ステップＳ１４０３：Ｙｅｓ）、コンパイル装置１００は、同一名のメソッドまたは多重定義演算子の組合せを重複メソッド候補として抽出する（ステップＳ１４０４）。そして、コンパイル装置１００は、ステップＳ１４０３に戻る。
【０１３１】
一方、同一名のメソッドまたは多重定義演算子が存在しない場合（ステップＳ１４０３：Ｎｏ）、コンパイル装置１００は、重複メソッド候補抽出処理を呼び出したステップに戻る。これにより、オーバーロードされたメソッドやオーバーロードされたメソッドを、メソッド間で実行面での冗長性を有する候補となる重複メソッド候補として抽出することができる。
【０１３２】
＜対応関係情報生成処理手順＞
つぎに、図１３に示したステップＳ１３０６の対応関係情報生成処理の具体的な処理手順について説明する。
【０１３３】
図１５は、対応関係情報生成処理の具体的処理手順の一例を示すフローチャートである。図１５のフローチャートにおいて、まず、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコードから、重複メソッド候補それぞれに対応する中間言語Ｉコードを抽出する（ステップＳ１５０１）。
【０１３４】
つぎに、コンパイル装置１００は、抽出した中間言語Ｉコードを参照して、重複メソッド候補のメソッド間で宣言・文・式のデータを順次比較する（ステップＳ１５０２）。そして、コンパイル装置１００は、比較した比較結果に基づいて、抽出した中間言語Ｉコードのうち、メソッド間で意味的に異なる部分があるか否かを判断する（ステップＳ１５０３）。
【０１３５】
ここで、メソッド間で意味的に異なる部分がある場合（ステップＳ１５０３：Ｙｅｓ）、コンパイル装置１００は、抽出した中間言語Ｉコードのうちのメソッド間で意味的に異なる部分にマーキングする（ステップＳ１５０４）。そして、コンパイル装置１００は、対応関係情報生成処理を呼び出したステップに戻る。なお、マーキングは、例えば、図６に示したようなチェック記号に相当する。
【０１３６】
一方、メソッド間で意味的に異なる部分がない場合（ステップＳ１５０３：Ｎｏ）、コンパイル装置１００は、対応関係情報生成処理を呼び出したステップに戻る。これにより、重複メソッド候補それぞれに対応する中間言語Ｉコードのうち、メソッド間で意味的に同一である部分と、メソッド間で意味的に異なる部分とを識別する対応関係情報１１０を生成することができる。
【０１３７】
＜マージ処理手順＞
つぎに、図１３に示したステップＳ１３０８のマージ処理の具体的な処理手順について説明する。
【０１３８】
図１６は、マージ処理の具体的処理手順の一例を示すフローチャートである。図１６のフローチャートにおいて、まず、コンパイル装置１００は、重複メソッド候補の中間言語Ｉコードから、宣言・文・式のデータを選択する（ステップＳ１６０１）。この際、コンパイル装置１００は、選択したデータと図１５に示したステップＳ１５０２で比較したデータが存在する場合は、そのデータも合わせて選択する。
【０１３９】
つぎに、コンパイル装置１００は、選択したデータにマーキングがあるか否かを判断する（ステップＳ１６０２）。ここで、マーキングがある場合（ステップＳ１６０２：Ｙｅｓ）、コンパイル装置１００は、選択したデータに基づいて、重複メソッド候補のメソッド固有の処理の中間言語Ｉコードを生成する（ステップＳ１６０３）。
【０１４０】
そして、コンパイル装置１００は、重複メソッド候補の中間言語Ｉコードから選択されていない未選択のデータがあるか否かを判断する（ステップＳ１６０４）。ここで、未選択のデータがある場合（ステップＳ１６０４：Ｙｅｓ）、コンパイル装置１００は、ステップＳ１６０１に戻る。
【０１４１】
また、ステップＳ１６０２において、マーキングがない場合（ステップＳ１６０２：Ｎｏ）、コンパイル装置１００は、選択したデータに基づいて、重複メソッド候補のメソッド共通の処理の中間言語Ｉコードを生成して（ステップＳ１６０５）、ステップＳ１６０４に移行する。
【０１４２】
また、ステップＳ１６０４において、未選択のデータがない場合（ステップＳ１６０４：Ｎｏ）、コンパイル装置１００は、生成した各処理の中間言語Ｉコードをマージすることにより、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成して（ステップＳ１６０６）、マージ処理を呼び出したステップに戻る。
【０１４３】
これにより、メソッド間で実行面での冗長性を有する重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードを生成することができる。なお、重複メソッド候補をマージしたメソッド本体の中間言語Ｉコードには、マージしたいずれのメソッドに応じた処理を行うのかを選択するためのデータ（例えば、図１１に示したデータ１１０１）が含まれる。また、ステップＳ１６０６では、マージしたいずれかのメソッドを呼び出すための中間言語Ｉコードも合わせて生成される。
【０１４４】
以上説明したように、実施の形態にかかるコンパイル装置１００によれば、ソースプログラムｓｃの構文解析および意味解析により得られる中間言語Ｉコード中の複数のメソッドから、メソッド間で実行面での冗長性を有する可能性がある重複メソッド候補を抽出することができる。これにより、オブジェクト指向言語の言語的特徴を判断できる構文・意味解析区において、データや処理ロジックについて同一性を有する可能性がある複数のメソッドを重複メソッド候補として抽出することができる。
【０１４５】
例えば、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコード中のメソッド群から、親子関係を有するクラス間で同一名のメソッドの組合せを重複メソッド候補として抽出してもよい。これにより、メソッド間で実行面での冗長性を有する可能性があるオーバーライドされたメソッドを重複メソッド候補として抽出することができる。
【０１４６】
例えば、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコード中のメソッド群から、同一クラス内のメソッド、あるいは、いずれのクラスにも属していないメソッドのうち、同一名のメソッドの組合せを重複メソッド候補として抽出してもよい。これにより、メソッド間で実行面での冗長性を有する可能性があるオーバーロードされたメソッドを重複メソッド候補として抽出することができる。
【０１４７】
例えば、コンパイル装置１００は、ソースプログラムｓｃの中間言語Ｉコード中のメソッド群から、同一クラス内の演算子、あるいは、いずれのクラスにも属していない演算子のうち、同一名の演算子の組合せを重複メソッド候補として抽出してもよい。これにより、メソッド（演算子）間で実行面での冗長性を有する可能性があるオーバーロードされた多重定義演算子を重複メソッド候補として抽出することができる。
【０１４８】
また、コンパイル装置１００によれば、抽出した重複メソッド候補それぞれの中間言語Ｉコードにより特定される処理ロジックに基づいて、重複メソッド候補のメソッド間の対応関係情報１１０を生成することができる。これにより、重複メソッド候補のメソッド間の実行面での冗長性の有無を判断するための対応関係情報１１０を生成することができる。
【０１４９】
例えば、コンパイル装置１００は、重複メソッド候補それぞれの中間言語Ｉコード中の宣言、文、式それぞれのデータごとに、メソッド間のデータを比較する。そして、コンパイル装置１００は、比較した比較結果に基づいて、重複メソッド候補それぞれの中間言語Ｉコードのうち、メソッド間で意味的に同一である部分とメソッド間で意味的に異なる部分とを識別する対応関係情報１１０を生成してもよい。これにより、重複メソッド候補のメソッド間で意味的に同一である部分とメソッド間で意味的に異なる部分とを識別することが可能となる。
【０１５０】
また、コンパイル装置１００によれば、生成した対応関係情報１１０に基づいて、重複メソッド候補のメソッド間で実行面での冗長性を有するか否かを判定し、メソッド間で実行面での冗長性を有する重複メソッド候補のマージ処理を行うことができる。これにより、メソッド間で実行面での冗長性を有する複数のメソッドを一つのメソッドにマージすることができ、構文・意味解析区の段階でメソッドの絶対数を削減することができる。
【０１５１】
例えば、コンパイル装置１００は、重複メソッド候補それぞれの中間言語Ｉコード中の宣言・文・式それぞれのデータのうち少なくともいずれかのデータが、メソッド間で意味的に同一である場合にメソッド間で実行面での冗長性を有すると判定してもよい。これにより、メソッド間で意味的に同一である部分が存在する重複メソッド候補をマージ対象とすることができ、効果的なマージ処理を行うことができる。
【０１５２】
例えば、コンパイル装置１００は、重複メソッド候補それぞれの中間言語Ｉコード中の宣言・文・式それぞれのデータのうちの所定数Ｘ以上のデータが意味的に同一である場合に、メソッド間で実行面での冗長性を有すると判定してもよい。これにより、メソッド間で意味的に同一である部分が多く存在する重複メソッド候補をマージ対象とすることができ、より効果的なマージ処理を行うことができる。
【０１５３】
これらのことから、コンパイル装置１００によれば、最適化区の入力時点でメソッドの絶対数を削減することが可能となり、ソースプログラムｓｃのコンパイル時間の短縮化を図るとともに、オブジェクトファイルｆのデータサイズを縮小することができる。また、コンパイル装置１００によれば、オブジェクト指向言語の言語的特徴からメソッド間で実行面での冗長性を有する可能性がある重複メソッド候補を絞り込むことができるため、マージ対象となる複数のメソッドの判別を効率的かつ効果的に行うことができる。
【０１５４】
これにより、ソフトウェア開発の開発スピードを向上させることができる。また、オブジェクトファイルｆのデータサイズの縮小により、実行時のプログラムのロード時間の短縮化を図るとともに、コンピュータシステムの省資源化（例えば、ＣＰＵ負荷、メモリ容量、ディスク容量、ネットワーク負荷など）を図ることができる。
【０１５５】
なお、本実施の形態で説明したコンパイル方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１５６】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５７】
（付記１）コンピュータが、
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、
前記複数のマージ可能メソッドのマージ処理を行う、
処理を実行することを特徴とするコンパイル方法。
【０１５８】
（付記２）前記コンピュータが、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドのメソッド間の対応関係情報を生成する処理を実行し、
前記複数のマージ可能メソッドを抽出する処理は、
前記対応関係情報に基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出することを特徴とする付記１に記載のコンパイル方法。
【０１５９】
（付記３）前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、親子関係を有するクラス間で同一名のメソッドの組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする付記１または２に記載のコンパイル方法。
【０１６０】
（付記４）前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、同一クラス内のメソッド、あるいは、いずれのクラスにも属していないメソッドのうち、同一名のメソッドの組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする付記１〜３のいずれか一つに記載のコンパイル方法。
【０１６１】
（付記５）前記複数のマージ候補メソッドを抽出する処理は、
前記中間言語コード中の複数のメソッドから、同一クラス内の演算子、あるいは、いずれのクラスにも属していない演算子のうち、同一名の演算子の組合せを前記複数のマージ候補メソッドとして抽出することを特徴とする付記１〜４のいずれか一つに記載のコンパイル方法。
【０１６２】
（付記６）前記コンピュータが、
前記複数のマージ候補メソッドそれぞれの中間言語コード中の宣言、文、式それぞれのデータごとに、前記複数のマージ候補メソッドのメソッド間のデータを比較する処理を実行し、
前記生成する処理は、
前記データごとの比較結果に基づいて、前記複数のマージ候補メソッドそれぞれの中間言語コードのうち、前記メソッド間で意味的に同一である部分と前記メソッド間で意味的に異なる部分とを識別する対応関係情報を生成することを特徴とする付記２に記載のコンパイル方法。
【０１６３】
（付記７）前記複数のマージ可能メソッドを抽出する処理は、
前記対応関係情報を参照して、前記複数のマージ候補メソッドそれぞれの中間言語コード中の宣言、文、式それぞれのデータのうちの少なくともいずれかのデータが意味的に同一である前記複数のマージ候補メソッドを、前記複数のマージ可能メソッドとして抽出することを特徴とする付記６に記載のコンパイル方法。
【０１６４】
（付記８）前記複数のマージ可能メソッドを抽出する処理は、
前記対応関係情報を参照して、前記複数のマージ候補メソッドそれぞれの中間言語コード中の宣言、文、式それぞれのデータのうちの所定数以上のデータが意味的に同一である前記複数のマージ候補メソッドを、前記複数のマージ可能メソッドとして抽出することを特徴とする付記６に記載のコンパイル方法。
【０１６５】
（付記９）前記マージ処理を行う処理は、
前記対応関係情報に基づいて、前記複数のマージ可能メソッドのメソッド間で共通する処理の中間言語コードと、前記複数のマージ可能メソッドの各メソッドで固有の処理の中間言語コードとをマージして、前記複数のマージ可能メソッドをマージしたメソッド本体の中間言語コードを生成することにより、前記複数のマージ可能メソッドのマージ処理を行うことを特徴とする付記２に記載のコンパイル方法。
【０１６６】
（付記１０）前記ソースプログラムは、オブジェクト指向言語によってコーディングされたプログラムであることを特徴とする付記１〜９のいずれか一つに記載のコンパイル方法。
【０１６７】
（付記１１）ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、前記複数のマージ可能メソッドのマージ処理を行う制御部、
を有することを特徴とするコンパイル装置。
【０１６８】
（付記１２）コンピュータに、
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、
前記複数のマージ可能メソッドのマージ処理を行う、
処理を実行させることを特徴とするコンパイルプログラム。
【０１６９】
（付記１３）コンピュータに、
ソースプログラムの構文解析および意味解析により得られる中間言語コード中の複数のメソッドから、少なくとも継承関係または名称のいずれかに基づき複数のマージ候補メソッドを抽出し、
前記複数のマージ候補メソッドそれぞれの中間言語コードにより特定される処理ロジックに基づいて、前記複数のマージ候補メソッドからマージ可能な複数のマージ可能メソッドを抽出し、
前記複数のマージ可能メソッドのマージ処理を行う、
処理を実行させるコンパイルプログラムを記録したことを特徴とする前記コンピュータに読み取り可能な記録媒体。
【符号の説明】
【０１７０】
１００  コンパイル装置
５０１  取得部
５０２  解析部
５０３  抽出部
５０４  生成部
５０５  判定部
５０６  マージ処理部
５０７  最適化部
５０８  コード生成部
５０９  出力部
【図１】
2015210740.tif 000003
【図２】
2015210740.tif 000004
【図３】
2015210740.tif 000005
【図４】
2015210740.tif 000006
【図５】
2015210740.tif 000007
【図６】
2015210740.tif 000008
【図７】
2015210740.tif 000009
【図８】
2015210740.tif 000010
【図９】
2015210740.tif 000011
【図１０】
2015210740.tif 000012
【図１１】
2015210740.tif 000013
【図１２】
2015210740.tif 000014
【図１３】
2015210740.tif 000015
【図１４】
2015210740.tif 000016
【図１５】
2015210740.tif 000017
【図１６】
2015210740.tif 000018