(57)【特許請求の範囲】
【請求項１】
プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンピュータにコンパイルさせる動的コンパイラプログラムであって、
前記コンピュータは、該コンピュータが実行するプログラムの１以上の部分プログラムの各々について、該部分プログラムをコンパイルして生成された実行命令列を、前記部分プログラムに適用された１以上の最適化の各々に関して参照された実行環境の状態情報である実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件のリストとに関係付けて保存する共有プールを有し、
前記動的コンパイラプログラムは前記コンピュータを、
現在の１以上の実行状態情報の各値を取得する実行状態取得部と、
前記共有プールから、コンパイル対象の部分プログラムと同じ部分プログラムをコンパイルして生成された実行命令列に関係付けられた前記条件のリストを読み出し、各条件を対応する現在の実行状態情報の値が満たすか否かを判定する判定部と、
前記判定部による判定結果が否定的である場合に、前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成する動的コンパイル部として機能させ、
前記コンパイラプログラムは、前記コンピュータに、前記判定部による判定が肯定的である場合は、前記条件のリストに関連付けられて前記共有プールに保存される前記実行命令列を再利用させる、動的コンパイラプログラム。
【請求項２】
前記動的コンパイル部は、前記コンパイル対象の部分プログラムに適用可能な１以上の最適化のうち、前記現在の１以上の実行状態情報の各値を参照してその効果が得られると判断した最適化を適用して前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成し、前記動的コンパイラプログラムは、前記コンピュータを、前記部分プログラムに適用された１以上の最適化の各々に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して対応する最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する条件付実行命令列記録部として更に機能させる、請求項１に記載の動的コンパイラプログラム。
【請求項３】
前記共有プールは、前記コンピュータのメモリの一部であり、前記条件付実行命令列記録部は、前記部分プログラムに適用された前記１以上の最適化のすべてが、前記共有プールにアクセス可能な他のコンパイル装置における値との差が少ない実行状態情報のみを参照する最適化である場合にのみ、各最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して対応する最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する、請求項２に記載の動的コンパイラプログラム。
【請求項４】
前記動的コンパイラプログラムは、前記コンピュータを、前記判定部による判定結果が肯定的である場合は、前記コンピュータのメモリ上に前記プログラムの作業領域として割り当てられた記憶領域に、前記共有プールから前記条件のリストに関連付けられた前記実行命令列を読み出して記録し、前記判定部による判定結果が否定的である場合は、前記記憶領域に、前記動的コンパイル部により生成された前記実行命令列を記録する実行命令列記録部として更に機能させる、請求項２に記載の動的コンパイラプログラム。
【請求項５】
前記判定部は、前記コンパイル対象の部分プログラムに対応する実行命令列であって、かつ前記現在の１以上の実行状態情報の各値が満し得る前記条件のリストに関連付けられた前記実行命令列が、前記共有プール内に複数存在する場合、前記条件のリスト内の条件の数の合計が最大である前記実行命令列を再利用すべき前記実行命令列として決定する、請求項２に記載の動的コンパイラプログラム。
【請求項６】
前記条件の数の合計は、最適化の種類ごとに予め設定された重み付けの値を用いて計算される、請求項５に記載の動的コンパイラプログラム。
【請求項７】
前記判定部は、前記コンパイル対象の部分プログラムに対応する実行命令列であって、かつ前記現在の１以上の実行状態情報の各値が満し得る前記条件のリストに関連付けられた前記実行命令列が、前記共有プール内に複数存在する場合、前記実行命令列に適用された最適化の数の合計が最大である前記実行命令列を再利用すべき前記実行命令列として決定する、請求項２に記載の動的コンパイラプログラム。
【請求項８】
前記最適化の数の合計は、最適化の種類ごとに予め設定された重み付けの値を用いて計算される、請求項７に記載の動的コンパイラプログラム。
【請求項９】
前記条件付実行命令列記録部は、前記動的コンパイル部が生成した前記実行命令列内にオペランドとしてアドレスが含まれる場合に、前記アドレスの前記実行命令列内での位置情報と、該アドレスが指すデータを識別する識別情報とに更に関連付けて、前記実行命令列を前記共有プールに記録する、請求項２に記載の動的コンパイラプログラム。
【請求項１０】
前記共有プールは、前記コンピュータがアクセス可能な記憶装置であり、前記条件付実行命令列記録部は、前記部分プログラムに適用された前記１以上の最適化のすべてが、前記実行状態取得部による取得ごとの値の変化が少ない実行状態情報のみを参照して適用された最適化である場合にのみ、各最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して対応する最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する、請求項２に記載の動的コンパイラプログラム。
【請求項１１】
コンピュータにおいて、プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンパイルする動的コンパイル方法であって、
前記コンピュータは、該コンピュータが実行するプログラムの１以上部分プログラムの各々について、該部分プログラムをコンパイルして生成された実行命令列を、前記部分プログラムに適用された１以上の最適化の各々に関して参照された実行環境の状態情報である実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件のリストとに関係付けて保存する共有プールを有し、
前記コンピュータのプロセッサが、現在の１以上の実行状態情報の各値を取得するステップと、
前記コンピュータのプロセッサが、前記共有プールから、コンパイル対象の部分プログラムと同じ部分プログラムをコンパイルして生成された実行命令列に関係付けられた前記条件のリストを読み出し、各条件を対応する現在の実行状態情報の値が満たすか否かを判定するステップと、
前記コンピュータのプロセッサが、判定の結果が否定的であることに応じて、前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成するステップとを含み、
前記判定が肯定的である場合は、前記条件のリストに関連付けられて前記共有プールに保存される前記実行命令列が再利用される、動的コンパイル方法。
【請求項１２】
前記実行命令列を生成するステップは、前記コンパイル対象の部分プログラムに適用可能な１以上の最適化のうち、前記現在の１以上の実行状態情報の各値を参照してその効果が得られると判断した最適化を適用して前記コンパイル対象の部分プログラムをコンパイルするステップを含み、前記コンピュータのプロセッサが、前記部分プログラムに適用された１以上の最適化のすべてが低い最適化レベルの最適化である場合にのみ、該最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、生成された実行命令列を前記共有プールに記録するステップを更に含む、請求項１１に記載の動的コンパイル方法。
【請求項１３】
プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンパイルする動的コンパイル装置であって、
該コンピュータが実行するプログラムの１以上の部分プログラムの各々について、該部分プログラムをコンパイルして生成された実行命令列を、前記部分プログラムに適用された１以上の最適化の各々に関して参照された実行環境の状態情報である実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件のリストとに関係付けて保存する共有プールと、
現在の１以上の実行状態情報の各値を取得する実行情報取得部と、
前記共有プールから、コンパイル対象の部分プログラムと同じ部分プログラムをコンパイルして生成された実行命令列に関係付けられた前記条件のリストを読み出し、各条件を対応する現在の実行状態情報の値が満たすか否かを判定する判定部と、
判定の結果が否定的であることに応答して、前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成する動的コンパイル部とを含み、
前記判定が肯定的である場合は、前記条件のリストに関連付けられて前記共有プールに保存される前記実行命令列を再利用する、動的コンパイル装置。
【請求項１４】
前記動的コンパイル部は、前記コンパイル対象の部分プログラムに適用可能な１以上の最適化のうち、前記現在の１以上の実行状態情報の各値を参照してその効果が得られると判断した最適化を適用して前記コンパイル対象の部分プログラムをコンパイルし、前記部分プログラムに適用された１以上の最適化のすべてが低い最適化レベルの最適化である場合にのみ、該最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、生成された実行命令列を前記共有プールに記録する条件付実行命令列記録部を更に含む、請求項１３に記載の動的コンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動的コンパイラプログラム、動的コンパイル方法及び動的コンパイル装置に関する。特に、適応型最適化されたコンパイル済みの部分プログラムを再利用する動的コンパイラプログラム、動的コンパイル方法及び動的コンパイル装置に関する。
【背景技術】
【０００２】
近年、例えばJava（登録商標）プログラムの実行環境において、JIT（Just In Time）コンパイラ等の動的コンパイラが用いられている。動的コンパイラは、Java（登録商標）アプリケーション等のプログラムの実行中において、プログラムの未コンパイルの部分を実行する必要が生じた場合、プログラムのうち実行すべき部分である部分プログラムをコンパイルする。これによりプログラム全体を最初にコンパイルした場合におけるプログラム起動の遅延を防ぎつつ、インタプリタ実行と比較し高速にプログラム実行することができる。
【０００３】
プログラムをより高速に実行するため、動的コンパイラは、部分プログラムをコンパイルする際に、プログラムの実行環境の状態情報である実行状態情報を取得し、該実行状態情報が示す実行環境の状態に最適化してコンパイルした実行命令列を生成する。動的コンパイラが最適化のために参照する実行状態情報としては、例えば、クラスがロードされているか否かの情報や、プログラムの実行時のプロファイルデータ等が挙げられる。このような最適化は適応型最適化と呼ばれている（非特許文献１参照。）。
【０００４】
上記のようにしてJITコンパイラ等の動的コンパイラが部分プログラムをコンパイルして生成する実行命令列は、コンパイルを行ったプロセスが動作している間有効である。そのため、動的コンパイラは同一のJavaプログラムが起動される度その部分プログラムをコンパイルする。このような状況は、同一マシンにおいて同一のJavaプログラムが複数回起動される場合や、仮想化環境において、複数のゲスト仮想マシンが同一のJavaプログラムを実行する場合に生じる。
【０００５】
従来、Javaプログラムに含まれる部分プログラムの重複したコンパイルを回避する技術として、永続化したキャッシュにAOT (Ahead of Time) コンパイル技術でコンパイルしたAOTコードを保管することによって、Java（登録商標）仮想マシン間でコンパイル済みAOTコードの共有を可能とする技術が開示されている（非特許文献２参照。）。
【０００６】
また、容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、バイトコードを実行する際に、JITコンパイラによりバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルして上記コードキャッシュに格納した後、そのネイティブコードを実行するJITコンパイラを備えた仮想計算機において、上記バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備える技術が開示されている（特許文献１参照。）。
【０００７】
特許文献２及び特許文献３については後述する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特許第３８０８７５５号公報
【特許文献２】特開２００５−２１５８８４号公報（第「０００３」段落、第「００２４」段落）
【特許文献３】特開２００２−２５９１３５号公報
【非特許文献】
【０００９】
【非特許文献１】T. Suganuma、外４名、”A DynamicOptimization Framework for a Java Just-In-Time Compiler”、In Proceedings of the ACM SIG-PLAN Conferenceon Object-Oriented Programming, Systems, Languages & Applications, pp.180-194, Oct. 2001.
【非特許文献２】Adam Pilkington、 Graham Rawson、“クラスの共有によるパフォーマンスの向上”、[online]、2008年9月30日、developerWorks Japan、 [平成22年3月23日検索]、インターネット<http://www.ibm.com/developerworks/jp/java/library/j-sharedclasses/?ca=dnj-1031>
【発明の概要】
【発明が解決しようとする課題】
【００１０】
非特許文献２において永続化したキャッシュに保管されるAOTコードは、AOTコンパイルによって生成されるJava（登録商標）メソッドのネイティブなコード・バージョンである。JITコンパイルとは異なり、AOTコンパイルは、実行中のJavaメソッドの動的な分析結果に応じた適応型最適化を採用していない。このため、AOTコードの共有よりコンパイルに必要な時間は節約されるが、共有AOTコードの実行速度は遅い。
【００１１】
一方、特許文献１においてコードキャッシュに格納されるネイティブコードは、JITコンパイルによって生成される。しかし特許文献１には、適応型最適化を含め、プログラムの実行速度を向上させる最適化に関する記載はなく、コードキャッシュに格納されるネイティブコードは最適化が行われていないネイティブコードである。従って、特許文献１においても、非特許文献２の技術と同様に、再利用されるネイティブコードの実行速度は遅い。
【００１２】
従って、Javaプログラムに含まれる部分プログラムの重複したコンパイルを回避するとともに、高速にプログラムを実行することが望まれる。しかし、適応型最適化を適用して生成された実行命令列を単に共有コードとしてキャッシュに保存しても、上述したように、適応型最適化では現在の実行状態情報の値が示す実行環境の状態に最適化を行うので、現在の実行状態情報の値と再利用時の実行状態情報の値とが異なる場合は、共有コードの利用可能性が不明となり結局のところ利用できない。この点に関し特許文献２は、現在の実行環境の状態と異なる状態に最適化されてコンパイルされている場合は、再コンパイルが必要と判断し、再度コンパイルを行う旨記載する。
【００１３】
しかしながら、特許文献２に示されるように、コンパイル時の実行状態情報の値と再利用時の実行状態情報の値が同一である場合のみコンパイル済みの実行命令列を利用するのでは、再利用の可能性が低くなるため、コンパイル済みコードの再利用による効果はほとんど期待できない。
【００１４】
なお、最適化の１つとして、プログラムの一部を、プログラムにより参照される変数が特定の値である場合の処理に特殊化する手法（specialization）が提案されている。例えば、プログラム内の各メソッドについて、そのメソッドが呼び出される毎に変数の値が特定の値であるか判断させ、その判断結果に応じて、特殊化した命令列及び特殊化していない命令の何れかに分岐して実行させる手法が提案されている（特許文献３参照。）。従って最適化の方法として特殊化を利用すれば上記問題は解消される。しかし、その他の適応型最適化を適用して生成されたネイティブコードの再利用の問題は依然として残る。
【００１５】
この発明は、上記の問題点を解決するためになされたものであって、適応型最適化を適用して生成されたコンパイル済みの実行命令列を効果的に再利用する技術を提供することを目的とする。本発明は、かかる技術の提供により、Javaプログラムに含まれる部分プログラムの重複したコンパイルを回避するとともに、高速にプログラムを実行することを目的とする。
【課題を解決するための手段】
【００１６】
上記課題を解決するために、本願発明者等は、適応型最適化を適用して生成された実行命令列を再利用するための条件に着目した。適応型最適化は、最適化時の実行環境の状態に最適化して実行命令列を生成するものであるが  再利用時の実行状態情報の値が、最適化時の実行状態情報の値とわずかでも違えば使用できないというものばかりではない。即ち、適応型最適化の中には、該最適化を適用して生成した実行命令列を、利用時の実行状態情報の値がある「一定の範囲内」であることを条件に利用可能とするものもある。そこで本願発明者等は、再利用時の実行状態情報の値が上記「一定の範囲内」であることを再利用時に検証可能とするために、コンパイル済みの実行命令列に、適用した最適化が参照した実行状態情報のリストと、適用した最適化の効果を得るためにリスト内の各実行状態情報の値が満たすべき条件とを関連付けて保存するというアイデアに想到した。
【００１７】
即ち、本願発明では、プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンパイルする動的コンパイラプログラムを実行するコンピュータにおいて、コンピュータのメモリの一部又はコンピュータがアクセス可能な記憶装置を共有プールとし、該共有プールに、部分プログラムをコンパイルして生成された実行命令列を、部分プログラムに適用された１以上の最適化の各々に関して参照された実行環境の状態情報である実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件のリストとに関係付けて保存する。そして、次に実行する部分プログラムに関して現在の１以上の実行状態情報の各値を取得すると、次に実行する部分プログラムに対応するコンパイル済みの実行命令列であって、かつ現在の１以上の実行状態情報の各値がそれに関連付けられた条件のリスト内の対応する条件を満たす実行命令列が、共有プール内に存在するか否かを判定する。条件を満たすコンパイル済みの実行命令列が存在する場合は、該コンパイル済みの実行命令列を再利用する。条件を満たすコンパイル済みの実行命令列が存在しない場合は、次に実行する部分プログラムをコンパイルして実行命令列を生成する。
【００１８】
言い換えると、上記目的を達成する本発明は、次のような、上記コンピュータ・システムにおいて実行される、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンピュータにコンパイルさせる動的コンパイラプログラムによって実現される。
【００１９】
前記動的コンパイラプログラムは前記コンピュータを、現在の１以上の実行状態情報の各値を取得する実行状態取得部と、前記共有プールから、コンパイル対象の部分プログラムと同じ部分プログラムをコンパイルして生成された実行命令列に関係付けられた前記条件のリストを読み出し、各条件を対応する現在の実行状態情報の値が満たすか否かを判定する判定部と、前記判定部による判定が否定的である場合に、前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成する動的コンパイル部として機能させる。そして前記動的コンパイラプログラムは、前記判定部による判定結果が肯定的である場合は、前記条件のリストに関連付けられた前記共有プールに保存される前記実行命令列を再利用する。なお、部分プログラムは、例えばプログラム中のメソッド、関数、基本ブロック等であってよい。
【００２０】
好ましくは、前記動的コンパイル部は、前記コンパイル対象の部分プログラムに適用可能な１以上の最適化のうち、前記現在の１以上の実行状態情報の各値を参照して該最適化による効果が得られると判断した最適化を適用して前記コンパイル対象の部分プログラムをコンパイルして実行命令列を生成する。そして上記動的コンパイラプログラムは、前記コンピュータを、前記部分プログラムに適用された１以上の最適化の各々に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して対応する前記最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する条件付実行命令列記録部として更に機能させる。
【００２１】
更に好ましくは、前記条件付実行命令列記録部は、前記部分プログラムに適用された前記１以上の最適化のすべてが、前記共有プールにアクセス可能な他のコンパイル装置における値との差が少ない実行状態情報のみ又は前記実行状態取得部による取得ごとの値の変化が少ない実行状態情報のみを参照する最適化である場合にのみ、各最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して前記各最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する。あるいは、前記条件付実行命令列記録部は、前記部分プログラムに適用された１以上の最適化のすべてが低い最適化レベルの最適化である場合にのみ、各最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して前記各最適化による効果が得られると判断するために利用された、前記各実行状態情報が満たすべき条件のリストとに関連付けて、前記動的コンパイル部により生成された実行命令列を前記共有プールに記録する。
【００２２】
また好ましくは、前記動的コンパイラプログラムは、前記コンピュータを、前記判定部による判定が肯定的である場合は、前記コンピュータのメモリ上に前記プログラムの作業領域として割り当てられた記憶領域に、前記共有プールから前記条件のリストに関連付けられた前記実行命令列を読み出して記録し、前記判定部による判定が否定的である場合は、前記記憶領域に、前記動的コンパイル部により生成された前記実行命令列を記録する実行命令列記録部として更に機能させる。  
【００２３】
また好ましくは、前記判定部は、前記コンパイル対象の部分プログラムに対応する実行命令列であって、かつ前記現在の１以上の実行状態情報の各値が満し得る前記条件のリストに関連付けられた前記実行命令列が、前記共有プール内に複数存在する場合、前記条件のリスト内の条件の数の合計が最大である前記実行命令列を再利用すべき前記実行命令列として決定する。
【００２４】
更に好ましくは、前記条件の数の合計は、最適化の種類ごとに予め設定された重み付けの値を用いて計算される。
【００２５】
また好ましくは、前記判定部は、前記コンパイル対象の部分プログラムに対応する実行命令列であって、かつ前記現在の１以上の実行状態情報の各値が満し得る前記条件のリストに関連付けられた前記実行命令列が、前記共有プール内に複数存在する場合、前記実行命令列に適用された最適化の数の合計が最大である前記実行命令列を再利用すべき前記実行命令列として決定する。
【００２６】
更に好ましくは、前記最適化の数の合計は、最適化の種類ごとに予め設定された重み付けの値を用いて計算される。
【００２７】
また好ましくは、前記条件付実行命令列記録部は、前記動的コンパイル部が生成した前記実行命令列内にオペランドとしてアドレスが含まれる場合に、前記アドレスの前記実行命令列内での位置情報と、該アドレスが指すデータを識別する識別情報とに更に関連付けて、前記実行命令列を前記共有プールに記録する。
【００２８】
以上、プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを順次コンピュータにコンパイルさせる動的コンパイラプログラムとして本発明を説明した。しかし、本発明は、上記動的コンパイラプログラムをインストールしたコンピュータにおいて実行される動的コンパイル方法として把握することもできる。また、本発明は、上記動的コンパイラプログラムをインストールして動的コンパイル方法を実行する動的コンパイル装置として把握することもできる。
【発明の効果】
【００２９】
本願発明では、部分プログラムをコンパイルして生成された実行命令列を再利用の目的で保存する共有プールに、上記実行命令列に関連付けて、上記部分プログラムに適用された１以上の最適化の各々に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件とを保存する。このため、コンパイル済みの実行命令列の再利用を検討する際に、現在の実行状態情報の各値が、検討対象の実行命令列に関連付けられた上記条件リスト内の対応する条件を満たすか否かを判定することが可能となり、適応型最適化を適用して生成した実行命令列の再利用可能性が高まる。また、適応型最適化を適用して生成された実行命令列を効率的に再利用することが可能となることから、Javaプログラムに含まれる部分プログラムの重複したコンパイルを回避するとともに、高速にプログラムを実行することができる。本発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００３０】
【図１】図１は、本実施形態に係るコンパイラシステム８０の機能構成の一例を示す。
【図２】図２（ａ）は、共有プールの一例を示す。図２（ｂ）は、共有プールの他の一例を示す。
【図３】図３は、実行状態情報と対応する実行状態情報の満たすべき条件の一覧表の一例を示す。
【図４】図４は、本実施形態に係る動的コンパイラ１００の動作フローの一例を示す。
【図５】図５（ａ）は、動的コンパイラ１００による判定処理の詳細な動作フローの一例を示す。図５（ｂ）は、動的コンパイラ１００によるスコア算出処理の詳細な動作フローの一例を示す。
【図６】図６は、動的コンパイラ１００による動的コンパイル処理の詳細な動作フローの一例を示す。
【図７】図７は、本発明の実施形態に係るコンピュータ５０のハードウェア構成の一例を示す。
【発明を実施するための形態】
【００３１】
以下、本発明の実施形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００３２】
図１は、本実施形態に係るコンパイラシステム８０の構成を示す。コンパイラシステム８０は、プログラムの実行中に、プログラムに含まれる複数の部分プログラムのうち実行すべき部分プログラムを、対応するコンパイル済みの実行命令列が再利用可能であるか否かの判定結果に応じてコンピュータにコンパイルさせる動的コンパイラ１００と、動的コンパイラ１００により生成された又は再利用を決定された実行命令列を実行することにより、プログラムを上記コンピュータにおいて実行する実行部１４０とを備えるプログラム実行環境９０と、再利用するコンパイル済みの実行命令列を保存する共有プール１３５とを備える。
【００３３】
ここで共有プール１３５は、上記コンピュータが実行するプログラムの１以上の部分プログラムの各々について、該部分プログラムをコンパイルして生成された実行命令列を、該部分プログラムに適用された１以上の最適化の各々に関して参照された実行環境の状態情報である実行状態情報のリストと、該リスト内の各実行状態情報の値が対応する最適化の効果を得るために満たすべきとされた条件とに関連付けて保存する。
【００３４】
上述したように、適応型最適化の中には、該最適化を適用して生成した実行命令列を、利用時の実行状態情報の値がある「一定の範囲内」であることを条件に利用可能とするものもある。従って、コンパイル済みの実行命令列を、コンパイル時に適用された最適化に関して参照された実行状態情報の値が最適化の効果を得るために満たすべきとされた条件とともに記憶することで、再利用時の実行状態情報の値が上記「一定の範囲内」であることを再利用時に検証可能となる。そしてこのような検証が可能となることで、適応型最適化を適用して生成された実行命令列の利用可能性が高まる。
【００３５】
共有プール１３５は、より具体的には、コンピュータのメモリの一部又はコンピュータがアクセス可能なハードディスク等の記憶装置のいずれであってもよい。図２（ａ）に示すように、ハイパーバイザ（hypervisor）２０２等の制御プログラムを利用してコンピュータを仮想化して複数の異なるオペレーティング・システム（OS）を並列実行させる仮想化環境２００では、同一のアプリケーション・プログラム２０６、２１４が複数の仮想マシン２０８、２１２上で動作することがある。この場合、コンピュータの共有メモリの一部を、再利用するコンパイル済みの実行命令列を保存する共有プール２１６とすることで、重複したコンパイルを回避できるとともに、複数の仮想マシン２０８、２１２においてJITコンパイラ等の動的コンパイラが使用するプロセッサやメモリ等のリソースを有効利用することが可能となる。
【００３６】
なお、図２（ａ）の右側の矢印２１７は、ゲスト仮想マシン２１０のJITコンパイラがアプリケーション・プログラム２１２に含まれる部分プログラムをコンパイルして生成した実行命令列が、共有プール２１６に保存されることを示している。また、同図左側の矢印２１８は、その共有プール２１６に保存された実行命令列を、ゲスト仮想マシン２０４のJITコンパイラが読み出して再利用することを示している。
【００３７】
図２（ｂ）は、アクセス可能な記憶装置２３４を共有プール１３５とする例を示す。同図に示すように、同一マシン２２２では、同一のアプリケーション・プログラム２２４が複数回起動される。そこで、同図左側の矢印２２７が示すように、アプリケーション・プログラム２２４を起動してその部分プログラムをコンパイルする場合は、コンピュータがアクセス可能な記憶装置２３４を共有プール１３５として、該共有プールにコンパイル済みの実行命令列を保存する。以降、同一アプリケーション・プログラム２２４を起動する場合には、同図右側の矢印２２８が示すように、共有プールに保存された実行命令列を再利用すれば、重複したコンパイルを回避できる。
【００３８】
なお、共有プール１３５として利用されるメモリの一部や記憶装置内の記憶領域（以下、ファイルという）は、動的コンパイラ１００が、必要に応じてプログラム実行環境９０を経由して、コンピュータのOSやハイパーバイザ２０２にその割り当てを要求することにより確保される。また、メモリの一部が共有プール１３５として割り当てられる場合、該共有プール１３５は、利用者により明示的に削除されない限り、OSやハイパーバイザ２０２が再起動するまで維持される。一方、ファイルが共有プール１３５として割り当てられる場合、該共有プール１３５は利用者により明示的に削除されるまで維持される。いずれの場合も、保存されてから一定時間経過したものを自動的に削除するなどのヒューリスティクスを適用することが可能であり、実行命令列単位で削除することも可能である。
【００３９】
共有プール１３５として、コンピュータのメモリの一部又はファイルのいずれを利用するかは、ハイパーバイザ２０２の有無などの実行環境、図２（ａ）のようにゲスト仮想マシン間で共有するか又は図２（ｂ）のように複数回の実行間で再利用するかといった利用シナリオ、共有プール１３５の永続性の必要性などの観点から、利用者がプログラム実行環境９０の設定として決定する。なお、メモリの一部とファイルの両方に共有プール１３５を割り当て、利用者やコンパイラ設計者が事前に条件として設定したメソッド名やクラス名などのコンパイル対象の部分プログラムの条件に応じて使い分けることも可能である。
【００４０】
プログラム実行環境９０は、Java（登録商標）バイトコード等の、コンピュータにより直接実行できないプログラムを実行する指示を受けて、動的コンパイラ１００及び実行部１４０の協調動作により該プログラムを実行する。実行部１４０は、動的コンパイラ１００によって共有プール１３５内のコンパイル済みの実行命令列が利用可能であると判定された場合は、そのコンパイル済みの実行命令列を実行する。より具体的には、共有プール１３５内のコンパイル済みの実行命令列が、後述する動的コンパイラ１００の実行命令列記録部１２５によりメモリ１０５にコピーされる場合は、実行部１４０は、メモリ１０５からコンパイル済みの実行命令列を読み出して実行する。
【００４１】
これに代えて実行部１４０は、メモリ・マップによりコンパイル済みの実行命令列を共有して実行してもよい。但し、最適化の無効化や、詳細は後述するが、クラス領域などへの参照をアドレス再配置で定数値にする場合など、実行命令列のパッチが必要な場合は、コンパイル済みの実行命令列はメモリ１０５にコピーし、実行部１４０は、メモリ１０５からコンパイル済みの実行命令列を読み出して実行するものとする。しかしこの場合であっても、共有プール１３５内のコンパイル済みの実行命令列を、Java仮想マシン等の複数のプログラム実行環境９０が同時には利用しないと保証できる場合は、実行部１４０はメモリ・マップによりコンパイル済みの実行命令列を利用して実行してもよい。そのような保証は、例えば使用中フラグやロック機構を利用することで実現できる。
【００４２】
また、実行部１４０は、動的コンパイラ１００によって実行命令列が生成される場合はその生成される実行命令列を実行する。より具体的には、動的コンパイラ１００の動的コンパイル部１２０により生成された実行命令列が、動的コンパイラ１００の実行命令列記録部１２５によりメモリ１０５に記録される場合は、実行部１４０は、メモリ１０５に記録された実行命令列を読み出して実行する。なお、実行部１４０は、例えばJava仮想マシン等の機能を含み、一部の部分プログラムを、インタプリタにより実行してもよい。
【００４３】
動的コンパイラ１００は、コンピュータ上で動的コンパイラプログラムを実行することにより実現され、メモリ１０５と、実行状態取得部１１０と、判定部１１５と、動的コンパイル部１２０と、実行命令列記録部１２５と、条件付実行命令列記録部１３０とを備える。
【００４４】
メモリ１０５は、動的コンパイラプログラムを実行するコンピュータのメモリ上に実行するプログラムの作業領域として割り当てられた記憶領域である。具体的には、メモリ１０５は、例えばコンパイラシステム８０がコンピュータのOSにメモリ割り当てを要求することにより確保した記憶領域であり、動的コンパイラ１００及び／又は実行部１４０のスタック領域、ヒープ領域、又は、mmapシステムコール等により割り当てられた記憶領域等であってよい。
【００４５】
実行状態取得部１１０は、部分プログラムの最適化の際に参照される、実行環境の状態情報である現在の１以上の実行状態情報の各値を取得する。各実行状態情報の値は、例えばJava仮想マシン等のプログラム実行環境９０が提供するAPIを呼び出したり、メモリ１０５を直接参照したりすることにより取得できる。
【００４６】
判定部１１５は、共有プール１３５から、コンパイル対象の部分プログラムと同じ部分プログラムをコンパイルして生成された実行命令列に関係付けられた条件のリストを読み出し、該リスト内の各条件を実行状態取得部１１０により取得された対応する現在の実行状態情報の値が満たすか否かを判定する。共有プール１３５の検索は、例えば、コンパイル対象の部分プログラムがメソッドである場合、該メソッドのクラス名及びメソッド名を利用してよい。
【００４７】
現在の各実行状態情報の値が、対応する条件、即ち該実行状態情報の値が満たすべきとされる条件を満たす場合、判定部１１５は、共有プール１３５から上記リストに関連付けられた実行命令列を読み出し、該実行命令列を、実行命令列記録部１２５を介して作業領域としてのメモリ１０５に記録してよい。ここで、リスト内に複数の条件がある場合、全ての条件が、それぞれ対応する現在の実行状態情報の値（各条件について参照された実行状態情報が複数ある場合は複数の実行状態情報の値）により満たされることがコンパイル済みの実行命令列を再利用する条件となる。
【００４８】
また、コンパイル対象の部分プログラムに対応する実行命令列であって、かつ現在の１以上の実行状態情報の各値がそれぞれ満し得る条件のリストに関連付けられた実行命令列が、共有プール１３５内に複数存在する場合、判定部１１５は、リスト内の条件の数の合計が最大である実行命令列を再利用すべき実行命令列として決定してよい。この際判定部１１５は、条件の数の合計を、該条件を課す基となった最適化の種類ごとに予め設定された重み付けの値を用いて計算してもよい。重み付けは、例えば、最適化の種類ごとその実行速度への影響度に応じて設定してよい。
【００４９】
上記構成に代えて判定部１１５は、コンパイル対象の部分プログラムに対応する実行命令列であって、かつ現在の１以上の実行状態情報の各値がそれぞれ満し得る条件のリストに関連付けられた実行命令列が、共有プール１３５内に複数存在する場合、実行命令列に適用された最適化の数の合計が最大である実行命令列を再利用すべき実行命令列として決定してもよい。ここでも判定部１１５は、最適化の数の合計を、最適化の種類ごとに予め設定された重み付けの値を用いて計算してもよい。重み付けは、例えば、最適化の種類ごとその実行速度への影響度に応じて設定してよい。
【００５０】
なお、コンパイル対象の部分プログラムに対応する実行命令列であって、かつ現在の１以上の実行状態情報の各値がそれぞれ満し得る条件のリストに関連付けられた実行命令列が、共有プール１３５内に１つも存在しない場合、判定部１１５は、後述する動的コンパイル部１２０にコンパイル対象の部分プログラムをコンパイルするよう通知する。なおこの場合、実行命令列記録部１２５は、動的コンパイル部１２０により生成された実行命令列を作業領域としてのメモリ１０５に記録する。
【００５１】
動的コンパイル部１２０は、判定部１１５による判定結果が否定的である場合に、コンパイル対象の部分プログラムをコンパイルして実行命令列を生成する。好ましくは、動的コンパイル部１２０は、コンパイル対象の部分プログラムに適用可能な１以上の最適化のうち、現在の１以上の実行状態情報の各値を参照してその効果が得られると判断した最適化を適用してコンパイル対象の部分プログラムをコンパイルする。
【００５２】
適用する最適化の決定は、より具体的には次のようにして行われる。まず、選択された最適化レベルによって決まる最適化の候補リストが取得される。なお、最適化レベルは、コンパイル対象の部分プログラムの累積実行回数や単位時間当たりの実行頻度などにより選択される。続いて、コンパイル対象の部分プログラムが解析され、候補リストにあるいずれかの最適化が可能なコード列が検索される。続いて、検索されたコード列に対して適用可能と判断された最適化を実際に適用した場合の効果が、現在の実行状態情報の値に基づいて見積もられる。見積もられた効果が所定の効果以上であれば最終的にその最適化が適用される。なお、上記見積もりは、実際には、現在の実行状態情報の値が、見積もる効果が所定の効果以上となるために実行状態情報の値が満たすべき条件を満たすか否かを判断することによって行われる。そして見積もりの結果、最適化の効果が得られると判断された全ての最適化が最終的に適用される。
【００５３】
このような最適化の効果の見積もり方法や、見積もりの際に参照される１以上の実行状態情報の種類、更に見積もる効果が所定の効果以上となるために各実行状態情報の値が満たすべき条件は、最適化のアルゴリズムによって決まるものであり、最適化の種類ごとに異なる。それぞれの最適化のアルゴリズムは例えば非特許文献１に記載されるように公知の技術であり、最適化のアルゴリズムそれ自体は本発明の要旨ではないので、ここでは最適化ごとのアルゴリズムの詳細な説明は省略する。なお、本発明において重要であるのは、最適化の適用を検討する際に動的コンパイル部１２０が参照した実行状態情報のリストと、動的コンパイル部１２０が使用した、各実行状態情報の値が最適化の効果を得るために満たすべき条件のリストとを、コンパイル済みの実行命令列の再利用を検討する際に利用できるようにすることである。そのために、動的コンパイル部１２０はこれら情報を一時的に保存して、後述する条件付実行命令列記録部１３０に渡す。
【００５４】
上記一時的な保存において、動的コンパイル部１２０は、１以上の実行状態情報の各値が最適化の効果を得るために満たすべき条件を、該条件を示すデータとして有している場合は、該データを保存してよい。また、動的コンパイル部１２０は、上記条件を、引数として渡された実行状態情報の値が条件を満たす場合に真を返す実行可能コードとして有している場合は、該実行可能コードを保存してよい。
【００５５】
条件付実行命令列記録部１３０は、動的コンパイル部１２０が生成した実行命令列を、動的コンパイル部１２０が部分プログラムに適用した１以上の最適化の各々に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために動的コンパイル部１２０が利用した情報、即ち、適用した最適化の効果を得るために対応する実行状態情報の値が満たすべき条件のリストとに関連付けて、共有プール１３５に記録する。なお、条件付実行命令列記録部１３０は、共有プール１３５に記録するこれら情報を動的コンパイル部１２０から直接にまたはメモリ１０５等を介して間接的に取得する。
【００５６】
共有プール１３５としてコンピュータのメモリの一部が使用される場合、条件付実行命令列記録部１３０は、適用された１以上の最適化のすべてが、共有プール１３５にアクセス可能な他のコンパイル装置における値との差が少ない実行状態情報のみを参照する最適化である場合に限定して、該最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために利用された、各実行状態情報が満たすべき条件のリストとに関連付けて、動的コンパイル部１２０により生成された実行命令列を共有プール１３５に記録してもよい。一方、共有プール１３５としてコンピュータがアクセス可能な記憶装置が使用される場合、条件付実行命令列記録部１３０は、適用された最適化のすべてが、実行状態取得部１１０による取得ごとの値の変化が少ない実行状態情報のみを参照する適化である場合に限定して、該最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために利用された、各実行状態情報が満たすべき条件のリストとに関連付けて、動的コンパイル部１２０により生成された実行命令列を共有プール１３５に記録してもよい。
【００５７】
上記性質を有する実行状態情報の種類に関する情報は、条件付実行命令列記録部１３０が参照できるように予めコンピュータに設定しておくものとする。あるいは、低い最適化レベルを適用する際に参照される実行状態情報の多くがこのような性質を有するので、上記構成に代えて、条件付実行命令列記録部１３０は、適用された１以上の最適化のすべてが、低い最適化レベルの最適化である場合に限定して、該最適化に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために利用された、各実行状態情報が満たすべき条件リストとに関連付けて、動的コンパイル部１２０により生成された実行命令列を共有プール１３５に記録してもよい。この場合、動的コンパイル部１２０は、適用した最適化レベルの情報も合わせて条件付実行命令列記録部１３０に渡すものとする。上記のような構成を採用すれば、適応型最適化を適用してコンパイルした実行命令列の再利用可能性が更に高まる。
【００５８】
図３は、適応型最適化の適用を検討する際に参照される実行状態情報と、適用する最適化の効果を得るために実行状態情報が満たすべき条件の具体例を示す一覧表である。図３に示すように、実行状態取得部１１０により取得され、また適応型最適化の適用を判断するために動的コンパイル部１２０が参照する実行状態情報は、（１）コンパイル対象の部分プログラム（メソッド）と、（２）プログラム実行環境９０が構築されるコンピュータ（システム）の構成情報と、（３）仮想マシンの内部情報と、（４）プログラム実行時のプロファイル情報のいずれかに分類できる。
【００５９】
（１）〜（４）のそれぞれに分類される実行状態情報の具体例は図３に示す通りである。なお、これらの実行状態情報は、プログラムの実行開始時にJava（登録商標）クラスファイルから実行部１４０により読み込まれて、又はプログラムの実行後新たに生成されてメモリ１０５格納される。なお、図３の一覧表に示す実行状態情報のうち、網掛けを施されたものは、上述した、共有プール１３５にアクセス可能な他のコンパイル装置における値との差が少ない及び実行状態取得部１１０による取得ごとの値の変化が少ない実行状態情報である。
【００６０】
以下、図３の一覧表にある「実行状態情報が満たすべき条件の具体例」の各々を説明する。まず条件１において、実行状態情報は、クラスファイルの変更日時（実行状態情報１）とメモリ１０５に保存されている実行命令列の作成日（実行状態情報２）である。条件１は、実行状態情報１の値が実行状態情報２の値以下であれば真を返す論理式として表すことができる。条件２において、実行状態情報は、インライン可能なメソッド一覧（実行状態情報１）である。実行状態情報１に、C1.foo()とC2.foo()の両方が含まれていれば真を返す論理式として表すことができる。
【００６１】
条件３において、実行状態情報は、マシンのCPU数（実行状態情報１）である。従って条件３は、実行状態情報１の値が２以上であれば真を返す論理式として表すことができる。条件４において、実行状態情報はJava仮想マシンのバージョン（実行状態情報１）である。従って条件４は、実行状態情報１の値がJava6に等しければ真を返す論理式として表すことができる。
【００６２】
条件５において、実行状態情報は、コマンド行引数（実行状態情報１）である。従って条件５は、実行状態情報１の値に-Xaggressiveが含まれていれば真を返す論理式として表すことができる。条件６において、実行状態情報は初期化が完了しているクラスのリスト（実行状態情報１）である。従って条件６は、実行状態情報１の値にjava.util.ArrayListが含まれていれば真を返す論理式として表すことができる。
【００６３】
条件７において、実行状態情報は、別のメソッドの実行命令列のアドレス（実行状態情報１）である。従って条件７は、実行状態情報１の値が現在コンパイル中のメソッドの生成アドレスの前後32KB以内であれば真を返す論理式として表すことができる。条件８において、実行状態情報はコンパイル中のメソッドが呼び出す別のメソッドに関してメモリ１０５に保存された情報（実行状態情報１）である。従って条件８は、実行状態情報１の値が「引数として受け取った値をグローバル変数に代入している」ことを示す情報を含んでいなければ真を返す論理式として表すことができる。
【００６４】
条件９において、実行状態情報は、ロード済みクラスのクラス階層情報（実行状態情報１）である。従って条件９は、実行状態情報１の値に「クラスCのメソッドfoo()がサブクラスでオーバーライドされている」ことを示す情報が含まれていなければ真を返す論理式として表すことができる。条件１０において、実行状態情報はコンパイル中のメソッドから参照されるクラスCへの外部参照解決の状態（実行状態情報１）である。従って条件１０は、実行状態情報１の値が「解決済み」であることを示す情報に等しければ真を返す論理式として表すことができる。
【００６５】
条件１１において、実行状態情報は、実行時プロファイルの結果（実行状態情報１）である。従って条件１１は、実行状態情報１の値に、メソッドfoo()引数の値が０である確率を示す情報として75%以上の数値が含まれていれば真を返す論理式として表すことができる。条件１２において、実行状態情報は最適化レベルの情報（実行状態情報１）である。従って条件１２は、実行状態情報１の値が「warm」に等しければ真を返す論理式として表すことができる。
【００６６】
以上のように、適用する最適化の効果を得るために実行状態情報が満たすべき条件は、コンピュータによって処理可能な形式で保持することができる。
【００６７】
条件付実行命令列記録部１３０はまた、動的コンパイル部１２０が生成した実行命令列内にオペランドとしてアドレスが含まれる場合、該実行命令列を、更に再配置情報に関連付けて共有プール１３５に記録する。ここで再配置情報とは、実行命令列が再利用される場合に上記アドレスを修正するための情報である。具体的には、再配置情報は、アドレスの実行命令列内での位置情報（より具体的には、アドレス値の実行命令列内で場所とバイト長）、該アドレスが指すデータを識別する識別情報とを含む。
【００６８】
例えば、アドレスの実行命令列内での位置情報として、「オフセット８０バイト目からの４バイト」、アドレスが指すデータを識別する識別情報として、「java.lang.Stringクラスの内容を保持する構造体」を有する再配置情報が、共有プール１３５内の実行命令列に関連付けられていたとする。この場合、実行命令列の再利用を決定すると、動的コンパイラ１００は、現在のプログラム実行環境９０におけるjava.lang.Stringクラスの内容を保持する構造体のアドレス（32bit=4バイト）を取得し、再利用する実行命令列を共有プール１３５からメモリ１０５へコピーし、オフセット８０バイト目からの４バイトを取得したアドレスで上書きする。
【００６９】
次に図４乃至図６を参照して、動的コンパイラ１００の動作を説明する。図４は、本実施形態に係る動的コンパイラ１００の動作フローの一例を示す。動的コンパイラ１００は、プログラムに含まれる複数の部分プログラムのうち、次に実行すべき部分プログラムを順次コンパイルする。図４に示す動作フローは、実行部１４０のリクエストに応答して、動的コンパイラ１００が次に実行すべき部分プログラムのコンパイルのリクエストを受けたところから開始する。
【００７０】
ステップ４００において処理は開始し、実行情報取得部１１０は、例えばJava仮想マシン等のプログラム実行環境９０が提供するAPIを呼び出したり、メモリ１０５を直接参照したりすることにより、現在の１以上の実行状態情報の各値を取得する。
【００７１】
次に判定部１１５は、共有プール１３５内に、コンパイル対象の部分プログラムに対応する再利用可能な実行命令列があるか否かを、実行情報取得部１１０から受け取った現在の１以上の実行状態情報の各値に基づいて判定する（ステップ４０５）。判定処理の詳細は、図５を参照して後述する。
【００７２】
続いて判定部１１５は、判定処理において再利用可能な実行命令列が見つかったか否かを判断する（ステップ４１０）。共有プール１３５内に再利用可能な実行命令列が見つからなかった場合（ステップ４１０：ＮＯ）、判定部１１５は、動的コンパイル部１２０にその旨通知し、動的コンパイル部１２０は次に実行すべき部分プログラムをコンパイルする（ステップ４１５）。動的コンパイル処理の詳細は、図６を参照して後述する。
【００７３】
続いて条件付実行命令記録部１３０は、部分プログラムをコンパイルして動的コンパイル部１２０により生成された実行命令列を、部分プログラムに適用した１以上の最適化の各々に関して参照された実行状態情報のリストと、該リスト内の各実行状態情報に関して最適化による効果が得られると判断するために動的コンパイル部１２０により利用された、各実行状態情報の値が満たすべき条件のリストとに関連付けて共有プール１３５に記録する（ステップ４２０）。
【００７４】
判定処理において再利用可能な実行命令列が見つかった場合（ステップ４１０：ＹＥＳ）、またはステップ４２０から、処理はステップ４２５へ進み、実行命令列記録部１２５は、動的コンパイル部１２０により生成された実行命令列又は判定部１１５により再利用が決定された共有プール１３５内の実行命令列をメモリ１０５に記録する。そして処理は終了する。
【００７５】
図５（ａ）は、図４に示すステップ４０５の判定処理の詳細な動作フローの一例を示す。処理はステップ５００から開始し、判定部１１５は、共有プール１３５から、次のコンパイル対象の部分プログラムに対応する実行命令列を全て読み出す。続いて判定部１１５は、取得した各実行命令列について、現在の実行環境への適合度合いを示すスコアを算出する（ステップ５０５）。スコア算出処理の詳細は図５（ｂ）を参照して後述する。続いて判定部１１５は、ステップ５０５において算出された適合度合いスコアが０を超える実行命令列があるか否かを判断する（ステップ５１０）。
【００７６】
算出されたスコアが０を超える実行命令列がある場合（ステップ５１０：ＹＥＳ）、判定部１１５は、スコアが最大の実行命令列を再利用する実行命令列として選択する（ステップ５１５）。一方、算出されたスコアが０を超える実行命令列がない場合（ステップ５１０：ＮＯ）、判定部１１５は、再利用可能な実行命令列は存在しないと判断する（ステップ５２０）。ステップ５１５及びステップ５２０の後処理は終了する。
【００７７】
図５（ｂ）は、図５（ａ）に示すステップ５０５のスコア算出処理の詳細な動作フローの一例を示す。処理はステップ５３０から開始し、判定部１１５は、読み出した各実行命令列について、該実行命令列に関連付けられた条件のリストを取得する。続いて判定部１１５は、各実行命令列について取得したリスト内の１以上の条件の各々に、実行状態取得部１１０が取得した対応する現在の実行状態情報の値を代入し（ステップ５３５）、リスト内の全ての条件が、現在の実行状態情報の各値によって満たされるか否かを判定する（ステップ５４０）。
【００７８】
リスト内の全ての条件が満たされる実行命令列が１以上ある場合（ステップ５４０：ＹＥＳ）、該１以上の実行命令列に対して、処理はステップ５４５へ進む。そして判定部１１５は、１以上の実行命令列の各々に対し、該実行命令列に関連付けられたリスト内の条件の数の合計を、現在の実行環境への適合度合いを示すスコアとして算出する。一方、リスト内の一部または全部の条件が満たされない実行命令列が１以上ある場合（ステップ５４０：ＮＯ）、該１以上の実行命令列に対して、処理はステップ５５０へ進む。そして判定部１１５は、１以上の実行命令列の各々に対し、現在の実行環境への適合度合いを示すスコアを０に設定する。そして処理は終了する。
【００７９】
図６は、図４に示すステップ４１５の動的コンパイル処理の詳細な動作フローの一例を示す。処理はステップ６００から開始し、動的コンパイル部１２０は、現在の最適化レベルによって決まる、適用する最適化の候補を決定する。続いて動的コンパイル部１２０は、コンパイル対象の部分プログラムを解析し、最適化の候補の中のいずれかを適用可能なコード列を検索する（ステップ６０５）。
【００８０】
続いて動的コンパイル部１２０は、最適化可能なコード列があったか否かを判定する（ステップ６１０）。最適化可能なコード列がない場合（ステップ６１０：ＮＯ）、処理は終了する。一方、最適化可能なコード列がある場合（ステップ６１０：ＹＥＳ）、処理はステップ６１５へ進み、動的コンパイル部１２０は、実行状態取得部１１０が取得した現在の１以上の実行状態情報を参照して、最適化の効果を見積もる。最適化の効果の見積もりは、具体的には、ステップ６０５で見つかったコード列に対し適用可能な最適化について、該最適化の効果を得るために実行状態情報が満たすべき１以上の条件を、対応する現在の１以上の実行状態情報の各値が満たすか否かによりなされる。
【００８１】
続いて動的コンパイル部１２０は、ステップ６１０における見積もりの結果が、最適化による効果が
得られることを示すか否かを判定する（ステップ６２０）。最適化による効果が得られると判断された場合（ステップ６２０：ＹＥＳ）、動的コンパイラは、該最適化の適用の検討に関して参照した実行状態情報の一覧と、最適化による効果を得るために各実行状態情報が満たすべき条件のリストとを、条件付実行命令列１３０に渡すために一旦保存する（ステップ６２５）。
【００８２】
続いて動的コンパイル部１２０は、最適化可能であり、かつ該最適化による効果が得られると現在の実行状態情報に基づいて判断したコード列を、該最適化を適用してコンパイルする（ステップ６３０）。そして処理は終了する。なお、ステップ６１０からステップ６３０の各ステップは、ステップ６０５で検索された最適化可能なコード列の各々に対して実行されることに留意されたい。
【００８３】
図７は、本実施形態に係るコンピュータ５０のハードウェア構成の一例を示した図である。コンピュータ５０は、バス２に接続されたメインＣＰＵ（中央処理装置）１とメインメモリ４を含んでいる。ハードディスク装置１３、３０、及びＣＤ−ＲＯＭ装置２６、２９、フレキシブル・ディスク装置２０、ＭＯ装置２８、ＤＶＤ装置３１のようなリムーバブル・ストレージ（記録メディアを交換可能な外部記憶システム）がフレキシブル・ディスクコントローラ１９、ＩＤＥコントローラ２５、ＳＣＳＩコントローラ２７などを経由してバス２へ接続されている。
【００８４】
フレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭのような記憶メディアが、リムーバブル・ストレージに挿入される。これらの記憶メディアやハードディスク装置１３、３０、ＲＯＭ１４には、オペレーティング・システムと協働してＣＰＵ等に命令を与え、本発明を実施するためのコンピュータ・プログラムのコードを記録することができる。即ち、上記説明した数々の記憶装置には、コンピュータ５０にインストールされ、コンピュータ５０をコンパイラシステム８０として機能させるコンパイラプログラムを記録することができる。
【００８５】
上記コンパイラプログラムは、動的コンパイラプログラム及び実行モジュールを含む。これらプログラム又はモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、動的コンパイラ１００と、実行部１４０としてそれぞれ機能させる。動的コンパイラプログラムは、実行状態取得モジュール、判定モジュール、動的コンパイルモジュール、実行命令列記録モジュール、及び条件付実行命令列記録モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、実行状態取得部１１０、判定部１１５、動的コンパイル部１２０、実行命令記録部１２５、及び条件付実行命令記録部１３０としてそれぞれ機能させる。コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。
【００８６】
コンピュータ５０は、キーボード／マウス・コントローラ５を経由して、キーボード６やマウス７のような入力デバイスからの入力を受ける。コンピュータ５０は、オーディオコントローラ２１を経由して、マイク２４からの入力を受け、またスピーカー２３から音声を出力する。コンピュータ５０は、視覚データをユーザに提示するための表示装置１１に、グラフィックスコントローラ１０を経由して接続される。コンピュータ５０は、ネットワーク・アダプタ１８（イーサネット（登録商標）・カードやトークンリング・カード）等を介してネットワークに接続し、他のコンピュータ等と通信を行うことが可能である。
【００８７】
以上の説明により、本実施形態に係るコンピュータ５０は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００８８】
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更又は改良を加えることが可能であることが当業者に明らかである。従って、そのような変更又は改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【００８９】
なお、特許請求の範囲、明細書、及び図面中において示した装置、システム、プログラム、及び方法における動作、手順、ステップ、及び段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り任意の順序で実現しうることに留意すべきである。また、前の処理の出力を後の処理で用いる場合でも、前の処理と後の処理の間に他の処理が入ることは可能である場合があること、又は間に他の処理が入るように記載されていても前の処理を後の処理の直前に行うよう変更することも可能である場合があることも留意されたい。特許請求の範囲、明細書、及び図面中の動作フローに関して、便宜上「まず、」、「次に、」、「続いて、」等を用いて説明したとしても、この順で実施することが必須であることを必ずしも意味するとは限らない。
【図１】
0005460430.tif 000002
【図２】
0005460430.tif 000003
【図３】
0005460430.tif 000004
【図４】
0005460430.tif 000005
【図５】
0005460430.tif 000006
【図６】
0005460430.tif 000007
【図７】
0005460430.tif 000008