(57)【要約】【課題】仮想計算機のプログラムを実行するためのエミュレータを高速化、低容量化する。【解決手段】エミュレータに、命令フェッチとデコードの処理の結果を保存しておくデコードキャッシュを設ける。命令の最初の実行時に、デコードキャッシュにデコードした結果を保存しておく。次回の実行の際には保存したキャッシュの内容を再利用し、実行を高速化することができる。仮想命令に対応した実行処理を行なう実行処理ルーチン、仮想命令ポインタをキーとして実行処理ルーチンのアドレスと対応させて保持するデコードキャッシュ、仮想命令ポインタに基づいて命令のフェッチ時にデコードキャッシュを調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段を起動して、その処理結果を使用する実行管理手段、実行管理手段から起動され、仮想命令ポインタに基づいて命令をデコードし、結果をデコードキャッシュに登録する命令デコード手段である。【選択図】図１ 
2005063165.tif 000002
【特許請求の範囲】
【請求項１】
仮想計算機の命令を解釈・実行するエミュレータであって、
各仮想命令に対応した実行処理を行なう実行処理ルーチンと、
仮想命令ポインタをキーとして実行処理ルーチンのアドレスと対応させて保持するデコードキャッシュと、
仮想命令ポインタに基づいて命令のフェッチ時にデコードキャッシュを調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段を起動して、その処理結果を使用する実行管理手段と、
実行管理手段から起動され、仮想命令ポインタに基づいて命令をフェッチしてデコードし、結果をデコードキャッシュに登録する命令デコード手段と
を有することを特徴とするエミュレータ。
【請求項２】
請求項１に記載のエミュレータであって、
命令デコード手段は、指定された位置から所定の範囲の複数の命令のフェッチとデコードとを一括して処理し、結果をデコードキャッシュに登録する
ことを特徴とするエミュレータ。
【請求項３】
請求項２に記載のエミュレータであって、
デコードキャッシュのエントリアドレスを指定するデコードキャッシュポインタを有し、
実行処理ルーチンは、実行管理手段へ戻る処理を行なう終端処理ルーチンを有するものであり、
命令デコード手段は、命令ブロックのデコード結果をデコードキャッシュに登録するとき、最後のエントリに終端処理ルーチンを登録し、デコードキャッシュポインタに命令ブロックの先頭のエントリを設定するものであり、
実行管理手段は、デコードキャッシュを調べるとき、デコードキャッシュポインタを参照して処理を行い、命令のデコード結果がデコードキャッシュに存在すれば、終端処理までそれを順次使用するものである
ことを特徴とするエミュレータ。
【請求項４】
請求項１ないし請求項３に記載のエミュレータであって、
デコードキャッシュは仮想命令ポインタをキーとして実行処理ルーチンのアドレスと、オペランドとを対応させて保持するものであり、
命令デコード手段は、デコードキャッシュに命令のデコード結果とオペランドとを対にして登録するものである
ことを特徴とするエミュレータ。
【請求項５】
請求項３に記載のエミュレータであって、
実行処理ルーチンは、仮想命令ポインタの更新処理を行なう機能を有する終端処理ルーチンと、仮想命令ポインタの更新処理機能を含まないその他の処理ルーチンとを含むものであり、
デコードキャッシュは仮想命令ポインタをキーとして実行処理ルーチンのアドレスと、オペランドとを対応させて保持するものであり、
命令デコード手段は、デコードキャッシュに命令のデコード結果とオペランドとを対にして登録するものであり、
実行管理手段は、デコードキャッシュを使用するときは登録されているオペランドを使用するものである
ことを特徴とするエミュレータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想計算機のプログラムを実行するためのエミュレータを高速化、低容量化する技術に関する。
【背景技術】
【０００２】
近年、インターネットの普及により、ネットワークを介してプログラムを実行するシステムが実用となっている。特にJava（登録商標）言語は、携帯電話上でのアプリケーションとしてプログラムを実行させることのできるものとして急速に広まっている。
【０００３】
Java言語は実行させるプラットフォームを撰ばない仮想計算機(Java VM)のプログラム（バイトコード）として配布される。また、マイクロソフト社の.NETフレームワークではアプリケーションはC言語で開発してMSIL(Microsoft Intermediate Language)という中間言語に変換され、CLR(Common Language Runtime)という仮想計算機で実行される。
【０００４】
JavaのバイトコードやMSILのアプリケーション・プログラムは、実行するプラットフォームを撰ばない仮想計算機のプログラムであるため、仮想計算機をシミュレートするエミュレーション技術を使って実行する。一般には仮想計算機の命令を１命令ずつ解釈し実行するソフトウェア（エミュレータ）がアプリケーションを実行する。
【０００５】
また、エミュレーション技術は従来の計算機システムのプロセッサを変更したときに、旧プロセッサ用に作られた旧アプリケーションを動作させることにも使われる。
【０００６】
その他に、エミュレーション技術は新規プロセッサの開発時に性能評価や新規プロセッサのソフトウェア開発（クロス開発）などにも使われる。この時の開発効率を向上にも、新規プロセッサを仮想計算機とみなして実行することで、開発効率を向上させることにも役立つ。
【０００７】
仮想計算機をソフトウェアで実行する手段として、仮想計算機の命令を逐次解釈・実行するインタプリタ方式がある。しかし、この手法では仮想計算機の命令を１つずつ実行するため、処理速度が遅い。インタプリタ方式で実行時間の半分以上を占めるのは、仮想計算機の命令をフェッチしてデコードする処理であり、この処理の高速化が望まれる。
【０００８】
図２にインタプリタにおける命令フェッチとデコードの処理を示す。また、図３にこのとき使用されるデコードテーブルの構成例を示す。
【０００９】
IP(Instruction Pointer)１は仮想計算機のプログラムカウンタであり、仮想計算機の命令を指し示すものであり、実行に伴って更新されていく。
【００１０】
インタプリタは、以下の手順で処理する。
【００１１】
s1:まず命令ポインタ（IP）1の指す仮想計算機の命令（以下、単に命令と記す）３をメモリ２から採取してきて、
s2:命令コード部等によりデコードテーブル41，42のインデックスを計算する。
【００１２】
S3:デコードテーブルから各命令に対応する実行処理ルーチンの処理アドレスを得る。デコードテーブルは図３のように多段構成になることが多い。
【００１３】
S4:そのアドレスへ分岐（実行処理へ分岐）する。
【００１４】
S5:そこで各処理を実行し最初に戻る
ということを繰り返し実行することで処理を進める。
【００１５】
デコードテーブル41，42の内容や実行処理ルーチンは各命令に対応してあらかじめ用意されている。途中IPの更新をする必要があるが、これはこのループのどこかで行われる。一般には各実行処理内で行う。
【００１６】
高速化方法として、JIT(Just-In-Compiler)コンパイラを使う手法がある。JITコンパイラはプログラムを実行する前に、仮想計算機の命令コードを適当な単位ごとに実計算機の命令コード（ネイティブコード）にコンパイルする。これにより、アプリケーションは直接そのマシンのプロセッサで実行できるようになり、高速な実行が可能となる。一連の仮想計算機の命令列がネイティブコードに展開されるため、命令フェッチとデコードのオーバヘッドが無くなる。また実計算機のレジスタを使って無駄なメモリ転送を省くなどの最適化を施すことができ、さらに実行を高速化できる。
【００１７】
一般にJITコンパイラはサブルーチンを単位としてコンパイルを行う。すなわち、あるサブルーチンを実行するときに、サブルーチン全体をコンパイルしてネイティブコードを生成しメモリ上に格納する。その後は生成したネイティブコードを実計算機が直接実行する。そのサブルーチンが頻繁に実行されるようなとき、実計算機のネイティブコードになっており最適化もされているので高速に実行できる。ただし、サブルーチンを最初に実行する時にはコンパイルするためのオーバヘッドがあり、あまり使われないサブルーチンであるとかえって遅くなることもある。
【非特許文献１】Java JITコンパイラの試作、情報処理学会研究報告96-ARC-120 pp37-42,DEC1996
【発明の開示】
【発明が解決しようとする課題】
【００１８】
JITコンパイラではコンパイルしたコードのサイズは元のコードの10倍以上になることもあり、実用的に無理なことがある。
【００１９】
携帯電話やPDAなどの携帯機器では使用できるメモリが限られており、コンパイルしたコードを全てメモリ上に展開することができない。また、コンパイルの処理に時間がかかることも問題となる。携帯機器でのソフトウェアの実行はゲームなどの対話型のアプリケーションが多く、応答性を高めるためにはコンパイルにあまり時間をかけることはできない。特に携帯機器に搭載されたプロセッサでは、処理能力が比較的低いため、大きなプログラムをコンパイルすると、実行中のプログラムが一瞬止って見えることもある。
【００２０】
また、一度しか実行されないような命令コードの場合、コンパイルする時間のオーバヘッドのため、インタプリタで実行するよりも遅くなることもある。
【００２１】
一方、インタプリタにおいては、他のプロセッサをエミュレーションするような場合、命令フェッチとデコードの処理はかなり複雑になる。前述の図３に命令デコード処理の例を示したように、一般にフェッチした仮想計算機命令の命令を表すビットだけを抜き出し、そこを基準に多段のテーブル検索を行うことになる。この処理にはシフト演算、AND演算、メモリからのロードといった煩雑な処理が必要となる。
【００２２】
その他にインタプリタが遅くなる理由として、命令フェッチ・デコード・実行の処理において色々なテーブルやデータを参照するために、データの局所性を損ない、プロセッサのハードウェアで用意されている命令キャッシュ等を効率的に使えないことがある。
【００２３】
図４に従来の処理のデータの参照の様子を示す。太実線は実行の流れ、点線がデータの参照、細実線はポインタを示す。この図のように一つの仮想計算機命令を実行するのに、仮想計算機のコード１、デコードテーブル40、レジスタテーブル50、定数テーブル60などの多数のデータを参照する。従来のインタプリタではこのような複雑な処理を命令毎に毎回行なわなければならない。
【００２４】
本発明は、インタプリタを基本とし、仮想計算機の命令を実行するエミュレータを高速に動作させることを目的とする。
【課題を解決するための手段】
【００２５】
本発明の基本構成を図１に示す。仮想計算機の命令を解釈・実行するエミュレータに、命令フェッチとデコードの処理の結果を保存しておくデコードキャッシュ３を設ける。命令の最初の実行時に、デコードキャッシュ３にデコードした結果を保存しておく。次回の実行の際には保存したキャッシュの内容を再利用し、命令フェッチとデコードの処理を省略し、実行を高速化することができる。
【００２６】
１．基本構成は、以下のものである。
【００２７】
仮想命令に対応した実行処理を行なう実行処理ルーチン４、
仮想命令ポインタ12をキーとして実行処理ルーチン４のアドレスと対応させて保持するデコードキャッシュ３、
仮想命令ポインタ12に基づいて命令のフェッチ時にデコードキャッシュ３を調べ、デコード結果が存在すればそれを使用し、なければ命令デコード手段２を起動して、その処理結果を使用する実行管理手段１、
実行管理手段１から起動され、仮想命令ポインタ12に基づいて命令をフェッチしてデコードし、結果をデコードキャッシュ３に登録する命令デコード手段２。
【００２８】
デコードキャッシュ３自体はメモリのキャッシュ等と同様の構成をとればよい。
【００２９】
２．さらに、命令デコード手段２は、指定された位置から所定の範囲の複数の命令のフェッチとデコードとを一括して処理し、結果をデコードキャッシュ３に登録する。
【００３０】
命令ブロックのとり方は固定値やサブルーチンの切れ目など任意でよい。これらがよく使われる命令の組み合わせやサブルーチンであれば、次回以後命令のフェッチとデコードが省略でき、高速化される。処理中にアクセスするデータの局所性が増してプロセッサ等に用意された命令キャッシュ、データキャッシュのヒット率が向上し、高速化する。
【００３１】
３．デコードキャッシュ３のエントリアドレスを指定するデコードキャッシュポインタ(DCP)31を設ける。
【００３２】
実行処理ルーチン4には、実行管理手段１へ戻る処理を行なう終端処理ルーチンを設ける。命令デコード手段２は、命令ブロックのデコード結果をデコードキャッシュ３に登録するとき、最後のエントリに終端処理ルーチンを登録し、デコードキャッシュポインタ31に命令ブロックの先頭のエントリを設定する。
【００３３】
実行管理手段１は、デコードキャッシュ３を調べるとき、デコードキャッシュポインタ31を参照して処理を行い、命令のデコード結果がデコードキャッシュ３に存在すれば、終端処理までそれを順次使用する。この間、仮想命令ポインタ12を参照しないで済むので命令フェッチとデコードの処理にデコードキャッシュ３のタグと仮想命令ポインタ12との比較処理が不要になり高速化する。
【００３４】
４．デコードキャッシュ３は仮想命令ポインタ12をキーとして、実行処理ルーチン４のアドレスの他に、オペランドを対応させて保持する構成とし、命令デコード手段２は、デコードキャッシュ３に命令のデコード結果とオペランドとを対にして登録する。
【００３５】
これにより、実行処理においてオペランドの切り出し処理が不要になるので高速化できる。また、処理中にアクセスするデータの局所性が増す。
【００３６】
５．前項において、実行処理中には仮想命令ポインタ12を参照する必要がなくなる。従って、全ての実行処理ルーチン４で仮想命令ポインタ12の更新を行なう必要はない。
【００３７】
実行処理ルーチン４は、仮想命令ポインタ12の更新処理を行なう機能を有する終端処理ルーチンと、仮想命令ポインタ12の更新処理機能を含まないその他の処理ルーチンとに分ける。例えば、登録する命令ブロックが必ず特定の命令(分岐命令、サブルーチン呼び出し、リターン命令など)で終わるようにして、前記の特定の命令においてのみ仮想命令ポインタ12の更新を行う。
【００３８】
または、ある命令ブロックをデコードキャッシュ３に登録した後に（デコードキャッシュの最後に登録したエントリの直後に）、仮想命令ポインタ12の更新をしてインタプリタの先頭アドレスに分岐するアドレスを登録する。
【００３９】
それ以外の命令については、更新処理が不要となり実行が高速化する。
【００４０】
６．項２において、実行処理ルーチン４は、複数の命令を組み合わせた実行マクロ処理ルーチンを含むものとし、命令デコード手段２は、命令のパターンによりマクロ命令であるか否かを判断し、マクロの各命令を一括してデコードキャッシュ３に登録する。
【００４１】
命令のフェッチデコードの処理回数が減り、組み合わせたマクロの実行処理を最適化することでも実行処理を向上させることができる。
【００４２】
７．さらに、エミュレーション実行中の命令の組み合わせ頻度を実行プロファイルとして記録する実行プロファイル採取手段と、実行プロファイルにより所定の頻度以上の組み合わせをマクロとして、実行マクロ処理ルーチンを生成する動的マクロ生成手段とを設ける。
【００４３】
動的にマクロを生成するためにアプリケーションに特化した処理の最適化が可能となり、実行速度が早くなる。
【発明の効果】
【００４４】
デコードキャッシュを設け、デコード結果を登録することにより、2回目以後は命令のフェッチ・デコード処理がデコードキャッシュの参照のみになるので高速化される。また、インタプリタが命令フェッチ・デコード・実行の処理において参照するデータが、ハードウェアのキャッシュ上にまとめて配置される可能性が高くなり、データの局所性が増すために処理時間を短くできる。
【００４５】
デコードキャッシュを用いることにより、エミュレーション処理における命令フェッチとデコードの処理を軽減し、実行速度、メモリ量、応答性を向上させることができる。
【００４６】
本発明は基本的に逐次処理を行うので、JITコンパイラほどの最大性能は出ないものの、使用メモリが少なく、利用できるメモリの少ない機器においてはアプリケーションの実効性能を引き出すことができる。また、実行時オーバヘッドもJITコンパイラよりも小さくでき応答性を損なうことも少ない。
【発明を実施するための最良の形態】
【００４７】
図１に基本構成図を示す。仮想命令ポインタ(IP:Instruction Pointer)12は仮想計算機のプログラムカウンタで、仮想計算機の命令を指し示すものである。インタプリタ全体の実行の管理を行なう実行管理手段1、命令デコード手段2及び実行処理ルーチン4の基本動作は従来のインタプリタの機能を包含する。命令フェッチとデコード処理において、ＩＰ12に基づいて、仮想計算機コード（プログラム）5のコードとデコードテーブル（図省略）を参照する。本発明でも従来のインタプリタの処理は必要であるが、背景技術の項で説明済みであるので、ここでは発明で加えられた事項を中心に記述する。
【実施例１】
【００４８】
[デコードキャッシュの構成]
デコードキャッシュ３はＩＰ12をキーとするデータテーブルとして構成すればよい。図５にデコードキャッシュの一構成例を示す。この例はダイレクトマッピング方式を用いたメモリのキャッシュと同様な構成である。ＩＰ12の上位何ビットかを取りだし、これをデコードキャッシュ３のテーブルのインデックスとする。このインデックスを元にTagと実行処理アドレスを取り出す。TagがＩＰ12と一致すれば、そのＩＰ12は登録済ということで、実行処理アドレスに分岐する処理を行えばよい。なおデコードキャッシュ３はメモリのキャッシュのセット・アソシアティブ方式と同等の構成を採ることもできる。例えば４ウェイのセット・アソシアティブとし、４枚のデコードキャッシュのテーブルを持ち、４枚のうち一致した実行処理アドレスへ分岐する。
【００４９】
図６のフローにより実施例1の動作を説明する。
【００５０】
s1.命令ポインタ(ＩＰ)12からデコードキャッシュ3のインデックスを計算する。
【００５１】
s2.デコードキャッシュ3のTagを取得し、ＩＰ12と比較する。
【００５２】
s3.一致しなければ、（デコードキャッシュ３に登録されていなければ）
s4.命令のフェッチ、デコードを行って実行処理ルーチン4との関係を生成する。これは従来のインタプリタ動作と同等である。
【００５３】
s5.デコードの後に、デコードキャッシュ3にTagと実行処理アドレス（実行処理ルーチン４の対応処理の先頭アドレス）を登録する。
【００５４】
s6.登録した実行アドレスへ分岐する。
【００５５】
s7. s３において一致すれば、すなわち登録済みであれば、デコードキャッシュ３の実行処理アドレスへ分岐する。
【００５６】
仮想計算機の命令のデコードのためには、前述のように複雑な操作が必要であるが、登録済みであれば、デコードキャッシュ３のTagを読んで、比較するだけの単純な処理で実行できる。
【００５７】
実行処理が終わると先頭s１へ戻る。
【実施例２】
【００５８】
[ブロック登録]
図７に実施例２による実行手順を示す。実施例１が１命令ずつ実行とデコードキャッシュ３の登録を行っていたのに対して、ここでは予めこれから実行すべき命令をデコードキャッシュ３に複数まとめて登録してから実行処理を行う。これにより、プロセッサに通常備えられている命令キャッシュ等のヒット率を向上させることにもなる。
【００５９】
すなわち、
s3.で一致しなければ、（デコードキャッシュ３に登録されていなければ）、s4.s5.s6まで同じ処理をして、
s8.命令ブロックの終わりか判断し、終わりでなければ
s9.次の命令とデコードキャッシュ３の次のエントリを取り出して、命令のフェッチデコード登録を行なう。
【００６０】
s10.命令ブロックの終わりに達すれば最初に登録したデコードキャッシュ３の実行アドレスへ分岐する。
【００６１】
命令ブロックのとり方は、仮想計算機の実行制御が途切れる点（分岐命令、サブルーチン呼び出し、リターン等）を終わりとし、それがなく、長く続くときはデコードキャッシュ３のエントリ数に見合った適宜な数に決定することでよい。
【実施例３】
【００６２】
[DCPによる最適化]
実施例２では、デコードキャッシュ３には仮想計算機の命令の実行の順番にエントリが並ぶ。このエントリを指定するデコードキャッシュポインタ（DCP）31を設ける。DCP31を基にしてデコードキャッシュ３のエントリの順番通り引いて、DCP31を更新しながら実行を繰り返すことで仮想計算機のコードをエミュレートすることができる。これにより、デコードキャッシュ３に登録されていれば、DCP31とデコードキャッシュ３のみの参照で済む。これにより参照の局所化が進み、命令キャッシュ等が効果的に使用され、処理速度の向上が期待できる。また命令フェッチ・デコード処理（連続処理）において、デコードキャッシュ３のTagとIP12の比較処理を省略することができるようになり、実行が早くなる。
【００６３】
しかし、デコードキャッシュ３に登録したブロックの最後にここまでしか登録されていないということを何らかの方法で示す必要がある（終端処理）。さもなければ全く関係のない命令が実行されるという誤った事態になる。
【００６４】
それを避けるため、デコードキャッシュ３に登録したブロックの最後のエントリの次に、先頭に戻るように開始アドレスを登録しておく（終端処理１）。
【００６５】
図８にこの場合の実行フローを示す。この例では実行処理A、B、Cを実行し（s1〜s9まで図７と同じ）、そのあとS10により最後のエントリの次のエントリに先頭に戻るように登録してあるので、正しく次の処理が行なえる。
【００６６】
仮想計算機の特定の命令（分岐命令など）をブロックの終わりとし、その命令の実行処理の終りには開始アドレスに分岐するように構成する（終端処理２）。
【００６７】
図９にこの場合の実行フローを示す。デコードキャッシュ３に命令ブロックを登録するときに、その最後は上記の特定の命令になるようにする。この図では終端処理Ｎ s10がこれに当たる。これにより、この例では実行処理A、B、C、の実行ではDCP31の更新が行なわれるが最後に終端処理s10の命令を実行すると、先頭に戻る。従って１つのブロックが実行された後、デコードキャッシュ３の登録のチェックがなされ、正しく次の処理が行なわれる。
【実施例４】
【００６８】
[オペランドフェチの最適化]
実行処理においてIP12の指す仮想計算機の命令からオペランドを抜き出す必要がある。この操作は、命令のデコードと同様に、まずIP12の示す命令を取り出し、その命令から特定のビットを抜き出すという処理である。また定数などは別の定数テーブル60からその値を取り出す操作も必要である。
【００６９】
命令デコード時にオペランドも抜きだして、デコードキャッシュ３にデコード結果と対にしてオペランドを格納しておく。これにより実行時に簡単に直接その値を取り出すことができ、処理速度を向上できる。また定数テーブル60のアクセスは不要となる。これによってデータの参照の局所性が増し高速化が期待できる。また実行処理中にIP12の参照が全く必要なくなる。これにより実計算機上でIP12をレジスタに割り付ける必要もなくなり、実計算機上で使えるレジスタが増えるため処理速度の向上が期待できる。
【実施例５】
【００７０】
[IP更新処理の最適化]
デコードキャッシュ３にオペランドも格納しておくことにより、実行処理においてIP12の参照が不要になる。IP12の更新を各実行処理の後に行う必要はなくなり、ブロックの最後で一括して行うようにする。すなわち図９において実行処理A,B,C等においてIP更新s7が不要になり、終端処理ＮでのみIP更新s11を行なう。これによりIP12の更新処理の回数を減らすことができ、処理速度が向上する。
【実施例６】
【００７１】
[マクロ実行]
仮想計算機のコードのパターンには頻繁に現れる命令の組み合わせがあり、このような頻度が大きい命令の組み合わせの処理をまとめて行う実行マクロルーチンを予め用意しておく。例えば、命令Aと命令Bを組み合わせた実行マクロABを用意した場合、命令Bに関する命令フェッチとデコードの処理が不要になる。このようにして命令フェッチとデコードの処理を少なくすることができ、実行速度を向上させることができる。２命令に限らず3命令以上の命令を組合わせても良い。なおＩＰ12の更新を命令数に合わせて行なう。
【００７２】
また、組み合わせたマクロは処理を最適化することが可能である。例えば定数のロードと加算の２つの処理を組み合わせた場合、従来はレジスタに定数をロードし、レジスタと加算を行うという２つの操作が必要であった。しかし、実計算機が定数の加算命令を持っていればその命令１つで実行可能となる。
【００７３】
実行マクロルーチンのアドレスのデコードキャッシュ３への登録は実施例２のブロック登録において、ブロック内の命令をデコードキャッシュ３へ登録する際に、命令パターンを調べ用意した実行マクロに合致するかどうか調べることで行う。
【００７４】
従来の方法で同様のことを行おうとすると、命令フェッチとデコードの処理を複数の命令に対して行う必要があった。つまり仮想計算機の命令を先読みして複雑なデコード処理を行わなければならない。本実施例では、IP12を参照してデコードテーブル40を引くという単純操作だけで、マクロの実行が可能となる。
【実施例７】
【００７５】
[動的なマクロ生成]
本実施例は実行時に実マシンで直接実行する命令を生成してそれを実行するという点で、従来のJITコンパイラの高速化手法に類似している。JITコンパイラがサブルーチンの単位で実行処理を生成するのに対し、本発明では2〜3命令の単位で細かいものを生成することが異なる。最も異なるのは、JITコンパイラが生成した実計算機の命令列は仮想計算機のコードと一対一に対応するのに対し、本手法で生成した実行マクロは一対多に対応することである。アプリケーション中に良く現れる実行命令のパターンに対し、一つの実行マクロが共通に使われることになる。この点で、メモリの消費量をJITよりも遥かに少なくすることができる。
【００７６】
図10に本実施例の処理フローを示す。
【００７７】
p1.インタプリタのメインループ中に実行プロファイルの採取を行う。実行プロファイルは仮想計算機の命令の組み合わせが現れた回数を記録するものとする。
【００７８】
p2.次に、その命令の組合わせのマクロを生成済か調べ、生成されていない場合は、
p3.命令の組み合わせ頻度によって判断し、所定の条件に合えば実行マクロを新しく生成する。その後はマクロ生成済の処理と同じ処理をする。
【００７９】
命令の組み合わせ頻度が少ない場合は、実施例２の処理、すなわち命令ブロックのフェッチ・デコード処理p10を行う。この場合はデコードキャッシュ３への登録、実行処理へと続く。
【００８０】
p4.頻度条件が合えば、実行マクロを生成する。
【００８１】
p5.命令の組合わせのマクロを生成済の場合は、マクロの実行アドレスをデコードキャッシュ３に登録し、
p6.その実行マクロへ分岐し、実行する。
【００８２】
また、この図では実行プロファイルの取得の処理はインタプリタのメインループ中で毎回行っているが、デコードキャッシュ３にブロックを登録するときに実行プロファイルの採取をするようにしても良い。実行プロファイルは静的（アプリケーション中に現れた頻度）となり、実際に良く実行されるもののプロファイルが採れなくなり若干効率が悪くなるが、実行プロファイルの採取のオーバヘッドを軽減できる。
【図面の簡単な説明】
【００８３】
【図１】本発明の基本構成を示した説明図。
【図２】インタプリタにおける命令フェッチ、デコードのフロー図。
【図３】デコードテーブルと命令デコード処理の説明図。
【図４】従来技術の処理の流れ図。
【図５】デコードキャッシュの構成例。
【図６】命令のデコードと登録処理のフロー図
【図７】命令ブロックのデコードと登録処理のフロー図。
【図８】命令ブロックのデコードと登録（ＤＣＰによる連続登録と終端処理１）のフロー図。
【図９】命令ブロックのデコードと登録（ＤＣＰによる連続登録と終端処理２）のフロー図。
【図１０】実施例７の処理フロー図。
【符号の説明】
【００８４】
１    実行管理手段
１２  仮想命令ポインタ（ＩＰ）
２    命令デコード手段
３    デコードキャッシュ
３１  デコードキャッシュポインタ
４    実行処理ルーチン
４０  デコードテーブル
５０  レジスタテーブル
６０  定数テーブル
５    仮想計算機のコード（プログラム）
【図１】
2005063165.tif 000003
【図２】
2005063165.tif 000004
【図３】
2005063165.tif 000005
【図４】
2005063165.tif 000006
【図５】
2005063165.tif 000007
【図６】
2005063165.tif 000008
【図７】
2005063165.tif 000009
【図８】
2005063165.tif 000010
【図９】
2005063165.tif 000011
【図１０】
2005063165.tif 000012