(57)【要約】本発明はバイトコード解釈に関する。インタプリタはよく実行されるバイトコードを選択しそれらを対応するマシンコードに翻訳する。インタプリタは、使用するジャンプテーブル(40)を拡張して、バイトコードにマシンコードへのインデックスをつける。この拡張は、対応するマシンコードと同様に良く実行されるバイトコードへの参照をも含む。従って、解釈は動的にプロファイルされ最適化される。
2004529413.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのバイトコードのシーケンスを動的にプロファリングする方法であって、
前記プログラム内のメソッドで実行されるブランチの数をランタイム時に決定するステップと、
前記プログラムで実行されるブランチの総数をランタイム時に決定するステップと、
前記メソッドで実行されるブランチ数と、前記プログラムで実行されるブランチの総数とをランタイム時に比較するステップと、
前記メソッドで実行されるブランチの数と前記プログラム全体で実行されるブランチの総数との比較に基づき、よく実行されるメソッドを決定するステップと、
を含む方法。
【請求項２】
請求項１に記載の方法において、
前記よく実行されるメソッドは、
前記メソッドで実行されるブランチ数が、前記プログラム全体で実行されるブランチの総数の１／５００を超えるものである、
ことを特徴とする方法。
【請求項３】
請求項１に記載の方法において、
さらに、前記よく実行されるメソッドのうちよく実行されるバイトコードのシーケンスを決定するステップをも含む、
ことを特徴とする方法。
【請求項４】
請求項３に記載の方法において、
前記よく実行されるバイトコードのシーケンスはトレースである、
ことを特徴とする方法。
【請求項５】
請求項３に記載の方法において、
さらに、前記よく実行されるバイトコードのシーケンスを使用して前記プログラムの解釈を最適化するステップをも含む、
ことを特徴とする方法。
【請求項６】
請求項３に記載の方法において、
前記バイトコードはJava（登録商標）バイトコードである、
ことを特徴とする方法。
【請求項７】
バイトコードを解釈する方法であって、
よく実行されるバイトコードのシーケンスを決定するステップと、
前記よく実行されるバイトコードのシーケンスをコンパイルして対応するマシンコードに変換するステップと、
ジャンプテーブルに新たなエントリーを生成し、このジャンプテーブルの新たなエントリーに新たなバイトコードのラベルを付けるステップと、
前記新たなバイトコードを、前記対応するコンパイルされたマシンコードに関連付けるステップと、
前記よく実行されるバイトコードのシーケンス内の第1のバイトコードを、前記新たなバイトコードに置き換えるステップと、
を含む方法。
【請求項８】
請求項７に記載の方法において、
前記よく実行されるバイトコードのシーケンスを決定するステップは、ランタイム時に行われる、
ことを特徴とする方法。
【請求項９】
請求項７に記載の方法において、
前記よく実行されるバイトコードのシーケンスは、トレースである、
ことを特徴とする方法。
【請求項１０】
請求項７に記載の方法において、
前記ジャンプテーブルの新たなエントリーは、このジャンプテーブル内の以前に未使用のエントリーである、
ことを特徴とする方法。
【請求項１１】
請求項７に記載の方法において、
前記バイトコードは、Java（登録商標）バイトコードである、
ことを特徴とする方法。
【請求項１２】
請求項７に記載の方法において、
前記よく実行されるバイトコードのシーケンスを決定するステップは、
さらに、よく実行されるメソッドを決定するステップと、このよく実行されるメソッドのなかでよく実行されるバイトコードのシーケンスを決定するステップとをも含む、
ことを特徴とする方法。
【請求項１３】
請求項７に記載の方法において、
前記バイトコードは、Java（登録商標）バイトコードである、
ことを特徴とする方法。
【請求項１４】
複数のバイトコードを実行する仮想マシン操作の方法であって、
前記複数のバイトコード内のバイトコードを検査するステップと、
よく実行されるバイトコードのシーケンスを表す新たなバイトコードを含みこの新たなバイトコードと対応するマシンコードとを関連付けるようなジャンプテーブルを参照して前記検査されたバイトコードに対応するマシンコードを探すステップと、
前記ジャンプテーブルを参照して探し出されたマシンコードを実行するステップと、
前記よく実行されるバイトコードのシーケンスの第1のバイトコードを、前記ジャンプテーブルに含まれる新たなバイトコードで置き換えるステップと、
を含む方法。
【請求項１５】
請求項１４に記載の方法において、
前記バイトコードはJava（登録商標）バイトコードである、
ことを特徴とする方法。
【請求項１６】
請求項１に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、それぞれのメソッドにおいて実行されるブランチの数をランタイム時に決定するステップを含む、
ことを特徴とする方法。
【請求項１７】
請求項１６に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、さらに、実行されるブランチの総数をランタイム時に決定するステップをも含む、
ことを特徴とする方法。
【請求項１８】
請求項１７に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、さらに、それぞれのメソッドにおいて実行される前記ブランチ数と、実行されるブランチの前記総数とを比較して、よく実行されるメソッドを決定するステップをも含む、
ことを特徴とする方法。
【請求項１９】
請求項１８に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、さらに、前記よく実行されるメソッドのブランチの数をランタイム時に決定するステップをも含む、
ことを特徴とする方法。
【請求項２０】
請求項１９に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、さらに、前記検査されたバイトコードが実行された回数をランタイム時に決定するステップをも含む、
ことを特徴とする方法。
【請求項２１】
請求項２０に記載の方法において、
前記よく実行されるバイトコードのシーケンスをランタイム時に決定するステップは、さらに、前記検査されたバイトコードが実行された回数と、前記メソッドのブランチの数とを比較してよく実行されるバイトコードのシーケンスを決定するステップをも含む、
ことを特徴とする方法。
【請求項２２】
請求項１に記載の方法において、
前記よく実行されるバイトコードのシーケンスはトレースである、
ことを特徴とする方法。
【請求項２３】
バイトコードのシーケンスを受け取り、このバイトコードのシーケンスに対応するマシンコードのシーケンスを実行する仮想マシンであって、
入力として前記バイトコードのシーケンスと、出力としてよく実行されるバイトコードのシーケンスと、を持つ動的プロファイラーと、
前記よく実行されるバイトコードのシーケンスに対応する挿入されたエントリーと、前記対応するマシンコードと、を含むジャンプテーブルと、
を含む仮想マシン。
【請求項２４】
請求項２３に記載の仮想マシンにおいて、
前記バイトコードはJava（登録商標）バイトコードである、
ことを特徴とする仮想マシン。
【請求項２５】
請求項２３に記載の仮想マシンにおいて、
前記よく実行されるバイトコードのシーケンスのなかの第1のバイトコードは、前記ジャンプテーブルの挿入されたエントリーで置き換えられる、
ことを特徴とする仮想マシン。
【請求項２６】
請求項２３に記載の仮想マシンにおいて、
前記動的プロファイラーは、さらに、
よく実行されるメソッドを検出する第1の検出器と、
前記よく実行されるメソッドのうち、前記よく実行されるバイトコードのシーケンスを検出する第2の検出器と、を含む、
ことを特徴とする仮想マシン。
【請求項２７】
バイトコードを解釈するための命令セットを格納する機械可読な媒体であって、
前記命令セットは、
バイトコードシーケンスを動的にプロファイリングして、よく実行されるバイトコードのシーケンスを決定するステップと、
ジャンプテーブルを拡張して、前記よく実行されるバイトコードのシーケンスを表す新たなバイトコードエントリーと、前記よく実行されるバイトコードのシーケンスに相当するマシンコードとを含ませるステップと、
前記よく実行されるバイトコードのシーケンスのなかの第１のバイトコードを、新たなバイトコードエントリーで置き換えるステップと、
前記ジャンプテーブルを参照して、前記よく実行されるバイトコードのシーケンスに相当する前記マシンコードを探し出すステップと、を含む、
ことを特徴とする機械可読な媒体。
【請求項２８】
請求項２８に記載の機械可読な媒体において、
前記バイトコードはJava（登録商標）バイトコードである、
ことを特徴とする機械可読な媒体。
【請求項２９】
請求項２８に記載の機械可読な媒体において、
前記よく実行されるバイトコードはトレースである、
ことを特徴とする機械可読な媒体。
【請求項３０】
請求項２８に記載の機械可読な媒体において、
前記動的にプロファイリングして決定するステップは、
さらに、よく実行されるメソッドを決定するステップと、
前記よく実行されるメソッドのなかの前記よく実行されるバイトコードのシーケンスを決定するステップと、をも含む、
ことを特徴とする機械可読な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的にはコード解釈に関するものであり、特に、バイトコード解釈に関するものである。
【背景技術】
【０００２】
幾つかのプログラミング言語は、具体的なハードウェアプラットフォームの代わりに仮想マシン上で実行するプラグラムを持つ。仮想マシンはバイトコードプログラムを実行する。仮想マシン上のプログラム実行は、２つのステップに分かれる、第1のステップでは、仮想マシンがプログラムを実行するのに必要な仮想マシン命令を決定する。これらの仮想マシン命令をバイトコードと称する。際2のステップは、この仮想マシン命令を実行する。仮想マシンのバイトコードインタプリタは、バイトコードの各バイトを調べ、関連する命令（群）を実行する。
【０００３】
バイトコードインタプリタは、ジャンプテーブルを使って個々のバイトコードを対応するネイティブ即ちその機械本来のマシンコードに翻訳する。バイトコードは、一般的に、小さい一連のネイティブプログラムに変換される。しかしながらこのプロセスは非効率的であると考えられる。その理由は、インタプリタは、ジャンプテーブルを使用して、実行される各バイトコードを参照して探し出し、対応するマシンコードを実行しなければならないからである。また、マシンコードも非効率的であると考えられる。これは、マシンコード命令の次のセットを考慮して不必要なステップを実行しなければならない。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
従って、ジャンプテーブルを参照して実行され、かつ、マシンコードバイトコードを最適化し次のマシンコード命令を予想し得るような、それぞれのバイトコードの参照を伴わずにバイトコードを解釈する方法を提供することが望ましい。
【課題を解決するための手段】
【０００５】
発明の概要
本発明は、最適化された動的なバイトコードインタプリタに関する。実施態様の説明では、インタプリタは、２つのステージ、プロファイラーステージとコンパイラー／オプティマイザーステージで動く。プロファイラーは、動的にバイトコードをプロファイルし、よく実行されるバイトコードのシーケンスを選び出す。コンパイラー／オプティマイザーは、選択したよく実行されるバイトコードのシーケンスをマシンコードに変換する。
【０００６】
プロファイラーは、それ自体で、２つのステージ：メソッドプロファイリングステージと、ブランチターゲットプロファイリングステージとで動く。メソッド（method）とは、オブジェクト指向プログラミングのプロシージャ或いは関数(function)である。メソッドプロファイリングステージでは、プログラムが実行されるときにそのプログラム内でよく実行されるメソッドを決定する。その後、ブランチターゲットプロファイリングステージは、メソッドプロファイリングステージで見つけたメソッドの各々に対するバイトコードのよく実行されるシーケンスを決定する。
【０００７】
コンパイラー／オプティマイザーは、選択されたバイトコードのシーケンスをマシンコードに変換、即ち翻訳する。コンパイラー／オプティマイザーは、新たな利用可能なバイトコードを選択し、よく実行されるバイトコードのシーケンスのためのエントリーと対応するマシンコードとを含むように仮想マシンのジャンプテーブルを拡張する。変換されたシーケンスの第1のバイトコードは、その後、新たなバイトコードで置き換えられる。よく実行される、即ち頻繁に実行されるバイトコードのシーケンスの次の実行時には、仮想マシンはこの新たなバイトコードにあうこととなり、ジャンプテーブルを使用してマシンコードに直接ジャンプする。その結果、よく実行されるバイトコードのシーケンスの各バイトコードを個別に解釈する必要が無くなる。
【発明の効果】
【０００８】
従って、説明した本発明の実施態様は、インタプリターの実行時間および効率を改善する。
【発明を実施するための最良の形態】
【０００９】
好適な実施態様の詳細な説明
図１を参照すると、仮想マシン４が図示されている。仮想マシン４は、入力としてバイトコードのシーケンスでバイトコードを受け取る。仮想マシンは、このバイトコードを処理し、対応するマシンコード１２を実行する。
【００１０】
図２を参照すると、
動的（ダイナミック）プロファイラー６とコンパイラー／オプティマイザー１０とを含む、仮想マシン４のバイトコードインタプリタが図示されている。動的プロファイラー６は、バイトコード２が実行される間に動作する。動的プロファイラー６は、よく実行されるバイトコードのセット８を決定する。このよく実行されるバイトコードのセット８は、コンパイラー／オプティマイザーに渡されコンパイルされマシンコードに変換され、そして、仮想マシンのジャンプテーブルを拡張するのに使用される。動的プロファイラー６は、バイトコード２を受け取り、よく実行されるバイトコードのセット８を決定するように操作する。動的プロファイラー６は、ランタイム時に作用する。従って、バイトコードは、それらが実行される間にプロファイルされる。
【００１１】
図３を参照すると、図２の動的プロファイラー６の操作を説明するブロック図が示されている。動的プロファイラーは２つのステージ：メソッドプロファイリングステージ１３とブランチターゲットプロファイリングステージ１６とを持つ。ある実施態様では、メソッドプロファイリングステージ１３は、よく実行されるメソッド１４を決定する。メソッドとは、オブジェクト指向プログラミングにおけるプロシージャ或いは関数である。メソッドプロファイリングステージ１３は、２つのカウンタ、即ち、１つはよく実行されるメソッド１４を決定するための各メソッド用のカウンタであり、もう１つは全体用であるカウンタ使用する。１つのカウンタJCOUNT(m)は、メソッドmのなかでブランチターゲット（branch target）が実行されるたびに増分される。全体のカウンタGJCOUNTは、プログラム全体のどこかでブランチターゲットが実行されるたびに増分される。プログラムのブランチターゲットの大部分を実行するメソッドが、よく実行されるメソッド１４である。
【００１２】
一旦、よく実行されるメソッドが決定された後、そのメソッドは、ブランチターゲット（分岐目標）プロファイリングステージ１６に入り、そこでは、よく実行されるメソッド１４のなかのよく実行されるバイトコード８のシーケンスを決定する。よく実行されるバイトコードのシーケンス８のそれぞれは、その後、ジャンプテーブルを拡張するためにコンパイラー／オプティマイザー１０によって使用される。コンパイラー／オプティマイザー１０は、よく実行されるバイトコードの各シーケンスをコンパイルして、ジャンプテーブルのそれに相当するマシンコード１２に変換する。その後、マシンコード１２は、よく実行されるバイトコードのシーケンス８が解釈されるたびに、実行される。
【００１３】
発明のある実施態様では、よく実行されるバイトコードのシーケンスは、トレースである。トレース(trace)は、第１のバイトコードが実行されるときに実行されるバイトコードのシーケンスである。従って、トレースはブランチ即ち分岐を含まないバイトコードのシーケンスである。トレースは、コンパイラの理論で知られる基本ブロック（basic block）とは異なる。基本ブロックは、その第1のバイトコードが実行される場合に限り実行される全てのバイトコードのシーケンスである。基本ブロックでは、シーケンスのなかの第1のバイトコードのみがブランチターゲットである。トレースでは、シーケンス内の第1のバイトコードがブランチターゲットであるが、シーケンス内のそれ以外のバイトコードもブランチターゲットとなり得る。従って、トレース内にトレースが含まれることもあり得る。本発明のその他の実施態様では、よく実行されるバイトコードのセットは、サブトレースである。サブトレースは、トレースの終了の前にトレースを終了させるのが都合がいい場合に実施することができる。その他の実施態様では、よく実行されるバイトコードのセットを基本ブロックとすることができる。
【００１４】
図４を参照すると、動的プロファイラー６の操作を説明するフローチャートが図示されている。動的プロファイラー６は、メソッドプロファイリングステージ１３で始まり、よく実行されるメソッド１４を決定する。メソッドプロファイリングステージ１３では、２つのカウンタ、１つは全体用のものであり、１つは各メソッド用のものがある。１つのカウンタは、特定のメソッドで実行されるブランチターゲットの数を監視する（ステップ１８）。ある実施態様では、このカウンタはJCOUNTと名付けられる。第1のカウンタは、バイトコードプログラム全体で実行されるブランチターゲットの総数を追跡し続ける（２０）。本発明のある実施態様では、このカウンタはGJCOUNTと名付けられる。
【００１５】
この２つのカウンタは定期的に比較される（２２）。本発明のある実施態様では、カウンタの１つが増分される毎にこの定期的な比較が実施される。JCOUNT＞N×GJCOUNTである場合には、当該メソッドは、プロファイリングの次のステージ、即ちブランチターゲットプロファイリングステージに入る。Ｎは予め定められた閾値である。本発明のある実施態様では、Ｎは１／５００である。このＮの値は、よく実行されるメソッドとして選択されるメソッドの数に制限を設けるものである。解釈の効率が不当に悪くされないようなＮの値を使用することができる。一旦、メソッドが、メソッドプロファイリングステージでよく実行されるものであると決定された後、当該メソッドは、このメソッドのためにブランチターゲットプロファイリングステージに入る。その他のメソッドの場合は、メソッドプロファイリングステージは、続行され、その他のよく実行されるメソッドの検出を試行する。ブランチターゲットプロファイリングステージは、多くのカウンタを使用して各ブランチターゲットが実行された回数を追跡し続けることができる。ブランチプロファイリングステージでは、各バイトコードがバイトコードインタプリタによって実行されるのに応じて、各バイトコードは、順次に検査される（２４）。ブランチターゲットプロファイリングステージは、バイトコードがブランチであるか否かを判定する（２６）。当該バイトコードがブランチ（分岐）でない場合は、次のバイトコードが実行されるのに応じて当該次のバイトコードを検査する。当該バイトコードがブランチターゲットである場合は、それに対応するブランチターゲット用のカウンタを増分する（２８）。また、カウンタは、当該メソッドで実行されるブランチターゲットの総数を監視する（３０）。ある実施態様では、このカウンタはJCOUNTである。
【００１６】
個々のバイトコードブランチターゲット用のカウンタは、当該メソッドのブランチターゲットの合計用のカウンタと比較される（３２）。特定のバイトコードブランチターゲットがブランチの総数Ｍを超える原因となる場合は、その特定のバイトコードブランチターゲットは、よく実行されるバイトコードのセットのスタート部分である（３４）。Ｍは予め定められた閾値である。本発明のある実施態様では、Ｍは１／５０００である。Ｎ値と同様に、所望の解釈の効率を悪化させないようないかなるＭの値を使用することができる。
【００１７】
本発明のある実施態様では、よく実行されるバイトコードのセットはトレースであり、かつ、特定のバイトコードブランチターゲットはトレースのスタート部である。
【００１８】
ここで図５を参照すると、ヒットマップが図示されている。ブランチターゲットプロファイリングステージは、様々なブランチターゲットを監視するためのヒットマップを作成する。ヒットマップは、ｂ個のカウンタ３８のアレイ（配列）であり、ここでｂは、当該メソッドのバイトコードの数と同じである。当該メソッド内のバイトコードのオフセットも、ヒットマップ内の対応するカウンタのインデックスとなる。従って、ヒットマップカウンタは効率的なカウンタである。よく実行されるメソッド内でブランチが実行される毎に増分され、実行されるブランチターゲットの総数を監視するようなカウンタもある。本発明のある実施態様では、そのカウンタはJCOUNTである。
【００１９】
ヒットマップカウンタは、ブランチバイトコードを解釈する間にのみ、増分さされ、これは解釈されたバイトコードのごく一部分である。ブランチバイトコードを解釈するとき、解釈されるブランチのターゲットに対応するカウンタが増分される。カウントの位置決めおよび増分は、ヒットマップフォーマットにおいてはシンプルである。従って、このプロファイリングステージは効率的である。
【００２０】
このプロファイラーが、特定のブランチターゲットがよく実行されるメソッド内のブランチターゲットの総数Ｍを超える原因となることを判定した場合は、その特定のブランチターゲットおよびそれに続くトレースをコンパイラー／オプティマイザーに渡す。コンパイラー／オプティマイザーは、トレース内の各バイトコードをコンパイルし、下記のごとくジャンプテーブルを拡張する。
【００２１】
ここで図６を参照すると、インタプリタの操作が図示されている。インタプリタはステップ６０で各バイトコードを検査する。バイトコードがブランチでない場合は、インタプリタの操作は、その解釈モードでは、プロファイラーおよびコンパイラーが無いかのごとく処理を続行する。インタプリタは、ジャンプテーブルを参照して、当該バイトコード命令に対応するようなマシンコード命令を探し出す（６４）。インタプリタはそのマシンコードを実行する（６６）。マシンコードブロックの最後には、リターン命令がしばしば置かれ、これはマシンコードからインタプリタに戻るためのものであり、そこで次のバイトコードが検査される。
【００２２】
しかしながら、本発明で説明した実施態様では、インタプリタは、ブランチターゲットプロファイリングで使用されたヒットマップ内の適切なカウンタを増分すべきである。インタプリタは、バイトコードがブランチであるかどうかを判定すべきである（６６）。バイトコードがブランチでない場合は、次のバイトコードが検査される（６０）。バイトコードがブランチである場合は、GJCOUNT（プログラム内のブランチの合計を計数するカウンタ）が増分される（６７）。
ブランチのターゲットに対応するヒットマップ内の適切なカウンタを、増分すべきである（７０）。ヒットマップ内の適切なカウンタは、検査された特定のブランチターゲットに対応するカウンタと、実行されたブランチターゲットの総数のためのカウンタとである。プロファイリングに必要な比較は定期的に実行されるべきであり、そこでよく実行されるメソッドおよびよく実行されるバイトコードのシーケンスが決定される（６９）。本発明のある実施態様では、これらの比較は、GJCOUNTがｘ回更新される毎に実行され、ここでｘは所望の効率をもたらすような何らかの値とする。ある実施態様では、ｘは１である。この場合は、ブランチターゲットが解釈されたことを示すGJCOUNTが更新される毎に、プロファイリングカウンタの比較が実行される。このようにして、プロファイリングステージは、その他の解釈ステージの間に効率的に交互配置される（interleaved）。
【００２３】
ブランチのターゲットがよく実行されるトレースのスタート部である場合は（６２）、インタプリタはステップ７２〜７６で処理されるその他のバイトコードとは異なる扱いを行う。バイトコードの解釈をより効率的に達成するためには、インタプリタはコンパイルモードに入り（７２）、下記のごとくジャンプテーブルを拡張する（７４）。従って、よく実行されるトレースの後続のいかなる実行も後述するように１つの単一バイトコードとして扱われるため、効率が改善される。代わりに、ジャンプテーブルを参照して、単一のバイトコードを解釈するのに使用されるものと同一のプロセスによってトレース全体を解釈することもできる（６４−６８）。
【００２４】
動的プロファイラによる決定のように、バイトコードがよく実行されるトレースのスタート部である場合は、インタプリタはコンパイルモードに入る（７２）。コンパイルモードでは、コンパイラー／オプティマイザーはマシンコードブロックを連結することによってバイトコードトレースをコンパイルする（７２）。トレースをコンパイルした後、コンパイラー／オプティマイザーは、ジャンプテーブルにそれに対応するマシンコード位置を持つ新たななバイトコードエントリーのインデックスを拡張する（７４）。コンパイラー／オプティマイザーは、当該トレースの第１のバイトコードを、ジャンプテーブルで索引をつけられた新たなバイトコードで置き換えるようにバイトコードプログラムを更新する（７６）。ジャンプテーブルを拡張し、よく実行されるトレースの第１の即ち先頭のバイトコードを置き換えた後、インタプリタはコンパイルモードを抜け、解釈モードに戻る。
【００２５】
インタプリタは、新たなバイトコードを、よく実行されるトレースの第１のバイトコードではないその他の何らかのバイトコードと同じように扱う。それぞれのバイトコードは、プログラムカウンタを進め、新たなバイトコードは、トレースの残りのバイトコードをスキップするようにそのカウンタを進める。従って、次の回には、当該トレースはバイトコードインタプリタによって解釈され、インタプリタは当該トレースの各バイトコードを個別に解釈はしない。代わりに、インタプリタは新たなバイトコードを検査する（６０）。新たなバイトコードは、よく実行されるバイトコードの開始部分としては扱われない（６２）。インタプリタは、ジャンプテーブルの新たなバイトコードを参照し（６４）、トレース全体のための対応するマシンコードを実行する（６６）。
【００２６】
ここで図７を参照すると、トレースをコンパイルする間（７２）のコンパイラー／オプティマイザーの操作のさらなる詳細を説明するフローチャートが図示される。コンパイラー／オプティマイザーは、よく実行されるトレースの第１のバイトコードを受け取る。それはジャンプテーブルを使用してよく実行されるトレース内の第１のバイトコードに対応するマシンコードブロックを探す（７８）。また、それは、ジャンプテーブルを参照してトレース内のその他の全てのバイトコードに対応するマシンコードブロックを探し出す（８０）。
【００２７】
コンパイラー／オプティマイザーは、幾つかのやり方でトレース内の最後のバイトコードを判定する。多くの場合、マシンコードブロックの最後には、リターンコード命令がある。このリターンコードは、マシンコードブロックからインタプリタに戻され、そして、次のバイトコードが解釈される。時にはリターンコードは、インタプリタに戻る命令ではない場合があり、代わりに、その命令は、例えば印刷命令などの仮想マシンの奥深くに入るような命令である。インタプリタに戻りインタプリタで次のバイトコードを検査する命令以外の、仮想マシンにさらに深く入り込むような命令がある場合は、コンパイラー／オプティマイザーはトレースを終了させる。また、インタプリタにバイトコードプログラム内のその他の位置にブランチさせるブランチ（分岐）命令がある場合は、コンパイラー／オプティマイザーは、トレースを終了させる。さもなければ、マシンコードブロックがインタプリタに戻るリターンコード命令を含む場合は、コンパイラーはトレースを終了しない。
【００２８】
コンパイラーは、よく実行されるトレース内の各バイトコードからのマシンコードブロックを連結し（８４）、当該トレース用のマシン言語ブロックを形成する。そのマシンコードブロックは、トレース内の各バイトコードに対応する個々のマシンコードブロックからのリターン（戻り）コードを含む。これらのリターンコードは、容易に識別可能である。コンパイラーはリターンコードを識別する（８６）。コンパイラーは、最後のリターンコード以外の全てのトレースのためのマシンコードブロックを（８６）取り除く。コンパイラーは、コンパイラ技術で標準の最適化ルールのセットを使用してマシンコードブロックを最適化する。
コンパイラー／オプティマイザーが幾つかのバイトコードのためにマシンコードブロックを連結したため、これらの最適化技術が実行可能である。
【００２９】
ここで図８を参照すると、バイトコードおよび対応するマシンコード命令にインデックスを付けるためにバイトコードインタプリタによって使用されるジャンプテーブルが図示されている。図８は、コンパイラー／オプティマイザーによる拡張部を何ら含まないジャンプテーブル４０を図示する。インタプリタが各バイトコードを検査するのに応じて、インタプリタはジャンプテーブル４０を参照してバイトコード４２への参照および対応するマシンコード４４を探す。インタプリタによって使用されていないいくらかの部分４６がある。ジャンプテーブル４０のこの部分は使用されない、即ち、コンパイラー／オプティマイザーの新たなバイトコードのマッピングがなければマップされない。
【００３０】
ここで図９を参照すると、コンパイラー／オプティマイザーによって既に拡張されたジャンプテーブルが図示されている。インタプリタが各バイトコードを検査するのに応じて、インタプリタはジャンプテーブル４０内のバイトコードへの参照４２を探す。そのバイトコードが、既にテーブルに挿入された、よく実行されるトレースの第1のバイトコードを参照する新たなバイトコード４８である場合は、インタプリタは、その他のバイトコードの参照４２と同じように、当該バイトコード参照４８を探し出す。そのバイトコードがよく実行されるトレースのスタート部分であり、かつ、ジャンプテーブル４２にまだ挿入されていない場合は、コンパイラー／オプティマイザーは、そのトレース内のバイトコードをコンパイルし、ジャンプテーブル４０を拡張する。コンパイラー／オプティマイザーは、ジャンプテーブル４０内の、以前に使用されていない、即ち、マッピングされていない部分４６に新たなエントリーを加える。
【００３１】
ジャンプテーブル４０には有限数の未使用エントリーがある。従って、ジャンプテーブルの未使用部分のエントリーを持つよく実行されるトレースが、現在のよく実行されるトレースであるのかを判定することは、有用である。解釈されたプログラムは、通常は、異なるバイトコードトレースの異なるメソッドを使用するステージを含む。バイトコードが解釈され続けるのに応じて、最近は実行されていなかった幾つかのトレースが、異なるトレースでより良い役目を果たすためにメモリを占有するかもしれない。また、新たなよく実行されるメソッドが所定の閾値Ｎ，Ｍを超えることが段々と困難になるかもしれない。その理由は、GJCOUNTが時間がたてば上昇し、それゆえに閾値Ｎ，Ｍに到達することが困難になるからである。
【００３２】
この両者の問題を解決策は、プロファイラーのそれまでのカウンタを定期的に半分にすることである。この半分にする操作は、J回のブランチターゲット毎に実施することができる。ここでＪは、予め定められた数である。この操作は、これまでに取り込まれたブランチターゲットの影響を減少し、よく実行されるメソッドとよく実行されるバイトコードのセットという双方の基準をもはや満たさないメソッドおよびトレースを除去するという効果をもたらす。
【００３３】
本明細書で開示した発明を使用して、バイトコードを利用するいかなる言語を解釈することができる。バイトコードを使用する言語の一例はJava（登録商標）である。従って、本発明はJava（登録商標）仮想マシンで使用することができる。
【００３４】
上記説明から本明細書で開示した発明は、動的な最適化されたバイトコード解釈の新規かつ有用なシステムや方法を提供することは明らかである。
【図面の簡単な説明】
【００３５】
【図１】本発明の好適な実施態様によるシステムを説明する図である。
【図２】バイトコードインタプリタの拡張部分を説明するブロック図である。
【図３】動的プロファイラーの２つのステージを説明するブロック図である。
【図４】動的プロファイラーの操作を説明するフローチャートである。
【図５】動的プロファイラーのカウンタのアレイを説明するブロック図である。
【図６】仮想マシン操作を説明するフローチャートである。
【図７】トレースをコンパイルするコンパイラー／オプティマイザー操作を説明するフローチャートである。
【図８】仮想マシンジャンプテーブルを説明するブロック図である。
【図９】仮想マシンの拡張されたジャンプテーブルを説明するブロック図である。
【図１】
2004529413.tif 000003
【図２】
2004529413.tif 000004
【図３】
2004529413.tif 000005
【図４】
2004529413.tif 000006
【図５】
2004529413.tif 000007
【図６】
2004529413.tif 000008
【図７】
2004529413.tif 000009
【図８】
2004529413.tif 000010
【図９】
2004529413.tif 000011
【国際公開パンフレット】
2004529413.tif 000012
2004529413.tif 000013
2004529413.tif 000014
2004529413.tif 000015
2004529413.tif 000016
2004529413.tif 000017
2004529413.tif 000018
2004529413.tif 000019
2004529413.tif 000020
2004529413.tif 000021
2004529413.tif 000022
2004529413.tif 000023
2004529413.tif 000024
2004529413.tif 000025
2004529413.tif 000026
2004529413.tif 000027
2004529413.tif 000028
2004529413.tif 000029
2004529413.tif 000030
2004529413.tif 000031
2004529413.tif 000032
2004529413.tif 000033
2004529413.tif 000034
【国際公開パンフレット（コレクトバージョン）】
2004529413.tif 000035
2004529413.tif 000036
【国際調査報告】
2004529413.tif 000037