(57)【要約】【課題】  プログラムの実行を効率化するプログラム実行制御プログラム、プログラム実行制御方法を提供する。【解決手段】  バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御処理を行うプログラム実行制御プログラムであって、プログラム実行制御処理は、実行対象である実行対象プログラムの実行時に、当該実行対象プログラムにおけるバイトコードをネイティブコードに変換する第１の変換工程と、起動時に、同じまたは別のプログラム実行制御プログラムの実行時におけるプロファイルを参照して、実行対象プログラムの識別情報に基づいて、当該実行対象プログラムが最適化完了プログラムに該当するか否かを判定する判定工程と、最適化完了プログラムに該当する場合、起動時に、実行対象プログラムのバイトコードのうち最適化コード情報に対応するバイトコードをネイティブコードに変換する第２の変換工程と、を有する。【選択図】図５
2014191493.tif 000002
【特許請求の範囲】
【請求項１】
バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御処理を行うプログラム実行制御プログラムであって、
前記プログラム実行制御処理は、
実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおける前記バイトコードを前記ネイティブコードに変換する第１の変換工程と、
起動時に、同じまたは別の前記プログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、前記実行対象プログラムの前記識別情報に基づいて、当該実行対象プログラムが前記最適化完了プログラムに該当するか否かを判定する判定工程と、
前記最適化完了プログラムに該当する場合、前記起動時に、前記実行対象プログラムのバイトコードのうち前記最適化コード情報に対応するバイトコードを前記ネイティブコードに変換する第２の変換工程と、を有するプログラム実行制御プログラム。
【請求項２】
請求項１において、
前記第１の変換工程では、前記実行対象プログラムが前記最適化状態に変換されたとき、当該実行対象プログラムの前記識別情報と前記最適化コード情報とを、前記プロファイルに記録するプログラム実行制御プログラム。
【請求項３】
請求項１または２において、
前記同じまたは別の前記プログラム実行制御プログラムの実行時は、同時に実行される前記プログラム実行制御プログラムの実行時、または、異なる時間帯に実行された前記プログラム実行制御プログラムの実行時のいずれかまたは両方であるプログラム実行制御プログラム。
【請求項４】
請求項１乃至３のいずれかにおいて、
前記同じまたは別の前記プログラム実行制御プログラムの実行時は、共通のオペレーションシステムで動作する前記プログラム実行制御プログラムの実行時、または、異なるオペレーションシステムで動作する前記プログラム実行制御プログラムの実行時のいずれかまたは両方であるプログラム実行制御プログラム。
【請求項５】
請求項１乃至４のいずれかにおいて、
前記第１の変換工程では、前記実行対象プログラムのコードサイズが収束したとき、前記実行対象プログラムが前記最適化状態に変換されたとみなすプログラム実行制御プログラム。
【請求項６】
請求項５において、
前記第１の変換工程では、基準実行回数、前記実行対象プログラムの実行の前後で前記コードサイズが変化しない場合に、前記実行対象プログラムの前記コードサイズが収束したことを示すプログラム実行制御プログラム。
【請求項７】
請求項１乃至６のいずれかにおいて、
前記第１の変換工程における前記所定の条件は、基準回以上実行される前記バイトコードの前記ネイティブコードへの変換であるプログラム実行制御プログラム。
【請求項８】
バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御方法であって、
実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおける前記バイトコードを前記ネイティブコードに変換する第１の変換工程と、
起動時に、同じまたは別の前記プログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、前記実行対象プログラムの前記識別情報に基づいて、当該実行対象プログラムが前記最適化完了プログラムに該当するか否かを判定する判定工程と、
前記最適化完了プログラムに該当する場合、前記起動時に、前記実行対象プログラムのバイトコードのうち前記最適化コード情報に対応するバイトコードを前記ネイティブコードに変換する第２の変換工程と、を有するプログラム実行制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム実行制御プログラム、プログラム実行制御方法に関する。
【背景技術】
【０００２】
特定のプラットフォームに依存することなくプログラムを実行する仮想計算機の代表的な技術の一つとして、Ｊａｖａ（登録商標）言語を用いる技術がある。具体的に、例えば、Ｊａｖａのバイトコードを解釈して実行するＪａｖａＶＭ（Ｊａｖａ Ｖｉｒｔｕａｌ Ｍａｃｈｉｎｅ：プログラム実行制御プログラム）が挙げられる。
【０００３】
しかしながら、バイトコードは、プロセッサが直接解釈可能なネイティブコードと比較して、オーバヘッドが大きく実行速度が劣る。そこで、例えば、プログラムの実行の際にＪＩＴ（Ｊｕｓｔ Ｉｎ Ｔｉｍｅ）コンパイラによって、バイトコードからネイティブコードへの動的コンパイルが行われる。これにより、バイトコードがネイティブコードに変換され、処理が高速化される（例えば、特許文献１、２）。
【０００４】
例えば、ＪａｖａＶＭにおけるバイトコードからネイティブコードへのコンパイルは、プログラムの実行回数が設定値を超えたときに行われる。このとき、ＪａｖａＶＭは、コンパイルの完了を待機し、コンパイルが完了すると生成されたネイティブコードを実行する。または、例えば、ＪａｖａＶＭにおいて、バイトコードによる処理の実行と、ネイティブコードへのコンパイルが並列に行われる。この場合、ＪａｖａＶＭは、コンパイルが完了するまではバイトコードを実行し、コンパイルが完了し次第、ネイティブコードを実行する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−２３７９８９号公報
【特許文献２】特開２００４−３５５２７７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、ＪａｖａＶＭにおいて、ネイティブコードへのコンパイルにかかるオーバヘッドが大きい。金融や保険・証券のオンラインシステムでは、プログラムの初回の実行時から、プログラムがネイティブコードで提供されるＣ、Ｃ++、ＣＯＢＯＬ等の言語プログラムと同等の実行速度（オーバヘッド）が求められる。
【０００７】
また、プログラムのネイティブコードは、プログラムの実行を繰り返すことで最適化されるが、コンパイルを実行したＪａｖａＶＭプロセスが動作している間についてのみ有効である。このため、ＪａｖａＶＭのプロセスは、別のＪａｖａＶＭのプロセスとネイティブコードを共有できない。したがって、各ＪａｖａＶＭにおいて、それぞれ、バイトコードからネイティブコードへのコンパイル処理が行われる。
【０００８】
そこで、本発明は、プログラムの実行を効率化するプログラム実行制御プログラム、プログラム実行制御方法を提供する。
【課題を解決するための手段】
【０００９】
第１の側面は、バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御処理を行うプログラム実行制御プログラムであって、前記プログラム実行制御処理は、実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおける前記バイトコードを前記ネイティブコードに変換する第１の変換工程と、起動時に、同じまたは別の前記プログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、前記実行対象プログラムの前記識別情報に基づいて、当該実行対象プログラムが前記最適化完了プログラムに該当するか否かを判定する判定工程と、前記最適化完了プログラムに該当する場合、前記起動時に、前記実行対象プログラムのバイトコードのうち前記最適化コード情報に対応するバイトコードを前記ネイティブコードに変換する第２の変換工程と、を有する。
【発明の効果】
【００１０】
第１の側面によれば、プログラムの実行が効率化される。
【図面の簡単な説明】
【００１１】
【図１】本実施の形態例におけるプログラム実行制御プログラムが動作する装置のブロック図の一例である。
【図２】ネイティブコードとバイトコードについて説明する図である。
【図３】ＪａｖａＶＭのブロック図の詳細について説明する例図である。
【図４】一般的なＪａｖａＶＭの処理概要について説明する図である。
【図５】本実施の形態例におけるＪａｖａＶＭの処理概要について説明する図である。
【図６】Ｊａｖａ言語で記述されたプログラムのソースコードの一例を示す図である。
【図７】図６のプログラムにおいて、ネイティブコード化されるコードの一例について説明する図である。
【図８】図７のプログラムに対応するプログラムプロファイルの一例を示す図である。
【図９】ＪａｖａＶＭの全体の処理について説明するフローチャート図である。
【図１０】起動初期処理制御工程の処理について説明するフローチャート図である。
【図１１】プログラムプロファイル制御工程の処理を説明するフローチャート図である。
【図１２】実行制御処理工程の処理を説明するフローチャート図である。
【図１３】実行制御処理工程によってネイティブコード化がさらに進められた図７のプログラムの例を示す図である。
【図１４】図１３のプログラムに対応したプログラムプロファイルの一例を示す図である。
【図１５】異なるメソッドが記述されたバイトコードの示す図である。
【図１６】プログラムプロファイルの共有形態の例について説明する図である。
【図１７】より高精度なプログラムプロファイルの生成工程について説明する図である。
【図１８】本実施の形態例におけるＪａｖａＶＭによるプログラムの実行速度について説明する図である。
【図１９】本実施の形態例におけるプログラム実行制御プログラムが動作する装置の構成図の一例である。
【発明を実施するための形態】
【００１２】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１３】
［プログラムの実行制御装置の構成図］
図１９は、本実施の形態例におけるプログラム実行制御プログラムが動作する装置１００の構成の一例を示す図である。同図の実行制御装置１００は、例えば、一般的なコンピュータであって、例えば、プロセッサ２１、表示部２２、入力部２３、通信部２４、メモリ２５を有する。各部は、バス２６を介して相互に接続される。
【００１４】
図１９において、表示部２２は、例えば、コンピュータの液晶モニタ等を示し、入力部２３は、キーボードやマウス等を示す。通信部２４は、他のコンピュータとの通信処理を制御する。また、同図の例において、ＲＡＭ（Random Access Memory）等のメモリ２５には、例えば、本実施の形態例におけるプログラム実行制御プログラム１０１、及び、実行対象のプログラムであるバイトコード１０４が記憶される。バイトコード１０４については、後述する。プログラム実行制御プログラム１０１は、ＪａｖａＶＭである。以下、プログラム実行制御プログラム１０１を、ＪａｖａＶＭと称する。プロセッサ２１は、ＪａｖａＶＭプログラム１０１と協働して、本実施の形態例におけるプログラムの実行制御処理を実現する。
【００１５】
［プログラムの実行制御装置のブロック図］
図１は、本実施の形態例におけるプログラム実行制御装置１００のブロック図の一例を示す図である。ＪａｖａＶＭ１０１は、コンピュータ上で動作するＯＳ８０の制御下において実行される。
【００１６】
図１のＪａｖａＶＭ１０１は、例えば、インタプリタ１０５とＪＩＴコンパイラ１０７とを有する。インタプリタ１０５は、Ｊａｖａ言語のプログラムを示すバイトコード１０４を逐次解釈して実行する。また、ＪＩＴコンパイラ１０７は、バイトコード１０４をネイティブコード１０８にコンパイルして変換する（動的コンパイル）。また、本実施の形態例において、ＪａｖａＶＭ１０１は、バイトコード１０４のネイティブコード１０８への変換情報が記憶されるプログラムプロファイル１０２を参照、更新する。プログラムプロファイル１０２は、例えば、コンピュータ１００がアクセス可能な記憶媒体に記憶される。
【００１７】
ここでバイトコード１０４と、ネイティブコード１０８について説明する。
【００１８】
［バイトコードとネイティブコード］
バイトコード１０４は、Ｊａｖａ言語で記述されたソースコード１１１が変換されることによって生成される。バイトコード１０４は、実行形式のプログラムであって、特定のＯＳ８０やハードウェアに依存することなく定義された命令の集合によって記述される。つまり、バイトコード１０４は、ＪａｖａＶＭ１０１が動作する環境であれば、様々なＯＳ８０、ハードウェアで実行可能であって、ＯＳ８０やハードウェアに依存することなく同一の処理を行う。
【００１９】
また、ネイティブコード１０８は、ＪＩＴコンパイラ１０７によってバイトコード１０４がコンパイルされることによって生成される。ネイティブコード１０８は、ＯＳ８０が実行可能な機械語で記述されたコードであって、特定のＯＳ８０やハードウェアに依存する。また、ネイティブコード１０８は、コンパイルを実行したＪａｖａＶＭ１０１プロセスのメモリ上に生成される。このため、ネイティブコード１０８はＪａｖａＶＭ１０１のプロセスが終了すると失われる。
【００２０】
図２は、ネイティブコード１０８とバイトコード１０４について説明する図である。同図の（Ａ）は、複数の種類の異なるＯＳ８０Ａ、８０Ｂ、８０Ｃそれぞれに対応して生成された各ネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃが、対応するＯＳに配布される例について説明する図である。また、同図の（Ｂ）は共通のバイトコード１０４が、複数の種類の異なるＯＳ８０Ａ、８０Ｂ、８０Ｃに配布される例について説明する図である。この例において、複数の種類の異なるＯＳ８０Ａ、８０Ｂ、８０Ｃとは、例えば、Ｘ８６ Ｗｉｎｄｏｗｓ（登録商標）８０Ａ、Ｉｎｔｅｌ６４ Ｒｅｄｈａｔ Ｅｎｔｅｒｐｒｉｓｅ Ｌｉｎｕｘ（登録商標）８０Ｂ、ＳＰＡＲＣ Ｓｏｌａｒｉｓ（登録商標）８０Ｃである。
【００２１】
図２の（Ａ）では、同一のソースコード１１１が、各ＯＳ８０Ａ、８０Ｂ、８０Ｃに依存して変換されることによってネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃが生成され、対応するＯＳに配布される。ネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃは、それぞれ、ソースコード１１１内の全てのコードが、実行環境のプラットフォームである各ＯＳに対応してコンパイルされることによって生成される。つまり、プラットフォームの種類毎に、当該プラットフォームに依存したフルコンパイル処理が行われ、ネイティブコードが生成される。このため、特定のＯＳ用に生成されたネイティブコード１０８は、異なるＯＳ上では動作しない。このため、同図の例において、Ｘ８６ Ｗｉｎｄｏｗｓ用のネイティブコード１０８Ａ、Ｉｎｔｅｌ６４ Ｒｅｄｈａｔ Ｅｎｔｅｒｐｒｉｓｅ Ｌｉｎｕｘ用のネイティブコード１０８Ｂ、ＳＰＡＲＣ Ｓｏｌａｒｉｓ用のネイティブコード１０８Ｃがそれぞれ生成される。
【００２２】
また、図２の（Ａ）において、ソースコード１１１内の全てのコードが変換される。このため、ソースコード１１１のコードのうち、実行頻度が低いコードについても、コンパイルの対象となる。即ち、ソースコード１１１内のコードの実行頻度に関わらず、一律に、ネイティブコードに変換される。したがって、ネイティブコード化するメリットの低いコードや、ネイティブコード化が不要なコードについても、コンパイルの対象となり、効率的ではない。このように、各ＯＳに対応して生成されたネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃが配布される場合、ＯＳの種別毎に、ソースコード１１１のフルコンパイル処理が行われると共に、ネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃは異なるＯＳ上で動作しない。なお、ネイティブコード１０８は、プログラム内で呼び出される共有バイトコード群１１０を含む。共有バイトコード群１１０は、例えば、共通ライブラリ（ファイルＩ／Ｏメソッド、セキュリティメソッド等）や、共通の宣言等である。
【００２３】
一方、図２の（Ｂ）において、同一のバイトコード１０４が、それぞれのＯＳ８０Ａ、８０Ｂ、８０Ｃに配布される。バイトコード１０４は、ＪａｖａＶＭ１０１が動作しているＯＳであれば、いずれのＯＳでも同一の処理を実現する。ただし、バイトコード１０４は逐次解釈され実行されることから、実行速度は、ネイティブコード１０８Ａ、１０８Ｂ、１０８Ｃに基づく処理の実行速度よりも遅い。なお、バイトコード１０４は、共有バイトコード群１１０を含まない。このため、バイトコード１０４の実行時、ＪａｖａＶＭ１０１が有する共有バイトコード群１１０Ａ、１１０Ｂ、１１０Ｃが使用される。
【００２４】
続いて、本実施の形態例におけるＪａｖａＶＭ１０１のより詳細なブロック図について説明する。
【００２５】
［ＪａｖａＶＭのブロック図］
図３は、ＪａｖａＶＭ１０１のブロック図の詳細について説明する例図である。同図のＪａｖａＶＭ１０１は、図１に示したインタプリタ１０５、ＪＩＴコンパイラ１０７に加え、プログラム実行制御部１０６、共有バイトコード群１１０、プログラムプロファイル参照・更新部１０３を有する。プログラム実行制御部１０６は、プログラムの実行に係る制御、ＪＩＴコンパイラ１０７へコンパイル指示、プログラムプロファイル参照・更新部１０３への指示等を行う。共有バイトコード群１１０は、共通ライブラリや共通の宣言等であって、バイトコードによって記述される。プログラムプロファイル参照・更新部１０３は、プログラム実行制御部１０６の指示に基づいて、プログラムプロファイル１０２の参照処理、及び、更新処理を行う。
【００２６】
図３において、ＪａｖａＶＭ１０１のインタプリタ１０５は、バイトコード１０４を逐次解釈し、プログラム実行制御部１０６に実行させる。また、プログラム実行制御部１０６は、バイトコードのうち、ネイティブコードへのコンパイルが有効なコードを所定の条件に基づいて検出し、検出されたコードをＪＩＴコンパイラ１０７によって、ネイティブコード１０８に変換させる。例えば、ＪＩＴコンパイラ１０７は、基準回以上実行されるコードをネイティブコードに変換する。基準回は、１回であってもよいし、複数回であってもよい。例えば、ＪＩＴコンパイラ１０７は、実行頻度の高いコードを、ネイティブコード１０８に変換してもよい。プログラムが繰り返し実行されると、ＪＩＴコンパイラ１０７によるバイトコードのネイティブコード化が繰り返し行われることによって、プログラムの最適化が進められる。最適化の結果、プログラムのバイトコードのうち、ネイティブコード化が有効なコードについてネイティブコードに変換されたプログラムが生成される。
【００２７】
また、図３において、プログラム実行制御部１０６は、プログラムプロファイル参照・更新部１０３を介して、プログラムプロファイル１０２を参照、更新する。本実施の形態例におけるプログラム実行制御部１０６は、ＪａｖａＶＭ１０１の起動時に、プログラムプロファイル１０２を参照し、実行対象のプログラムが最適化状態に変換された実績を有するか否かを判定する。実行対象のプログラムが最適化状態に変換された実績を有する場合、プログラム実行制御部１０６は、起動時に、実行対象のプログラムを、予め、ＪＩＴコンパイラ１０７によって最適化状態に変換する。詳細については、後述する。
【００２８】
続いて、一般的なｊａｖａＶＭ、及び、本実施の形態例におけるｊａｖａＶＭにおけるプログラムの処理の概要について説明する。
【００２９】
［一般的なＪａｖａＶＭの処理概要］
図４は、一般的なＪａｖａＶＭ１０１ａ、１０１ｂにおけるプログラムの処理の概要について説明する図である。この例において、ＪａｖａＶＭ１０１ａ、１０１ｂは、例えば、一回以上実行するバイトコード１０４を対象としてネイティブコード１０８に変換する。また、同図では、共通のＯＳ８０において、２つのＪａｖａＶＭ１０１ａ、１０１ｂのプロセスが動作する場合が例示される。また、以下、実行対象のプログラムをメソッドと称する。
【００３０】
図４のフローチャート図において、まず、ＪａｖａＶＭ１０１ａは、実行対象のメソッドにおける実行対象のコードがネイティブコード化されているか否かを判定する（Ｓ１１）。ネイティブコード化されていない場合（Ｓ１１のＮＯ）、ＪａｖａＶＭ１０１ａは、バイトコード１０４をネイティブコード１０８に変換する（Ｓ１２）。続いて、生成されたネイティブコード１０８に基づいてメソッドが実行される（Ｓ１３）。同様の処理が、他のＪａｖａＶＭ１０１ｂにおいて実行される。
【００３１】
生成されるネイティブコード１０８は、ＪａｖａＶＭ１０１ａ、１０１ｂそれぞれのメモリ上に生成される。このため、複数のＪａｖａＶＭ１０１ａ、１０１ｂ間で、各ｊａｖａＶＭで生成されたネイティブコード１０８や、ネイティブコード化されたコードの情報は共有されない。また、ＪａｖａＶＭ１０１ａ、１０１ｂによって生成されたネイティブコード１０８は、ＪａｖａＶＭ１０１ａ、１０１ｂの再起動を越えて保持されない。
【００３２】
［本実施の形態例におけるＪａｖａＶＭの処理概要］
図５は、本実施の形態例のＪａｖａＶＭ１０１ｃ、１０１ｄにおけるプログラムの処理の概要について説明する図である。図４の例と同様にして、ＪａｖａＶＭ１０１ｃ、１０１ｄは、一回以上実行するバイトコード１０４を対象としてネイティブコード１０８に変換する。また、この例では、共通のＯＳ８０において２つのＪａｖａＶＭ１０１ｃ、１０１ｄのプロセスが動作する場合が例示される。
【００３３】
図５のフローチャート図において、本実施の形態例におけるＪａｖａＶＭ１０１ｃは、ＪａｖａＶＭ１０１ｃ自体の起動時に、プログラムプロファイル１０２に基づいて、実行対象のメソッドのネイティブコード化を行う（Ｓ２１）。本実施の形態例におけるプログラムプロファイル１０２は、最適化状態に変換された実績を有するメソッドの識別情報と、当該メソッドのコードのうちネイティブコード１０８に変換された最適化コード情報とを有する。具体的に、ＪａｖａＶＭ１０１ｃは、プログラムプロファイル１０２が、実行対象のメソッドについて、最適化状態に変換された実績を有する場合、プログラムプロファイル１０２が有する最適化コード情報に基づいて、予め、メソッドを最適化状態に変換する。
【００３４】
続いて、ＪａｖａＶＭ１０１ｃは、メソッドにおける実行対象のコードが、ネイティブコード化されているか否かを判定する（Ｓ２２）。ネイティブコード化されていない場合（Ｓ２２のＮＯ）、ＪａｖａＶＭ１０１ｃは、バイトコード１０４をネイティブコード１０８に変換する（Ｓ２３）。実行時のパラメータや、実行環境によって、メソッドにおける実行対象のコードは異なることがある。このため、最適化状態に変換済みのメソッドであっても、ネイティブコード化の処理が生じる。続いて、ネイティブコード１０８に基づいてメソッドが実行される（Ｓ２４）。このとき、新たにネイティブコード化されたコード情報や、メソッドが最適化状態に変換されたか否かの情報等が、プログラムプロファイル１０２に更新される。他のＪａｖａＶＭ１０１ｄについても、ＪａｖａＶＭ１０１ｃと共通のプログラムプロファイル１０２を参照、更新し、同様の処理を行う。
【００３５】
このように、本実施の形態例におけるＪａｖａＶＭ１０１ｃ、１０１ｄは、起動時に、プログラムプロファイル１０２に基づいて、実行対象のメソッドについて、予め、最適化状態に変換する。これにより、ＪａｖａＶＭ１０１ｃ、１０１ｄは、メソッドの初回の実行時から、メソッドの処理速度を向上させることができる。また、本実施の形態例において、プログラムプロファイル１０２は、複数のＪａｖａＶＭ１０１ｃ、１０１ｄによって共有される。これにより、ＪａｖａＶＭ１０１ｃは、別のＪａｖａＶＭ１０１ｄの実行時に生成されたプログラムプロファイル１０２に基づいて、起動時に、実行対象のメソッドを最適化状態に変換できる。また、例えば、ＪａｖａＶＭ１０１ｃが再起動される場合、ＪａｖａＶＭ１０１ｃは、前回の実行時におけるプログラムプロファイル１０２を継続して使用することができる。
【００３６】
本実施の形態例におけるＪａｖａＶＭ１０１ｃ、１０１ｄのより詳細な処理内容については、後述する。ここで、プログラムプロファイル１０２の一例について説明する。また、プログラムプロファイル１０２の例について説明する前に、プログラムプロファイル１０２に対応するメソッドの一例、及び、当該メソッドにおいてネイティブコード化されるコードの一例について説明する。
【００３７】
［プログラムの具体例］
図６は、Ｊａｖａ言語で記述されたプログラムのソースコード１１１の一例を示す図である。同図のソースコード１１１が変換されることによって、バイトコード１０４が生成される。例えば、同図のソースコード１１１には、普通預金クラスにおける、残高照会メソッド（関数）Ｍ１及び入金メソッド（関数）Ｍ２の処理が記述される。残高照会メソッドＭ１は、パラメータｉｄを入力として、パラメータｉｄに示される普通口座の残高を照会するメソッドである。また、入金メソッドＭ２は、パラメータｉｄ、パラメータｄｅｐｏｓｉｔＡｍｏｕｎｔを入力として、パラメータｉｄに示される普通口座に、パラメータｄｅｐｏｓｉｔＡｍｏｕｎｔの金額を入金するメソッドである。
【００３８】
図６のソースコード１１１のように、プログラムは、一般的に、ｉｆ文や、ｔｒｙ文等の分岐命令を有する。このため、実行対象のコードは、分岐命令の判定結果に基づいて変化する。また、プログラムは、ｆｏｒ文等の命令を有する。このため、コードによっては１回のメソッドの実行を通して複数回実行される。一方、例外処理が記述されるコードは、実行対象になり難いため、実行頻度が低い。このように、同一のメソッド内のコードであっても、各コードの実行頻度は異なる。このため、例えば、複数回以上、実行されるコードを対象としてネイティブコードへの変換が行われる場合、同一のメソッド内のコードであっても、ネイティブコードに変換されるコードと、バイトコードのまま変換が行われないコードとがある。
【００３９】
［プログラムのネイティブコード化例］
図７は、図６のプログラムにおいて、ネイティブコード化されるコードの一例について説明する図である。同図において、破線で囲まれたコードについてブロック化され、各コードブロックに対して番号が付与される。そして、同図において、太線で囲まれたコードブロック内のコードは、ＪＩＴコンパイラ１０７によってネイティブコード化されたコードである。この例において、メソッドＭ１にコードにおいて、ブロックＢ２〜Ｂ３、ブロックＢ６〜Ｂ８、ブロックＢ１６、ブロックＢ１８〜Ｂ１９に対応するコードがネイティブコードに変換されている。
【００４０】
［プログラムプロファイルの例］
図８は、図７のプログラムに対応するプログラムプロファイル１０２−１の一例を示す図である。同図のプログラムプロファイル１０２−１は、例えば、メソッド識別子、実行回数、バイトコードサイズ、ネイティブコードサイズ、最適化ブロック情報、最適化完了フラグを有する。
【００４１】
メソッド識別子はメソッドを特定可能な情報であって、例えば、メソッド名を示す。また、実行回数は、ＪａｖａＶＭ１０１の起動後、メソッドが実行された回数を示す。そして、バイトコードサイズは、メソッドのコードにおけるバイトコードのサイズ（ｂｙｔｅ）を、ネイティブコードサイズは、メソッドのコードにおけるネイティブコードのサイズ（ｂｙｔｅ）を示す。そして、最適化ブロック情報は、ネイティブコードに変換されたコードブロックの番号を示す。最適化完了フラグは、メソッドが最適化状態まで変換されたか否かを示す。
【００４２】
図８のプログラムプロファイル１０２−１は、残高照会メソッドＭ１について、ｊａｖａＶＭ１０１の起動後、１００回実行された旨の情報を有する。また、プログラムプロファイル１０２−１は、残高照会メソッドＭ１について、バイトコードサイズ８０ｂｙｔｅ、ネイティブコードサイズ１３２４ｂｙｔｅの情報、及び、最適化状態に未変換である旨の最適化完了フラグＮを有する。また、プログラムプロファイル１０２−１は、最適化ブロック情報として、ネイティブコードに変換されたコードブロック（図７）の番号２,３,６,７,８,１６,１８,１９を有する。
【００４３】
このように、プログラムプロファイル１０２−１は、実行実績のある各メソッドについて、メソッドの識別情報、当該メソッドが最適化状態に変換されたか否かを示す最適化完了フラグ、及び、ネイティブコードに変換済みの最適化ブロック情報（最適化コード情報）等を有する。このようなプログラムプロファイル１０２−１に基づいて、ｊａｖａＶＭ１０１の起動時に最適化処理が行われる。
【００４４】
続いて、本実施の形態例におけるＪａｖａＶＭ１０１の処理の詳細について、フローチャート図に基づいて順次説明する。
【００４５】
［全体の処理を示すフローチャート］
図９は、ＪａｖａＶＭ１０１の全体の処理について説明するフローチャート図である。ＪａｖａＶＭ１０１のプログラム実行制御部１０６は、起動時に、ＪａｖａＶＭ１０１の起動処理を行うと共に（Ｓ３１）、起動初期処理制御を行う（Ｓ３２）。具体的に、ｊａｖａＶＭ１０１は、起動初期処理制御として、プログラムプロファイル１０２に基づいて、実行対象のメソッドの最適化状態へ変換を行う。起動初期処理制御の詳細については、別のフローチャート図に基づいて後述する。続いて、プログラム実行制御部１０６は、プログラムプロファイル制御を行う（Ｓ３３）。プログラム実行制御部１０６は、プログラムプロファイル制御として、実行対象のメソッドを実行すると共に、実行後のメソッドの情報に基づいて、プログラムプロファイル１０２を更新する。プログラムプロファイル制御の詳細についても、別のフローチャート図に基づいて後述する。
【００４６】
［起動初期処理制御のフローチャート］
図１０は、起動初期処理制御工程の処理について説明するフローチャート図である。この処理は、図９のフローチャート図における工程Ｓ３２の処理に対応する。
【００４７】
初めに、プログラム実行制御部１０６は、プログラムプロファイル１０２が存在するか否かを判定する（Ｓ４１）。プログラムプロファイル１０２が存在する場合（Ｓ４１のＹＥＳ）、プログラム実行制御部１０６は、続いて、プログラムプロファイル１０２を参照し、実行対象メソッドを最適化するか否かを判定する（Ｓ４２）。具体的に、プログラム実行制御部１０６は、実行対象メソッドについて、プログラムプロファイル１０２において最適化完了フラグがＹを示す場合に、実行対象メソッドを最適化する。最適化完了フラグがＹを示す場合、同じまたは別のＪａｖａＶＭ１０１の実行時において、実行対象メソッドが最適化状態にまで変換された実績を有することを示す。同じまたは別のＪａｖａＶＭ１０１の実行時とは、例えば、同一のＯＳ上で動作する他のＪａｖａＶＭ１０１の実行時、別のＯＳ上で動作するＪａｖａＶＭ１０１の実行時、ＪａｖａＶＭ１０１の前回の実行時、等である。
【００４８】
実行対象メソッドの最適化完了フラグがＹを示す場合（Ｓ４２のＹＥＳ）、ＪａｖａＶＭ１０１のＪＩＴコンパイラ１０７は、プログラムプロファイル１０２における最適化ブロック情報に基づいて、実行対象メソッドを最適化状態に変換する。具体的に、ｊａｖａＶＭ１０１は、実行対象メソッドのバイトコードのうち最適化ブロック情報（最適化コード情報）に対応するバイトコードをネイティブコードに変換する。
【００４９】
一方、プログラムプロファイル１０２が存在しない場合（Ｓ４１のＮＯ）、または、実行対象メソッドの最適化完了フラグがＮを示す場合（Ｓ４２のＮＯ）、ＪａｖａＶＭ１０１の起動時における実行対象メソッドの変換処理は行われない。そして、プログラムプロファイル１０２の参照が最後まで終了すると、プログラム実行制御部１０６は、起動初期処理制御（図９のＳ３２）を終了する。
【００５０】
［プログラムプロファイル制御工程のフローチャート］
図１１は、プログラムプロファイル制御工程の処理について説明するフローチャート図である。この処理は、図９のフローチャート図における工程Ｓ３３の処理に対応する。プログラム実行制御部１０６は、起動後、実行対象のメソッドが、プログラムプロファイル１０２に基づいて最適化状態に変換済みであるか否かを判定する（Ｓ５１）。最適化状態に変換済みではない場合（Ｓ５１のＮＯ）、続いて、プログラム実行制御部１０６は、実行対象のメソッドの実行制御処理を行う（Ｓ５２）。実行制御処理工程については、別のフローチャート図において後述する。
【００５１】
続いて、プログラム実行制御部１０６は、実行制御処理工程の後、プログラムプロファイル１０２を参照し、メソッドのコードサイズが実行制御処理前後で同一であるか否かを判定する（Ｓ５３）。具体的に、プログラム実行制御部１０６は、メソッドについて、プログラムプロファイル１０２におけるコードサイズ（バイトコードサイズ、ネイティブコードサイズ）と、実行制御処理工程後のコードサイズとが同一であるか否か判定する。同一の場合（Ｓ５３のＹＥＳ）、プログラム実行制御部１０６は、メソッドのコードサイズが同一の場合にカウントアップされる実行回数が、閾値（基準実行回数）を超えたか否かを判定する（Ｓ５４）。
【００５２】
閾値を超えた場合（Ｓ５４のＹＥＳ）、プログラム実行制御部１０６は、メソッドが最適化状態に変換されたとみなし、メソッドが最適化完了状態に到達したものと判定する（Ｓ５５）。具体的に、プログラム実行制御部１０６は、閾値で指定される基準実行回、メソッドの実行制御処理工程の前後でメソッドのコードサイズが変化しない場合に、メソッドが最適化状態に変換され、最適化完了点に達したものとみなす。つまり、メソッドが繰り返し実行されることによって、メソッド内のコードが順次、ネイティブコード化され、新たに、ネイティブコード化されるコードがなくなったとき、メソッドのコードサイズの変化が収束し、メソッドが最適化状態に変換されたとみなされる。
【００５３】
一方、メソッドのコードサイズが実行制御処理の前後で同一であって（Ｓ５３のＹＥＳ）、実行回数が閾値を超えない場合（Ｓ５４のＮＯ）、プログラム実行制御部１０６は、実行回数をカウントアップする（Ｓ５６）。また、メソッドのコードサイズが実行制御処理の前後で異なる場合（Ｓ５３のＮＯ）、プログラム実行制御部１０６は実行回数をリセットする（Ｓ５７）。また、ＪａｖａＶＭ１０１の起動時に、実行対象のメソッドがプログラムプロファイル１０２に基づいて最適化状態に変換済みである場合についても（Ｓ５１のＹＥＳ）、実行対象のメソッドの実行制御処理が行われる（Ｓ５２）。また、このとき、最適化完了点に達しているものとみなされる（Ｓ５５）。
【００５４】
続いて、プログラム実行制御部１０６は、プログラムプロファイル１０２を更新する（Ｓ５６）。具体的に、プログラム実行制御部１０６は、メソッドの実行回数、バイトコードサイズ、ネイティブコードサイズ、最適化ブロック情報、最適化完了フラグについて、プログラムプロファイル１０２に更新する。なお、メソッドが最適化状態に変換された場合（Ｓ５４のＹＥＳ）、最適化完了フラグはＮからＹに更新される。また、プログラム実行制御部１０６は、メソッドがプログラムプロファイル１０２に登録されていない場合、メソッドの情報を、新たにプログラムプロファイル１０２に登録する。
【００５５】
［実行制御処理工程のフローチャート］
図１２は、メソッドの実行制御処理工程の処理を説明するフローチャート図である。この処理は、図１１のフローチャート図における工程Ｓ５２に対応する。
【００５６】
まず、プログラム実行制御部１０６は、次の実行対象のメソッドを呼び出す（Ｓ６１）。続いて、プログラム実行制御部１０６は、メソッド内の実行対象のコードがネイティブコードに変換されているか否かを判定する（Ｓ６２）。実行対象のコードがネイティブコードに変換されていない場合であって（Ｓ６２のＮＯ）、動的コンパイルの対象とされる場合（Ｓ６３のＹＥＳ）、プログラム実行制御部１０６は、対象のバイトコードについて、インタプリタ１０５によって処理させ実行すると共に（Ｓ６４）、ＪＩＴコンパイラ１０７に動的コンパイルさせる（Ｓ６５）。なお、実行対象のコードがコンパイルの対象とされる場合（Ｓ６３のＹＥＳ）とは、例えば、実行対象のコードの実行回数が基準回を超えた場合である。
【００５７】
一方、実行対象のコードがネイティブコードに変換されていない場合であって（Ｓ６２のＮＯ）、動的コンパイルの対象とされない場合（Ｓ６３のＮＯ）、プログラム実行制御部１０６はバイトコードをインタプリタ１０５に処理させ実行する（Ｓ６４）。また、実行対象のコードが既にネイティブコードに変換済みである場合（Ｓ６２のＹＥＳ）、プログラム実行制御部１０６はネイティブコードを実行する（Ｓ６６）。
【００５８】
続いて、実行制御処理工程によって、さらにネイティブコードへの変換処理が行われたプログラムのネイティブコード化の例、及び、プログラムプロファイル１０２の更新例を挙げる。
【００５９】
［プログラムのネイティブコード化例］
図１３は、実行制御処理工程によってネイティブコード化がさらに進められた図７のプログラムの例を示す図である。同図において、点線で囲まれたコードブロックは、新たに、ネイティブコードに変換されたコードブロックを示す。具体的に、この例において、ブロックＢ２〜Ｂ３、ブロックＢ６〜Ｂ８、ブロックＢ１６、ブロックＢ１８〜Ｂ１９に加えて、新たに、ブロックＢ９〜Ｂ１２に対応するコードがネイティブコードに変換されている。このように、メソッドが繰り返し実行されることによって、ネイティブコードへの変換状態が変移する。
【００６０】
［プログラムプロファイルの例］
図１４は、図１３のメソッドに対応して更新されたプログラムプロファイル１０２−２の一例を示す図である。同図のプログラムプロファイル１０２−２は、図８のプログラムプロファイル１０２−１に対して、各メソッドの実行に伴って更新されている。
【００６１】
具体的に、残高照会メソッドＭ１について、図１４のプログラムプロファイル１０２−２は、図７のプログラムプロファイル１０２−１に対して、最適化ブロック情報にブロック番号９〜１２が追加されている。また、実行回数が１０００回に、バイトコードサイズが８０バイトに、ネイティブコードサイズが３３０４バイトに更新されていると共に、最適化完了フラグがＮからＹに更新されている。これは、残高照会メソッドＭ１のコードサイズの変化が収束し、最適化状態に変換されたとみなされたことを示す。また、入金メソッドＭ２についても、図８のプログラムプロファイル１０２−１に対して、実行回数が３４０回に更新されていると共に、ネイティブコードサイズが０バイトから２５１０バイトに更新されている。なお、入金メソッドＭ２については、最適化完了フラグはＮのまま更新されていない。他のメソッドについても、同様に更新される。
【００６２】
このように、本実施の形態例におけるｊａｖａＶＭ１０１によって、メソッドが実行されることによって、最適化状態に変換された実績を有するメソッドの情報と、当該メソッドの最適化ブロック情報（最適化コード情報）とがプログラムプロファイル１０２−２に記憶される。即ち、本実施の形態例におけるｊａｖａＶＭ１０１によると、メソッドの実行を繰り返すことによって、最適化状態に変換された実績を有するメソッドの識別情報と最適化コード情報とを有するプログラムプロファイル１０２が自動的に生成される。
【００６３】
そして、本実施の形態例におけるＪａｖａＶＭ１０１は、ＪａｖａＶＭ１０１の起動時に、プログラムプロファイル１０２を参照することによって、実行対象のメソッドのうち、最適化状態に変換された実績を有する実行対象のメソッドについて、予め、最適化状態に変換しておくことができる。これにより、本実施の形態例におけるｊａｖａＶＭ１０１は、実行対象のメソッドについて、繰り返し実行することによって徐々に変換していくのではなく、メソッドの実行前に最適化状態に変換することができる。これにより、メソッド実行時のオーバヘッドが最小限に抑えられ、初回実行時から処理が高速化される。
【００６４】
また、ｊａｖａＶＭの起動時に、実行対象のメソッドにおける全てのコードを対象としてネイティブコード化する場合、ネイティブコード化するメリットの低いコードや、ネイティブコード化が不要なコードについても変換することになり、時間がかかる。これに対し、本実施の形態例におけるｊａｖａＶＭは、起動時に、実行対象のメソッドにおける全てのコードではなく、ネイティブコード化が有効なコードを対象としてネイティブコードに変換する。例えば、メソッドにおけるコードのうち、実行頻度の高いコードについて、ネイティブコードに変換される。これにより、起動時におけるネイティブコードへの変換処理が最小限に抑えられ、起動時間が短く抑えられる。また、近年、プロセッサや外部記憶装置について、処理能力が大幅に向上しているため、ｊａｖａＶＭ起動時における大幅な負荷の増加や、起動時間の増大は生じ難い。
【００６５】
［異なるメソッドが実行される場合］
なお、本実施の形態例におけるｊａｖａＶＭ１０１は、プログラムプロファイル１０２を共有する複数のｊａｖａＶＭ１０１間で異なるメソッドが実行される場合についても有効である。
【００６６】
図１５は、異なるメソッドＭａ、Ｍｂがそれぞれ記述されるバイトコード１０４ａ、１０４ｂの示す図である。この例において、各メソッドＭａ、Ｍｂにおいて、共通ライブラリが有する共通メソッドＭ１１、Ｍ１２が呼び出される。共通メソッドとは、図２で前述したとおり、共有バイトコード群１１０に含まれる共通メソッド（ファイルＩ／Ｏメソッドや、セキュリティメソッド等）である。共有バイトコード群１１０は、ＪａｖａＶＭ１０１内にバイトコード１０４として保持される。
【００６７】
図１５の例において、例えば、メソッドＭａが実行されることによって、メソッドＭａから呼び出される共通メソッドＭ１１、Ｍ１２が最適化状態に変換された場合、プログラムプロファイル１０２には共通メソッドＭ１１、Ｍ１２の最適化コード情報が記憶される。そして、メソッドＭｂの実行のために別のＪａｖａＶＭ１０１が新たに起動された場合、別のＪａｖａＶＭ１０１の起動時に、プログラムプロファイル１０２に基づいて、共通メソッドＭ１１、Ｍ１２が最適化状態に変換される。別のＪａｖａＶＭ１０１は、共通メソッドＭ１１、Ｍ１２が最適化状態にネイティブコード化されていることから、メソッドＭｂを高速に実行することができる。
【００６８】
このように、複数のｊａｖａＶＭ１０１において、異なるメソッドを実行する場合であっても、各ｊａｖａＶＭ１０１は、起動時に、呼び出し頻度が高い共通バイドコード群１１０を最適化状態に変換しておくことができる。これにより、メソッドから呼び出される共通バイドコード群１１０の処理が高速化されるため、メソッドの実行処理についても高速化される。また、最適化状態に変換された実績を有する共通メソッドは実行頻度が高い場合が多いことから、複数のメソッドから呼び出される可能性も大きい。これにより、ｊａｖａＶＭ１０１の起動時に、最適化状態に変換された実績を有する共通メソッドが最適化状態に変換されることにより、メソッドの処理についても高速化される。
【００６９】
続いて、プログラムプロファイルの共有形態の例について説明する。
【００７０】
［プログラムプロファイルの共有形態］
図１６は、プログラムプロファイル１０２の共有形態の例について説明する図である。同図には、プログラムプロファイル１０２が共有される３つの事例が示される。同図の（Ａ）は、同一のコンピュータ１００ＸのＯＳ上で動作する２つのＪａｖａＶＭ１０１ａ、１０１ｂのうち、１つのＪａｖａＶＭ１０１ｂが再起動される例を示す。この例において、再起動されたＪａｖａＶＭ１０１ｂは、起動時に、前回使用した共有のプログラムプロファイル１０２を参照することができる。つまり、ＪａｖａＶＭ１０１ｂは、起動と終了を跨いで、プログラムプロファイル１０２を使用することができる。これにより、ＪａｖａＶＭ１０１ｂは、実行対象のメソッドのうち、ＪａｖａＶＭ１０１ａの実行時、及び、ｊａｖａＶＭ１０１ｂの前回の実行時に最適化状態に変換された実績を有するメソッドについて、起動時に、最適化状態に変換することができる。
【００７１】
また、図１６の（Ｂ）は、異なるコンピュータ１００Ｘ、１００Ｙにおいて実行中のＪａｖａＶＭ１０１ａ〜１０１ｄにおいて、１つのプログラムプロファイル１０２が参照、更新される場合を例示する図である。この例において、コンピュータ１００ＸにおいてＪａｖａＶＭ１０１ａ、１０１ｂ、コンピュータ１００ＹにおいてＪａｖａＶＭ１０１ｃ、１０１ｄが実行される。このように、本実施の形態例におけるプログラムプロファイル１０２は、異なるＯＳ上で起動される複数のｊａｖａＶＭ１０１間で共有されてもよい。また、同図の（Ｃ）は、同一のコンピュータ１００Ｘにおいて、新たに起動されたＪａｖａＶＭ１０１ｄによって、既に起動中のＪａｖａＶＭ１０１ａが生成したプログラムプロファイル１０２が参照、更新される場合を例示する図である。このように、本実施の形態例におけるプログラムプロファイル１０２は、既存のｊａｖａＶＭ１０１ａと、新たに起動されるｊａｖａＶＭ１０１ｄとの間で共有されてもよい。
【００７２】
このように、本実施の形態例におけるプログラムプロファイル１０２は、異なるＯＳ上で動作する複数のｊａｖａＶＭ１０１や、異なる時間帯に実行される複数のＪａｖａＶＭ１０１によって、共有可能である。これにより、ＪａｖａＶＭ１０１によるプログラム実行処理が効率化される。
【００７３】
［プログラムプロファイルの洗練］
また、本実施の形態例におけるｊａｖａＶＭ１０１は、メソッドの実行を繰り返すことによってプログラムプロファイル１０２を自動的に生成することができる。このため、ユーザは、プログラムプロファイル１０２の情報を一から生成する必要がない。例えば、開発環境において生成されたプログラムプロファイル１０２が、運用環境において使用されることにより、高精度なプログラムプロファイル１０２が生成される。
【００７４】
図１７は、高精度なプログラムプロファイル１０２の生成工程について説明する図である。同図の例では、開発環境２００におけるプログラムプロファイル１０２を、運用環境３００に適用する場合について例示する。開発環境２００では、一般的に、運用環境と同じシステム構成、及び、運用形態を想定してテスト等が行われる。このため、開発環境２００におけるテスト等の実行を通して、運用環境３００において有効なプログラムプロファイル１０２が自動生成される。これにより、運用環境３００におけるプログラムプロファイル１０２の生成に係る手間が省略される。また、開発環境２００及び運用環境３００においてプログラムプロファイル１０２の更新を繰り返すことによって、プログラムプロファイル１０２の情報がより洗練され、さらに高精度なプログラムプロファイル１０２が生成可能になる。
【００７５】
［実行速度］
図１８は、本実施の形態例におけるＪａｖａＶＭ１０１によるメソッドの実行速度について説明する図である。同図は、一般的なＪａｖａＶＭによるメソッドの実行速度を表すグラフＧ１と、本実施の形態例におけるＪａｖａＶＭ１０１によるメソッドの実行速度を表すグラフＧ２を有する。各グラフＧ１、Ｇ２における横軸はメソッドの実行回数、縦軸はメソッドの実行時間（ｍｓ）を示す。グラフＧ１、Ｇ２は、ＪａｖａＶＭを起動し、同一のメソッドを連続して実行した場合における実行回数と実行時間との対応関係を示す。
【００７６】
一般的なＪａｖａＶＭにおけるメソッドの実行速度を示すグラフＧ１において、プログラムの実行回数の増加に伴って、実行時間が指数関数的に低下している。具体的に、実行回数が約５０００回のとき実行時間は１０００ｍｓ程度であって、実行回数が約１００００回を超えると、実行時間は約５０ｍｓ程度で収束する。このように、一般的はＪａｖａＶＭ１０１によると、初期の実行回数における実行時間が長く、実行回数の増加に連れてコードの最適化が進むことにより実行時間が改善される。
【００７７】
一方、本実施の形態例のＪａｖａＶＭ１０１におけるメソッドの実行速度を示すグラフＧ２では、グラフＧ１に対して、初期の実行回数から実行時間が短い。このように、本実施の形態例におけるＪａｖａＶＭ１０１は、起動直後から、高速にメソッドを実行することができる。このように、本実施の形態例におけるｊａｖａＶＭ１０１によると、メソッドが効率的に実行される。なお、この例において、ＪａｖａＶＭ１０１の起動時に、実行対象のメソッドについて、最適化状態に変換された実績と、その最適化コード情報とを有するプログラムプロファイル１０２が存在しているものとする。
【００７８】
以上のように、本実施の形態例におけるプログラム実行制御処理は、実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおけるバイトコードをネイティブコードに変換する第１の変換工程を有する。また、プログラム実行制御処理は、起動時に、同じまたは別のプログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、実行対象プログラムの識別情報に基づいて、当該実行対象プログラムが最適化完了プログラムに該当するか否かを判定する判定工程を有する。また、プログラム実行制御処理は、最適化完了プログラムに該当する場合、起動時に、実行対象プログラムのバイトコードのうち最適化コード情報に対応するバイトコードをネイティブコードに変換する第２の変換工程と、を有する。
【００７９】
これにより、本実施の形態例におけるプログラム実行制御プログラムは、起動時に、プログラムプロファイルを参照することによって、実行対象プログラム（メソッド）のうち、最適化状態に変換された実績を有する実行対象プログラムについて、プログラムの実行前に、予め、最適化状態に変換しておくことができる。これにより、プログラム実行時のオーバヘッドが最小限に抑えられ、プログラムは初回の実行時から高速に実行可能になる。また、プログラム実行時の処理が効率化され負荷が軽減されることによって、プログラム実行時における計算機のシステムリソース（プロセッサやメモリ）の使用率が削減される。
【００８０】
また、本実施の形態例におけるプログラム実行制御プログラムは、起動時に、実行対象プログラムにおける全てのコードではなく、ネイティブコード化が有効なコードを対象としてネイティブコード化する。このため、本実施の形態例におけるプログラム実行制御プログラムは、汎用性があり事前にコンパイルが不要なバイトコードについて、その利便性を活かしながら、プログラムの実行前に最適化状態にネイティブコード化することができる。また、本実施の形態例において、プログラム実行制御プログラムの起動時におけるネイティブコード化処理は、必要最小限に抑えられる。このため、必要以上にネイティブコードへの変換処理が行われることが回避され、プログラム実行制御プログラムの起動時間が増大することが回避される。
【００８１】
また、本実施の形態例におけるプログラム実行制御プログラムにおいて、プロファイルは複数のプログラム実行制御プログラムによって共有可能である。このため、プログラム実行制御プログラムは、プログラム実行制御プログラムの起動と終了を跨いで、前回のプログラム実行時におけるプロファイルを継続使用することができる。また、プログラム実行制御プログラムは、他のプログラム実行制御プログラムによって生成されたプロファイルを利用することができる。これにより、プログラム実行制御プログラムは、動作環境の変化や、再起動の有無に因ることなく、プログラムを初回から高速に実行することができ、プログラムの実行を効率化することができる。
【００８２】
なお、プログラム実行制御プログラムでは、一般的に、メモリ領域（ヒープ領域）と非ヒープ領域の両方のメモリを開放するＦｕｌｌ ＧＣ（フルガーベジコレクション）が行われる。本実施の形態例におけるプログラム実行制御プログラムよると、例えば、Ｆｕｌｌ ＧＣによるプログラム実行制御プログラムの切り替えが生じた場合に、プロファイルに基づいて、切り替え前の実行対象プログラムの最適化コード情報を引き継ぐことができる。これにより、本実施の形態例におけるプログラム実行制御プログラムは、Ｆｕｌｌ ＧＣ等によるプログラム実行制御プログラムの切り替え制御が生じた場合であっても、切り替え直後から、実行対象のプログラムを高速に実行することができる。
【００８３】
また、本実施の形態例のプログラム実行制御処理における第１の変換工程では、実行対象プログラムが最適化状態に変換されたとき、当該実行対象プログラムの識別情報と最適化コード情報とを、プロファイルに記録する。
【００８４】
これにより、本実施の形態例におけるプログラム実行制御プログラムは、プログラムの実行を繰り返すことによって、プロファイルを自動的に生成することができる。これにより、プログラム実行制御プログラムは、プロファイルを一から生成する必要がない。また、プログラム実行制御プログラムは、例えば、運用形態の類似する複数の環境において、プロファイルを共有することによって、より高精度のプロファイルを生成することができる。即ち、プログラム実行制御プログラムは、プロファイルを共有、及び、継続して使用することによって、より高精度なプロファイルを生成することができる。
【００８５】
また、本実施の形態例のプログラム実行制御処理において、同じまたは別のプログラム実行制御プログラムの実行時は、同時に実行されるプログラム実行制御プログラムの実行時、または、異なる時間帯に実行されたプログラム実行制御プログラムの実行時のいずれかまたは両方である。これにより、本実施の形態例におけるプログラム実行制御プログラムは、前回のプログラム実行時におけるプロファイルを使用することができ、プログラム実行制御プログラムの再起動に基づく実行対象プログラムの実行速度の低下を最小限にすることができる。
【００８６】
本実施の形態例のプログラム実行制御処理において、同じまたは別のプログラム実行制御プログラムの実行時は、共通のオペレーションシステムで動作するプログラム実行制御プログラムの実行時、または、異なるオペレーションシステムで動作するプログラム実行制御プログラムの実行時のいずれかまたは両方である。これにより、本実施の形態例におけるプログラム実行制御プログラムは、同一のＯＳ上、または、異なるＯＳ上で動作する複数のプログラム実行制御プログラムと、プロファイルを共有することができる。
【００８７】
また、本実施の形態例のプログラム実行制御処理における第１の変換工程では、実行対象プログラムのコードサイズが収束したとき、実行対象プログラムが最適化状態に変換されたとみなす。これにより、プログラム実行制御プログラムは、プログラムのコードサイズに基づいて、プログラムが最適化状態に変換されたか否かを判定することができる。
【００８８】
また、本実施の形態例のプログラム実行制御処理における第１の変換工程では、基準実行回数、実行対象プログラムの実行の前後でコードサイズが変化しない場合に、実行対象プログラムのコードサイズが収束したことを示す。これにより、プログラム実行制御プログラムは、プログラムのコードサイズが収束したか否かを容易に判定することができる。
【００８９】
また、プログラム実行制御処理の第１の変換工程における所定の条件は、基準回以上実行されるバイトコードのネイティブコードへの変換である。これにより、プログラム実行制御プログラムは、プログラムのバイトコードのうち、ネイティブコードへのコンパイルが有効なコードを対象として、ネイティブコードに変換することができる。これにより、プログラム実行制御プログラムは、起動時におけるプログラムのコンパイル対象のコードを最小限に抑えることができる。
【００９０】
以上の実施の形態をまとめると、次の付記のとおりである。
【００９１】
（付記１）
バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御処理を行うプログラム実行制御プログラムであって、
前記プログラム実行制御処理は、
実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおける前記バイトコードを前記ネイティブコードに変換する第１の変換工程と、
起動時に、同じまたは別の前記プログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、前記実行対象プログラムの前記識別情報に基づいて、当該実行対象プログラムが前記最適化完了プログラムに該当するか否かを判定する判定工程と、
前記最適化完了プログラムに該当する場合、前記起動時に、前記実行対象プログラムのバイトコードのうち前記最適化コード情報に対応するバイトコードを前記ネイティブコードに変換する第２の変換工程と、を有するプログラム実行制御プログラム。
【００９２】
（付記２）
付記１において、
前記第１の変換工程では、前記実行対象プログラムが前記最適化状態に変換されたとき、当該実行対象プログラムの前記識別情報と前記最適化コード情報とを、前記プロファイルに記録するプログラム実行制御プログラム。
【００９３】
（付記３）
付記１または２において、
前記同じまたは別の前記プログラム実行制御プログラムの実行時は、同時に実行される前記プログラム実行制御プログラムの実行時、または、異なる時間帯に実行された前記プログラム実行制御プログラムの実行時のいずれかまたは両方であるプログラム実行制御プログラム。
【００９４】
（付記４）
付記１乃至３のいずれかにおいて、
前記同じまたは別の前記プログラム実行制御プログラムの実行時は、共通のオペレーションシステムで動作する前記プログラム実行制御プログラムの実行時、または、異なるオペレーションシステムで動作する前記プログラム実行制御プログラムの実行時のいずれかまたは両方であるプログラム実行制御プログラム。
【００９５】
（付記５）
付記１乃至４のいずれかにおいて、
前記第１の変換工程では、前記実行対象プログラムのコードサイズが収束したとき、前記実行対象プログラムが前記最適化状態に変換されたとみなすプログラム実行制御プログラム。
【００９６】
（付記６）
付記５において、
前記第１の変換工程では、基準実行回数、前記実行対象プログラムの実行の前後で前記コードサイズが変化しない場合に、前記実行対象プログラムの前記コードサイズが収束したことを示すプログラム実行制御プログラム。
【００９７】
（付記７）
付記１乃至６のいずれかにおいて、
前記第１の変換工程における前記所定の条件は、基準回以上実行される前記バイトコードの前記ネイティブコードへの変換であるプログラム実行制御プログラム。
【００９８】
（付記８）
バイトコードのプログラムについて、少なくとも一部をネイティブコードに変換して実行するプログラム実行制御方法であって、
実行対象である実行対象プログラムの実行時に、所定の条件に基づいて、当該実行対象プログラムにおける前記バイトコードを前記ネイティブコードに変換する第１の変換工程と、
起動時に、同じまたは別の前記プログラム実行制御プログラムの実行時におけるプロファイルであって、最適化状態に変換された実績を有する最適化完了プログラムの識別情報と、当該最適化完了プログラムのネイティブコードに変換済みの最適化コード情報とを有するプロファイルを参照して、前記実行対象プログラムの前記識別情報に基づいて、当該実行対象プログラムが前記最適化完了プログラムに該当するか否かを判定する判定工程と、
前記最適化完了プログラムに該当する場合、前記起動時に、前記実行対象プログラムのバイトコードのうち前記最適化コード情報に対応するバイトコードを前記ネイティブコードに変換する第２の変換工程と、を有するプログラム実行制御方法。
【符号の説明】
【００９９】
１００：コンピュータ、１０１：プログラム実行制御プログラム（ＪａｖａＶＭ）、１０２：プログラムプロファイル、１０３：プログラムプロファイル参照・更新部、１０４：バイトコード、１０５：インタプリタ、１０６：プログラム実行制御部、１０７：ＪＩＴコンパイラ、１０８：ネイティブコード
【図１】
2014191493.tif 000003
【図２】
2014191493.tif 000004
【図３】
2014191493.tif 000005
【図４】
2014191493.tif 000006
【図５】
2014191493.tif 000007
【図６】
2014191493.tif 000008
【図７】
2014191493.tif 000009
【図８】
2014191493.tif 000010
【図９】
2014191493.tif 000011
【図１０】
2014191493.tif 000012
【図１１】
2014191493.tif 000013
【図１２】
2014191493.tif 000014
【図１３】
2014191493.tif 000015
【図１４】
2014191493.tif 000016
【図１５】
2014191493.tif 000017
【図１６】
2014191493.tif 000018
【図１７】
2014191493.tif 000019
【図１８】
2014191493.tif 000020
【図１９】
2014191493.tif 000021