(57)【特許請求の範囲】
【請求項１】
コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う命令実行装置であって、
メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するメモリ確保部と、
前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換する命令置換部と、
前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行する付加処理実行部と、
取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う被置換命令実行部とを含み、
前記付加処理実行部及び前記被置換命令実行部を、前記専用命令に応答して呼び出される前記専用命令のハンドラとして実装し、
前記メモリ確保部及び前記命令置換部を、前記特定の命令に応答して呼び出される、前記特定の命令のハンドラの一部として実装し、該特定の命令のハンドラは、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行う、
命令実行装置。
【請求項２】
前記実行系は、Java(R)仮想マシンであり、前記メモリ上に読み込まれた前記命令列は、１以上の前記特定の命令を含む、クラスファイルに含まれる各メソッドのバイトコード列であり、前記メモリ確保部は、前記クラスファイルの前記メソッド毎に、前記メモリ領域を、前記１以上の特定の命令の数に等しい要素数からなる配列として確保し、確保した前記配列の位置情報を前記メソッドに関連付けて保存し、前記命令置換部は、前記バイトコード列内に含まれる前記１以上の特定の命令の各々を、前記配列の各要素にコピーし、かつ、前記専用命令及び前記特定の命令に割り当てられた前記配列のインデックス情報で置換する、請求項１に記載の命令実行装置。
【請求項３】
前記特定の命令は後方へのジャンプ命令であり、前記メモリ領域を必要とする付加処理は、前記後方へのジャンプ命令の実行回数をカウントするカウンタ処理である、請求項２に記載の命令実行装置。
【請求項４】
前記配列のインデックス情報は、前記バイトコード列内の前記後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換される、請求項３に記載の命令実行装置。
【請求項５】
前記配列のインデックス情報は、前記専用命令の命令名に埋め込まれて前記バイトコード列内の前記後方へのジャンプ命令と置換される、請求項３に記載の命令実行装置。
【請求項６】
前記命令実行装置は、マルチスレッド環境下で動作し、前記特定の命令のハンドラは更に、１のスレッドの要求に基づく前記命令列内の前記特定の命令の読み出しに応答して、処理の実行の待機を要求する待機命令で前記特定の命令を置換し、該特定の命令を一時的な退避場所に格納する待機命令挿入部と、前記命令列内の前記特定の命令を実行中の他のスレッドの有無を確認する実行状態確認部とを含み、前記メモリ確保部は、前記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始し、前記命令置換部は、一時的な退避場所に格納された前記特定の命令を前記メモリ領域にコピーし、かつ、前記バイトコード列内の前記待機命令を、前記専用命令及び前記特定情報で置換する、請求項２に記載の命令実行装置。
【請求項７】
コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対してメモリ領域を必要とする付加処理を行う、コンピュータにおいて実行される命令実行プログラムであって、該命令実行プログラムは前記コンピュータに、
メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するステップと、
前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換するステップと、
前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行するステップと、
取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行うステップと
を実行させ、前記命令実行プログラムは、前記専用命令に応答して呼び出される専用命令のハンドラと、前記特定の命令に応答して呼び出される特定命令のハンドラとを含み、前記専用命令のハンドラは前記確保するステップと、前記置換するステップとを前記コンピュータに実行させ、前記特定命令のハンドラは、前記付加処理を実行するステップと、前記特定の命令によりなされる処理と同じ処理を行うステップとを前記コンピュータに実行させ、かつ、前記コンピュータに、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行わせる、
命令実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ上で所定の実行系により実行される命令を含む命令列内の特定の命令の実行を監視するために、メモリ領域を必要とする付加処理を行う技術に関する。
【背景技術】
【０００２】
従来、トレース単位での動的コンパイルやバイナリ変換を行う処理系において、トレースを生成するために、プログラムの実行を監視することがなされている。
【０００３】
例えば、非特許文献１は、ループの実行回数を監視するために、プログラム内の後方へのジャンプ命令の各々にカウンタ変数を割り付け、それぞれのジャンプの実行回数をカウントする技術を開示する。非特許文献１に記載の技術によれば、カウンタ変数のアドレスは、後方へのジャンプの実行時にジャンプ命令のアドレスをキーとしてハッシュテーブルを参照することによって取得される。
【０００４】
また、非特許文献２は、監視対象のプログラムを書き換え、ジャンプ命令の飛び先をプロファイル用のコードに変更し、それによってカウンタの計算を行う技術を開示する。
【０００５】
また、動作中のプログラムの一部を書き換える技術に関して、特許文献１が存在する。特許文献１は、書き換え条件が成立すると、変更対象とされる旧プログラムの先頭に新プログラムが格納された新プログラム格納エリアのアドレスを書き込み、新プログラム格納エリアの末尾にジャンプ先アドレスとして旧プログラム格納エリアの次のアドレスを書き込む技術を開示する。
【０００６】
なお、以下に挙げる特許文献２は、ベース値とベース値からのオフセット値によってアドレスを求める手法についての背景技術として記載したものである。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平成９―２４４７１７号公報
【特許文献２】特開２００５―３２２２３２号公報
【非特許文献】
【０００８】
【非特許文献１】Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia, “Dynamo: A Transparent Dynamic OptimizationSystem”, ACM SIGPLAN Notices, Volume 35, pp.1-12, May 2000
【非特許文献２】Eli D. Collins, Barton P. Miller, “A Loop-aware Search Strategy forAutomated Performance Analysis”, In High PerformanceComputing and Communications (HPCC-05), Sorrento, Italy, September 2005.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、非特許文献１が開示する技術は、プログラムの挙動を変えることなくプログラムの実行を監視することを可能とするものの、ハッシュテーブル参照のオーバーヘッドが大きいという問題がある。一方、特許文献１や非特許文献２が開示する技術は、カウンタのアドレスを求めるためにハッシューブルを参照することを必要としないので、非特許文献１の技術と比較してオーバーヘッドが小さい。
【００１０】
しかし、特許文献１や非特許文献２が開示する技術は、元のプログラムを書き換えて他のコードに変更してしまうため、元のプログラムの挙動を変えてしまう。仮に、書き換えられた部分のコードを他の場所に退避させるとしても、今度は実行命令数の増大によって、プログラムの挙動が変わってしまう。また、これら技術では、元のプログラム言語で記述できる以上のことはできない。
【００１１】
この発明は、上記の問題点を解決するためになされたものであって、オーバーヘッドを低減し、かつ、プログラムの挙動を変えない、プログラムの実行を監視する技術を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するために、本発明の第１の態様においては、コンピュータ上で所定の実行系により実行される命令を含む命令列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う命令実行装置であって、メモリ上に読み込まれた前記命令列内に含まれる前記特定の命令に対し、前記付加処理のためのメモリ領域を確保するメモリ確保部と、前記特定の命令を、確保した前記メモリ領域にコピーし、かつ、前記付加処理を行う専用命令及び前記メモリ領域の位置を特定する特定情報で置換する命令置換部と、前記命令列内の前記専用命令の読み出しに応答して、該専用命令と共に置換された前記特定情報から前記メモリ領域を取得し、該メモリ領域を用いて前記付加処理を実行する付加処理実行部と、取得された前記メモリ領域にコピーされた前記特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う被置換命令実行部とを含む、命令実行装置を提供する。
【００１３】
好ましくは、前記付加処理部及び前記被置換命令実行部は、前記専用命令に応答して呼び出される、前記専用命令のハンドラとして実装される。
【００１４】
また好ましくは、前記実行系は、Java(R)仮想マシンであり、前記メモリ上に読み込まれた前記命令列は、１以上の前記特定の命令を含む、クラスファイルに含まれる各メソッドのバイトコード列である。そして前記メモリ確保部は、前記クラスファイルの前記メソッド毎に、前記メモリ領域を、前記１以上の特定の命令の数に等しい要素数からなる配列として確保し、確保した前記配列の位置情報を前記メソッドに関連付けて保存する。更に前記命令置換部は、バイトコード列内に含まれる前記１以上の特定の命令の各々を、前記配列の各要素にコピーし、かつ、前記専用命令及び前記特定の命令に割り当てられた前記配列のインデックス情報で置換する。
【００１５】
また好ましくは、前記特定の命令は後方へのジャンプ命令であり、前記メモリ領域を必要とする付加処理は、前記後方へのジャンプ命令の実行回数をカウントするカウンタ処理である。
【００１６】
更に好ましくは、前記配列のインデックス情報は、バイトコード列内の前記後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換される。これに代えて、前記配列のインデックス情報は、前記専用命令の命令名に埋め込まれて前記バイトコード列内の前記特定の命令と置換されてもよい。
【００１７】
また好ましくは、前記メモリ確保部及び前記命令置換部を、前記特定の命令に応答して呼び出される、前記特定の命令のハンドラの一部として実装し、該特定の命令のハンドラは、前記特定の命令を処理すると共に、確保した前記メモリ領域の初期化を行う。
【００１８】
更に好ましくは、前記命令実行装置は、マルチスレッド環境下で動作し、前記特定の命令のハンドラは更に、１のスレッドの要求に基づく前記命令列内の前記特定の命令の読み出しに応答して、処理の実行の待機を要求する待機命令で前記特定の命令を置換し、該特定の命令を一時的な退避場所に格納する待機命令挿入部と、前記命令列内の前記特定の命令を実行中の他のスレッドの有無を確認する実行状態確認部とを含み、前記メモリ確保部は、前記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始し、前記命令置換部は、一時的な退避場所に格納された前記特定の命令を前記メモリ領域の前記他の一部にコピーし、かつ、前記バイトコード列内の前記待機命令を、前記専用命令及び前記特定情報で置換する。
【００１９】
以上、命令実行装置として本発明を説明したが、本発明は、コンピュータにより実行される、命令実行方法および命令実行プログラムとして把握することもできる。
【発明の効果】
【００２０】
本発明によれば、メモリ上に読み込まれた命令列内の監視対象の特定の命令は、付加処理を行う専用命令と該専用命令のための追加のメモリ領域の位置を特定する特定情報に置き換えられ、追加のメモリ領域にコピーされるので、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がなく、オーバーヘッドを低減できる。また、本発明によれば、命令列内から専用命令が読み出されると、追加のメモリ領域を用いて付加処理が実行された後、該領域内の特定の命令を参照して特定の命令と同様の処理がなされるので、元のプログラムの挙動が変わらない。本発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００２１】
【図１】本発明に係る命令実行方法を適用可能なコンピュータ・システムの機能構成を示す構成図である。
【図２】本発明の第１の実施形態に係る命令実行装置２００の機能ブロック図である。
【図３】本発明に係る命令実行装置によるバイトコードの書き換えの一例を示す図である。
【図４】（ａ）は、従来のジャンプ命令のハンドラの擬似コードの一例を示す。（ｂ）は、本発明の専用命令のハンドラの擬似コードの一例を示す。
【図５】本発明の第１の実施形態に係る命令実行装置２００による処理の流れを示すフローチャートである。
【図６】図５に示したメモリ確保及び命令置換処理（Ｓ５０５）の流れを示すフローチャートである。
【図７】図５に示した専用命令のハンドラ２１５による処理（Ｓ５１５）の流れを示すフローチャートである。
【図８】本発明の第２の実施形態に係る命令実行装置８００の機能ブロック図である。
【図９】本発明の第２の実施形態に係る命令実行装置８００による処理の流れを示すフローチャートである。
【図１０】図９に示した特定命令のハンドラ８０５による処理（Ｓ９０５）の流れを示すフローチャートである。
【図１１】本発明の第３の実施形態に係る命令実行装置１１００の機能ブロック図である。
【図１２】特定命令のハンドラ１１０５による処理の流れを示すフローチャートである。
【図１３】カウンタ処理によるオーバーヘッドを従来技術と本発明とで比較した実験結果を示す図である。
【図１４】本発明の実施形態に係るコンピュータ５０のハードウェア構成の一例を示す。
【発明を実施するための形態】
【００２２】
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００２３】
動的コンパイルを行う言語や、バイナリ変換等において、処理を行う単位としてトレースを用いる技術が重要になっている。トレースとは、動的に実行を監視することによって決定される、頻繁に実行される命令列である。トレースベースの処理系では、実行回数の多いループを見つけてトレースを生成する候補とするために、一般に、後方へのジャンプ命令ごとにカウンタを設け、実行回数をカウントすることがなされている。この際、上述したように、従来技術ではジャンプ命令のアドレスをキーとするハッシュテーブルを用いてカウンタの管理が行われていたため、ハッシュを引くオーバーヘッドが大きくなっていた。
【００２４】
本発明は、このようなトレースベースの処理系において、トレースを生成するために実行を監視するオーバーヘッドの削減を、プログラムの挙動を変えずに行うことを目的とするものである。なお、以下では理解を容易にするために、本発明を仮想マシンにおけるインタプリタに適用する場合について説明する。また、トレースを生成するための実行の監視は、ジャンプ命令の実行回数をカウントするカウンタ処理により行うものとする。しかし、本発明の適用は仮想マシンにおけるインタプリタに限定されず、
例えば、他のマシン用のバイナリを実行するバイナリトランスレータ・エミュレータにも適用でき、監視対象の特定の命令の実行に対してなされる、メモリ領域を必要とする任意の付加処理に対して適用可能であることに留意されたい。
【００２５】
図１は、本発明を適用可能なコンピュータ・システム１００の構成を示す。コンピュータ・システム１００は中央処理装置（CPU）、メモリ及びこれらの周辺回路等（図示しない）を含む一般的なコンピュータのハードウェア１０５、オペレーティング・システム(OS)１１０、仮想マシン１２５、記憶装置１１５を含む。なお、仮想マシン１２５は、一例として、サン・マイクロシステムズ（Sun（登録商標）Microsystems）から入手可能なJava（Ｒ）仮想マシンであってよい。以下では仮想マシン１２５は、Java（Ｒ）仮想マシンであるとして説明する。
【００２６】
Java（Ｒ）仮想マシン１２５は、通信網及び記録媒体等（図示しない）を介して予め記憶装置１１５に導入され、システムの立ち上げ時にハードウェア１０５のメモリにロードされて、ＯＳ１１０上で動作する。Java（Ｒ）仮想マシン１２５は、サーバコンピュータ等のコンピュータから通信網を介して送信されたバイトコード１２０、または、記録媒体を介して記憶装置１１５に供給されたバイトコード１２０を実行する。
【００２７】
Java（Ｒ）ランタイム関数１４０は、Java（Ｒ）の言語仕様のうち、バイトコードの仕様以外の部分を処理する関数群であって、例えば、まだメモリにロードされていないバイトコードを、記憶装置１１５等からメモリにロードしたり、オブジェクトを作成するために、メモリ内の領域を確保したりする。
【００２８】
JITコンパイラ１３０は、バイトコード１２０を動的コンパイルし、ハードウェア１０５のＣＰＵが実行可能なマシンコード形式のバイトコードを生成する。生成されたマシンコード形式のバイトコードは、ハードウェア１０５のＣＰＵにより実行される。
【００２９】
インタプリタ１３５は、バイトコード１２０を１命令ずつ処理し、バイトコードごとに定義された処理を行う。また、インタプリタ１３５は、バイトコードをハードディスクドライブ等の記憶装置１１５や通信網から読み込んだり、ＯＳ１１０へ要求したりなど、バイトコード操作以外の処理を、Java（Ｒ）ランタイム関数１４０を介して処理する。
【００３０】
インタプリタ１３５はまた、本発明に係るバイトコード実行方法を実現するために必要な構成要素を含み、メモリ上に読み込まれたバイトコード列内に含まれる監視対象の特定の命令の実行に対して、メモリ領域を必要とする付加処理を行う。
【００３１】
即ち、インタプリタ１３５は、メモリ上に読み込まれたバイトコード列内に含まれる監視対象の特定の命令に対し、付加処理のための追加のメモリ領域を確保してその一部に特定の命令をコピーし、バイトコード列内の特定の命令を、付加処理を行う専用命令と追加のメモリ領域の位置を特定する特定情報とで置換する。また、インタプリタ１３５は、バイトコード列内から専用命令を読み出されると、該専用命令と共に特定の命令と置換された特定情報に基づきメモリ領域を取得して、追加のメモリ領域の他の一部を用いて付加処理を実行し、更に、該メモリ領域内にコピーされた特定の命令を参照して該命令と同様の処理を行う。
【００３２】
なお、追加のメモリを確保して命令の置換を行うまでの一連の処理は、特定の命令を含むバイトコード列のメモリ上への読み込みに応答して行ってもよく、或いは、特定の命令の実行に応答して行ってもよい。以下では、前者を第１実施形態、後者を第２実施形態として順に説明する。また、上述したように以下の説明では、特定の命令は後方へのジャンプ命令であるとする。更に、後方へのジャンプ命令の実行に対して行われるメモリ領域を必要とする付加処理は、後方へのジャンプ命令の実行回数をカウントするカウンタ処理であるとする。
【００３３】
（第１実施形態）  図２は、本発明の第１の実施形態に係る命令実行装置２００としてのインタプリタの機能ブロック図である。第１の実施形態に係る命令実行装置２００としてのインタプリタは、メモリ確保部２０５と、命令置換部２１０と、専用命令ハンドラ２１５とを含む。専用命令ハンドラ２１５は、付加処理実行部２２０と、被置換命令実行部２２５とを含む。
【００３４】
メモリ確保部２０５は、メモリ上にクラスファイルがロードされると、クラスファイルに含まれるメソッド毎に、付加処理のためのメモリ領域として、メソッドのバイトコード列内に含まれる１以上の特定の命令の数に等しい要素数からなる配列を確保する。そのためメモリ確保部２０５は、クラスファイルのロードに応答して、各メソッドのバイトコード列を走査し、後方へのジャンプ命令に相当するバイトコード、例えば、goto、ifeq、if_icmpeq等のJava（Ｒ）バイトコードの数をカウントする。
【００３５】
配列の各要素は、メソッドに含まれる１以上の後方へのジャンプ命令にそれぞれ割り当てられる。要素のメモリ領域の一部は、付加処理のための作業領域、即ちカウンタとして使用される。また、要素のメモリ領域の他の一部は、該要素を割り当てられた特定の命令、即ち後方へのジャンプ命令とジャンプ先へのオフセットとをコピーするための領域として使用される。従って、本実施例における配列の各要素のサイズは、少なくとも、カウンタのバイト数（例えば４バイト）と後方へのジャンプ命令の情報のサイズ（例えば、ジャンプ命令の２バイトとジャンプ先へのオフセットの２バイト）を足し合わせた８バイトである。
【００３６】
メモリ確保部２０５はまた、確保した配列の位置情報、例えば、配列へのポインタをメソッドに関連付けて保存する。一例としてメモリ確保部２０５は、配列の位置情報をメソッドごとの情報（例えば、名前、アクセス制御情報）を格納するメソッド構造体に格納してもよい。なお、メモリ確保部２０５は、メソッド単位に代えて、クラス単位で配列を確保してもよい。この場合、メモリ確保部２０５は、配列の位置情報を、クラスごとの情報（例えば、名前、メソッド、変数等のリスト）を格納するクラス構造体に格納してよい。ただし、クラスに含まれるメソッドの数が多い場合は、メソッド単位で処理することが好ましい。これは、後述する命令置換部２１０により使用される配列の要素を指定するインデックの長さが２バイトを超えるケースが起こり得るためであり、その場合、インデックス情報を元のバイトコード列に埋め込むことが難しくなる。
【００３７】
命令置換部２１０は、メソッドのバイトコード列内に含まれる１以上の特定の命令の各々を、メモリ確保部２０５により確保された配列の各要素にコピーする。本実施例では、特定の命令は後方へのジャンプ命令であるため、命令置換部２１０は、後方へのジャンプ命令をジャンプ先へのオフセットと共に配列の要素にコピーする。そのため命令置換部２１０は、メモリ確保部２０５によるメモリの確保に応答して、クラスフィル内の各メソッドのバイトコード列を走査し、後方へのジャンプ命令に相当するバイトコード、例えば、goto、ifeq、if_icmpeq等のJava（Ｒ）バイトコードを検出すると、これを配列の要素に順にコピーする。以下では、JBgotoのように、Java（Ｒ）のバイトコード名には最初にJBを付けてJava（Ｒ）バイトコードであることを示す。
【００３８】
命令置換部２１０はまた、メソッドのバイトコード列内に含まれる１以上の特定の命令、即ち後方へのジャンプ命令の各々を、それに割り当てられたメモリ領域の位置を特定する特定情報と、付加処理を行う専用命令とで置換する。ここで付加処理を行う専用命令とは、命令実行装置２００としてのインタプリタにより処理されるように事前に定義される専用の命令であって、該専用の命令と置換される特定の命令の実行に対する付加処理と、置換される特定の命令と同様の処理とをインタプリタに処理させる命令である。以下ではこの専用の命令の名前を、JBbackedgeとする。
【００３９】
また、上述したように、本実施例では、後方へのジャンプ命令の各々に配列の要素が割り当てられる。そこで命令置換部２１０は、割り当てられたメモリ領域の位置を特定する特定情報として、配列のインデックスを利用してもよい。更に、命令置換部２１０は、配列のインデックス情報を、後方へのジャンプ命令のジャンプ先を示すオフセット情報と置換してもよい。これに代えて命令置換部２１０は、配列のインデックス情報を、専用命令の名前に埋め込んで、バイトコード列内の後方へのジャンプ命令と置換してもよい。例えば、バイトコード列内の注目する後方へのジャンプ命令に割り当てられた配列の要素のインデックスが２であるとすると、命令置換部２１０は、JBbackedge2を、そのバイトコード列内の注目する後方へのジャンプ命令と置換してよい。
【００４０】
ここで、図３を参照して、メモリ確保部２０５による配列の確保と、命令置換部２１０による命令のコピー及び置換とを説明する。図３の横軸t３０２は時間の流れを示し、番号３００で参照される矩形は、メモリ上にロードされたメソッドを示す。なお、図３の上段に示すメソッド３００、３３０、３８０は、状態は異なるがいずれも同じメソッドを示す。同様に図３の下段に示す配列３２０、３６０は、状態は異なるがいずれも同じ配列を示す。メソッド３００は、バイトコード列３０５を含み、バイトコード列３０５内には、後方へのジャンプ命令としてJBgoto３１０がオフセット（<jumpoffset>）３１５と共に含まれている。
【００４１】
メモリ確保部２０５は、メモリ上にメソッド３００がロードされると、バイトコード列３０５を走査して、JBgoto３１０のような後方へのジャンプ命令の数nをカウントする。続いて、メモリ確保部２０５は、図３に示すように、求まった後方へのジャンプ命令数nに等しい要素数からなる配列３２０をメモリ上に確保し、矢印３２２に示すように、確保した配列３２０の位置情報を、メソッド３３０のメソッド構造体３３５に格納する。
【００４２】
次に命令置換部２１０は、メソッド３３０のバイトコード列３４０を走査して、検出した後方へのジャンプ命令を、配列３６０の要素にコピーする。なお、割り当てる配列の要素は、一例として、後方へのジャンプ命令の検出順に配列の先頭から決定してよい。図３では、矢印３５７により示されるように、後方へのジャンプ命令JBgoto３４５がオフセット（<jumpoffset>）３５０と共に、割り当てられた配列３６０の要素の一部３７０と３７５にそれぞれコピーされている。また、同要素の他の一部３６５は、後述する専用命令JBbackedge３９０によりカウンタとして使用される領域であるため、命令置換部２１０は、要素３６５に初期値０を設定したカウンタ変数を格納する。  
【００４３】
その後命令置換部２１０は、バイトコード列３４０内のコピーされた後方へのジャンプ命令JBgoto３４５とそのオフセット（<jumpoffset>）３５０を、矢印３７８に示すように、それぞれ、専用命令JBbackedge３９０と割り当てられた配列の要素の位置を特定するインデックス情報（<index>）３９５とで置換する。命令置換部２１０による命令のコピーと置換は、メソッド３３０のバイトコード列３４０内に未処理の後方へのジャンプ命令がなくなるまで繰り返される。
【００４４】
図２に戻って、専用命令ハンドラ２１５は、バイトコード列内の専用命令に応答して呼び出される、専用命令のハンドラである。専用命令ハンドラ２１５は、付加処理実行部２２０と被置換命令実行部２２５とを含む。
【００４５】
付加処理実行部２２０は、専用命令ハンドラ２１５が呼び出されると、上記専用命令と共に特定の命令と置換されたバイトコード列内の特定情報に基づいてメモリ領域を取得し、該メモリ領域を用いて置換された特定の命令に対する付加処理を実行する。具体例として、特定情報として配列のインデックス情報が、後方へのジャンプ命令のオフセット情報（例えば、２バイトの情報）と置換されている場合を考える。なお、配列本体への位置情報、例えば、配列へのポインタ情報は、メソッド構造体に格納されているものとする。
【００４６】
上記ケースにおいて付加処理実行部２２０は、バイトコード列から読み出された専用命令に続く２バイトを配列のインデックス情報として読み出す。また、付加処理実行部２２０は、メソッド構造体から配列へのポインタ情報を読み出し、配列の先頭のアドレスを取得する。目的のメモリ領域の位置は、配列の先頭のアドレスに、インデックス情報に要素のサイズを乗じた値を加えることにより求められる。付加処理実行部２２０は、求めたメモリ領域をカウンタ変数として利用し、後方へのジャンプ命令の実行回数をカウントする。なお、インデックス情報が専用命令に埋め込まれている場合も、同様にして目的のメモリ領域を取得できる。
【００４７】
被置換命令実行部２２５は、付加処理実行部２２０により取得されたメモリ領域にコピーされている、置換された特定の命令を参照して、該特定の命令によりなされる処理と同じ処理を行う。
【００４８】
図４に、専用命令ハンドラ２１５の擬似コードを示す。比較のため、図４（ａ）には、ジャンプ命令のアドレスをキーとするハッシュテーブルを用いてカウンタを管理する、従来のハンドラの擬似コードを示す。コード中に記載されるPCはプログラムカウンタであり、従来のハンドラが呼び出される際には、PCはジャンプ命令のアドレスを指している。
【００４９】
１行目のコードでは、PCが指すアドレスの次のアドレスから２バイトが読み取られ、これがジャンプ命令のオフセット値としてoffsetに設定される。２行目のコードでは、式、offset<0が検査され、PCが指すジャンプ命令が後方へのジャンプ命令であることが確認される。後方へのジャンプ命令である場合、次の３―４行目のコードが実行され、３行目のコードでは、PC、即ちジャンプ命令のアドレスを引数としてハッシュテーブルが参照され、結果であるカウンタのアドレスがcounterAddrに設定される。４行目のコードでは、カウンタの値が１インクリメントされる。最後の６行目のコードでは、PCにoffsetの値が加えられ、ジャンプ先のアドレスがPCに設定される。
【００５０】
図４（ｂ）は、本発明の専用命令ハンドラ２１５の擬似コードの一例を示す。ここでも、コード中に記載されるPCはプログラムカウンタを示し、本発明の専用命令ハンドラ２１５が呼び出される際には、PCはジャンプ命令のアドレスを指している。１行目のコードでは、PCが指すアドレスの次のアドレスから２バイトが読み取られ、これが専用命令と置換された後方へのジャンプ命令に割り当てられた配列の要素を示すインデックス情報としてindexに設定される。３行目のコードでは、メソッド構造体に格納された配列の先頭のアドレスに8*indexが加えられ、加算された値が配列の要素の先頭アドレスとしてcounterAddressに設定される。ここで、要素のサイズは、カウンタとして使用する４バイトと、元のジャンプ命令のバイトコード情報のコピー先として使用する４バイトの合計８バイトとしている。
【００５１】
４行目のコードでは、配列の要素の先頭アドレスcounterAddressに４バイトを加えることにより、元のバイトコード情報の先頭アドレスが求められ、該アドレスにある情報が元のバイトコード情報としてoriginalBCに設定される。５行目のコードでは、counterAddressを用いてカウンタの値が１インクリメントされる。６行目以降のif文では、originalBC が後方へのジャンプ命令（JBgoto、JBifeq、JBif_icmpeq等）と比較され、置換された後方へのジャンプ命令の種類を特定され、特定された種類のジャンプ命令と同様の処理が行われる。例えば、元のバイトコードoriginalBCがJBgotoである場合、８行目のコードにおいて、アドレス（counterAddress+5）から２バイトが読み取られ、JBgotoのジャンプ先を示すオフセット情報としてoffsetに設定される。そして９行目のコードにおいて、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。
【００５２】
一方、元のバイトコードoriginalBCがJBifeqである場合、１２行目のコードにおいて、アドレス（counterAddress+5）から２バイトが読み取られ、これがJBifeqのジャンプ先を示すオフセット情報としてoffsetに設定される。そして１３行目のコードにおいて、最初のオペランドが０であるか否かが検査され、０である場合、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。最初のオペランドが０でない場合、次の処理へ進むためにPCに３が加えられる。
【００５３】
また、元のバイトコードoriginalBCがJBif_icmpeqである場合、１７行目のコードにおいて、アドレス（counterAddress+5）から２バイトが読み取られ、これがJBif_icmpeqのジャンプ先を示すオフセット情報としてoffsetに設定される。そして１８行目のコードにおいて、最初のオペランドと２番目のオペランドが等しいか否かが検査され、等しい場合、offsetの値をPCに加えることにより、ジャンプ先のアドレスがPCに設定される。等しくない場合、次の処理へ進むためにPCに３を加えられる。上記以外の後方へのジャンプ命令についても、同様に処理できる。
【００５４】
次に図５から図７を参照して、本発明の第１の実施形態に係る命令実行装置２００としてのインタプリタによる処理の流れを説明する。図５は、本発明の第１の実施形態に係る命令実行装置２００によるバイトコード実行処理の全体の流れを示すフローチャートである。図６は、図５に示すメモリ確保及び命令置換処理（Ｓ５０５）の流れを示すフローチャートである。図７は、図５に示す専用命令のハンドラによる処理（Ｓ５１５）の流れを示すフローチャートである。  
【００５５】
図５に示す処理は、ステップ５００より開始され、命令実行装置２００は、メモリ上に新しいクラスファイルがロードされたか否かを判定する。新しいクラスファイルがロードされた場合（ステップ５００：ＹＥＳ）、処理はステップ５０５へ進み、メモリ確保部２０５は、クラスファイル内の各メソッドについて、メモリ確保処理と命令置換処理とを実行する。メモリ確保部２０５による各処理の詳細は、図６を参照して後述する。
【００５６】
一方、ステップ５００において、新しいクラスファイルがロードされていない場合（ステップ５００：ＮＯ）、処理はステップ５１０へ進み、命令実行装置２００は、メモリ上のバイトコード列から次のバイトコードを読み出し、該バイトコードが専用命令であるか否かを判定する。なお、命令実行装置２００が初めてステップ５１０を実行する場合における次のバイトコードとは、メモリ上のクラスファイルに含まれるメソッドの最初のバイトコードである。
【００５７】
ステップ５１０において、読み込んだバイトコードが専用命令である場合、命令実行装置２００は専用命令のハンドラを呼び出して専用命令を処理する（ステップ５１５）。一方、ステップ５１０において、読み込んだバイトコードが専用命令でない場合、命令実行装置２００は、そのバイトコードに定義された処理を行う（ステップ５２０）。続いて命令実行装置２００は、次のバイトコードが存在するか否か、即ち、プログラムの終わりであるか否かを判定し（ステップ５２５）、プログラムの終わりでない場合（ステップ５２５：ＮＯ）、処理はステップ５００に戻り一連の処理を繰り返す。一方、ステップ５２５において、プログラムの終わりである場合（ステップ５２５：ＹＥＳ）、命令実行装置２００は、処理を終了する。
【００５８】
図６に示すフローチャートは、図５に示すステップ５０５の処理の詳細を示し、メモリ上にロードされたクラスファイルに含まれるメソッド毎にメモリ確保部２０５により実行される。図６に示す処理は、ステップ６００より開始され、メモリ確保部２０５は、メソッドのバイトコード列を走査して、置換対象の命令、即ち、後方へのジャンプ命令の数nをカウントする。続いてメモリ確保部２０５は、カウント数nが正であるか否かを判定し（ステップ６０２）、カウント数nが正でない場合（ステップ６０２：ＮＯ）、処理を終了する。
【００５９】
一方、カウント数nが正である場合（ステップ６０２：ＹＥＳ）、メモリ確保部２０５は、n個の所定のサイズmの要素からなる配列をメモリ上に確保し、確保した配列へのポインタを所定の位置Aに格納する（ステップ６０５）。ここで所定のサイズmとは、上述したように、付加処理であるカウンタ処理に必要なメモリ領域のサイズr1と、置換対象の命令である、後方へのジャンプ命令及びそのオフセット値をコピーするのに必要なメモリ領域のサイズr2を足し合わせたサイズ（例えば、８バイト）である。また、所定の位置Aとは、一例として、メソッドに関連する情報を格納するメソッド構造体である。なお、各要素のメモリ領域のうち、付加処理に利用される領域にはカウンタの値として初期値0を設定しておくものとする。
【００６０】
メモリ確保部２０５により配列が確保されると、命令置換部２１０は、現在処理中の配列のインデックスを示す変数iを用意し、変数iに初期値0を設定する（ステップ６１０）。続いて命令置換部２１０は、メモリ確保部２０５が処理した先程のメソッドのバイトコード列を再び走査して、置換対象の後方へのジャンプ命令を検出し、該命令をそのオフセット情報と共に、i番目の要素にコピーする（ステップ６１５）。  
【００６１】
続いて命令置換部２１０は、i番目の要素にコピーしたバイトコード列内の後方へのジャンプ命令を専用の命令（JBbackedg)で置換し、かつ、現在の要素のインデックスを示す変数iの値を、バイトコード列内の後方へのジャンプ命令に続く２バイトの領域、即ち、後方へのジャンプ命令のオフセットが格納されていた領域に格納する（ステップ６２０）。続いて命令置換部２１０は、変数iを１インクリメントし（ステップ６２５）、変数iが後方へのジャンプ命令の数nに等しいか否かを判定する（ステップ６３０）。
【００６２】
変数iが後方へのジャンプ命令の数nに等しくない場合（ステップ６３０：ＮＯ）、処理はステップ６１５に戻り、命令置換部２１０は、ステップ６１５からステップ６３０までの一連の処理を繰り返し、メソッドのバイトコード列内の全ての後方へのジャンプ命令について、命令の置換とコピーとを行う。一方、ステップ６３０において、変数iが後方へのジャンプ命令の数nに等しい場合（ステップ６３０：ＹＥＳ）、命令置換部２１０は処理を終了する。
【００６３】
図７に示すフローチャートは、上述したように、図５に示すステップ５１５の処理の詳細を示す。図７に示す処理は、専用命令のハンドラ２１５が呼び出されることにより開始され、専用命令のハンドラ２１５の付加処理実行部２２０は、バイトコード列内の専用命令（JBbackedg)の次のバイトコードを所定のバイト数読み込み、これを変数indexに設定する（ステップ７００）。ここで所定のバイト数とは、配列の要素のインデックスのサイズであり、例えば２バイトである。
【００６４】
続いて付加処理実行部２２０は、メソッド構造体等の所定の位置Aから配列へのポインタを読み出し、配列の先頭のアドレスArrayを取得する（ステップ７０５）。続いて付加処理実行部２２０は、式（Array + index*m)を計算し、付加処理のためのメモリ領域のアドレスAddressを取得する（ステップ７１０）。なお、上述したようにmは要素のサイズであり、付加処理であるカウンタ処理に必要なメモリ領域のサイズr1と、置換対象の命令である後方へのジャンプ命令及びそのオフセット値をコピーするのに必要なメモリ領域のサイズr2を足し合わせた値を有する。
【００６５】
続いて付加処理実行部２２０は、アドレスAddressにより指定されるメモリ領域をカウンタとして使用し、置換対象の後方へのジャンプ命令の実行回数をカウントすべく、カウンタを１インクリメントする（ステップ７１５）。また、専用命令のハンドラ２１５の被置換命令実行部２２５は、式（Address + r1)により求まるアドレスから、置換された元の後方へのジャンプ命令を、そのオフセット情報と共に読み出す（ステップ７２０）。続いて被置換命令実行部２２５は、読み出した元の後方へのジャンプ命令とオフセット情報とを参照して、元の命令と同様の処理を行う（ステップ７２５）。このときプログラムカウンタPCは、バイトコード列内の元の後方へのジャンプ命令があったアドレスを指したままであるため、被置換命令実行部２２５は、読み出したオフセットの値をそのまま利用して後方へのジャンプ命令を処理できることに留意されたい。そして処理は終了する。
【００６６】
このように第１の実施形態に係る命令実行装置２００によれば、メモリ上に読み込まれたバイトコード列内に監視対象の特定の命令が検出されると、付加処理のための追加のメモリ領域が確保され、検出された特定の命令は、確保されたメモリ領域の一部にコピーされた後、付加処理を行う専用命令と追加のメモリ領域の位置を特定する特定情報とに置換される。このため、第１の実施形態に係る命令実行装置２００によれば、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がなく、オーバーヘッドを低減できる。
【００６７】
また、第１の実施形態に係る命令実行装置２００によれば、バイトコード列内から専用命令が読み出されると、特定情報から取得されたメモリ領域を用いて付加処理が実行された後、該領域内の特定の命令を参照して該命令と同様の処理がなされる。このため、第１の実施形態に係る命令実行装置２００によれば、挙動の変化を、命令実行装置２００それ自身（本実施例ではJava（Ｒ）仮想マシンのレイヤー）の中だけにとどめるため、元のプログラムの挙動を変えることなく付加処理を行うことができる。
【００６８】
（第２実施形態）図８は、本発明の第２の実施形態に係る命令実行装置８００としてのインタプリタの機能ブロック図である。第２の実施形態に係る命令実行装置８００では、追加のメモリを確保して命令の置換を行うまでの一連の処理を、特定の命令（本実施例では、後方へのジャンプ命令）に応答して呼び出される、特定の命令のハンドラの処理の一部として実行する。そのため、特定の命令の最初の実行に対しては、専用命令よる付加処理（本実施例では、カウンタ処理）が行われない。そこで、特定の命令の最初の実行に対する付加処理は、特定の命令のハンドラが初期化処理として行うものとする。
【００６９】
第２の実施形態に係る命令実行装置８００としてのインタプリタは、特定命令ハンドラ８０５を含み、該特定命令ハンドラ８０５は、メモリ確保部８１０と、命令置換部８１５と、初期化部８２０と、特定命令処理部８２５とを含む。また、第２の実施形態に係る命令実行装置８００としてのインタプリタは、専用命令ハンドラ８３０を含み、専用命令ハンドラ８３０は、付加処理実行部８３５と、被置換命令実行部８４０とを含む。なお、専用命令ハンドラ８３０については、既に説明した第１の実施形態に係る命令実行装置２００における専用命令ハンドラ２１５の機能と変わるところがないため、繰り返しを避けるためここでは説明を省略する。
【００７０】
特定命令ハンドラ８０５は、命令実行装置８００が、クラスファイルに含まれるメソッドのバイトコード列から特定の命令のバイトコードを読み出すことに応答して呼び出される。なお、特定命令ハンドラ８０５は、後述するメモリ確保部８１０により確保される配列の現在の要素数を示す変数counterArraySizeを有し、変数counterArraySizeには初期値として0が設定されているものとする。
【００７１】
メモリ確保部８１０は、現在確保されている配列の要素数を変数counterArraySizeの値により確認し、変数counterArraySizeの値が0である場合、即ち、初めて配列を確保する場合、１個の所定サイズmの要素の配列をメモリ上に確保する。また、メモリ確保部８１０は、確保した配列の位置情報、例えば、配列へのポインタをメソッドに関連付けて保存する。一例として、メモリ確保部８１０は、配列の位置情報をメソッド構造体に格納する。メモリ確保部８１０はまた、変数counterArraySizeを１インクリメントする。
【００７２】
なお、第１実施形態係る命令実行装置２００に関連して説明したように、要素のメモリ領域の一部は、付加処理のための作業領域、即ちカウンタとして使用される。また、要素のメモリ領域の他の一部は、該要素を割り当てられる特定の命令、即ち後方へのジャンプ命令とジャンプ先へのオフセットとをコピーするための領域として使用される。従って、上記要素の所定サイズmは、少なくとも、カウンタのバイト数（例えば４バイト）と後方へのジャンプ命令の情報のサイズ（例えば、ジャンプ命令の２バイトとジャンプ先へのオフセットの２バイト）を足し合わせた８バイトとする。
【００７３】
メモリ確保部８１０はまた、変数counterArraySizeの値が0でない場合、変数counterArraySizeを１インクリメントして、配列のサイズを、所定サイズmの要素を変数counterArraySizeの値の数だけ有する配列に拡張する。
【００７４】
命令置換部８１５は、特定命令ハンドラ８０５の呼び出し元であるバイトコード列内の特定の命令を、該特定の命令に対してメモリ確保部８１０が確保したインデックス値がcounterArraySize-1である配列の要素にコピーする。本実施例では、特定の命令は後方へのジャンプ命令であるため、命令置換部８１５は、後方へのジャンプ命令をジャンプ先へのオフセットと共に配列の要素にコピーする。
【００７５】
命令置換部８１５はまた、コピーしたバイトコード列内の後方へのジャンプ命令を、該ジャンプ命令に割り当てられた配列の要素の位置を特定する特定情報と、付加処理を行う専用命令とで置換する。特定情報として配列のインデックスを利用する場合、インデックスの値はcounterArraySize-1となる。また、専用命令は、第１実施形態に関連して説明した専用命令と同じであるため、ここでは説明を省略する。なお、第２実施形態においても、専用の命令の名前をJBbackedgeとする。
【００７６】
初期化部８２０は、メモリ確保部８１０により確保されたインデックス値がcounterArraySize-1である要素の一部の領域を用いて、バイトコード列内の特定の命令に対する付加処理、すなわち後方へのジャンプ命令の実行回数をカウントする。特定命令ハンドラ８０５は、バイトコード列内の各特定の命令について、該命令が専用命令に置換される前の最初の実行時に１度だけ呼び出されるものである。そのため、付加処理部８２０による上記カウンタ処理は、バイトコード列内の各特定の命令に対するカウンタを１で初期化することに等しい。
【００７７】
特定命令処理部８２５は、特定の命令に対してもともと定義されている本来の処理を実行する。即ち、特定の命令が後方へのジャンプ命令であれば、特定命令処理部８２５は、後方へのジャンプ命令に対し定義されている本来のジャンプ処理を行う。
【００７８】
次に図９及び１０を参照して、本発明の第２の実施形態に係る命令実行装置８００による処理の流れを説明する。図９は、本発明の第２の実施形態に係る命令実行装置８００によるバイトコード実行処理の全体の流れを示すフローチャートである。図１０は、図５に示す特定命令ハンドラ８０５による処理（Ｓ９１０）を示すフローチャートである。
【００７９】
図９に示す処理は、ステップ９００より開始され、命令実行装置８００は、メモリ上に新しいクラスファイルがロードされると、クラスファイル内の各メソッドについて、バイトコード列からバイトコードを順に読み出す。続いて命令実行装置８００は、読み出したバイトコードが特定の命令、本実施例では後方へのジャンプ命令であるか否かを判定する（ステップ９０５）。特定の命令である場合（ステップ９０５：ＹＥＳ）、命令実行装置８００は、特定命令ハンドラ８０５を呼び出して特定の命令を処理する（ステップ９１０）。特定命令ハンドラ８０５による処理の詳細は、図１０を参照して後述する。
【００８０】
ステップ９０５で特定の命令でない場合、命令実行装置８００は、読み出したバイトコードが専用の命令、本実施例ではJBbackedgeであるか否かを判定する（ステップ９１５）。専用の命令である場合（ステップ９１５：ＹＥＳ）、命令実行装置８００は、専用命令ハンドラ８３０を呼び出して専用の命令を処理する（ステップ９２０）。専用命令のハンドラ８３０による処理の詳細は、図７を参照して説明した専用命令のハンドラ２１５による処理と同じであるため、ここでは説明を省略する。
【００８１】
ステップ９１５で専用の命令でない場合、命令実行装置８００は、読み出したバイトコードに定義された処理を行う（ステップ９２５）。ステップ９１０、ステップ９２０、又はステップ９２５から処理はステップ９３０へ進み、命令実行装置８００は、プログラムの終わりであるか否か、即ち、次のバイトコードが存在するか否かを判定し（ステップ９３０）、プログラムの終わりでない場合（ステップ９３０：ＮＯ）、命令実行装置８００はステップ９００に戻って一連の処理を繰り返す。一方、ステップ９３０において、プログラムの終わりである場合、命令実行装置８００は処理を終了する。
【００８２】
図１０は、特定命令、即ち後方へのジャンプ命令のハンドラ８０５による処理の流れを示すフローチャートである。図１０に示す処理はステップ１０００より開始し、メモリ確保部８１０は、現在確保されている配列の要素数を示すcounterArraySizeの値が０であるか否かを判定する。counterArraySizeの値が０である場合（ステップ１０００：ＹＥＳ）、メモリ確保部８１０は、counterArraySizeを１インクリメントして、所定サイズmの要素１つからなる配列をメモリに確保し、配列へのポインタを、現在処理中のメソッドのメソッド構造体に格納する（ステップ１００５）。ここで現在処理中のメソッドとは、特定命令ハンドラ８０５の呼び出し元である特定の命令が含まれるメソッドである。
【００８３】
一方、ステップ１０００において、counterArraySizeの値が０でない場合（ステップ１０００：ＮＯ）、メモリ確保部８１０は、counterArraySizeを１インクリメントして、既にメモリ上に確保されている配列を、counterArraySizeの値に要素の所定のサイズmを乗じて得られるサイズに拡張する（ステップ１０１０）。続いて処理は、ステップ１００５またはステップ１０１０からステップ１０１５へ進み、命令置換部８１５は、実行中の元の特定の命令である後方へのジャンプ命令を、インデックスの値がcounterArraySize-1である新しく確保された配列の要素にコピーする。
【００８４】
続いて命令置換部８１５は、バイトコード列内の元の特定の命令である後方へのジャンプ命令を、専用の命令JBbackedgeと、後方へのジャンプ命令に割り当てられた配列の要素のインデックス情報（counterArraySize-1）とで置換する（ステップ１０２０）。続いて初期化部８２０は、インデックスの値がcounterArraySize-1である新しく確保された配列の要素の一部の領域をカウンタとして利用し、所定の付加処理である後方へのジャンプ命令の実行回数をカウントする（ステップ１０２５）。続いて特定命令処理部８２５は、元の特定の命令である後方へのジャンプ命令に元々定義されていた操作を行う（ステップ１０３０）。その後処理は終了する。
【００８５】
このように、第２の実施形態に係る命令実行装置８００によれば、第１の実施形態に係る命令実行装置２００と同様に、追加のメモリ領域の位置を取得するのにハッシュテーブルを参照する必要がないため、オーバーヘッドを低減でき、また、挙動の変化が、命令実行装置８００それ自身（本実施例ではJava（Ｒ）仮想マシンのレイヤー）の中だけにとどめられるため、元のプログラムの挙動を変えることなく付加処理を行うことができる。
【００８６】
更に第２の実施形態に係る命令実行装置８００によれば、バイトコード列内の特定の命令（例えば、後方へのジャンプ命令）が実際に実行されるそのときに、該特定の命令に付加処理（例えば後方へのジャンプ命令の実行回数をカウントするカウンタ処理）のためのメモリ領域が割り当てられる。そのため、実際には実行されることのないバイトコード列内の特定の命令にまで付加処理のためのメモリ領域を割り当ててしまうことによるメモリの浪費がない。
【００８７】
ところで第２の実施形態に係る命令実行装置８００では、Java（Ｒ）仮想マシンのようにマルチスレッド環境下で動作する場合に、スレッド間の競合が問題となる。即ち、マルチスレッド環境下では、１のスレッドによるバイトコード列内の特定の命令の処理の要求に応答して、特定命令ハンドラ８０５が特定の命令の書き換えを行っている最中に、他のスレッドによりその特定の命令の処理が要求されることが起こりえる。そこで、このような競合の問題に対処した命令実行装置を、第３の実施形態に係る命令実行装置１１００として以下に説明する。
【００８８】
（第３の実施形態）図１１は、本発明の第３の実施形態に係る命令実行装置１１００としてのインタプリタの機能ブロック図である。第３の実施形態に係る命令実行装置１１００としてのインタプリタは、基本的には、第２の実施形態に係る命令実行装置８００としてのインタプリタと同じ機能構成を有する。ただし、第３の実施形態に係る特定命令ハンドラ１１０５は、待機命令挿入部１１１０と、実行状態確認部１１１５とを新たに含む。そこで以下ではこの新たに追加される待機命令挿入部１１１０と、実行状態確認部１１１５とについて主に説明する。
【００８９】
特定命令ハンドラ１１０５は、１のスレッドの要求に基づいて命令実行装置１１１０がバイトコード列から特定の命令のバイトコードを読み出すと、これに応答して呼び出される。呼び出された特定命令ハンドラ１１０５はまず、待機命令挿入部１１１０に処理を開始させる。待機命令挿入部１１１０は、特定命令ハンドラ１１０５の呼び出し元であるバイトコード列内の特定の命令を、一時的な退避場所に退避させた後、処理の実行の待機を要求する待機命令で置換する。ここで一時的な退避場所とは、メモリ上の領域であってもよく、或いはレジスタであってもよい。なお特定の命令が後方へのジャンプ命令である場合、そのジャンプ先を示すオフセット情報も一緒に退避させるものとする。
【００９０】
実行状態確認部１１１５は、特定命令ハンドラ１１０５の呼び出し元であるバイトコード列内の特定の命令を実行中の他のスレッドが存在するか否かを確認する。そのような他のスレッドの有無の確認は、現在のスレッドの一覧を取得し、各スレッドについて実行中のバイトコードの位置を調べることにより行ってよい。
【００９１】
なお、第３の実施形態に係る命令実行装置１１００におけるメモリ確保部１１２０は、実行状態確認部１１１５による確認の結果に基づき、上記特定の命令を実行中の他のスレッドが存在しないことを条件にその処理を開始するものとする。
【００９２】
また、第３の実施形態に係る命令実行装置１１００における命令置換部１１２５は、一時的な退避場所に格納された特定の命令を、該命令に対してメモリ確保部１１２０により確保された配列の要素にコピーし、かつ、待機命令挿入部１１１０により埋め込まれたバイトコード列内の待機命令を、専用命令及び配列の要素のインデックスで置換するものとする。なお、その他の構成要素の機能については、上述したように、第２実施形態に係る命令実行装置８００と変わるところがないため、ここでは説明を省略する。
【００９３】
次に図１２を参照して、本発明の第３の実施形態に係る特定命令ハンドラ１１０５による処理の流れを説明する。なお、本発明の第３の実施形態に係る命令実行装置１１００による全体の処理の流れ及び専用命令のハンドラ１１４０による処理の流れは、それぞれ、図９を参照して説明した本発明の第２の実施形態に係る命令実行装置８００による処理の流れ、及び図７を参照して説明した本発明の第１の実施形態に係る命令実行装置２００の専用命令ハンドラ２１５による処理の流れと基本的に同じであるため、ここでは説明を省略する。
【００９４】
図１２に示す処理は、１のスレッドの要求に基づき、バイトコード列内の特定の命令である後方へのジャンプ命令に応答して特定命令ハンドラ１１０５が呼び出されることにより開始する。待機命令挿入部１１１０は、特定命令ハンドラ１１０５の呼び出し元となったバイトコード列内の後方へのジャンプ命令を、処理の実行の待機を要求する待機命令JBwaitで置換し、元の後方へのジャンプ命令をそのオフセット情報と共に、メモリやレジスタ等の一時的な退避場所に格納する（ステップ１２００）。
【００９５】
続いて実行状態確認部１１１５は、全スレッドの現在の実行状態、即ち、実行中のバイトコードの位置を確認し（ステップ１２０５）、特定命令ハンドラ１１０５の呼び出し元となったバイトコード列内の後方へのジャンプ命令を実行中の他のスレッドが存在しないか否かを判定する（ステップ１２１０）。そのような他のスレッドが存在する場合（ステップ１２１０：ＹＥＳ）、処理はステップ１２０５へ戻り一連の処理を繰り返す。
【００９６】
一方、ステップ１２１０で、上記後方へのジャンプ命令を実行中の他のスレッドが存在しない場合、処理はステップ１２１５へ進み、メモリ確保部１１２０は、現在確保されている配列の要素数を示すcounterArraySizeの値が０であるか否かを判定する。counterArraySizeの値が０である場合（ステップ１２１５：ＹＥＳ）、メモリ確保部８１０は、counterArraySizeを１インクリメントして、所定のサイズmの要素１つからなる配列をメモリに確保し、配列へのポインタを、現在処理中のメソッドのメソッド構造体に格納する（ステップ１２２０）。ここで現在処理中のメソッドとは、特定命令ハンドラ１１０５の呼び出し元の特定の命令が含まれるメソッドである。
【００９７】
一方、ステップ１２１５において、counterArraySizeの値が０でない場合、メモリ確保部１１２０は、counterArraySizeを１インクリメントして、既にメモリ上に確保されている配列を、counterArraySizeの値に要素の所定のサイズmを乗じて得られるサイズに拡張する（ステップ１２２５）。続いて処理は、ステップ１２２０またはステップ１２２５からステップ１２３０へ進み、命令置換部１１２５は、一時的な退避場所に格納された元の特定の命令である後方へのジャンプ命令をそのオフセット情報と共に、インデックスの値がcounterArraySize-1である新しく確保された配列の要素にコピーする。
【００９８】
続いて命令置換部１１２５は、バイトコード列内の待機命令JBwaitを、専用の命令JBbackedgeと、後方へのジャンプ命令に割り当てられた配列の要素のインデックス情報（counterArraySize-1）とで置換する（ステップ１２３５）。続いて初期化部１１３０は、インデックスの値がcounterArraySize-1である新しく確保された配列の要素の一部の領域をカウンタとして利用し、所定の付加処理である後方へのジャンプ命令の実行回数をカウントする（ステップ１２４０）。続いて特定命令処理部１１３５は、元の特定の命令である後方へのジャンプ命令に元々定義されていた操作を行う（ステップ１２４５）。そして処理は終了する。
【００９９】
このように、第３の実施形態に係る命令実行装置１１００の特定命令ハンドラ１１０５によれば、最初に書き換え対象の特定の命令が待機命令で置換されるため、新たに特定の命令を実行するスレッドが存在しなくなり、また、書き換え対象の特定の命令を実行中の他のスレッドが存在しない場合に特定命令の置換処理が開始されるため、マルチスレッド環境下での競合の問題が解決される。
【０１００】
次に図１３を参照して、本発明によるオーバーヘッド削減の効果を検証する。図１３に示すグラフは、後方へのジャンプ命令の実行回数をカウントするカウンタ処理によるオーバーヘッドを、そのような付加処理を行わない場合、従来技術を利用した場合、本発明を利用した場合の３つケースについて比較した実験結果である。縦軸は相対的な実行時間を示し、横軸はDaCapo benchmarksuiteというベンチマーク群の各プログラム名を示している。図１３に示すグラフから分かるように、どのようなプログラムについても、本発明によればカウンタ処理によるオーバーヘッドを無視できる。
【０１０１】
図１４は、本実施形態に係るコンピュータ５０のハードウェア構成の一例を示した図である。コンピュータ５０は、バス２に接続されたメインＣＰＵ（中央処理装置）１とメインメモリ４を含んでいる。ハードディスク装置１３、３０、及びＣＤ−ＲＯＭ装置２６、２９、フレキシブル・ディスク装置２０、ＭＯ装置２８、ＤＶＤ装置３１のようなリムーバブル・ストレージ（記録メディアを交換可能な外部記憶システム）がフレキシブル・ディスクコントローラ１９、ＩＤＥコントローラ２５、ＳＣＳＩコントローラ２７などを経由してバス２へ接続されている。
【０１０２】
フレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭのような記憶メディアが、リムーバブル・ストレージに挿入される。これらの記憶メディアやハードディスク装置１３、３０、ＲＯＭ１４には、オペレーティング・システムと協働してＣＰＵ等に命令を与え、本発明を実施するためのコンピュータ・プログラムのコードを記録することができる。即ち、上記説明した数々の記憶装置には、コンピュータ５０にインストールされ、コンピュータ５０を命令実行装置２００、８００、又は１１００として機能させるバイトコード実行プログラムを記録することができる。
【０１０３】
コンピュータ５０を命令実行装置２００として機能させる上記バイトコード実行プログラムは、メモリ確保モジュール、命令置換モジュール、専用命令ハンドラ・モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、メモリ確保部２０５、命令置換部２１０、専用命令ハンドラ２１５としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、付加処理実行部２２０、被置換命令実行部２１５としてそれぞれ機能させる。
【０１０４】
コンピュータ５０を命令実行装置８００として機能させる上記バイトコード実行プログラムは、特定命令ハンドラ・モジュールと、専用命令ハンドラ・モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、特定命令ハンドラ８０５、専用命令ハンドラ８３０としてそれぞれ機能させる。また、特定命令ハンドラ・モジュールは、メモリ確保モジュール、命令置換モジュール、初期化モジュール、特定命令処理モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、メモリ確保部８１０、命令置換部８１５、初期化部８２０、特定命令処理部８２５としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、付加処理実行部８３５、被置換命令実行部８４０としてそれぞれ機能させる。
【０１０５】
コンピュータ５０を命令実行装置１１００として機能させる上記バイトコード実行プログラムは、特定命令ハンドラ・モジュールと、専用命令ハンドラ・モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、特定命令ハンドラ１１０５、専用命令ハンドラ１１４０としてそれぞれ機能させる。また、特定命令ハンドラ・モジュールは、待機命令挿入モジュール、実行状態確認モジュール、メモリ確保モジュール、命令置換モジュール、初期化モジュール、特定命令処理モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、待機命令挿入部１１１０、実行状態確認部１１１５、メモリ確保部８１０、命令置換部８１５、初期化部８２０、特定命令処理部８２５としてそれぞれ機能させる。また、専用命令ハンドラ・モジュールは、更に、付加処理実行モジュールと、被置換命令実行モジュールを含む。これらモジュールは、ＣＰＵ１等に働きかけて、コンピュータ５０を、付加処理実行部１１４５、被置換命令実行部１１５０としてそれぞれ機能させる。コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。
【０１０６】
コンピュータ５０は、キーボード／マウス・コントローラ５を経由して、キーボード６やマウス７のような入力デバイスからの入力を受ける。コンピュータ５０は、オーディオコントローラ２１を経由して、マイク２４からの入力を受け、またスピーカー２３から音声を出力する。コンピュータ５０は、視覚データをユーザに提示するための表示装置１１に、グラフィックスコントローラ１０を経由して接続される。コンピュータ５０は、ネットワーク・アダプタ１８（イーサネット（登録商標）・カードやトークンリング・カード）等を介してネットワークに接続し、他のコンピュータ等と通信を行うことが可能である。
【０１０７】
以上の説明により、本実施形態に係るコンピュータ５０は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【０１０８】
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【図１】
0005489884.tif 000002
【図２】
0005489884.tif 000003
【図３】
0005489884.tif 000004
【図４】
0005489884.tif 000005
【図５】
0005489884.tif 000006
【図６】
0005489884.tif 000007
【図７】
0005489884.tif 000008
【図８】
0005489884.tif 000009
【図９】
0005489884.tif 000010
【図１０】
0005489884.tif 000011
【図１１】
0005489884.tif 000012
【図１２】
0005489884.tif 000013
【図１３】
0005489884.tif 000014
【図１４】
0005489884.tif 000015