(57)【要約】【課題】プロセサコア、メモリそして仮想マシンインタプリタを備えたデータ処理システムを提供する。【解決手段】仮想マシンインタプリタはプロセサコアにより実行される仮想マシン命令を導入するネイティブマシン命令を発生する。仮想マシンインタプリタは繰り返し実行されることが予想される一連の仮想マシン命令の一群から先頭仮想マシン命令を検出する。仮想マシンインタプリタは一群中の先頭仮想マシン命令とメモリのメモリ位置との対応関係を記録し、このメモリ位置からメモリにネイティブマシン命令を書き込む。このメモリ位置からメモリに書き込まれたネイティブマシン命令を実行することにより、プロセサコア上記一群のためのネイティブマシン命令を繰り返し実行する。
2004507832.tif 000002
【特許請求の範囲】
【請求項１】
ネイティブマシン命令を実行するプロセサコアを備えた仮想マシン命令プログラムを実行するデータ処理システムであって、
前記プロセサコアと、
メモリと、
前記プログラム実行中にプログラムフローに応じて選択された仮想マシン命令を受け取る仮想マシンインタプリタであって、前記プロセサコアに接続されて、前記プロセサコアにより実行される仮想マシン命令を導入するネイティブマシン命令を発生する仮想マシンインタプリタであって、繰り返し実行されることが予想される一連の前記選択された仮想マシン命令の一群から先頭仮想マシン命令を検出し、前記一群中の前記先頭仮想マシン命令と前記メモリのメモリ位置との対応関係を記録し、前記先頭仮想マシン命令から開始する仮想マシン命令に対して発生した前記一群のためのネイティブマシン命令を前記メモリ位置から前記メモリに書き込み、前記メモリ位置から前記メモリに書き込まれたネイティブマシン命令を実行することにより前記一群のためのネイティブマシン命令を繰り返し実行するよう前記プロセサコアを制御する仮想マシンインタプリタとを備えたことを特徴とするデータ処理システム。
【請求項２】
前記仮想マシンインタプリタは、前記一群の開始時にネイティブブランチバック命令を発生し、このネイティブブランチバック命令を前記メモリ中の前記一群の最後に置くこと特徴とする請求項１に記載のデータ処理システム。
【請求項３】
前記仮想マシンインタプリタは、前記一群が記憶されるアドレスレンジとは重ならないあるアドレスレンジ内のターゲットアドレスを有する無条件なさらなるネイティブブランチ命令を前記ネイティブブランチ命令の後に置き、そして前記プロセサコアのプログラムカウンタをモニタし、そして前記仮想マシン命令の選択と、前記ループ群の開始後に前記アドレスレンジに前記プログラムカウンタの値が入ったときに前記選択された仮想マシン命令からのネイティブマシン命令の発生を再開すること特徴とする請求項２に記載のデータ処理システム。
【請求項４】
前記仮想マシンインタプリタは、少なくとも前記先頭仮想マシン命令
を示し、プログラムフローに影響しないヒント情報を受け取り、前記対応関係を記録し、前記ヒント情報を受け取ったときに所定条件で、前記プログラムフローが前記先頭仮想マシン命令に達したときに前記一群用に前記ネイティブマシン命令を書き込むこと特徴とする請求項２に記載のデータ処理システム。
【請求項５】
ネイティブマシン命令を実行するプロセサコアを用いて仮想マシン命令プログラムを実行する方法であって、
プログラムフローの基に実行すべき仮想マシン命令を選択し、
前記選択された仮想マシン命令から、該選択された仮想マシン命令を実行すべくネイティブマシン命令を決定し、
繰り返し実行されることが予想される一連の前記選択された仮想マシン命令の一群から先頭仮想マシン命令を検出し、
前記先頭仮想マシン命令とメモリ位置との対応関係を記録し、
前記先頭仮想マシン命令から開始する仮想マシン命令から決定される前記一群のためのネイティブマシン命令を前記メモリ位置からメモリに書き込み、
前記メモリ位置から前記メモリに書き込まれた前記一群のためのネイティブマシン命令を実行することにより前記一群のためのネイティブマシン命令を繰り返し実行するようプロセサコアを制御することを特徴とする実行方法。
【請求項６】
前記一群の開始時にネイティブブランチバック命令を発生し、このネイティブブランチバック命令を前記メモリ中の前記ループ群の最後に置くこと特徴とする請求項５に記載の実行方法。
【請求項７】
前記一群が記憶されるアドレスレンジとは重ならないあるアドレスレンジ内のターゲットアドレスを有する無条件なさらなるネイティブブランチ命令を前記ネイティブブランチ命令の後に置き、そして前記プロセサコアのプログラムカウンタをモニタし、そして前記仮想マシン命令の選択と、前記ループ群の開始後に前記アドレスレンジに前記プログラムカウンタの値が入ったときに前記選択と決定を再開すること特徴とする請求項６に記載の実行方法。
【請求項８】
前記先頭仮想マシン命令の検出は、仮想ブランチバック命令により終了するループを検出する前記プログラムを事前処理し、前記先頭仮想マシン命令として前記仮想ブランチバック命令のターゲットアドレスを示す前記プログラムにヒントを加えること特徴とする請求項６に記載の実行方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、仮想マシン命令とは異なるネイティブ命令を実行するプロセッサコアを用いて仮想マシン命令プログラムを実行する方法及び装置に関する。
【０００２】
【従来の技術】
仮想マシンプログラムは、コンパイルされたＪＡＶＡプログラム実行時やこの仮想マシン命令プログラムとは異なる命令セットを備えたプロセサによりエミュレートされるプロセサによるプログラム実行時などの様々状況で実行される。
【０００３】
ＪＡＶＡの場合、ＪＡＶＡ言語によるプログラムがまず、ＪＡＶＡバイトコードと呼ばれるＪＡＶＡ仮想マシン命令のプログラムにコンパイルされる。コンパイルは、多くの実行時、即ち、”Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ”（ＪＩＴ）、ＪＡＶＡプログラム実行前、ＪＡＶＡプログラムのブロック実行前に一度だけ行われる。このプログラム又はブロックはＪＡＶＡ仮想マシン命令にコンパイルされてメモリにロードされる。そしてプロセサによりバイトコードが実行される。このプロセサによってＪＡＶＡ言語に規定されたそれらバイトコードのための効果が得られなければならない。
【０００４】
仮想マシンプログラムはインタプリタにより実行される。このインタプリタは、例えば、プロセサのエミュレーションプログラムにより実行され、又はインストラクションメモリとプロセッサコア間にプリプロセサを配して実行される。インタプリタプログラムは仮想マシン命令をロードし、仮想マシン命令により要求される効果を得るためにどんなアクションをとるかを判断し、そしてそれらのアクションをとるためのネイティブマシン命令を備える。同様にプリプロセサは仮想マシン命令をチェックし、上記要求される効果を得るためのプロセサに対し命令を発する。
【０００５】
両者いずれの場合においても、仮想マシン命令はロードされ直ぐに変換される。各仮想マシン命令は、実行時（又は直ぐ後で実行されるるとき）一つ以上のネイティブマシン命令に変換される。実行時、プログラムフローによりどの各仮想マシン命令を変換するかが指示される。このため、エミュレータが仮想プログラムカウンタを備え、命令実行中カウウントアップし、又は仮想マシンブランチ命令を実行するように変更する。
【０００６】
【発明が解決しようとする課題】
通常、仮想マシン命令プログラムの実行エミュレレーションは、同様なネイティブマシン命令プログラムの実行よりはるかに遅い。これを早めるためのあるタスクを備えたネイティブマシン命令プログラムライブラリが従来知られている。仮想マシン命令プログラムがこのタスクの実行を要求すると、ライブラリからあるプログラムが呼び出されて、エミュレータの管理なしに、タスクを速く実行するようプロセサを制御する。ＪＩＴコンパイラはＶＭの実行を早める他の手段である。しかし、これらはＶＭコードと変換されたコードの両方を記憶する多くのメモリを必要とする。これに加えて、実際の変換が行われる実行フェーズは非常に遅いためこれらの実行タイミングは予測しがたい。
【０００７】
ＰＣＴ特許出願番号９９／１８４８６によれば仮想マシン命令プログラムを実行するプリプロセサは公知である。このプリプロセサは、仮想マシン命令とネイティブマシン命令の実行を非常に早く切り替えることができる。このプリプロセサはプロセサコアのプログラムカウンタを監視する。仮想マシン命令とネイティブマシン命令のそれぞれに所定のプログラムカウンタ値範囲が規定されている。カウント値がネイティブマシン命令用に規定された範囲にある限り、プリプロセサは受動的で、メモリよりプロセサにフェッチされるネイティブマシン命令がプログラムカウンタにより指定される。一方、カウント値が仮想マシン命令用に規定された範囲にあるとプリプロセサは能動的になり、プロセサコア用ネイティブマシン命令はもはやメモリよりフェッチされなくなる。プリプロセサは仮想マシン命令をメモリよりロードし、これら仮想マシン命令よりネイティブマシン命令を発生する。ネイティブマシン命令のプログラムライブラリとして導入されているタスクの実行を仮想マシン命令が要求すると、プリプロセサはプロセサコアを制御してプロセサコアのプログラムカウンタをネイティブマシン命令プログラムの開始点に変更する。これによりネイティブマシン命令プログラム実行速度は速まるが、仮想マシン命令実行速度は依然として遅い。
【０００８】
米国特許番号５，８８９，９９６に記載されているインタプリタはネイティブマシン命令プログラムの、仮想マシン命令に応じた異なるブロックを示している。この特許によれば、これらのブロックはすべてキャッシュメモリにロードされ、インタプリタは仮想マシン命令を実行する度に、適切なブロックに制御を移す。これにより、キャッシュメモリより必要なネイティブマシン命令がフェッチされるのでプグラム実行速度が上がる。しかし、仮想マシン命令実行速度は依然としてネイティブマシン命令プログラム実行速度より遅い。
【０００９】
従って、この発明の目的は、実行速度が早い仮想マシン命令実行方法及び装置を提供するものである。
【００１０】
【課題を解決するための手段】
この発明の装置並びに方法は請求項１並びに請求項５に規定されている。繰り返し実行されることが予想される仮想マシン命令を導入するネイティブマシン命令群の少なくとも一部が規定されている。ネイティブマシン命令群の少なくとも一部、好ましくは、繰り返し実行されることが予想される命令の１セット又はそれ以上のループの開始点での仮想マシン命令に対応する第１のネイティブマシン命令からメモリに記憶される。エミュレータがネイティブマシン命令群の少なくとも一部の開始点の記憶位置とこの開始点に相当する仮想マシン命令の対応関係を記録する。続いて、エミュレータはプロセサコアを制御して、仮想マシン命令の各繰り返し実行のために対応するネイティブマシン命令を発生することなしに、メモリからネイティブマシン命令群の少なくとも一部を実行する。好ましくは、ネイティブマシン命令群はキャッシュメモリに保存される。
【００１１】
繰り返し実行されることが予想されるネイティブマシン命令群の好ましい例はループであり、割り込み命令が実行されることなく命令群は続いて繰り返し実行される。しかし、この発明は、例えば、サブルーチン命令群のように、他の理由で繰り返し実行されるループではない命令群にも適用できる。ループの場合は命令群全体が保存されるとよい。さらに好ましくは、バックワードブランチネイティブマシン命令群が発生され、命令群の最後でメモリ保存されるとよい。これにより、エミュレータのさらなる介入なしにループが繰り返し実行される。代わりに、ループ実行毎にループの一部に対応したネイティブマシン命令を新たにエミュレータより発生してもよい。これにより実行効率は落ちるが、ループ内のある命令がエミュレータによる特別な処理を必要とする場合に効果的である。
【００１２】
好ましくは、エミュレータにより、プロセサコアの命令フェッチアドレスから命令群の命令をプロセサコアが実行中であるかどうか、又はプログラムカウンタが命令群のカウントを終了したかを判断する。後者の場合、エミュレータはネイティブマシン命令の発生を再開する。原理的に、エミュレータは命令群の最終アドレスを記憶し、このアドレスと命令フェッチアドレスを比較することにより、プロセサコアの命令フェッチアドレスにより命令群がフェッチされたことを検出する。しかし、好ましくは、命令群の最後でブランチ命令を追加してプロセサがいくつかの事前に規定されたアドレス範囲（例えば、アドレスの所定ビットが１に等しいが、所定範囲であればよい）に入り込む。この場合、エミュレータは命令フェッチアドレスがその所定範囲にあるか判断すればよい。
【００１３】
原理的に、命令群のネイティブマシン命令は発生されたとき初めてプロセサにより実行され、エミュレータにより記憶される。即ち、命令群全体が発生され記憶される前にネイティブマシン命令は実行される。この場合、プロセサコアはネイティブマシン命令の命令群を２度又はそれ以上実行する。しかし、好ましい実施形態では、エミュレータにより命令群をまず記憶し、そしてメモリから発生したループの命令をプロセサコアが実行開始するよう制御する。そしてプロセサコアは１度メモリからの命令群を実行する。従って、他の実行と異なるループの最初の実行を処理する必要が無く、エミュレータの動作が簡単になる。
【００１４】
この発明においては、命令群の少なくとも一部の最初のネイティブマシン命令とこのネイティブマシン命令が記憶されるメモリ位置の対応関係を記録する必要がある。
【００１５】
これは、例えば、予め規定されたメモリ位置からの命令群の少なくとも一部に対して発生したネイティブマシン命令を記憶し始めることで達成され、これは実行されるある特定のプログラムとは無関係に行われる。
【００１６】
発生したネイティブマシン命令の記憶開始をエミュレータが知るためには、記憶されるべく発生したネイティブマシン命令に対するプログラムの一部の最初の仮想マシン命令を示すヒント情報が仮想マシン命令プログラムと組合わさるとよい。このヒント情報はプログラムの追加命令でもよく、又はプログラムのその部分の最初の仮想マシン命令位置を示すリストであってもよい。例えば、そのような処理に適するループ又はサブルーチン命令群を検出するプログラムを分析することによりこのヒント情報を先にコンパイルしてもよい。
【００１７】
代わりに、プログラム実行中に発生したネイティブマシン命令をほぼ区別無く記憶して、プログラム中の仮想マシン命令位置と対応する発生したネイティブマシン命令のメモリアドレスの組み合わせを記録してもよい。従って、仮想マシンブランチバック命令が発生したら、エミュレータによりブランチの仮想マシン目的位置により対応するネイティブマシン命令が開始するメモリ位置を検出することができる。これにより、プロセサコアはメモリからのこれらの命令を実行開始できる。
【００１８】
【発明の実施の形態】
以下、図面を参照して、この発明の実施形態を説明する。
【００１９】
図１はこの発明の一実施形態である装置を示している。この装置はプロセサコア１０，メモリシステム１４，そしてメモリシステム１４とプロセサコア１０に配された仮想マシンインタプリタ１２を備えている。プロセサコア１０は命令アドレス出力１００を出力し、仮想マシンインタプリタ１２から命令入力１０２を受ける。メモリシステム１４はアドレス入力１４４を受け、仮想マシンインタプリタ１２との間でデータ入出力１４６をやりとりする。メモリシステム１４にはキャッシュメモリ１４０と主メモリ１４２が備えられている。説明を簡単にするために、プロセサコア１０へのオペランドデータ入力は示していない。これはこの発明の理解には必ずしも必要ではないからである。オペランドデータは例えば別々の図示しないデータメモリからプロセサコア１０に対するそれ自身のデータアドレスとデータ値の関係から、プロセサコア１０に与えられる。又は、命令供給との時分割マルチプレックスによりメモリシステム１４から与えられても良い。このシステムはＶＭ命令と発生するネイティブマシン命令に対し物理的に異なるメモリを備えてもよく、ＶＭＩが書き込み接続を有するメモリに対しプロセサコアが読み出し接続を有することになる。
【００２０】
仮想マシンインタプリタ１２は、プリプロセサ１２０、命令マルチプレクサ１２２，アドレスマルチプレクサ１２４そして読み出し／書き込みスイッチ１２６を備える。仮想マシンインタプリタ１２の制御出力は命令マルチプレクサ１２２、アドレスマルチプレクサ１２４、読み出し／書き込みスイッチ１２６の制御入力となる。プロセサコア１０のアドレス出力１００がプリプロセサ１２０の入力となる。プリプロセサ１２０のアドレス出力はアドレスマルチプレクサ１２４を介してメモリシステム１４のアドレス入力１４４となる。プリプロセサ１２０の仮想マシン命令入力はメモリシステム１４のデータ入出力１４６となる。プリプロセサ１２０のネイティブマシン命令出力は命令マルチプレクサ１２２を介してプロセサコア１０の命令入力１０２となる。
【００２１】
これらの入出力関係により、仮想マシンインタプリタ１２が通常動作モードとなり、アドレスマルチプレクサ１２４を介して、またメモリシステム１４のデータ入出力１４２からの仮想マシン命令に応答して、プリプロセサ１２０が仮想マシン命令のアドレスをメモリシステム１４のアドレス入力１４０として発生する。プリプロセサは受け取った仮想マシン命令を解読して、この仮想マシン命令に対してどのネイティブマシン命令をプロセサコア１０が実行すべきかを判断する。そして、これらのネイティブマシン命令を命令マルチプレクサ１２２を介してプロセサコア１０命令入力１０２とする。
【００２２】
プリプロセサ１２０は（プロセサコア１０のプログラムカウンタとは異なる）仮想マシンプログラムカウンタを有し、これによりプログラムフロー中次に実行すべき仮想マシン命令のプログラムにおける位置を検出する。通常モードでは、プリプロセサ１２０自身が仮想マシン命令を取り扱い、これがプリプロセサのプログラムカウンタに働きかける。ブランチ命令の状態検出以外には、この目的のためにネイティブマシン命令を発生する必要はない。原理的には、このように通常モードで、繰り返し実行されるプログラムループとサブルーチンを含み、すべての仮想マシン命令が実行可能である。しかし、この発明では繰り返し実行されると予想されるプログラムのそのような部分には特別な処理が（必要ではないが）施されることもある。
【００２３】
ループ動作モードでは、仮想マシンインタプリタ１２は発生したネイティブマシン命令を直接プロセサコア１０に与えることはない。代わりに、仮想マシンインタプリタはこれらの命令をメモリシステム１４に記憶する。これは、メモリシステム１４のアドレス入力１４０に、アドレスマルチプレクサ１２４を介して、また、データ読み出し／書き込みスイッチ１２６を介してデータ入出力１４２にネイティブマシン命令を与えることにより行われる。この目的のため、データ読み出し／書き込みスイッチ１２６を介してネイティブマシン命令出力がメモリシステム１４のデータ入出力１４２に与えられる。
【００２４】
ネイティブ実行モードでは、プロセサコア１０がメモリシステム１４からのネイティブマシン命令を実行する。この目的のため、プロセサコア１０の命令アドレス出力１００が、アドレスマルチプレクサ１２４を介して、メモリシステム１４のアドレス入力１４０に与えられる。そしてプロセサコア１０の命令入力１０２が命令マルチプレクサ１２２を介してメモリシステム１４のデータ入出力１４２に与えられる。
【００２５】
図２は仮想マシンインタプリタ１２の動作を示すフローチャートである。通常動作モードでは、仮想マシンインタプリタ１２は、最終ステップ２９で仮想マシン命令の終了（又は仮想マシンプログラムを停止させるバイトコードの実行）を検知するまで第一ステップ２１，第二ステップ２２，第三ステップ２３を繰り返す。フローチャートのステップ２１において、仮想マシンインタプリタ１２はメモリシステム１４からある仮想マシン命令をロードし、この命令がループの開始命令か否かを判定する。開始命令でない場合、仮想マシンインタプリタ１２は第二ステップ２２を実行する。第二ステップ２２では、仮想マシンインタプリタ１２は第一ステップ２１でロードされた仮想マシン命令を解読し、この仮想マシン命令を実行する少なくとも一つのネイティブマシン命令を発生する。このネイティブマシン命令発生過程はすでに引用したＰＣＴ特許出願番号９９／１８４８６及びそれに対する引例に記載されている。第三ステップ２３で、仮想マシンインタプリタ１２は発生したネイティブマシン命令又をプロセサコア１０に与え、プロセサコアからの命令アドレス出力ををモニタして次の仮想マシン命令をいつ実行すべきか判定する。次の仮想マシン命令を実行するときは最終ステップ２９を実行してプログラムが終了したか判断する。終了してない場合は、第一ステップ２１，第二ステップ２２，第三ステップ２３を繰り返す。第一ステップ２１，第二ステップ２２，第三ステップ２３へ戻るのは無条件に行われてもよく、仮想マシンプログラムを停止させるバイトコードに応答してソフトウエアトラップ命令を実行してロープから抜けても良い。
【００２６】
通常動作モードでは、プロセサコア１０から発生した命令アドレスは命令を特定するのには用いられない。仮想マシンインタプリタ１２の仮想マシンプログラムカウンタがメモリシステム１４内のアドレスを制御しここから仮想マシン命令をフェッチする。仮想マシンインタプリタ１２はプロセサコア１０から発生した命令アドレスを用いてプロセサコア１０の状態テストを行ってもよい。これは、ネイティブ条件ブランチ命令をプロセサコア１０に与えプロセサコア１０がこのブランチを受け入れるかを見ることにより行われる。さらに、仮想マシンインタプリタ１２は、少なくとも二つの命令アドレスレンジを規定し、その一の最上位ビットを１とすることにより、プロセサコア１０から発生した命令アドレスをモード選択に用いてもよい。第１のレンジ内でプロセサコア１０がアドレスを発生する間は、上記したように、仮想マシンインタプリタ１２は通常モードで仮想マシン命令を解読する。しかし、プロセサコア１０が発生したアドレスが第１のレンジ以外であると、仮想マシンインタプリタ１２は別のモード、例えば、ネイティブモードで動作し、プロセサコア１０がメモリシステム１４からネイティブマシン命令をフェッチし実行する。
【００２７】
第一ステップ２１で、仮想マシンインタプリタ１２がループの開始命令がロードされたことを検出すると、仮想マシンインタプリタ１２は第四ステップ２４，第五ステップ２５，第六ステップ２６、第七ステップ２７，第八ステップ２８を実行する。第四ステップ２４は第二ステップ２２と似ており、現在の仮想マシン命令を実行するための一つ以上のネイティブマシン命令を発生する。しかし、第五ステップ２５では仮想マシンインタプリタ１２は、この（これらの）ネイティブマシン命令を、第三ステップ２３で実行する代わりに、メモリシステム１４に記憶する。第六ステップ２６で仮想マシンインタプリタ１２は次の仮想マシン命令をロードし、この仮想マシン命令がループの最終命令ではない場合は第四ステップ２４に戻る。このようにして、仮想マシンインタプリタ１２は発生した一連のネイティブマシン命令をメモリシステム１４に記憶する。仮想マシンインタプリタ１２が仮想マシン命令のループの最後まで達したことを検知したら、第七ステップ２７，第八ステップ２８を実行する。第七ステップ２７では、ループに対して発生した一連の命令の最後で、仮想マシンインタプリタ１２がネイティブ条件ブランチバック命令をメモリシステム１４に記憶する。ネイティブ条件ブランチバック命令の後、仮想マシンインタプリタ１２は無条件ブランチ命令を所定のレンジ内の命令アドレスに記憶する。この所定レンジは、例えば、プロセサコア１０から発生する仮想マシンインタプリタ１２が通常モードで動作すべきアドレスから始まるレンジである。
【００２８】
第八ステップ２８で、仮想マシンインタプリタ１２はブランチ命令をプロセサコア１０に与えて、ループに対して発生した一連のネイティブ命令をフェッチする。この点に関して、第八ステップ２８は第三ステップ２３に似ている。ただし、第八ステップ２８ではプロセサコア１０がメモリシステム１４からのネイティブ命令を実行するのに対し、第三ステップ２３ではネイティブ命令は仮想マシンインタプリタ１２から供給される点が異なる。第八ステップ２８において、プロセサコア１０が発生した命令アドレス値を仮想マシンインタプリタ１２がモニタしてプロセサコア１０がループから抜けたことを検知するまで、プロセサコア１０はメモリシステム１４から命令をフェッッチし実行する。そして、仮想マシンインタプリタ１２は最終ステップ２９を実行して通常モード動作を再開する。
【００２９】
図２のフローチャートは、ネイティブ命令が発生しメモリに記憶された後にループが実行される例を示している。これがこの発明の最も簡潔な応用例であるが、ループ以外の繰り返し実行されると予想される他の仮想マシン命令セットにもこの発明は応用できる。例としては、サブルーチン、例外的ハンドラ又はより大きなループの最も処理しやすい命令群等である。これらの場合、記憶されたネイティブマシン命令は発生した命令の最後にブランチバックを含まない。一連の仮想マシン命令の実行を仮想マシンプログラムが呼び出す度に、記憶された対応するネイティブ命令に制御が戻る。
【００３０】
図２の実施形態では、繰り返し実行される仮想マシン命令セットに対して発生した第１のネイティブ命令からのみ、仮想マシンインタプリタ１２が発生したネイティブマシン命令のメモリシステム１４への書き込みを開始する。仮想マシンインタプリタ１２がネイティブマシン命令の書き込みを開始するメモリアドレスは、実行される仮想マシン命令プログラムとは無関係な、所定のメモリアドレスでもよい。これにより、ループ外の仮想マシン命令に対して発生するネイティブマシン命令の書き込みにオーバヘッドが生ずることがなくなる。さらには、メモリシステム１４にキャッシュメモリを用いるとキャッシュ交換量がこのように減少する。
【００３１】
しかし、これは仮想マシンインタプリタ１２が、発生したネイティブマシン命令をいつ書き込み始めるかを示す信号が必要であることを意味する。所定数の仮想マシン命令を所定回数実行することを示すループ命令を仮想マシン命令が含む場合は、発生したネイティブマシン命令を記憶開始するためのトリガーとして用いることができる。代わりに、解読結果がメモリに記憶されるべき命令群の開始を示すメタ命令を仮想マシン命令プログラムに含んでもよい。この場合、メタ命令により、第１ステップにおいて仮想マシンインタプリタ１２が次の仮想マシン命令をロードし、第４ステップ２４から実行する。なお、必ずしも必要ではないがメタ命令は仮想マシン命令群のサイズを示しても良く、命令群の位置に等しいブランチターゲットを用いて仮想マシンブランチバック命令から命令群の最後が検出される。代わりに、そのような命令群の先頭にある仮想マシン命令のアドレスリストと仮想マシンプログラムを組み合わせても良い。この場合、第１ステップ２１で、仮想マシンインタプリタ１２がこのリストの少なくとも一部をロードして現在の仮想マシン命令アドレスと比較する。
【００３２】
仮想マシン命令の位置は、例えば、高水準言語から仮想マシン命令へのコンパイル最中に、コンパイルされた高水準言語ループ（例えばループ用）位置として検出してもよい。代わりに、仮想マシンプログラムをを事前処理してこれらの位置を検出し、ブランチバック命令を検出し、そして検出されたブランチバック命令のターゲットをループの開始点としてマークしてもよい。従って、高水準言語ソースコードが不要となる。同様に、サブルーチンの開始点（仮想マシン命令がサブルーチン命令にジャンプするためのターゲット）及び／又はキャッシングの例外としての命令をこのようにマークしてもよい。
【００３３】
最も簡潔な実施形態としては、メモリから発生したネイティブマシン命令シーケンスの実行を、ブランチ命令を含まない仮想マシン命令セット又はこのセットの最後のブランチバック以外の他の制御転送命令用のネイティブマシン命令シーケンスのみに適用してもよい。これにより、毎回実行すべきネイティブマシン命令シーケンスが同じになる。もし、セットの最後には位置しないブランチ命令を仮想マシン命令セットが含む場合は多くの手法がとれる。第１の手法は通常モードでのこのセットの実行であり、即ち、毎回仮想マシン命令の解読を実行し、メモリからの解読された命令は実行しない。
【００３４】
仮想マシン命令セット内のブランチのための第２の手法は、ネイティブマシン命令セットを、同じネイティブマシン命令と共にいつも実行される複数部分に分岐し、これら部分用に記憶されたネイティブマシン命令を記憶することである。この場合、仮想マシン命令セットの最後にはない制御命令の転送において終了する各部分のネイティブマシン命令の終了を仮想マシンインタプリタ１２が検出する。これは、通常モードでの実行を示すレンジにジャンプする各部分の最後へのネイティブマシン命令の挿入と組み合わせたい場合は、プロセサコア１０により発生した命令アドレスをモニタすることにより行ってもよい。ネイティブマシンブランチ命令のブランチターゲットは終了した部分を示すのに用いてもい。この部分の実行終了時に、制御転送を命令する仮想マシン命令を仮想マシン命令が処理し、そしてプロセサコアにメモリシステム１４からの、仮想マシン命令セットの選択された部分のために発生したネイティブマシン命令を実行する。又は命令セット以外に仮想マシン命令が制御を転送する場合は、通常モードが再開する。
【００３５】
第３の手法は、ネイティブマシン命令間のネイティブマシンブランチ命令を用いて、命令セット内で制御転送命令を実行するそれら制御を転送を発生することある。これによりネストループが実現できる。
【図面の簡単な説明】
【図１】
この発明の装置の一実施形態を示す図である。
【図２】
仮想マシンプログラムをエミュレートする方法を示すフローチャートを示す図である。
【国際公開パンフレット】
2004507832.tif 000003
2004507832.tif 000004
2004507832.tif 000005
2004507832.tif 000006
2004507832.tif 000007
2004507832.tif 000008
2004507832.tif 000009
2004507832.tif 000010
2004507832.tif 000011
2004507832.tif 000012
2004507832.tif 000013
2004507832.tif 000014
2004507832.tif 000015
2004507832.tif 000016
2004507832.tif 000017
2004507832.tif 000018
【国際調査報告】
2004507832.tif 000019
2004507832.tif 000020
2004507832.tif 000021