(57)【要約】【課題】  より多くの命令列を、変数が特定の値である場合の処理に最適化してコンパイルする。【解決手段】  最適化の対象プログラムにおいて、変数又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、変数又は記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、変数又は記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、対象プログラムにおける、更新命令から制御移行命令までの間に、変数の内容又は記憶領域の内容が特定の内容である場合に実行され、制御移行命令の移行先アドレスを、命令列コンパイル部により最適化された命令列のアドレスに設定する設定命令を生成する設定命令生成部とを備える最適化コンパイラを提供する。【選択図】図１
2005215830.tif 000002
【特許請求の範囲】
【請求項１】
最適化の対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、
前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、
検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、
前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部と
を備える最適化コンパイラ。
【請求項２】
前記対象プログラムは、オブジェクト指向プログラム言語で記述されており、
前記命令列は、オブジェクトのメソッドであり、
前記制御移行命令は、当該オブジェクトの複数のメソッドについて、各メソッドの識別情報を、当該メソッドをコンパイルした命令列のアドレスに対応付けたメソッドテーブルから、呼び出す対象のメソッドの識別情報に対応付けられたアドレスを選択して、当該アドレスに制御を移行することにより、当該メソッドを呼び出し、
前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記命令列コンパイル部により最適化された命令列のアドレスを、前記メソッドテーブルに格納する命令を生成する
請求項１記載の最適化コンパイラ。
【請求項３】
前記制御移行命令は、制御の移行を指示する命令コードと、制御の移行先アドレスを示すオペランドとを含み、
前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記制御移行命令のオペランドを、前記命令列コンパイル部により最適化された前記命令列のアドレスに書換える命令を生成する
請求項１記載の最適化コンパイラ。
【請求項４】
前記対象プログラムの各変数には、前記対象プログラムのうち、当該変数の内容を読み書きする命令の実行が許可される読み書き許可範囲を示す属性が定められており、
前記更新命令検出部は、各変数の前記読み書き許可範囲から、当該変数の更新命令を検出し、
前記命令列検出部は、各変数の前記読み書き許可範囲から、当該変数の内容又は当該変数により指定される記憶領域の内容に応じて異なる処理を行う命令列を検出する
請求項１記載の最適化コンパイラ。
【請求項５】
前記更新命令検出部は、前記対象プログラムの各変数について、当該変数の読み書き許可範囲から、当該変数又は当該変数により指定される記憶領域の全ての更新命令を検出し、
前記更新命令検出部により当該変数又は当該変数により指定される記憶領域の全ての更新命令が検出された場合において、
前記命令列コンパイル部は、前記命令列検出部が検出した前記命令列を、当該変数の内容又は当該記憶領域の内容が前記特定の内容である場合の処理に最適化してコンパイルした特殊化命令列と、当該命令列を、当該処理に最適化せずにコンパイルした通常命令列とを生成し、
前記設定命令生成部は、前記更新命令検出部により検出された各更新命令について、当該更新命令から前記制御移行命令までの間に実行される範囲に、当該更新命令により更新された内容が前記特定の内容である場合には、前記移行先アドレスを前記特殊化命令列のアドレスに設定し、当該更新命令により更新された内容が前記特定の内容でない場合には、前記移行先アドレスを前記通常命令列のアドレスに設定する命令を、前記設定命令として生成する
請求項４記載の最適化コンパイラ。
【請求項６】
前記設定命令生成部は、更に、変数の内容又は変数により指定される記憶領域の内容を当該変数の前記読み書き許可範囲外から書換えるリフレクションメソッド内に、各制御移行命令の移行先アドレスを前記通常命令列に設定する設定命令を生成する
請求項５記載の最適化コンパイラ。
【請求項７】
前記命令列検出部が検出した前記命令列を、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合の処理に最適化した場合に、当該処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出し、算出した当該実行時間の見積に、当該命令列の実行頻度の見積を乗じることにより、最適化の効果を算出する最適化効果算出部と、
前記設定命令を生成した場合に当該設定命令に要する処理時間の見積を算出し、算出した当該処理時間の見積に、当該設定命令の実行頻度の見積を乗じることにより、最適化のオーバヘッドを算出する最適化オーバヘッド算出部と
を更に備え、
前記設定命令生成部は、各命令列についての前記最適化の効果の合計が、各設定命令についての前記最適化のオーバヘッドの合計を超える場合に設定命令を生成する
請求項１記載の最適化コンパイラ。
【請求項８】
前記最適化効果算出部は、前記命令列検出部が検出した命令列において、前記変数又は前記記憶領域の内容を読み出す命令より先に実行される範囲に、当該変数又は当該記憶領域の内容を変更し得る命令が含まれない場合に、当該変数又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する
請求項７記載の最適化コンパイラ。
【請求項９】
前記対象プログラムのプログラマは、前記対象プログラムにおける各変数に、当該変数の内容が他のスレッドの処理により更新され得ることを示すボラタイル属性を定めることができ、
前記最適化効果算出部は、前記更新命令により更新される前記変数又は前記更新命令により更新される前記記憶領域を指定する変数に、前記ボラタイル属性が定められていない場合に、前記命令列検出部が検出した命令列から当該変数の内容又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する
請求項７記載の最適化コンパイラ。
【請求項１０】
前記対象プログラムは、オブジェクト指向プログラム言語で記述されており、
前記命令列は、オブジェクトのメソッドであり、
前記命令列コンパイル部は、前記対象プログラムにおいて所定の変数又は記憶領域の更新命令がオブジェクトのコンストラクタのみにおいて検出された場合に、当該変数又は記憶領域の内容に応じて異なる処理を行う命令列を、当該変数又は記憶領域の内容が特定の内容である場合の処理に最適化してコンパイルする
請求項１記載の最適化コンパイラ。
【請求項１１】
前記対象プログラムは、オブジェクト指向プログラミング言語により記述されており、
前記更新命令検出部は、前記更新命令として、オブジェクトのメンバー変数の内容又はメンバー変数により指定される記憶領域の内容を更新する命令を検出し、
前記命令列検出部は、メソッド呼び出し命令により呼び出されて実行され、前記メンバー変数の内容又は前記メンバー変数により指定される記憶領域の内容に応じて異なる処理を行うメソッドを、前記命令列として検出し、
前記命令列コンパイル部は、前記命令列検出部により検出されたメソッドを、メンバー変数の内容又はメンバー変数により指定される記憶領域の内容が前記特定の内容である場合の処理に最適化してコンパイルし、
前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記メソッド呼出命令による呼出先アドレスを、前記命令列コンパイル部により最適化されたメソッドのアドレスに設定する命令を生成する
請求項１記載の最適化コンパイラ。
【請求項１２】
最適化の対象プログラムをコンピュータにより最適化するコンパイル方法であって、
前記コンピュータにより、
前記対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出段階と、
前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出段階と、
検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル段階と、
前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル段階において最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成段階と
を備えるコンパイル方法。
【請求項１３】
最適化の対象プログラムをコンピュータにより最適化させるコンパイルプログラムであって、
前記コンピュータを、
前記対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、
前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、
検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、
前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部と
して機能させるコンパイルプログラム。
【請求項１４】
請求項１３記載のコンパイルプログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体に関する。特に、本発明は、プログラムの所定の変数が特定の内容であるものとして特殊化する最適化を行うコンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体に関する。
【背景技術】
【０００２】
近年、プログラマの負担を軽減し、プログラムの堅牢性・保守性等を高める目的で、オブジェクト指向言語等のプログラム言語が広く用いられている。プログラム言語で記述されたプログラムを機械語に翻訳するコンパイラは、一般的に、プログラムの実行速度を向上するために、様々な最適化を行う。
【０００３】
従来、プログラムの実行速度を向上させる最適化の１つとして、プログラムの一部を、プログラムにより参照される変数が特定の値である場合の処理に特殊化する手法(specialization)が提案されている。例えば、プログラム内の各メソッドについて、そのメソッドが呼び出される毎に変数の値が特定の値であるか判断させ、その判断結果に応じて、特殊化した命令列及び特殊化していない命令列の何れかに分岐して実行させる手法が提案されている（特許文献１参照。）。
【０００４】
また、オブジェクト内でのみ使用されるプライベート変数(private variable)について、そのオブジェクトの生成時にのみ、その変数に値が代入されることが予め分かっている場合に、当該オブジェクト内でその変数を使用する全てのメソッドを特殊化してコンパイルする技術が用いられている（非特許文献１参照。）。
【０００５】
非特許文献２については後述する。
【特許文献１】特開２００２−２５９１３５号公報
【非特許文献１】藤波順久  著。「オブジェクト指向言語の実行時最適化。」日本ソフトウェア科学会第12回大会論文集、１９９５年９月、245-248ページ
【非特許文献２】川人基弘、小松秀昭、中谷登志男  著。「Java言語に対する投機的なメモリアクセスの最適化手法。」情報処理学会論文誌、Vol. 44、No. 3、883-896ページ。2003年。(Javaは登録商標)
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上記特許文献１の技術によると、コンパイラは、変数の値が特定の値であるか否か判断する命令を、メソッドの処理の冒頭に生成する。このため、そのメソッドが呼び出される毎に、この判断処理が毎回行なわれる。しかしながら、変数の値が特定の値であるか否かを一旦判断すれば、その後にその変数の値が更新されない限り、この判断を再度行う必要はない。このため、不必要な判断処理を行っている場合があった。
【０００７】
更に、この技術によると、コンパイラは、特殊化により短縮される処理時間が、変数の値が特定の値であるか否かの判断に要する処理時間を超える場合にのみ、プログラム全体の効率が向上すると判断して、プログラムを特殊化してコンパイルする。従って、不必要な判断処理の処理時間により、プログラムの特殊化が適切に行われない場合があった。
【０００８】
また、上記非特許文献１によると、コンパイラは、変数にある特定の値が代入され易い場合であっても、その値が必ず代入されることが確かめられなければ、最適化を行うことができない。このため、特殊化すれば実行効率が高まる場合であっても最適化が適切に行なわれない場合があった。
【０００９】
そこで本発明は、上記の課題を解決することのできるコンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明の第１の形態においては、最適化の対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、変数の内容又は記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、変数の内容又は記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、対象プログラムにおける、更新命令から制御移行命令までの間に、変数の内容又は記憶領域の内容が特定の内容である場合に実行され、制御移行命令の移行先アドレスを、命令列コンパイル部により最適化された命令列のアドレスに設定する設定命令を生成する設定命令生成部とを備える最適化コンパイラ、コンピュータを最適化コンパイラとして機能させるコンパイラプログラム、コンパイラプログラムを記録した記録媒体、及び最適化コンパイラを用いたコンパイル方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明の効果】
【００１１】
本発明によれば、より多くの命令列を、変数が特定の値である場合の処理に最適化してコンパイルすることができる。
【発明を実施するための最良の形態】
【００１２】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１３】
図１は、最適化コンパイラ１０の機能ブロック図である。最適化コンパイラ１０は、オブジェクト指向言語等で記述された最適化対象の対象プログラム２０を入力し、対象プログラム２０において呼び出される各メソッドを、対象プログラム２０のオブジェクトで用いられるメンバー変数が所定の内容である場合の処理に最適化する。これにより、対象プログラム２０の実行速度を高めることを目的とする。
【００１４】
最適化コンパイラ１０は、更新命令検出部１００と、本発明に係る命令列検出部の一例であるメソッド検出部１１０と、最適化効果算出部１２０と、最適化オーバヘッド算出部１３０と、本発明に係る命令列コンパイル部の一例であるメソッドコンパイル部１４０と、設定命令生成部１５０とを備える。更新命令検出部１００は、対象プログラム２０における各変数について、その変数の内容またはその変数により指定される記憶領域の内容を更新する更新命令を検出する。
【００１５】
例えば、更新命令検出部１００は、その変数が数値を示す場合に、その変数に数値を代入する代入命令を検出してもよいし、その変数の数値を増加するインクリメント命令を検出してもよい。また、更新命令検出部１００は、その変数が配列変数である場合に、その配列変数を初期化するべくその配列変数の大きさを示す数値をその変数により指定される記憶領域に格納する命令を、更新命令として検出してもよい。
【００１６】
メソッド検出部１１０は、対象プログラム２０において、他の命令列に制御を移す制御移行命令により制御が移行されて、変数の内容又は記憶領域の内容に応じて異なる処理を行う命令列を検出する。ここで、命令列とは、例えば、オブジェクト指向言語におけるメソッドである。これに代えて、命令列とは、関数型プログラム言語における関数・手続であってもよいし、所定のサブルーチンであってもよい。
【００１７】
また、制御移行命令とは、メソッドを呼び出して実行させる呼出命令である。この命令は、メソッド・インボーク命令又はメソッド・コール命令とも呼ばれるが、本実施例の以降の説明においては、この命令を呼出命令と呼ぶ。これに代えて、対象プログラム２０が、関数型プログラム言語で記述されている場合には、制御移行命令とは、関数呼出命令であってもよい。更に他の例として、制御移行命令とは、他の命令列に処理を移す場合にその後に元の命令列に制御を戻すための処理を行わない、分岐命令であってもよい。
【００１８】
そして、最適化効果算出部１２０は、メソッド検出部１１０が検出した各メソッドを、変数の内容又は記憶領域の内容が特定の内容である場合の処理に最適化した場合に、当該処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出する。そして、最適化効果算出部１２０は、算出した各メソッドについての当該実行時間の見積に、そのメソッドの実行頻度を乗じることにより、最適化の効果を算出する。
【００１９】
最適化オーバヘッド算出部１３０は、変数の内容又は記憶領域の内容が特定の内容である場合に実行され、メソッド呼出命令の呼出先アドレスを、メソッドコンパイル部１４０により最適化される命令列のアドレスに設定する設定命令を生成した場合における、その設定命令に要する処理時間の見積を計算する。そして、最適化オーバヘッド算出部１３０は、算出したその処理時間の見積に、その設定命令の実行頻度の見積を乗じることにより、最適化のオーバヘッドを算出する。
【００２０】
続いて、メソッドコンパイル部１４０は、各メソッドについての最適化の効果の合計が、各設定命令についての最適化のオーバヘッドの合計を超える場合に、メソッド検出部１１０により検出された各メソッドを、当該変数の内容又は当該記憶領域の内容が特定の内容である場合の処理に最適化してコンパイルする。この最適化は、特殊化(specialization)と呼ばれる最適化であり、例えば、メソッドコンパイル部１４０は、当該変数に基づく条件分岐命令を削除して、その変数が特定の値である場合に実行される分岐先の命令列のみをコンパイルする最適化を行ってもよい。
なお、以降の説明において、メソッドコンパイル部１４０により変数の内容又は記憶領域の内容が特定の内容である場合の処理に最適化されたメソッドを、その変数又はその記憶領域について特殊化されたメソッドと呼ぶ。
【００２１】
同様に、当該最適化の効果の合計が当該最適化のオーバヘッドの合計を超える場合に、更新命令毎に、設定命令生成部１５０は、その更新命令から何れかの呼出命令までの間に、設定命令を生成する。ここで、好ましくは、設定命令生成部１５０は、各更新命令が実行されるメソッド内に、設定命令を生成する。一例としては、設定命令生成部１５０は、各更新命令の直後に実行される箇所に、設定命令を生成する。そして、設定命令生成部１５０は、以上の様に最適化された対象プログラム２０を、コンパイル結果の結果プログラム３０として出力する。
【００２２】
図２は、最適化コンパイラ１０がメソッドを最適化する処理の動作フローの一例を示す。最適化コンパイラ１０は、対象プログラム２０における各変数又はその変数により指定される各記憶領域について、以下の処理を繰り返す（Ｓ２００）。まず、更新命令検出部１００は、その変数又はその記憶領域の内容を更新する全ての更新命令を検出する（Ｓ２１０）。一部の更新命令だけしか検出することができなかった場合、即ち全ての更新命令を検出できたと保障することはできない場合には（Ｓ２２０：ＮＯ）、最適化コンパイラ１０は、Ｓ２７０に処理を移して、次の変数又は記憶領域についての判断を繰り返す。一方、全ての更新命令が検出できた場合に（Ｓ２２０：ＹＥＳ）、メソッド検出部１１０は、その変数又はその記憶領域の内容に応じて異なる処理を行う全てのメソッドを検出する（Ｓ２３０）。
【００２３】
続いて、最適化効果算出部１２０は、検出した各メソッドについて、そのメソッドを、その変数又はその記憶領域の内容が特定の内容である場合の処理に最適化した場合に、その処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出する（Ｓ２４０）。例えば、最適化効果算出部１２０は、その処理に最適化した場合に生成される機械語コードの実行サイクル数から、その処理に最適化しない場合に生成される機械語コードの実行サイクル数を減じた値を、短縮される実行時間の見積として算出してもよい。
【００２４】
より具体的には、最適化効果算出部１２０は、メソッド検出部１１０が検出したメソッドにおいて、当該変数又は当該記憶領域の内容を読み出す命令より先に実行される範囲に、当該変数又は当該記憶領域の内容を変更し得る命令が含まれないことを条件として、当該変数又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する。ここで、変数又は変数により指定される記憶領域の内容を変更し得る命令とは、例えば、メモリの何れかのアドレスにデータを格納するストア命令、メソッドの呼出命令、又は他のスレッドと同期を取る命令等である。
【００２５】
但し、最適化効果算出部１２０は、当該変数又は当該記憶領域の内容を読み出す命令に先立って実行されるストア命令が、当該変数又は当該記憶領域の内容を変更しないことを、エイリアス解析等により判断した場合には、このストア命令を、当該変数又は当該記憶領域の内容を変更し得る命令から除外する。この解析は、例えば、非特許文献２に記載される技術により実現される。同様に、最適化効果算出部１２０は、当該変数又は当該記憶領域の内容を読み出す命令に先立って実行される呼出命令の呼出先のメソッドが、当該変数又は当該記憶領域の内容を変更しないと判断した場合には、この呼出命令を、当該変数又は当該記憶領域の内容を変更し得る命令から除外する。
【００２６】
更に、対象プログラム２０を記述したプログラム言語によっては、プログラマは、対象プログラム２０の各変数に、当該変数の内容が他のスレッドの処理により更新され得ることを示すボラタイル属性を定めることができる場合がある。このような場合には、最適化効果算出部１２０は、検出した更新命令により更新される変数又はその更新命令により更新される記憶領域を指定する変数に、このボラタイル属性が定められていないことを更に条件として、当該変数又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する。但し、一般的に、プログラマが変数にボラタイル属性を定めることは稀である。
【００２７】
そして、最適化効果算出部１２０は、各メソッドについて、そのメソッドについて算出したその実行時間の見積に、そのメソッドの実行頻度の見積を乗じることにより、最適化の効果を算出する。例えば、最適化効果算出部１２０は、各メソッドの実行頻度として、対象プログラム２０が１回実行される毎にそのメソッドが呼び出される回数を取得してもよい。より具体的には、最適化コンパイラ１０が、対象プログラム２０を実行しているインタプリタからの指示で対象プログラム２０をコンパイルする実行時コンパイラである場合には、最適化効果算出部１２０は、このインタプリタが各メソッドを実行していた回数を取得してもよい。
【００２８】
続いて、最適化オーバヘッド算出部１３０は、メソッドコンパイル部１４０により設定命令が生成された場合に、その設定命令に要する処理時間の見積を計算する（Ｓ２５０）。そして、最適化オーバヘッド算出部１３０は、算出したその処理時間の見積に、その設定命令の実行頻度の見積を乗じることにより、最適化のオーバヘッドを算出する。最適化効果算出部１２０と同様に、最適化オーバヘッド算出部１３０は、設定命令の実行頻度の見積として、対象プログラム２０において設定命令を生成すべき箇所が実行される回数を取得してもよい。より具体的には、最適化コンパイラ１０が、対象プログラム２０を実行しているインタプリタからの指示で対象プログラム２０をコンパイルする実行時コンパイラである場合には、最適化オーバヘッド算出部１３０は、このインタプリタが各箇所を実行していた回数を取得してもよい。
【００２９】
続いて、メソッドコンパイル部１４０は、各メソッドについての最適化の効果の合計が、各設定命令についての最適化のオーバヘッドの合計を超える場合に、メソッド検出部１１０により検出された各メソッドを、当該変数の内容又は当該記憶領域の内容が特定の内容である場合の処理に最適化してコンパイルすべきものであると判断する（Ｓ２６０）。
【００３０】
最適化オーバヘッド算出部１３０は、対象プログラム２０内の各命令の実行頻度を取得できない場合には、以上の処理に代えて、コンストラクタ内に生成する設定命令に要する処理時間を、極めて小さい、例えば０であると取り扱ってもよい。この結果、メソッドコンパイル部１４０は、オブジェクトのコンストラクタ内に生成する設定命令の実行頻度が極めて小さいとみなすことができるので、メソッド検出部１１０により検出されたメソッドを特殊化してコンパイルすることができる。
【００３１】
最適化コンパイラ１０は、以上の処理を、各変数又はその変数により指定される各記憶領域について繰り返す（Ｓ２７０）。これにより、最適化コンパイラ１０は、何れのメソッドを、何れの変数又は記憶領域が特定の値である場合の処理に最適化するべきかを判断することができる。
【００３２】
図３は、図２に続く処理の動作フローを示す。最適化コンパイラ１０は、図２の処理における判断の結果に基づいて、以下の処理を各メソッドについて繰り返す（Ｓ３００）。まず、メソッドコンパイル部１４０は、当該メソッドを特殊化せずにコンパイルする（Ｓ３１０）。そして、メソッドコンパイル部１４０は、当該メソッドが、特殊化してコンパイルするべきメソッドか否かを判断する（Ｓ３２０）。特殊化してコンパイルするべきメソッドである場合に（Ｓ３２０：ＹＥＳ）、メソッドコンパイル部１４０は、そのメソッドを、Ｓ２６０において判断された各変数又は各記憶領域が特定の値である場合の処理に特殊化してコンパイルする（Ｓ３３０）。
【００３３】
メソッドコンパイル部１４０が特殊化の対象とする変数又は記憶領域は複数でもよく、例えば、メソッドコンパイル部１４０は、あるメソッドを、ある変数が第１の特定の値であり、他の変数が第２の特定の値である場合の処理に特殊化してコンパイルしてもよい。以上の処理を、最適化コンパイラ１０は、各メソッドについて繰り返す（Ｓ３４０）。続いて、設定命令生成部１５０は、特殊化すべきであると判断した変数の各更新命令について、その更新命令から、その更新命令により更新される変数又は記憶領域の内容について特殊化したメソッドの呼出命令までの間に、設定命令を生成する（Ｓ３５０）。
【００３４】
以上、本図において、最適化コンパイラ１０がメソッドを最適化する処理の一例を説明したが、最適化コンパイラ１０による処理順序はこの例に限定されるものではない。例えば、最適化コンパイラ１０が、メソッド呼出の毎に呼び出されるメソッドをコンパイルする動的コンパイラである場合には、Ｓ３１０及びＳ３３０に示すコンパイル処理は、メソッド呼出のタイミングで行なわれてもよい。
【００３５】
図４は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第１の例を示す。本図を用いて、設定命令生成部１５０が設定命令を生成する処理の詳細を説明する。図４（ａ）は、最適化前の対象プログラム２０を示す。更新命令検出部１００は、更新命令として、オブジェクトthisのメンバー変数Vに、何らかの値を代入する代入命令（１）を検出する。なお、オブジェクトthisのメンバー変数Vを、this.Vと表記する。
【００３６】
図４（ｂ）は、最適化後の対象プログラム、即ち結果プログラム３０を示す。結果プログラム３０は、実際には、コンピュータによって実行可能な機械語の命令列にコンパイルされている。本図においては、説明の便宜上、結果プログラム３０を、機械語の命令列の意味を示すソースプログラムとして表記する。以降の各図の説明における最適化後の対象プログラムについても同様である。
【００３７】
設定命令生成部１５０は、変数this.Vの内容に応じて異なる処理をするメソッドを最適化すると判断した場合に、代入命令（１）から呼出命令までの間、例えば、代入命令の直後に実行される箇所に、設定命令（２）を生成する。より具体的には、まず、設定命令生成部１５０は、設定命令として、this.Vが特殊化の条件を満たす場合に実行され、thisのメソッドテーブルであるmethod_tableを、特殊化したメソッドのアドレスを含むメソッドテーブルに設定する命令を４行目に生成する。
【００３８】
ここで、オブジェクトthisのメソッドテーブルとは、オブジェクトthisの複数のメソッドについて、各メソッドの識別情報を、そのメソッドをコンパイルした命令列のアドレスに対応付けたデータ構造である。即ち、呼出命令は、呼び出す対象のメソッドの識別情報に対応付けられたアドレスをメソッドテーブルから選択して、そのアドレスに制御を移行することにより、そのメソッドを呼び出す。設定命令は、このメソッドテーブルを書換えることにより、呼出命令の呼出先アドレスを設定する。
【００３９】
次に、設定命令生成部１５０は、設定命令として、呼出命令のオペランドを、this.Vについて特殊化したメソッドのアドレスに書換える命令を、５行目に生成する。呼出命令は、他の例として、制御の移行を指示する命令コードと、制御の移行先アドレスを示すオペランドとを含む場合がある。この呼出命令は、メソッドテーブルを用いることなく、呼出先アドレスを直接オペランドとして指定する。設定命令は、このような呼出命令のオペランドを、this.Vについて特殊化したメソッドのアドレスに書換えることにより、この呼出命令の呼出先アドレスを適切に設定することができる。
【００４０】
更に、設定命令生成部１５０は、設定命令として、this.Vが特殊化の条件を満たさない場合に実行され、オブジェクトthisのメソッドテーブルを、各メソッドをthis.Vについて特殊化せずにコンパイルした命令列へのアドレスのみを含むメソッドテーブル（通常のメソッドテーブル）に書換える命令を７行目に生成する。そして、同様に、設定命令生成部１５０は、this.Vが特殊化の条件を満たさない場合に実行され、呼出命令のオペランドを、通常のメソッドのアドレス、即ち、this.Vについて特殊化せずにコンパイルした命令列のアドレスに書換える命令を８行目に生成する。
【００４１】
また、この代入命令（１）が、複数のスレッドにより並行して実行される場合には、設定命令生成部１５０は、１行目から１０行目を何れか１つのスレッドにより排他的に実行させる旨を示すsynchronized命令を生成する。この結果、３行目においてthis.Vが特殊化の条件を満たすと判断してから、４行目においてメソッドテーブルを書換える処理までの間に、this.Vの内容が他のスレッドにより変更される事態を防ぐことができる。
なお、好ましくは、設定命令生成部１５０は、this.Vの内容を更新する更新命令が、常に単一のスレッドにより実行されると判断した場合に、synchronized命令を生成しな。この場合、synchronized命令に要する処理時間を削減することにより対象プログラム２０をより高速に実行させることができる。
【００４２】
図５は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第２の例を示す。図５（ａ）は、最適化前の対象プログラム２０を示す。更新命令検出部１００は、更新命令として、オブジェクトthisのメンバー変数V1に、何らかの値を代入する代入命令（１）を検出する。なお、オブジェクトthisのメンバー変数V1を、this.V1と表記する。また、このオブジェクトthisは、メンバー変数であるV2を更に有している。オブジェクトthisのメンバー変数V2を、同様に、this.V2と表記する。
【００４３】
また、本図の説明の前提として、メソッドコンパイル部１４０は、対象プログラム２０におけるあるメソッド群を、this.V1及びthis.V2について特殊化してコンパイルする。更に、this.V1及びthis.V2の何れかが特殊化の条件を満たさない事態に備え、メソッドコンパイル部１４０は、そのメソッド群を、this.V1のみについて特殊化してコンパイルすると共に、this.V2のみについて特殊化してコンパイルする。更に、メソッドコンパイル部１４０は、そのメソッド群を、this.V1及びthis.V2のいずれについても特殊化せずにコンパイルする。
【００４４】
図５（ｂ）は、最適化後の対象プログラム、即ち結果プログラム３０を示す。設定命令生成部１５０は、変数this.V1又はthis.V2の内容に応じて異なる処理をするメソッドを最適化すると判断した場合に、代入命令（１）から呼出命令までの間、例えば、代入命令の直後に実行される箇所に、設定命令（２）を生成する。より具体的には、まず、設定命令生成部１５０は、設定命令（２）として、this.V1が特殊化の条件を満たすか否か判断する命令を３行目に生成する。
【００４５】
次に、設定命令生成部１５０は、オブジェクトthisのメソッドテーブルが、this.V2に特殊化したメソッドのアドレスを含むメソッドテーブルであるか否か判断する命令を４行目に生成する。この命令により、this.V1の内容を更新する更新命令が実行された時に、既に他の設定命令によって、thisのメソッドテーブルに、this.V2に特殊化したメソッドのアドレスが設定されているか否か判断することができる。
【００４６】
そして、設定命令生成部１５０は、３行目及び４行目の双方の命令による判断結果が真である場合、即ち、this.V1及びthis.V2の双方が特殊化の条件を満たす場合に実行される命令を以下のように生成する。まず、設定命令生成部１５０は、オブジェクトthisのメソッドテーブルを、this.V1及びthis.V2の双方について特殊化したメソッドのアドレスを含むメソッドテーブルに書換える命令を、５行目に生成する。そして、設定命令生成部１５０は、各呼出命令のオペランドを、this.V1及びthis.V2の双方について特殊化したメソッドのアドレスに書換える命令を６行目に生成する。
【００４７】
また、設定命令生成部１５０は、３行目の命令による判断結果が真でありかつ４行目の判断結果が偽である場合、即ち、this.V1が特殊化の条件を満たしthis.V2が特殊化の条件を満たさない場合に実行される命令を以下のように生成する。まず、設定命令生成部１５０は、オブジェクトthisのメソッドテーブルを、this.V1について特殊化したメソッドのアドレスを含むメソッドテーブルに書換える命令を、８行目に生成する。そして、設定命令生成部１５０は、各呼出命令のオペランドを、this.V1について特殊化したメソッドのアドレスに書換える命令を９行目に生成する。
【００４８】
続いて、設定命令生成部１５０は、オブジェクトthis.V1が特殊化の条件を満たさない場合に実行され、オブジェクトthisのメソッドテーブルが、this.V2に特殊化したメソッドのアドレスを含むメソッドテーブルであるか否か判断する命令を１２行目に生成する。
【００４９】
そして、設定命令生成部１５０は、３行目による判断結果が偽であり、１２行目による判断結果が真である場合、即ち、this.V1が特殊化の条件を満たさず、this.V2が特殊化の条件を満たす場合に実行される命令を以下のように生成する。まず、設定命令生成部１５０は、オブジェクトthisのメソッドテーブルを、this.V2について特殊化したメソッドのアドレスを含むメソッドテーブルに書換える命令を、１３行目に生成する。そして、設定命令生成部１５０は、各呼出命令のオペランドを、this.V2について特殊化したメソッドのアドレスに書換える命令を１４行目に生成する。
【００５０】
また、設定命令生成部１５０は、３行目及び１２行目の双方の命令による判断結果が偽である場合、即ち、this.V1及びthis.V2のいずれもが特殊化の条件を満たさない場合に実行される命令を以下のように生成する。まず、設定命令生成部１５０は、オブジェクトthisのメソッドテーブルを、this.V1及びthis.V2の何れについても特殊化されていないメソッドのアドレスを含むメソッドテーブルに書換える命令を、１６行目に生成する。そして、設定命令生成部１５０は、各呼出命令のオペランドを、this.V1及びthis.V2の何れについても特殊化されていないメソッドのアドレスに書換える命令を１７行目に生成する。
【００５１】
以上、本図の例で示すように、メソッドを複数の変数について特殊化した場合には、設定命令生成部１５０は、各更新命令が実行される毎に実行され、その実行時点において何れの変数が特殊化の条件を満たすか否かを判断する命令を生成する。これにより、特殊化の条件を満たす変数の組に応じて、できる限り特殊化したメソッドを実行させることができる。
【００５２】
図６は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第３の例における、対象プログラム２０を示す。対象プログラム２０は、オブジェクトのコンストラクタでないメソッドscanSubset、init、及びfrequentlyCalledMethodを含む。そして、メソッドfrequentlyCalledMethodは、メソッドscanSubset及びinitと比較して、頻繁に実行されることが分かっている。また、対象プログラム２０は、オブジェクトのメンバー変数であるfCalledを定義している。
【００５３】
本図の対象プログラム２０は、コンストラクタでないメソッドscanSubset及びメソッドinit内に更新命令を含むので、非特許文献１の技術によっては最適化されない。また、仮に対象プログラム２０が、特許文献１の技術により最適化された場合には、変数fCalledの内容が０か否かに応じて処理１又は処理２を実行する命令列が、frequentlyCalledMethod内に生成される。この場合、最適化前の処理と比較して速度が向上しない。実際には、特許文献１に記載のインパクト解析により、最適化の効果がないと判断されるので、この最適化は行なわれない。このように、本図の対象プログラム２０を、従来の技術により最適化することはできなかった。これに対し、本実施例に係る最適化コンパイラ１０は、対象プログラム２０を最適化することができる。以下にその詳細を示す。
【００５４】
まず、本図の例におけるオブジェクトのメンバー変数であるfCalledには、対象プログラム２０のうち、その変数の内容を読み書きする命令の実行が許可される読み書き許可範囲を示す属性が定められている。例えば、変数fCalledには、１行目において、その変数の内容を読み書きする命令の実行が、その変数の属するオブジェクト内のみにおいて許可される旨を示す、private属性が定められている。
【００５５】
また、読み書き許可範囲を示す属性とは、private属性の他、その変数の内容を読み書きする命令の実行を、その変数が属するオブジェクトを承継して生成された他のオブジェクトのみにおいて許可するprotected属性であってもよいし、その変数の内容を読み書きする命令の実行を、何れのオブジェクトにおいても許可するpublic属性であってもよい。更に他の例として、読み書き許可範囲を示す属性とは、一旦値が代入された後は変更されないことを示すfinal属性であってもよい。
【００５６】
更新命令検出部１００は、変数fCalledの読み書き許可範囲、例えばこの変数の属するオブジェクト内の各メソッドから、その変数の全ての更新命令を検出する。例えば、更新命令検出部１００は、変数fCalledの更新命令として、この変数をインクリメントするインクリメント命令（１）を５行目において検出し、この変数に０を代入する代入命令（２）を７行目において検出する。
【００５７】
続いて、メソッド検出部１１０は、変数fCalledの読み書き許可範囲、例えばこの変数の属するオブジェクト内の各メソッドから、その変数に応じて異なる処理を行うメソッドを検出する。例えば、メソッド検出部１１０は、変数fCalledが０か否かにより異なる処理を行うメソッドfrequentlyCalledMethodを、８行目から１３行目において検出する。
【００５８】
図７は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第３の例における、結果プログラム３０を示す。メソッドコンパイル部１４０は、メソッドfrequentlyCalledMethodを、変数fCalledの内容が０である場合の処理に特殊化してコンパイルすることにより、１６行目及び１７行目に、frequentlyCalledMethod_Specialを生成する。このメソッドを特殊化命令列と呼ぶ。また、メソッドコンパイル部１４０は、メソッドfrequentlyCalledMethodを、変数fCalledの内容が０である場合の処理に最適化せずにコンパイルすることにより、１０行目から１５行目にメソッドfrequentlyCalledMethodをコンパイルした命令列を生成する。この命令列を、通常命令列と呼ぶ。
【００５９】
そして、設定命令生成部１５０は、５行目のインクリメント命令（１）の直後に実行される６行目に、オブジェクトthisのメソッドテーブルであるmethod_tableに対して、メソッドfrequentlyCalledMethodのアドレスを含む通常のメソッドテーブルを設定する設定命令を生成する。この結果、fCalledの値がインクリメントされて数値が不明である場合には、特殊化していないメソッドfrequentlyCalledMethodを実行させることができる。
【００６０】
また、設定命令生成部１５０は、８行目の代入命令（２）の直後に実行される９行目に、method_tableに対して、メソッドfrequentlyCalledMethod_Specialのアドレスを含むメソッドテーブルを設定する設定命令を生成する。この結果、変数fCalledに０が代入された場合には、特殊化したメソッドfrequentlyCalledMethod_Specialを実行させて処理を効率化できる。
【００６１】
このように、設定命令生成部１５０は、更新命令検出部１００により検出された各更新命令について、その更新命令からメソッドの呼出命令までの間に、その更新命令により更新された内容が特定の内容である場合には、呼出命令の呼出先アドレスを特殊化命令列のアドレスに設定し、その更新命令により更新された内容が特定の内容でない場合には、呼出命令の呼出先アドレスを通常命令列のアドレスに設定する命令を、設定命令として生成する。これにより、変数の内容が更新され得る場合にのみ設定命令を実行させることができるので、メソッドの特殊化に伴って発生するオーバヘッドを低減することができる。
【００６２】
なお、本図において、設定命令生成部１５０は、設定命令として、変数等の内容が特定の内容であるか判断する判断命令を生成しなくともよい。即ち、設定命令生成部１５０は、対象プログラム２０をコンパイルする時点で変数等の内容が予め定まっている場合、例えば変数fCalledに０が代入される等の場合には、その内容に応じてメソッドテーブルを書換える命令を生成すればよい。これにより、不要な判断命令を削除して結果プログラム３０の実行効率を一層高めることができる。
【００６３】
また、本図の例において変数fCalledにはprivate属性が定められているので、変数fCalledを読み書きする命令は、変数fCalledが定義されるオブジェクト内でのみ実行される。従って、設定命令生成部１５０は、オブジェクト内のみの各更新命令について、その更新命令が実行される直後に設定命令を生成すればよい。これにより、更新命令の検出に要する処理時間を低減できる。
【００６４】
但し、プログラム言語によっては、プログラマは、private属性が定められた変数の内容を、例外的に、他のオブジェクトのメソッドから変更することができる。そこで、対象プログラム２０が例えばＪａｖａ（登録商標）で記述されている場合には、設定命令生成部１５０は、変数又は記憶領域の内容をその変数の読み書き範囲外から書換えるリフレクションメソッド（例えば、java.lang.reflect.Field.set()メソッド）内に、呼出命令の呼出先アドレスを通常命令列のアドレスに設定する設定命令を更に生成する。
【００６５】
図８は、メソッドテーブルの構造を説明する図である。図６に示す対象プログラム２０がコンパイルされて実行される場合に、対象プログラム２０を実行するランタイムシステムは、オブジェクト８００と、オブジェクト８００のメソッドテーブルである第１メソッドテーブル８２０及び第２メソッドテーブル８４０と、変数fCalledについて特殊化せずにコンパイルされた命令列８３０と、変数fCalledについて特殊化してコンパイルされた命令列８５０とを生成する。なお、最適化コンパイラ１０がJust In Timeコンパイラ等の動的コンパイラである場合には、命令列８３０は、メソッドfrequentlyCalledMethodをコンパイルしてから実行する命令列であってもよい。同様に、命令列８５０は、メソッドfrequentlyCalledMethodを特殊化してコンパイルしてから実行する命令列であってもよい。
【００６６】
第１メソッドテーブル８２０及び第２メソッドテーブル８４０は、オブジェクト８００の複数のメソッドについて、各メソッドの識別情報を、そのメソッドをコンパイルした命令列のアドレスに対応付けて格納する。例えば、第１メソッドテーブル８２０は、メソッドの識別情報１に対応付けて、命令列８３０のアドレスを格納している。また、第２メソッドテーブル８４０は、メソッドの識別情報１に対応付けて、命令列８５０のアドレスを格納している。
【００６７】
そして、設定命令生成部１５０により生成された設定命令は、変数等が特殊化の条件を満たす場合に、ポインタ８１０を、第１メソッドテーブル８２０のアドレスから、第２メソッドテーブル８４０のアドレスを指すように書換える。これにより、以降に実行される呼出命令は、メソッドテーブルとして第２メソッドテーブル８４０を参照することにより、識別情報が１のメソッドのアドレスとして命令列８５０のアドレスを取得して、そのアドレスに制御を移行する。これにより、設定命令が一旦実行され、変数等が特殊化の条件を満たしていると判断された場合には、その後に設定命令を実行することなく、特殊化されたメソッドが適切に呼び出される。
【００６８】
図９（ａ）は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第４の例における、対象プログラム２０を示す。図９及び図１０を用いて、設定命令生成部１５０が、設定命令を生成することにより、呼出命令のオペランドを書換えさせる処理を説明する。まず、図６及び図７と同様に、更新命令検出部１００は、更新命令として、インクリメント命令（１）を６行目において検出し、代入命令（２）を８行目において検出する。そして、メソッド検出部１１０は、変数fCalledの内容に応じて異なる処理を行うメソッドとして、９行目から１４行目に、メソッドfrequentlyCalledMethodを検出する。
【００６９】
そして、設定命令生成部１５０は、メソッドfrequentlyCalledMethodを呼び出す呼出命令（５）及び呼出命令（６）を、１８行目及び１９行目において検出する。これらの呼出命令は、プログラムの実行時に呼出先アドレスが変更されないことを示すstatic属性の付されたメソッドを呼び出す。従って、これらの各呼出命令は、制御の移行を指示する命令コードであるcallと、制御の移行先アドレスを示すオペランドである0x12345678とにコンパイルされる。そして、設定命令生成部１５０は、検出した呼出命令のアドレスを、呼出先アドレスを書換えるべき命令のリストとして管理する。
【００７０】
図９（ｂ）は、設定命令生成部１５０により管理される、呼出先アドレスを書換えるべき命令のリストの一例を示す。設定命令生成部１５０は、呼び出すメソッドの識別情報、例えばメソッドの名称に対応付けて、そのメソッドが特殊化された場合に書換えるべき呼出命令のアドレスを管理している。具体的には、設定命令生成部１５０は、メソッドの名称frequentlyCalledMethodに対応付けて、（５）及び（６）のアドレスを管理している。
【００７１】
設定命令生成部１５０は、新たに呼出命令がコンパイルされた場合には、その呼出命令のアドレスを、書換えるべき呼出命令のアドレスのリストに追加する。一方、設定命令生成部１５０は、他の最適化等により呼出命令が除去された場合には、その呼出命令のアドレスを、書換えるべき呼出命令のアドレスのリストから削除する。
【００７２】
図１０は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第４の例における、結果プログラム３０を示す。設定命令生成部１５０は、インクリメント命令（１）の直後に実行される位置に、呼出命令のオペランドを、特殊化していないメソッドのアドレスである0x12345678に書換える設定命令を生成する。処理の詳細として、設定命令は、図９（ｂ）に示した呼出先アドレスを書換えるべき命令のリストを参照することにより、呼出先アドレスを書換えるべき呼出命令を選択し、選択したそれらの呼出命令のオペランドを、メソッドfrequentlyCalledMethodのアドレスに書換える。
【００７３】
一方、設定命令生成部１５０は、代入命令（２）の直後に実行される位置に、呼出命令のオペランドを、特殊化したメソッドのアドレスである0x12346000に書換える設定命令を生成する。処理の詳細として、設定命令は、図９（ｂ）に示した呼出先アドレスを書換えるべき命令のリストを参照することにより、呼出先アドレスを書換えるべき呼出命令を選択し、選択したそれらの呼出命令のオペランドを、メソッドfrequentlyCalledMethod_Specialのアドレスに書換える。
【００７４】
これにより、２２行目及び２３行目に示す命令コードcallのオペランドは、設定命令により、0x12345678及び0x12346000の何れかに書換えられる。この結果、２２行目及び２３行目の呼出命令は、変数fCalledの内容に応じて、frequentlyCalledMethod及び又はfrequentlyCalledMethod_Specialの何れかを適切に呼び出すことができる。
【００７５】
図１１は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第５の例を示す。図１１（ａ）は、最適化前の対象プログラム２０を示す。更新命令検出部１００は、オブジェクトのメンバー変数fEncodingTypeの更新命令として、変数fEncodingTypeに、メソッドinitの引数encodingTypeの内容を代入する代入命令（１）を、対象プログラム２０の５行目に検出する。また、メソッド検出部１１０は、メンバー変数fEncodingTypeの内容に応じて異なる処理を行うメソッドconvertCharsToBytesを、対象プログラム２０の６行目から１９行目に検出する。
【００７６】
図１１（ｂ）は、最適化後の結果プログラム３０を示す。本図において、最適化効果算出部１２０は、検出したメソッドconvertCharsToBytesについて、そのメソッドを、fEncodingTypeが特定の内容である場合の処理に最適化した場合に、その処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出する。例えば、最適化効果算出部１２０は、代入命令（１）において代入される値がEncodingSupport.U16BEである確率が、他の値が代入される確率より高く、例えば９０％である旨のプロファイル情報を取得する。
【００７７】
そして、最適化効果算出部１２０は、メソッドconvertCharsToBytesについて、そのメソッドを、fEncodingTypeがEncodingSupport.U16BEである場合の処理に最適化した場合に、その処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出する。これを受けて、メソッドコンパイル部１４０は、最適化の効果が最適化のオーバヘッドを超えると判断した場合に、メソッドconvertCharsToBytesを、変数fEncodingTypeがEncodingSupport.U16BEである場合の処理に最適化してコンパイルする。このコンパイル結果を、図１１（ｂ）の１０行目から１６行目のメソッドconvertCharsToBytes_Specialとして示す。メソッドコンパイル部１４０は、図１１（ａ）の８行目に記述されていたswitch文を除去することができた。
【００７８】
そして、設定命令生成部１５０は、変数fEncodingTypeの内容がEncodingSupport.U16BEである場合に実行され、メソッドコンパイル部１４０により最適化されたメソッドのアドレスを、メソッドテーブルに格納する設定命令（２）を生成する。更に、設定命令生成部１５０は、設定命令（２）として、変数fEncodingTypeの内容がEncodingSupport.U16BEでない場合に実行され、メソッドコンパイル部１４０により最適化されていないメソッドのアドレスを、メソッドテーブルに格納する命令を９行目に格納する。
【００７９】
以上、本図に示すように、最適化コンパイラ１０は、プロファイル情報に基づいて、最適化の効果及びオーバヘッドを算出することにより、特殊化により実行速度が向上する場合にのみ適切に最適化を行うことができる。
【００８０】
図１２は、最適化コンパイラ１０が対象プログラム２０を最適化してコンパイルする第６の例を示す。更新命令検出部１００は、配列変数tableの属性を参照することにより、配列変数privateが同一のオブジェクトのみから参照されることを検出する。更新命令検出部１００は、オブジェクト内の全てのメソッドを解析した結果、配列変数tableの更新命令として、配列変数tableを初期化する初期化命令（１）を、オブジェクトのコンストラクタ内において検出する。ここで、初期化命令（１）は、配列変数table用の記憶領域を確保してその記憶領域へのポインタを代入するとともに、配列変数tableにより指定されるメモリ上の記憶領域内に、配列変数tableの大きさを示すHASHTABLE_SIZEの値を格納する。このように、更新命令とは、数値を変数に代入する命令のみならず、変数により指定された記憶領域に数値を格納する命令を含む。
【００８１】
そして、メソッド検出部１１０は、配列変数tableの内容に応じて異なる処理を行うメソッドgetを、対象プログラム２０の８行目から１２行目に検出する。例えば、メソッドgetは、１２行目において配列変数tableを参照する参照命令（２）を有し、参照結果に基づいて以降の処理を行う。また、参照命令（２）は、変数の内容の参照に先立って、配列変数tableの添字である変数hashが、配列変数として確保した記憶領域を指すか否かの条件を判断し、条件が満たされない場合には、例外(Exception)の発生を利用者に通知する処理を行う。以降、この処理を配列境界チェック処理と呼ぶ。
【００８２】
続いて、メソッドコンパイル部１４０は、メソッドgetを、変数HASHTABLE_SIZEが１２８である場合の処理に最適化してコンパイルする。この結果、特殊化されたメソッドにおいて、配列変数tableの添字である変数hashは、常に１２８未満となる。これにより、メソッドコンパイル部１４０は、参照命令（２）において配列境界チェック処理を除去することができる。
【００８３】
以上、本図に示すように、最適化コンパイラ１０は、各メソッドを、変数の内容自体のみならず、変数により指定される記憶領域に格納された内容が特定の内容である場合の処理に最適化することができる。これにより、最適化する対象のメソッドを増加させて、プログラムの実行効率を一層高めることができる。更に、メソッドコンパイル部１４０は、メソッドgetを処理する命令列を他のメソッドの命令列内にコピーし、他のメソッドの一部として実行させる最適化であるインライン処理を行う場合であっても、特殊化したメソッドgetを、他のメソッドの命令列内にコピーすることが好ましい。
【００８４】
なお、本図で示すように、配列変数の参照命令は、配列境界チェック処理と、配列変数の内容を参照する処理とを含んでいる。これらの処理は、配列変数として確保した記憶領域の大きさをメモリから読み出して添字と比較する命令と、配列変数の内容をメモリから読み出すロード命令とにコンパイルされる。ここで、メソッドコンパイル部１４０が、特殊化により配列境界チェック処理を除去した場合であっても、他のスレッドがこの配列変数の内容を変更する場合を考慮すると、配列変数の内容をメモリから読み出すロード命令は、除去されずに実行される。
【００８５】
本図の例と異なり、配列変数を初期化する命令又は配列変数のサイズを拡張する命令が、コンストラクタ以外のメソッドで実行される場合には、配列変数の内容をメモリから読み出すロード命令の読出先アドレスが、どのメソッドにより初期化された配列変数であるか不明である。このため、配列境界チェック命令を除去してしまうと、通知すべき例外を通知できない等の不都合がある。従って、最適化コンパイラ１０は、特殊化をしても依然としてロード命令が実行されるメソッドについては、本図のように変更命令をコンストラクタのみにおいて検出した場合にのみ、特殊化を行う。
【００８６】
図１３は、最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す。最適化コンパイラ１０は、ホストコントローラ１３８２により相互に接続されるＣＰＵ１３００、ＲＡＭ１３２０、グラフィックコントローラ１３７５、及び表示装置１３８０を有するＣＰＵ周辺部と、入出力コントローラ１３８４によりホストコントローラ１３８２に接続される通信インターフェイス１３３０、ハードディスクドライブ１３４０、及びＣＤ−ＲＯＭドライブ１３６０を有する入出力部と、入出力コントローラ１３８４に接続されるＲＯＭ１３１０、フレキシブルディスクドライブ１３５０、及び入出力チップ１３７０を有するレガシー入出力部とを備える。
【００８７】
ホストコントローラ１３８２は、ＲＡＭ１３２０と、高い転送レートでＲＡＭ１３２０をアクセスするＣＰＵ１３００及びグラフィックコントローラ１３７５とを接続する。ＣＰＵ１３００は、ＲＯＭ１３１０及びＲＡＭ１３２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１３７５は、ＣＰＵ１３００等がＲＡＭ１３２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１３８０上に表示させる。これに代えて、グラフィックコントローラ１３７５は、ＣＰＵ１３００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００８８】
入出力コントローラ１３８４は、ホストコントローラ１３８２と、比較的高速な入出力装置である通信インターフェイス１３３０、ハードディスクドライブ１３４０、及びＣＤ−ＲＯＭドライブ１３６０を接続する。通信インターフェイス１３３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１３４０は、最適化コンパイラ１０が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１３６０は、ＣＤ−ＲＯＭ１３９５からプログラム又はデータを読み取り、ＲＡＭ１３２０を介して入出力チップ１３７０に提供する。
【００８９】
また、入出力コントローラ１３８４には、ＲＯＭ１３１０と、フレキシブルディスクドライブ１３５０や入出力チップ１３７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１３１０は、最適化コンパイラ１０の起動時にＣＰＵ１３００が実行するブートプログラムや、最適化コンパイラ１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１３５０は、フレキシブルディスク１３９０からプログラム又はデータを読み取り、ＲＡＭ１３２０を介して入出力チップ１３７０に提供する。入出力チップ１３７０は、フレキシブルディスク１３９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００９０】
最適化コンパイラ１０に提供されるプログラム、例えば本発明に係る変換プログラムは、フレキシブルディスク１３９０、ＣＤ−ＲＯＭ１３９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。変換プログラムは、入出力チップ１３７０及び／又は入出力コントローラ１３８４を介して、記録媒体から読み出され最適化コンパイラ１０にインストールされて実行される。
【００９１】
最適化コンパイラ１０にインストールされて実行される変換プログラムは、更新命令検出モジュールと、メソッド検出モジュールと、最適化効果算出モジュールと、最適化オーバヘッド算出モジュールと、メソッドコンパイルモジュールと、設定命令生成モジュールとを含む。各モジュールが最適化コンパイラ１０に働きかけて行わせる動作は、図１から図１２において説明した最適化コンパイラ１０における、対応する部材の動作と同一であるから、説明を省略する。
【００９２】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１３９０、ＣＤ−ＲＯＭ１３９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムを最適化コンパイラ１０に提供してもよい。
【００９３】
以上、本実施例で示すように、最適化コンパイラ１０は、変数等の内容を更新する更新命令が実行される毎に実行される箇所に、その更新命令により更新された内容が、メソッドの特殊化の条件を満たすか否か判断して、メソッドの呼出先を切り換える設定命令を生成する。この結果、この設定命令が一旦実行され、変数等が特殊化の条件を満たしていると判断された場合には、その後に設定命令を実行することなく、特殊化されたメソッドが適切に呼び出される。これにより、変数等の更新命令と比較して変数等を参照するメソッドが頻繁に実行される場合には、設定命令を実行する頻度を低減して、プログラムの実行効率を高めることができる。
【００９４】
また、最適化コンパイラ１０は、変数に対して定められた属性を参照することにより、対象プログラムにおいて更新命令又はメソッドを検出する範囲を適切に選択する。これにより、ある変数を更新する全ての更新命令を高速に検出できると共に、その変数の内容に応じて異なる処理を行うメソッドを高速に検出できる。また、最適化コンパイラ１０は、対象プログラムの実行時プロファイル情報に基づいて、最適化の効果及びオーバヘッドを算出することにより、特殊化により実行速度が向上する場合にのみ最適化を行うことができる。
【００９５】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００９６】
以上に示す実施例によると、以下の各項目に示すコンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体が実現される。
（項目１）  最適化の対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部とを備える最適化コンパイラ。
（項目２）  前記対象プログラムは、オブジェクト指向プログラム言語で記述されており、前記命令列は、オブジェクトのメソッドであり、前記制御移行命令は、当該オブジェクトの複数のメソッドについて、各メソッドの識別情報を、当該メソッドをコンパイルした命令列のアドレスに対応付けたメソッドテーブルから、呼び出す対象のメソッドの識別情報に対応付けられたアドレスを選択して、当該アドレスに制御を移行することにより、当該メソッドを呼び出し、前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記命令列コンパイル部により最適化された命令列のアドレスを、前記メソッドテーブルに格納する命令を生成する項目１記載の最適化コンパイラ。
（項目３）  前記制御移行命令は、制御の移行を指示する命令コードと、制御の移行先アドレスを示すオペランドとを含み、前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記制御移行命令のオペランドを、前記命令列コンパイル部により最適化された前記命令列のアドレスに書換える命令を生成する項目１記載の最適化コンパイラ。
【００９７】
（項目４）  前記対象プログラムの各変数には、前記対象プログラムのうち、当該変数の内容を読み書きする命令の実行が許可される読み書き許可範囲を示す属性が定められており、前記更新命令検出部は、各変数の前記読み書き許可範囲から、当該変数の更新命令を検出し、前記命令列検出部は、各変数の前記読み書き許可範囲から、当該変数の内容又は当該変数により指定される記憶領域の内容に応じて異なる処理を行う命令列を検出する項目１記載の最適化コンパイラ。
（項目５）  前記更新命令検出部は、前記対象プログラムの各変数について、当該変数の読み書き許可範囲から、当該変数又は当該変数により指定される記憶領域の全ての更新命令を検出し、前記更新命令検出部により当該変数又は当該変数により指定される記憶領域の全ての更新命令が検出された場合において、前記命令列コンパイル部は、前記命令列検出部が検出した前記命令列を、当該変数の内容又は当該記憶領域の内容が前記特定の内容である場合の処理に最適化してコンパイルした特殊化命令列と、当該命令列を、当該処理に最適化せずにコンパイルした通常命令列とを生成し、前記設定命令生成部は、前記更新命令検出部により検出された各更新命令について、当該更新命令から前記制御移行命令までの間に実行される範囲に、当該更新命令により更新された内容が前記特定の内容である場合には、前記移行先アドレスを前記特殊化命令列のアドレスに設定し、当該更新命令により更新された内容が前記特定の内容でない場合には、前記移行先アドレスを前記通常命令列のアドレスに設定する命令を、前記設定命令として生成する項目４記載の最適化コンパイラ。
（項目６）  前記設定命令生成部は、更に、変数の内容又は変数により指定される記憶領域の内容を当該変数の前記読み書き許可範囲外から書換えるリフレクションメソッド内に、各制御移行命令の移行先アドレスを前記通常命令列に設定する設定命令を生成する項目５記載の最適化コンパイラ。
（項目７）  前記命令列検出部が検出した前記命令列を、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合の処理に最適化した場合に、当該処理に最適化せずにコンパイルした場合と比較して、短縮される実行時間の見積を算出し、算出した当該実行時間の見積に、当該命令列の実行頻度の見積を乗じることにより、最適化の効果を算出する最適化効果算出部と、前記設定命令を生成した場合に当該設定命令に要する処理時間の見積を算出し、算出した当該処理時間の見積に、当該設定命令の実行頻度の見積を乗じることにより、最適化のオーバヘッドを算出する最適化オーバヘッド算出部とを更に備え、前記設定命令生成部は、各命令列についての前記最適化の効果の合計が、各設定命令についての前記最適化のオーバヘッドの合計を超える場合に設定命令を生成する項目１記載の最適化コンパイラ。
【００９８】
（項目８）  前記最適化効果算出部は、前記命令列検出部が検出した命令列において、前記変数又は前記記憶領域の内容を読み出す命令より先に実行される範囲に、当該変数又は当該記憶領域の内容を変更し得る命令が含まれない場合に、当該変数又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する項目７記載の最適化コンパイラ。
（項目９）  前記対象プログラムのプログラマは、前記対象プログラムにおける各変数に、当該変数の内容が他のスレッドの処理により更新され得ることを示すボラタイル属性を定めることができ、前記最適化効果算出部は、前記更新命令により更新される前記変数又は前記更新命令により更新される前記記憶領域を指定する変数に、前記ボラタイル属性が定められていない場合に、前記命令列検出部が検出した命令列から当該変数の内容又は当該記憶領域の内容をメモリから読み出す命令を削除することにより短縮される実行時間の見積を算出する項目７記載の最適化コンパイラ。
（項目１０）  前記対象プログラムは、オブジェクト指向プログラム言語で記述されており、前記命令列は、オブジェクトのメソッドであり、前記命令列コンパイル部は、前記対象プログラムにおいて所定の変数又は記憶領域の更新命令がオブジェクトのコンストラクタのみにおいて検出された場合に、当該変数又は記憶領域の内容に応じて異なる処理を行う命令列を、当該変数又は記憶領域の内容が特定の内容である場合の処理に最適化してコンパイルする項目１記載の最適化コンパイラ。
（項目１１）  前記対象プログラムは、オブジェクト指向プログラミング言語により記述されており、前記更新命令検出部は、前記更新命令として、オブジェクトのメンバー変数の内容又はメンバー変数により指定される記憶領域の内容を更新する命令を検出し、前記命令列検出部は、メソッド呼び出し命令により呼び出されて実行され、前記メンバー変数の内容又は前記メンバー変数により指定される記憶領域の内容に応じて異なる処理を行うメソッドを、前記命令列として検出し、前記命令列コンパイル部は、前記命令列検出部により検出されたメソッドを、メンバー変数の内容又はメンバー変数により指定される記憶領域の内容が前記特定の内容である場合の処理に最適化してコンパイルし、前記設定命令生成部は、前記設定命令として、前記更新命令により更新された内容が前記特定の内容である場合に実行され、前記メソッド呼出命令による呼出先アドレスを、前記命令列コンパイル部により最適化されたメソッドのアドレスに設定する命令を生成する項目１記載の最適化コンパイラ。
【００９９】
（項目１２）  最適化の対象プログラムをコンピュータにより最適化するコンパイル方法であって、前記コンピュータにより、前記対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出段階と、前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出段階と、検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル段階と、前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル段階において最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成段階とを備えるコンパイル方法。
（項目１３）  最適化の対象プログラムをコンピュータにより最適化させるコンパイルプログラムであって、前記コンピュータを、前記対象プログラムにおいて、変数の内容又は変数により指定される記憶領域の内容を更新する更新命令を検出する更新命令検出部と、前記対象プログラムにおいて、他の命令列に制御を移す制御移行命令により制御が移行されて、前記変数の内容又は前記記憶領域の内容に応じて異なる処理を行う命令列を検出する命令列検出部と、検出した当該命令列を、前記変数の内容又は前記記憶領域の内容が予め定められた特定の内容である場合の処理に最適化してコンパイルする命令列コンパイル部と、前記対象プログラムにおける、前記更新命令から前記制御移行命令までの間に、前記変数の内容又は前記記憶領域の内容が前記特定の内容である場合に実行され、前記制御移行命令の移行先アドレスを、前記命令列コンパイル部により最適化された前記命令列のアドレスに設定する設定命令を生成する設定命令生成部として機能させるコンパイルプログラム。
（項目１４）  項目１３記載のコンパイルプログラムを記録した記録媒体。
【図面の簡単な説明】
【０１００】
【図１】図１は、最適化コンパイラ１０の機能ブロック図である。
【図２】図２は、最適化コンパイラ１０がメソッドを最適化する処理の動作フローの一例を示す。
【図３】図３は、図２に続く処理の動作フローを示す。
【図４】図４は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第１の例を示す。
【図５】図５は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第２の例を示す。
【図６】図６は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第３の例における、対象プログラム２０を示す。
【図７】図７は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第３の例における、結果プログラム３０を示す。
【図８】図８は、メソッドテーブルの構造を説明する図である。
【図９】図９は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第４の例における、対象プログラム２０を示す。
【図１０】図１０は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第４の例における、結果プログラム３０を示す。
【図１１】図１１は、最適化コンパイラ１０が対象プログラム２０を結果プログラム３０に最適化してコンパイルする第５の例を示す。
【図１２】図１２は、最適化コンパイラ１０が対象プログラム２０を最適化してコンパイルする第６の例を示す。
【図１３】図１３は、最適化コンパイラ１０として機能するコンピュータのハードウェア構成の一例を示す。
【符号の説明】
【０１０１】
１０  最適化コンパイラ
２０  対象プログラム
３０  結果プログラム
１００  更新命令検出部
１１０  メソッド検出部
１２０  最適化効果算出部
１３０  最適化オーバヘッド算出部
１４０  メソッドコンパイル部
１５０  設定命令生成部
８００  オブジェクト
８１０  ポインタ
８２０  第１メソッドテーブル
８３０  命令列
８４０  第２メソッドテーブル
８５０  命令列
【図１】
2005215830.tif 000003
【図２】
2005215830.tif 000004
【図３】
2005215830.tif 000005
【図４】
2005215830.tif 000006
【図５】
2005215830.tif 000007
【図６】
2005215830.tif 000008
【図７】
2005215830.tif 000009
【図８】
2005215830.tif 000010
【図９】
2005215830.tif 000011
【図１０】
2005215830.tif 000012
【図１１】
2005215830.tif 000013
【図１２】
2005215830.tif 000014
【図１３】
2005215830.tif 000015