(57)【要約】【課題】ＪＩＴコンパイル中であるメソッドが呼び出された際のオーバーヘッドを軽減するプログラム実行制御装置を提供する。【解決手段】本発明に係るプログラム実行制御装置は、メソッド呼び出しの際に、当該メソッドがコンパイル済みであるか否かを判定し、当該メソッドがコンパイル済みであれば、当該メソッドのネイティブコードを実行する。当該メソッドがコンパイル済みでなければ、当該メソッドのコンパイルの終了を待ってから当該メソッドのネイティブコードを実行するか、もしくは当該メソッドの中間コードをインタプリタで処理するかのどちらか一方を選択する。その際、その時点において実行時間がより短いと予想される方を選択する。【選択図】図３
2011002976.tif 000002
【特許請求の範囲】
【請求項１】
コンパイラと、インタプリタと、別タスクで行うＪＩＴコンパイラとを備え、ソースコードから生成した中間コードを順次読み込んで、解釈実行するプログラム実行制御装置であって、
前記ＪＩＴコンパイラによる前記中間コードのＪＩＴコンパイル状況をメソッド情報としてメソッド毎に保持するメソッド情報管理手段と、
前記メソッド情報管理手段に保持されているメソッド情報へのアクセスを制御するメソッド情報更新手段と、
前記メソッド情報管理手段に保持されているメソッド情報に基づいて、前記ＪＩＴコンパイル状況が転換点に達しているか否かを判定するＪＩＴコンパイル状況判定手段と、
前記インタプリタによる前記中間コードの実行がメソッドの呼び出しに達した際に、前記メソッド情報管理手段に保持されているメソッド情報を参照し、呼び出された前記メソッドがコンパイル中であって、前記ＪＩＴコンパイル状況が転換点に達していない場合には、前記インタプリタにより前記中間コードを逐次解釈し実行することを選択し、転換点に達している場合には、前記ＪＩＴコンパイラによるネイティブコードへの変換の終了を待ってから前記ネイティブコードを実行することを選択するプログラム制御手段を備えた
ことを特徴とするプログラム実行制御装置。
【請求項２】
前記メソッド情報は、中間コードサイズと、中間コードコンパイル済みサイズと、インタプリタ処理時間と、ＪＩＴコンパイル状況とを含むことを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項３】
前記プログラム制御手段は、呼び出された前記メソッドがコンパイル済みである場合には、前記コンパイル済みのネイティブコードを実行することを選択することを特徴とする請求項１に記載のプログラム実行制御装置。
【請求項４】
前記ＪＩＴコンパイル状況判定手段は、前記メソッド情報に含まれる前記中間コードサイズと、前記中間コードコンパイル済みサイズと、前記ＪＩＴコンパイラから通知されるＪＩＴコンパイル速度とから、ＪＩＴコンパイルの終了までに必要な残り時間と、ネイティブコードの実行時間とを見積もり、前記ＪＩＴコンパイルの終了までに必要な残り時間と前記ネイティブコードの実行時間の合計時間が、前記インタプリタ処理時間に対して短い場合に、転換点に達していると判定し、前記合計時間が、前記インタプリタ処理時間に対して短くない場合に、転換点に達していないと判定することを特徴とする請求項２に記載のプログラム実行制御装置。
【請求項５】
前記コンパイラは、前記ソースコードを前記中間コードへコンパイルする際、前記メソッド毎の前記中間コードサイズを前記中間コード中に付与することを特徴とする請求項４に記載のプログラム実行制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、中間コード列からなるプログラムを実行するプログラム実行制御装置に関し、特に、ＪＩＴコンパイラを用いたプログラム実行制御装置に関するものである。
【背景技術】
【０００２】
特定のプラットフォームに依存することなくプログラムを実行する、仮想計算機の代表的なものの一つとして、Ｊａｖａ（登録商標）言語を用いる技術がある。例えば、Ｊａｖａ（登録商標）バイトコードを解釈して実行する、ＪＶＭ（Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）が挙げられる。
【０００３】
Ｊａｖａ（登録商標）バイトコードは、Ｊａｖａ（登録商標）言語で記述されたソースコードをコンパイルすることにより生成される一種の中間コードである。また、ＪＶＭは、このバイトコードを逐次解釈してプロセッサに処理を実行させるいわゆるインタプリタとして機能する。
【０００４】
ＪＶＭの介在により、プラットフォームに依存しないプログラム実行環境を実現できるが、その実行速度は、プロセッサが直接理解できるネイティブコードに変換されたプログラムの実行速度に比べ、一般的に遅くなる。そのため、プログラム実行時に、バイトコードをネイティブコードへコンパイルするためのＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイラを備えたＪＶＭが考案され、一般に用いられている。
【０００５】
また、Ｊａｖａ（登録商標）Ｓｃｒｉｐｔなどのスクリプト言語により記述されたプログラムは、スクリプトエンジンにより実行される。このスクリプトエンジンは、プラットフォームに依存しないプログラム実行環境を実現する手段として有用である。このため、スクリプトエンジンは、インタラクティブなネットワーク上のアプリケーションを実現する手段として、ブラウザなどに実装されている。
【０００６】
このようなスクリプト言語で記述されたプログラムは、スクリプトエンジンによって一旦中間コードに変換された後、インタプリタ処理で逐次実行されることになる。このようなスクリプトエンジンにおいても、上述のＪＶＭ同様、ＪＩＴコンパイラを備えたものが知られている。
【０００７】
上述のようなインタプリタとＪＩＴコンパイラを共に備えた従来のプログラム実行制御装置は、プログラム自体の構造解析や、インタプリタ処理時の、メソッドの起動回数の計数などで、当該メソッドをＪＩＴコンパイルするか否かを決定する。これは、今後も頻繁に呼び出される可能性が高く、ＪＩＴコンパイルする価値のある箇所を優先的にＪＩＴコンパイルするためである。しかしながら、このように優先順位付けをしてＪＩＴコンパイルを行うとしても、プログラム実行開始当初などの一定期間にＪＩＴコンパイルが集中してしまうため、プログラムの応答性能の低下が顕著にあらわれるという課題があった。
【０００８】
この課題を解決するため、従来の技術では、ＪＩＴコンパイルは、インタプリタ処理やネイティブコードの実行といったプログラムの実行タスクとは別の低優先度のタスクとして、並行して行うものがあった（例えば、特許分権1参照）。
【０００９】
特許文献１に開示された従来の技術では、ＪＩＴコンパイル済みでないメソッドが呼び出された際は、常にインタプリタ処理で実行していた。また、ＪＩＴコンパイル中であるメソッドが呼び出された場合、ＪＩＴコンパイルの終了を待ってからネイティブコードを実行していた。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００４−３５５２７７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、前記従来の技術では、ＪＩＴコンパイル中であるメソッドが呼び出された際に、当該メソッドのＪＩＴコンパイルの状況に基づいて、適切に処理を切り替えることがでないという課題を有していた。
【００１２】
つまり、ＪＩＴコンパイルの終了を待ってからネイティブコードを実行するため、メソッドが呼び出されたとき、当該メソッドがまだＪＩＴコンパイル開始の直後であることも考えられる。この場合、ＪＩＴコンパイルの終了を待つ時間が、オーバーヘッドとなる。一方、常にインタプリタ処理を行う実装の場合、メソッドが呼び出されたとき、当該メソッドのＪＩＴコンパイルが既に、終了直前にまで達していると、中間コードのインタプリタ処理での実行に要する時間が、そのままオーバーヘッドとなる。
【００１３】
本発明は、前記従来の課題を解決するもので、メソッドが呼び出された際に、当該メソッドのＪＩＴコンパイルの状況に基づいて、ネイティブコード実行またはインタプリタ処理を選択するプログラム実行制御装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
前記従来の課題を解決するために、本発明のプログラム実行制御装置は、コンパイラと、インタプリタと、別タスクで行うＪＩＴコンパイラとを備え、ソースコードから生成した中間コードを順次読み込んで、解釈実行するプログラム実行制御装置であって、前記ＪＩＴコンパイラによる前記中間コードのＪＩＴコンパイル状況をメソッド情報としてメソッド毎に保持するメソッド情報管理手段と、前記メソッド情報管理手段に保持されているメソッド情報へのアクセスを制御するメソッド情報更新手段と、前記メソッド情報管理手段に保持されているメソッド情報に基づいて、前記ＪＩＴコンパイル状況が転換点に達しているか否かを判定するＪＩＴコンパイル状況判定手段と、前記インタプリタによる前記中間コードの実行がメソッドの呼び出しに達した際に、前記メソッド情報管理手段に保持されているメソッド情報を参照し、呼び出された前記メソッドがコンパイル中であって、前記ＪＩＴコンパイル状況が転換点に達していない場合には、前記インタプリタにより前記中間コードを逐次解釈し実行することを選択し、転換点に達している場合には、前記ＪＩＴコンパイラによるネイティブコードへの変換の終了を待ってから前記ネイティブコードを実行することを選択するプログラム制御手段を備えたことを特徴とする。
【００１５】
本構成によって、メソッドが呼び出された際に、当該メソッドのＪＩＴコンパイルの進捗状況に基づいて、ネイティブコードを実行するか、インタプリタ処理を行うかを、選択し、適切に処理を切り替えることができる。
【発明の効果】
【００１６】
本発明のプログラム実行制御装置によれば、呼び出されたメソッドがＪＩＴコンパイル途中である場合、当該メソッドのＪＩＴコンパイルの状況に基づいて、適切に処理を切り替えることにより、計算機システムのオーバーヘッドを削減することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施の形態におけるプログラム実行制御装置の構成を示す図
【図２】本発明の実施の形態におけるプログラム実行手段の構成を示す図
【図３】本発明の実施の形態におけるプログラム制御手段の動作のフローを示す図
【発明を実施するための形態】
【００１８】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【００１９】
図１は、本発明の実施の形態におけるプログラム実行制御装置の構成の概要図である。
【００２０】
図中１０１は、本発明のプログラム実行制御装置を示している。プログラム実行制御装置１０１は、それが動くＣＰＵに固有のネイティブコードへコンパイルされたプログラムであり、メモリシステム上に常駐してソースコードを実行する。即ち、プログラム実行制御装置１０１は、ソースコードから中間コードへのコンパイル、中間コードの順次読み出しとインタプリタによる逐次実行、中間コードからネイティブコードへのＪＩＴコンパイル、ネイティブコードの実行、を行う。
【００２１】
図中１０２は、プログラムコードの集まりであるソースコード列を表している。ソースコード列１０２は、それ自体がアプリケーションプログラムのプログラムコードであり、プログラム実行制御装置１０１が介在することにより、任意のＣＰＵで実行される。
【００２２】
図中１０３は、中間コードの集まりである中間コード列を表している。プログラム実行制御装置１０１が、ソースコード列１０２から、中間コード列１０３を生成する。中間コード列１０３は、ソースコード列１０２と同様、プログラム実行制御装置１０１の介在により動く。
【００２３】
図中１０４は、ＣＰＵ固有のネイティブコードの集まりであるネイティブコード列を表している。プログラム実行制御装置１０１が、中間コード列１０３から、メソッド毎にコンパイルして、ネイティブコードを生成する。
【００２４】
これら、ソースコード列１０２、中間コード列１０３、ネイティブコード列１０４は、また、計算機システムのメモリシステム上にある。
【００２５】
図中１０５は、ソースコード列１０２を中間コード列１０３へ変換するためのコンパイラである。コンパイラ１０５は、ソースコード列１０２から中間コード列１０３への変換を、中間コードの逐次実行に先行して、一般に一括して行う。
【００２６】
コンパイラ１０５は、ソースコード列１０２から中間コード列１０３へコンパイルする時に、メソッド毎の中間コードサイズを、中間コード内に付与する。中間コードサイズは、メソッド呼び出し時に、後述のメソッド情報管理表２０１に登録され、その後のＪＩＴコンパイル状況の判定に用いられる。
【００２７】
なお、コンパイラ１０５は、プログラム実行制御装置１０１の他の部分と切り離されていてもよい。例えば、サーバサイドが、ソースコード列１０２から中間コード列１０３へのコンパイルを行う。クライアントサイドが、ネットワーク経由で、サーバサイドから中間コード列１０３を取得し、クライアントサイドに実装されたプログラム実行制御装置１０１を実行するというような構成も可能である。
【００２８】
図中１０６は、プログラム実行手段であり、プログラム実行制御装置１０１を制御するプログラムを表している。プログラム実行手段１０６は、メソッドが呼び出された際に、当該メソッドのＪＩＴコンパイルの状況に基づいて、ネイティブコード実行またはインタプリタ処理を選択し、切り替える機能を有している。
【００２９】
図中１０７は、プログラム実行制御装置１０１のインタプリタであり、プログラム実行手段１０６が読み込んだ中間コードを逐次解釈して実行する。
【００３０】
図中１０８は、プログラム実行制御装置１０１のＪＩＴコンパイラであり、中間コードからネイティブコードへの変換をメソッド毎に行う。
【００３１】
以下、プログラム実行手段１０６、インタプリタ１０７、ＪＩＴコンパイラ１０８について説明する。
【００３２】
プログラム実行手段１０６は、コンパイラ１０５に指示を出し、ソースコード列１０２から中間コード列１０３への変換を行う。なお、前述のように、この部分はプログラム実行制御装置１０１から切り離されていてもよく、プログラム実行手段１０６の指示で中間コード列１０２へのコンパイルが行われることに限定されない。
【００３３】
次に、プログラム実行手段１０６は、中間コード列１０３を順次読み込み、インタプリタ１０７により処理していく。メソッドの呼び出しに達すると、プログラム実行手段１０６は、当該メソッドの中間コードを中間コード列１０３から読み込んでインタプリタ処理するか、ネイティブコード列１０４中の当該メソッドのネイティブコードを実行するか選択する。
【００３４】
当該メソッドの中間コードをインタプリタ処理する場合には、インタプリタ１０７により逐次実行する。
【００３５】
なお、ここにおいて、中間コードをインタプリタ処理するとは、少量の処理単位で読み込んだ中間コードに対応するネイティブコードを、ＣＰＵに実行させること指している。即ち、インタプリタ１０７が、中間コードの種類毎に、それが読み込まれたときにどのようなネイティブコードをＣＰＵに実行させるのかを管理している。そして、インタプリタ１０７が、順次読み込まれた中間コードに対応するネイティブコードを、逐次、ＣＰＵに実行させることになる。
【００３６】
他方、当該メソッドのネイティブコードを実行するとは、当該メソッドのネイティブコードがあるメモリシステムのアドレスがプログラム実行手段１０６で管理されている。そして、プログラム実行手段１０６が、そのアドレスをＣＰＵのプログラムカウンタに設定することに相当する。
【００３７】
また、プログラム実行手段１０６は、メソッドの呼び出し時に当該メソッドの中間コードを新規にＪＩＴコンパイルするか否かを判断する。ＪＩＴコンパイルする場合には、ＪＩＴコンパイラ１０８に当該メソッドのＪＩＴコンパイルを指示する。
【００３８】
インタプリタ１０７は、プログラム実行手段１０６からの指示に従い、順次読み込まれる中間コード列１０３を解釈、実行する。また、インタプリタ１０７は、メソッド毎のインタプリタ処理時間を計測し、プログラム実行手段１０６に通知する。
【００３９】
ＪＩＴコンパイラ１０８は、プログラム実行手段１０６からのＪＩＴコンパイル指示を受け、中間コードからＣＰＵ固有のネイティブコードへのＪＩＴコンパイルを行う。なお、プログラム実行制御装置１０１においては、中間コードからネイティブコードへのＪＩＴコンパイルは、インタプリタ処理や、ネイティブコードの実行といったプログラムの実行タスクとは別のタスクにおいて並行して行われる。
【００４０】
また、ＪＩＴコンパイラ１０８が、中間コードのコンパイル済みサイズをプログラム実行手段１０６に通知し、プログラム実効手段１０６においてメソッド毎に更新、保持される。なお、ＪＩＴコンパイラ１０８からの中間コードコンパイル済みサイズの通知は、一定時間が経過したタイミングや、一定サイズのＪＩＴコンパイルが終了したタイミングで行われる。
【００４１】
また、ＪＩＴコンパイラ１０８はＪＩＴコンパイル速度（中間コードの単位サイズあたりのＪＩＴコンパイル時間）を計測し、プログラム実行手段１０６に通知する。これは、後述するＪＩＴコンパイル状況判定手段２０３が、ＪＩＴコンパイルの終了までに必要な残り時間を見積もるのに用いられる。なお、ＪＩＴコンパイル速度は、直近のものに限らず、ある一定期間で平均値をとるなどして平滑化したものであってもよい。また、ＪＩＴコンパイラ１０８は、ＪＩＴコンパイルの終了をプログラム実行手段１０６に通知する。
【００４２】
以下、プログラム実行手段１０６の構成を図２に示し、動作の詳細を説明する。
【００４３】
図中２０１は、メソッド情報管理表であり、中間コードの実行時に呼び出されたメソッドの情報が初回に登録され、以後、更新される。
【００４４】
図中２０２は、メソッド情報管理表更新手段であり、メソッド情報管理表へのアクセス（読み書き）の制御を行う。
【００４５】
図中２０３は、ＪＩＴコンパイル状況判定手段であり、メソッド情報管理表に登録されているメソッドのＪＩＴコンパイルの状況を判定する。
【００４６】
図中２０４は、プログラム制御手段であり、プログラム実行手段１０６全般の制御と、プログラム実行手段１０６のデータの入出力を行う。
【００４７】
なお、プログラム実行手段１０６は、それ自体がプログラムである。また、前述のメソッド情報管理表２０１、メソッド情報管理表更新手段２０２、ＪＩＴコンパイル状況判定手段２０３、プログラム制御手段２０４は、プログラム実行手段１０６の概要を説明するために機能毎に分類して明示した構成要素である。
【００４８】
以下、メソッド情報管理表２０１、メソッド情報管理表更新手段２０２、ＪＩＴコンパイル状況判定手段２０３、プログラム制御手段２０４の動作を説明する。
【００４９】
メソッド情報管理表２０１の登録の欄は、そのラインのメソッド情報が有効であるかが登録される。ここでは、１’ｂ０が無効を、１’ｂ１が有効を表すものとする。全ライン、初期値は１’ｂ０であり、メソッド情報が新規に登録されると１’ｂ１に更新される。また、そのラインのメソッド情報が破棄されると、１’ｂ０に更新される。
【００５０】
なお、メソッド情報の破棄の方法に関して、ここでは述べないが、別途メソッドの呼び出し傾向などを管理し、呼び出されなくなったメソッドから情報を破棄するなどすればよい。
【００５１】
メソッド情報管理表２０１のメソッドＩＤの欄には、メソッドを一意に識別するためのメソッドＩＤが、プログラム制御手段２０４の指示で、メソッド情報管理表更新手段２０２により登録される。
【００５２】
以降、メソッド情報管理表の参照、更新は、直接にはメソッド情報管理表更新手段２０２が行うものとして説明する。
【００５３】
メソッド情報管理表２０１のインタプリタ処理回数の欄にはメソッド情報の新規登録時に初期値１が登録され、以後当該メソッドがインタプリタ処理されるたびにインクリメントされる。なお、インタプリタ処理の回数に閾値を設け、コンパイル開始条件に用いている場合などは、その閾値でインクリメントを停止してもよい。
【００５４】
メソッド情報管理表２０１のインタプリタ処理時間の欄には、インタプリタ１０７からプログラム制御手段２０４に通知されるメソッド毎のインタプリタ処理時間が登録、更新される。
【００５５】
なお、インタプリタ１０７でのインタプリタ処理時間の計測、インタプリタ１０７からの処理時間の通知、インタプリタ処理時間の欄への登録、更新は、当該メソッドのＪＩＴコンパイル状況の欄が２’ｂ０１の期間のみであってもよい。これは、インタプリタ処理時間が、ＪＩＴコンパイル状況判定手段２０３において、ＪＩＴコンパイル状況を２’ｂ０１から２’ｂ１０へ遷移させるときの判定にのみ用いられるからである。また、インタプリタ処理時間は、直近の値に限らず、数回の平均値をとるなどしてある程度の平滑化がなされていてもよい。また、インタプリタ処理の数回おきに計測、更新するなどでもよく、毎回行う必要はない。
【００５６】
メソッド情報管理表２０１の中間コードサイズの欄には、中間コード列１０３中に付与された値が、メソッドの呼び出し時にプログラム制御手段２０４によって読み取られ、メソッド情報の新規登録時に登録される。
【００５７】
メソッド情報管理表２０１の中間コードコンパイル済みサイズの欄には、メソッドの新規登録時に初期値０が登録され、以後、ＪＩＴコンパイラ１０８からプログラム制御手段２０４へ通知されるコンパイル済みサイズで更新される。
【００５８】
なお、ＪＩＴコンパイラ１０８におけるコンパイル済みサイズの累積、コンパイル済みサイズの通知、中間コードコンパイル済みサイズの欄の更新は、当該メソッドのＪＩＴコンパイル状況の欄が２’ｂ０１の期間のみであってもよい。これは、中間コードコンパイル済みサイズは、ＪＩＴコンパイル状況判定手段２０３において、ＪＩＴコンパイル状況を２’ｂ０１から２’ｂ１０へ遷移させるときの判定にのみ用いられるからである。
【００５９】
メソッド情報管理表２０１のＪＩＴコンパイル状況の欄には、メソッドの新規登録時に初期値で２’ｂ００が登録され、以後、コンパイルが進むにつれて更新される。
【００６０】
なお、ここでは、ＪＩＴコンパイル状況の欄の２’ｂ００が未コンパイル状態、２’ｂ０１がコンパイル中で転換点には達していない状態、２’ｂ１０がコンパイル中で転換点に達している状態、２’ｂ１１はコンパイルが終了している状態を表している。
【００６１】
プログラム制御手段２０４が、当該メソッドのＪＩＴコンパイルの開始を決定すると、当該メソッドに対応する、メソッド情報管理表２０１のＪＩＴコンパイル状況欄の値が２’ｂ００から２’ｂ０１に更新される。その後、ＪＩＴコンパイルが進み、ＪＩＴコンパイル状況判定手段２０３が転換点に達したと判定すると、ＪＩＴコンパイル状況欄の値が２’ｂ０１から２’ｂ１０に更新される。その後、ＪＩＴコンパイル終了時に、ＪＩＴコンパイル状況欄の値が２’ｂ１０から２’ｂ１１に更新される。
【００６２】
メソッド情報管理表２０１のネイティブコードのアドレスの欄には、ＪＩＴコンパイル後のネイティブコードが格納されるメモリシステムのアドレスが、当該メソッドのＪＩＴコンパイルの開始時にプログラム制御手段２０４から通知され、登録される。
【００６３】
メソッド情報管理表更新手段２０２は、プログラム制御手段２０４からのメソッド情報管理表２０１へのアクセスを制御する。メソッド情報の新規登録の際は、プログラム制御手段２０４から、メソッドＩＤ、中間コードサイズを受け、メソッド情報管理表２０１の登録の欄の値が1’ｂ０であるラインに登録する。
【００６４】
また、メソッド情報管理表更新手段２０２は、メソッド情報の新規登録の際、インタプリタ処理回数の欄の値を１に、中間コードコンパイル済みサイズの値を０に、ＪＩＴコンパイル状況の値を２’ｂ００に初期化する。
【００６５】
また、メソッド情報管理表更新手段２０２は、プログラム制御手段２０４からインタプリタ処理時間を適宜受け、更新する。
【００６６】
また、メソッド情報管理表更新手段２０２は、ＪＩＴコンパイル開始時にはネイティブコードのアドレスを受け、登録する。
【００６７】
なお、メソッド情報管理表２０１のインタプリタ処理時間の欄を更新する際に、平滑化などが行われる場合は、メソッド情報管理表更新手段２０２においてなされればよい。
【００６８】
また、メソッド情報管理表更新手段２０２は、プログラム制御手段２０４に対してインタプリタ処理回数を通知する。プログラム制御手段２０４は、インタプリタ処理回数をもとにして、当該メソッドのＪＩＴコンパイル開始を判断する。なお、インタプリタ処理回数の通知のタイミングは、プログラム制御手段２０４からのアクセスのタイミングで行われればよい。
【００６９】
また、メソッド情報管理表更新手段２０２は、ＪＩＴコンパイル状況判定手段２０３を用いて、ＪＩＴコンパイル状況を判定する。判定は、ＪＩＴコンパイル状況の欄の値が２’ｂ０１のメソッドに対してのみ行われ、ＪＩＴコンパイルが転換点に達したか否かを判定する。この際、メソッド情報管理表更新手段２０２は、ＪＩＴコンパイル状況判定手段２０３に、判定対象のメソッドのインタプリタ処理時間と、中間コードサイズと、中間コードコンパイル済みサイズを渡す。判定後、メソッド情報管理表更新手段２０２は、ＪＩＴコンパイル状況判定手段２０３から、転換点に達していることを通知された場合、メソッド情報管理表のＪＩＴコンパイル状況を２’ｂ０１から２’ｂ１０に変更する。
【００７０】
ＪＩＴコンパイル状況判定手段２０３は、メソッド情報管理表２０１の中間コードコンパイル済みサイズの更新が行われる際に、ＪＩＴコンパイル状況の欄の値を２’ｂ０１から２’ｂ１０へ遷移させるか否かの判定を行う。
【００７１】
なお、ＪＩＴコンパイル状況の判定は、インタプリタ処理時間の更新に同期して行うとしてもよいし、中間コードコンパイル済みサイズの更新とインタプリタ処理時間の更新の両方に同期するとしてもよい。
【００７２】
また、ＪＩＴコンパイル状況判定手段２０３は、ＪＩＴコンパイラ１０８からプログラム制御手段２０４を介して通知されるＪＩＴコンパイル速度を保持し、ＪＩＴコンパイルの終了までに必要な残り時間の見積もりに用いる。
【００７３】
以下、ＪＩＴコンパイル状況判定手段２０３が、ＪＩＴコンパイルの終了までに必要な残り時間とネイティブコードの実行時間とを見積もり、ＪＩＴコンパイルが転換点に達しているか否かを判定するまでの流れを例示する。
【００７４】
図２に示すように、メソッド情報管理表２０１に登録されているメソッドＩＤがｍｅｔｈｏｄ１のメソッドでは、インタプリタ処理時間が１１００[ｍｓ]である。また、中間コードサイズが１０２００［ｂｙｔｅ］、中間コードコンパイル済みサイズが２５００［ｂｙｔｅ］である。
【００７５】
いま、ＪＩＴコンパイル状況判定手段２０３が保持しているコンパイル速度が０．２［ｍｓ／ｂｙｔe］であるとし、ネイティブコードの実行時間はインタプリタ処理時間に０．０５を掛けて見積もられるものとする。
【００７６】
ＪＩＴコンパイル状況判定手段２０３は、メソッド情報管理表更新手段２０２から、インタプリタ処理時間、中間コードサイズ、中間コードコンパイル済みサイズを受け取り、ＪＩＴコンパイル終了までに必要な残り時間を見積もる。
【００７７】
このとき、ＪＩＴコンパイルの残量は１０２００［ｂｙｔｅ］−２５００［ｂｙｔｅ］＝７７００［ｂｙｔｅ］である。このため、ＪＩＴコンパイル終了までに必要な残り時間は７７００［ｂｙｔｅ］×０．２［ｍｓ／ｂｙｔe］＝１５４０［ｍｓ］となる。
【００７８】
また、ＪＩＴコンパイル状況判定手段２０３は、ネイティブコードの実行時間を１１００［ｍｓ］×０．０５＝５５［ｍｓ］と見積もる。
【００７９】
ここで、必要な残り時間は、（コンパイル終了までに必要な残り時間）＋（ネイティブコード実行時間）＝１５４０［ｍｓ］＋５５［ｍｓ］＝１５９５［ｍｓ］となる。この場合、必要な残り時間は、インタプリタ処理時間１１００［ｍｓ］よりも長い。
【００８０】
ゆえに、ＪＩＴコンパイル判定手段２０３は、コンパイル中で転換点には達していないと判定し、結果をメソッド情報管理表更新手段２０２に通知する。この状況で、メソッドＩＤがｍｅｔｈｏｄ１のメソッドが呼び出された場合は、プログラム制御手段２０４はインタプリタ１０７でのインタプリタ処理による実行を選択することになる。
【００８１】
他方、メソッド情報管理表２０１に登録されているメソッドＩＤがｍｅｔｈｏｄ３のメソッドでは、インタプリタ処理時間が２３００［ｍｓ］であり、中間コードサイズが３３２４０［ｂｙｔｅ］、中間コードコンパイル済みサイズが２４０００［ｂｙｔｅ］である。
【００８２】
同様に、ＪＩＴコンパイル終了までに必要な残り時間は（３３２４０［ｍｓ］−２４０００［ｍｓ］）×０．２＝１８４８［ｍｓ］である。また、ネイティブコード実行時間は２３００［ｍｓ］×０．０５＝１１５［ｍｓ］である。つまり、必要な残り時間は、（ＪＩＴコンパイル終了までに必要な残り時間）＋（ネイティブコード実行時間）＝１８４８［ｍｓ］＋１１５［ｍｓ］＝１９６３［ｍｓ］となる。この場合、必要な残り時間は、インタプリタ処理時間２３００［ｍｓ］よりも短い。
【００８３】
ゆえに、ＪＩＴコンパイル状況判定手段２０３は、コンパイル中で転換点に達している状態であると判定する。結果、ｍｅｔｈｏｄ３のＪＩＴコンパイル状況の欄が２’ｂ１０に更新されることになる。
【００８４】
ＪＩＴコンパイル状況の欄を更新後、メソッドＩＤがｍｅｔｈｏｄ３のメソッドが呼びだされた場合、プログラム制御手段２０４は、当該メソッドのネイティブコードの実行を選択することになる。
【００８５】
なお、ＪＩＴコンパイル状況判定手段２０３がネイティブコードの実行時間を見積もる方法は、上記方法に限らず、例えば中間コードサイズに一定値を掛けるなどの他の方法で見積もるとしてもよい。あるいは、ネイティブコードの実行時間は相対的に微小な値であるため、無視するとしてもよい。
【００８６】
また、ＪＩＴコンパイルの終了を待ってからネイティブコードを実行する場合においては、ＪＩＴコンパイルタスクへのＣＰＵ資源やメモリ資源の割り当てをＪＩＴコンパイル終了まで一時的に増やすような制御が考えられる。これは、実行タスクがアイドルに遷移するためである。このような場合、実際のＪＩＴコンパイル速度は、ＪＩＴコンパイル状況判定手段２０３に保持したＪＩＴコンパイル速度よりも早くなる。そのため、ＪＩＴコンパイル状況判定手段２０３は、保持したＪＩＴコンパイル速度に補正を施してから、コンパイル終了までに必要な残時間を見積もるなどとしてもよい。
【００８７】
なお、中間コードサイズが比較的小さいメソッドに関しては、インタプリタ処理時間もＪＩＴコンパイル時間も短時間であると考えられる。それゆえ、プログラム制御手段２０４は、中間コードサイズに閾値を設けて処理を行ってもよい。例えば、プログラム制御手段２０４は、閾値を超えたメソッドのみに対して前述のようにインタプリタ処理時間や中間コードコンパイル済みサイズを更新し、ＪＩＴコンパイル状況判定手段２０３において転換点に達しているか否かを判定する。この場合、閾値以下のサイズの小さいメソッドに関しては、ＪＩＴコンパイル中に呼び出された場合、インタプリタ処理で実行するか、ＪＩＴコンパイルの終了を待ってネイティブコードを実行するかを固定的に決めておくなどすればよい。
【００８８】
プログラム制御手段２０４は、コンパイラ１０５へのソースコードのコンパイル指示、中間コードの順次読み込みとインタプリタ１０７を用いての逐次処理、ＪＩＴコンパイラ１０８へのＪＩＴコンパイル指示、メソッドのネイティブコードの実行といった一連のプログラム実行を制御する。
【００８９】
また、前述のように、プログラム制御手段２０４は、インタプリタ１０７とＪＩＴコンパイラ１０８から、インタプリタ処理時間やＪＩＴコンパイル速度、中間コードコンパイル済みサイズを受け取る。また、プログラム制御手段２０４は、受け取った情報を、メソッド情報管理表更新手段２０２やＪＩＴコンパイル状況判定手段２０３に渡す。
【００９０】
また、プログラム制御手段２０４は、メソッドの呼び出しに達した際に、当該メソッドをインタプリタ処理するか、当該メソッドのネイティブコードを実行するかの判断を行う。
【００９１】
ここで、プログラム制御手段２０４の、メソッド呼び出しからの動作の流れを図３に示し、先行例に記載の従来技術のプログラム実行制御装置との差異を明らかにする。
【００９２】
ここでは、メソッド呼び出しは２回目以降であり、メソッド情報管理表２０１に当該メソッドの情報が既に登録されているものとして示す。因みに、初回のメソッド呼び出しである場合には、先ず当該メソッドの初期値の新規登録を行い、プログラム制御手段２０４はインタプリタ処理でのメソッド実行を選択する。なお、初回のメソッド呼び出し時は、メソッド情報管理表２０１に当該メソッドの情報が登録されていない状態である。
【００９３】
メソッド呼び出し時、プログラム制御手段２０４は、メソッド情報管理表更新手段２０２を介して、メソッド情報管理表２０１を参照する（ステップＳ３００）。
【００９４】
メソッド情報管理表２０１のＪＩＴコンパイル状況の欄が２’ｂ１１で、当該メソッドがコンパイル済みであることが示されている場合には（ステップ３０１でＹＥＳ）、当該メソッドのネイティブコードを実行する（ステップ３０２）。
【００９５】
メソッド情報管理表２０１のＪＩＴコンパイル状況の欄が２’ｂ１０で、コンパイル中で転換点に達していることが示されている場合には（ステップ３０１でＮＯ→ステップ３０３でＹＥＳ→ステップ３０４でＹＥＳ）、ＪＩＴコンパイルの終了まで待機し（ステップ３０５）、当該メソッドのネイティブコードを実行する（ステップ３０２）。
【００９６】
メソッド情報管理表２０１のＪＩＴコンパイル状況の欄が２’ｂ０１で、コンパイル中で転換点に達していないことが示されている場合には（ステップ３０１でＮＯ→ステップ３０３でＹＥＳ→ステップ３０４でＮＯ）、インタプリタ１０７で当該メソッドの中間コードを逐次処理することを選択する（ステップ３０８）。
【００９７】
メソッド情報管理表２０１のＪＩＴコンパイル状況の欄が２’ｂ００で、未コンパイルであることが示されている場合には（ステップ３０１でＮＯ→ステップ３０３でＮＯ）、管理情報表２０１のインタプリタ処理回数の欄の値等から、当該メソッドを新規にＪＩＴコンパイルするべきか否かを判断する（ステップＳ３０６）。新規にＪＩＴコンパイルすると判断した場合には（ステップ３０６でＹＥＳ）、ＪＩＴコンパイラ１０８に対して当該メソッドのＪＩＴコンパイルを指示し、インタプリタ１０７で当該メソッドの中間コードを逐次処理することを選択する（ステップ３０８）。ＪＩＴコンパイルしないと判断した場合には（ステップ３０６でＮＯ）、インタプリタ１０７で当該メソッドの中間コードを逐次処理することを選択する（ステップ３０８）。
【００９８】
以上により、本発明のプログラム実行制御装置は、ＪＩＴコンパイル途中のメソッドを呼び出した場合、当該メソッドのＪＩＴコンパイルの状況に基づいて、ネイティブコードを実行するか、インタプリタ処理を行うかを、適切に選択できる。この選択で、ＪＩＴコンパイルの終了を待ってからネイティブコードを実行するのと、即座に中間コードのインタプリタ処理に移るのとの選択において、より実行時間の短い方を選ぶことが可能になる。これにより、どちらか一方を固定的に選択するときに発生していたオーバーヘッドを除くことが可能になる。また、中間コードのＪＩＴコンパイルを低優先度のタスクとして、実行タスクと併走させる構成が採り易く、プログラムの応答性能を保つことができる。
【産業上の利用可能性】
【００９９】
本発明のプログラム実行制御装置は、インタプリタとＪＩＴコンパイラを備えた仮想計算機として有用である。また、この仮想計算機を組み込んだ各種の家電機器、携帯電話など通信機器、産業機器、乗用機器などの用途にも応用できる。
【符号の説明】
【０１００】
１０１    プログラム実行制御装置
１０２    ソースコード列
１０３    中間コード列
１０４    ネイティブコード列
１０５    コンパイラ（ソースコード→中間コード）
１０６    プログラム実行手段
１０７    インタプリタ
１０８    ＪＩＴコンパイラ（中間コード→ネイティブコード）
２０１    メソッド情報管理表
２０２    メソッド情報管理表更新手段
２０３    ＪＩＴコンパイル状況判定手段
２０４    プログラム制御手段
【図１】
2011002976.tif 000003
【図２】
2011002976.tif 000004
【図３】
2011002976.tif 000005