(57)【要約】【課題】テンプレートＪＩＴコンパイラにおいても、命令スケジュリングされたコードを生成することができるジャバ仮想マシンを提供すること。【解決手段】  ＪＩＴコンパイラに、テンプレートを用いてバイトコードをネイティブコードに翻訳する翻訳器３と、コードバッファ６と、ＦＩＦＯバッファ５と、評価器４を設ける。評価器４は、翻訳された最新の命令と上記コードバッファ６の最後の数命令との間に干渉があるとき、もしくは上記翻訳された最新の命令と上記ＦＩＦＯバッファ５に保持された命令との間に依存関係があるとき、上記最新の命令をＦＩＦＯバッファ５に出力する。また、翻訳された最新の命令、もしくはＦＩＦＯバッファ５から取り出した命令と、コードバッファ６の最後の数命令との間に干渉がないとき、上記翻訳された最新の命令もしくはＦＩＦＯバッファ５の命令をコードバッファ６に出力する。【選択図】          図１
2006120043.tif 000002
【特許請求の範囲】
【請求項１】
各バイトコードに一対一に対応したネイティブコードを保持したテンプレートを用いて、バイトコードをネイティブコードにコンパイルする機能を備えた仮想マシンであって、
上記テンプレートを用いてバイトコードをネイティブコードに翻訳する翻訳手段と、
上記翻訳手段により翻訳された命令を格納するＦＩＦＯバッファと、命令スケジュリング済みの命令を格納するコードバッファと、
上記翻訳手段により翻訳された命令または上記ＦＩＦＯバッファに格納された命令と、上記コードバッファに格納された最後の数命令との干渉を評価する評価手段とを備え、
上記評価手段は、
上記翻訳された最新の命令と上記コードバッファの最後の数命令との間に干渉があるとき、もしくは上記翻訳された最新の命令と上記ＦＩＦＯバッファに保持された命令との間に依存関係があるとき、上記最新の命令をＦＩＦＯバッファに出力し、
上記翻訳された最新の命令、もしくはＦＩＦＯバッファから取り出した命令と、コードバッファの最後の数命令との間に干渉がないとき、上記翻訳された最新の命令もしくはＦＩＦＯバッファの命令をコードバッファに出力する
ことを特徴とする仮想マシン。
【請求項２】
各バイトコードに一対一に対応したネイティブコードを保持したテンプレートを用いて、バイトコードをネイティブコードにコンパイラする機能を備えた仮想マシンにより実行されるプログラムであって、
上記プログラムは、上記テンプレートを用いてバイトコードをネイティブコードに翻訳する処理と、
上記翻訳された最新の命令と上記コードバッファの最後の数命令との間に干渉があるとき、もしくは上記翻訳された最新の命令と上記ＦＩＦＯバッファに保持された命令との間に依存関係があるとき、上記最新の命令をＦＩＦＯバッファに出力する処理と、
上記翻訳された最新の命令、もしくはＦＩＦＯバッファから取り出した命令と、コードバッファの最後の数命令との間に干渉がないとき、上記翻訳された最新の命令もしくはＦＩＦＯバッファの命令をコードバッファに出力する処理をコンピュータに実行させる
ことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はＪＩＴコンパイラを有する仮想マシンに関し、ＪＩＴコンパイラがテンプレートＪＩＴコンパイラであっても、命令スケジュリングされたコードを生成することができるＪＩＴコンパイラを有する仮想マシンに関するものである。
【背景技術】
【０００２】
近年、家電機器、車載機器などの組み込みシステムにおいてＪＡＶＡ（登録商標）システム（以下ＪＡＶＡ（登録商標）を“ジャバ”という）が用いられる事例が増えている。ジャバプログラムはジャバのバイトコードをジャバ仮想マシンで実行するインタプリタ型のため、そのままでは実行効率が悪い。
そこでジャバプログラムのスピードアップの方法の一つとして、バイトコードをＪＩＴｅｄコード（本発明ではネイティブコードという）にコンパイルして実行する、Ｊｕｓｔ  ｉｎ  Ｔｉｍｅ（ＪＩＴ）コンパイルという方法がある。
ＪＩＴされたコードは（１）コードそのものの実行効率の改善、（２）メソッド呼び出しの効率化、によってバイトコードの実行より高速になっている。
上記のようにＪＩＴコンパイラはジャバのバイトコードをネイティブコードに変換して実行効率を上げる手段であり、例えば特許文献１には、バイトコードを高速にマシンコードに変換するコンパイラについて記載され、また、非特許文献１にも、ジャバ仮想マシンにおけるコンパイラについて記載されている。
【０００３】
テンプレートＪＩＴコンパイラとは、バイトコードに対して一対一のネイティブコードのテンプレートを持ち、中間コード生成なしでＪＩＴコンパイルを行うもので、コンパイル時間が短く、中間コードのためのメモリ消費もないので、組み込みＪＡＶＡ（登録商標）システムに適している。
一方、ＲＩＳＣアーキテクチャのプロセッサは、レジスタ干渉やメモリ干渉を避けて命令を配置することで性能を引き出すことができる。これを命令スケジュリングという。通常のコンパイラ（例：Ｃコンパイラ）ではソースを中間コードに変換し、中間コードをＤＡＧ(Directed Acyclic Graph)に変換し、最後にコード生成を行うことで命令スケジュリングを行っている。  
【特許文献１】特開平１１−１７５３４９号公報
【非特許文献１】Proceedings of Java(登録商標）Virtual Machine Research and Technology Symposium,Monterey,California,USA,April23-24,2001,Michael Paleczny,Christpher Vick,Cliff Click「The Java（登録商標） HotSpotServer Compiler 」Sun Microsystems［平成１６年１０月１４日検索］、インターネット＜URL:http://www.usenix.org/publication/library/prceedings/jvm01/paleczny.html＞
【発明の開示】
【発明が解決しようとする課題】
【０００４】
テンプレートでないＪＩＴコンパイラでは、命令スケジュリングを行うために中間コードを生成するなど、コンパイル時間、メモリ消費が必要である。
一方、テンプレートＪＩＴコンパイラでは中間コードを生成せず、バイトコードに対するネイティブコードが連続して生成されるため、命令スケジュリングが難しかった。
本発明は上記事情に鑑みなされたものであって、テンプレートＪＩＴコンパイラにおいても、命令スケジュリングされたコードを生成することができるジャバ仮想マシンを提供することを目的とする。
【課題を解決するための手段】
【０００５】
上記課題を解決するため、本発明においては、ＪＩＴコンパイラに、テンプレートを用いてバイトコードをネイティブコードに翻訳する翻訳手段と、命令スケジュリング済みの命令を格納するコードバッファと、ＦＩＦＯバッファと、評価手段を設ける。
上記評価手段は、上記翻訳された最新の命令と上記コードバッファに出力された最後の数命令に干渉があるかを調べ、干渉がなければ上記最新の命令をコードバッファに出力し、干渉があるとき、該最新の命令をＦＩＦＯバッファに出力する。
また、ＦＩＦＯバッファに命令があるとき、ＦＩＦＯバッファから命令を取り出し、該命令とコードバッファの最後の数命令との間に干渉があるかを調べ、干渉がなければＦＩＦＯバッファから取り出した命令をコードバッファに出力する。また、干渉があるとき、上記翻訳手段により翻訳された最新の命令とＦＩＦＯバッファの命令とに依存関係があるかを調べ、依存関係があれば、ＦＩＦＯバッファに上記最新の命令を出力し、依存関係がなければ、上記のように最新の命令と上記コードバッファの最後の数命令に干渉があるかを調べ、干渉がなければ上記最新の命令をコードバッファに出力し、干渉があるとき、該最新の命令をＦＩＦＯバッファに出力する。
【発明の効果】
【０００６】
本発明においては、上記のようにＪＩＴコンパイラに、テンプレートを用いてバイトコードをネイティブコードに翻訳する翻訳手段と、コードバッファと、ＦＩＦＯバッファと、評価手段を設け、評価手段により、翻訳された最新の命令を評価して、命令スケジュリングを行っているので、テンプレートＪＩＴコンパイラであっても、命令スケジュリングを行うことができ、プログラムの実行速度を向上させることができる。
【発明を実施するための最良の形態】
【０００７】
図１に本発明のジャバ仮想マシンの全体構成を示す。
コンピュータ１００はハードウエア２０とＯＳ３０を有し、ＯＳ３０上にジャバ仮想マシン１０を備える。
ジャバ仮想マシン１０はインタプリタ１１とＪＩＴコンパイラ１２を持つ。ＪＩＴコンパイラ１２はバイトコードに対して、一対一に対応付けられたネイティブコードを保持するテンプレートを持ち、該テンプレートを用いてバイトコードをネイティブコードに変換する。その際、翻訳されたネイティブコードを評価し、ネイティブコード間の干渉、依存関係に基づき、命令スケジュリングを行う。
【０００８】
図２は、本実施例のＪＩＴコンパイラ１２の機能構成を示すブロック図である。
同図に示すように、ＪＩＴコンパイラ１２は、テンプレート２、翻訳器３、評価器４、ＦＩＦＯバッファ５、コードバッファ６を備える。
翻訳器２は、テンプレート２を用いて、バイトコード１をネイティブコード（以下命令という）に翻訳する。評価器４は、上記翻訳器２により翻訳された命令を評価して、命令スケジュリングを行い、スケジュリング結果をコードバッファ６に出力する。
すなわち、上記評価器４はＦＩＦＯバッファを用いて、以下の処理を繰り返し命令スケジュリングを行う。
（１）ＦＩＦＯバッファ５に命令が保持されていないとき。
(i) 上記翻訳器２により翻訳された最新の命令Ａと上記コードバッファ６に出力された最後の数命令Ｂとの間にレジスタ干渉やメモリ干渉があるかを調べる。
(ii)干渉がなければ上記命令Ａをコードバッファ６に出力する。
(iii) 干渉があると、上記命令ＡをＦＩＦＯバッファ５に出力する。
ここで、レジスタ干渉やメモリ干渉があると（同じレジスタや同じメモリへアクセスする命令が数命令の間に続けて発行されると）、実行速度が遅くなる。そこで、上記のように干渉がある場合、上記命令Ａを直ちにコードバッファ６に出力せず、取り合えずＦＩＦＯバッファ５に保持させる。なお、上記「最後の数命令Ｂ」とは、コードバッファ６に出力された通常１乃至４命令前の命令をいい、この数は命令の種類毎に定められるようにしてもよい。
【０００９】
（２）ＦＩＦＯバッファに命令が保持されているとき。
(i) ＦＩＦＯバッファ５に命令が保持されている場合、ＦＩＦＯバッファ５から命令Ｃを一つ取り出す。なお、ＦＩＦＯバッファ５からは、格納された順にデータが取り出されるので、ＦＩＦＯバッファ５に複数個の命令が格納されている場合、最初に格納されたデータ（最先の命令）が取り出される。
(ii)ＦＩＦＯバッファ５から取り出した命令Ｃと、コードバッファ６の最後の数命令Ｂとの間に干渉があるかを調べる。
(iii) 干渉がなければ、上記命令Ｃをコードバッファ６に出力する。
(iv)干渉があれば、翻訳器３からの命令があるかを調べる。
ここで、翻訳すべきバイトコードがなくなり、新たな命令が翻訳器３から出力されなくなれば、干渉の有無に関わらずＦＩＦＯバッファ５に保持されていた命令Ｃをコードバッファに出力する。
【００１０】
(v) 命令Ｃと最後の数命令Ｂの間に干渉があり、かつ翻訳器３からの最新の命令がある場合、翻訳器３から命令Ｄを取り出す。
(vi)翻訳器３から取り出した命令Ｄと、ＦＩＦＯバッファ５に格納された全ての命令との間に依存関係があるかを調べる。すなわち、上記翻訳器３から取り出した命令が、ＦＩＦＯバッファ５に格納されているいずれかの命令の実行結果を使用する命令であるかを調べる。
(vii) 上記命令Ｄと、ＦＩＦＯバッファ５に保持された命令との間に依存関係がある場合、ＦＩＦＯバッファ５に保持された命令が実行された後に上記命令Ｄが実行される必要があるので、上記命令ＤをＦＩＦＯバッファ５に格納する。ＦＩＦＯバッファ５からは前記したように格納順に命令が取り出されるため、命令ＤをＦＩＦＯバッファ５に格納することで命令の実行順序は保証される。
(viii)上記命令Ｄと、ＦＩＦＯバッファ５に保持された命令との間に依存関係がない場合には、前記（１）と同様に、上記命令Ｄとコードバッファ６に出力された最後の数命令Ｂとの間に干渉があるかを調べ、干渉がなければ上記翻訳された最新の命令Ｄをコードバッファ６に出力し、干渉があれば、該最新の命令ＤをＦＩＦＯバッファ５に出力する。
【００１１】
本実施例においては、上記のように、評価器４とＦＩＦＯバッファを設け、命令間の干渉、依存関係に基づきネイティブコードの命令スケジュリングを行っているので、テンプレートＪＩＴコンパイラであっても、比較的簡単な構成を付加するだけで、命令スケジュリングを行うことができる。
なお、本発明の命令スケジュリングでは、従来技術のように中間コードを生成して命令スケジューリングするほど完璧な命令スケジュリングはできないが、テンプレートＪＩＴコンパイラとしては、満足できる程度の命令スケジューリングが可能であり、スケジュリングしない場合と比べ、実行速度を向上させることができる。
【００１２】
図３、図４は本実施例の命令スケジュリング処理を示すフローチャートである。
まず、図３において、ＦＩＦＯバッファに命令があるかを調べる（ステップＳ１）。ＦＩＦＯバッファに命令がなければ、翻訳器からの新たな命令があるかを調べ、なければ処理を終了する（ステップＳ２）。
翻訳器からの命令があれば、翻訳器から命令を一つ取り出し（ステップＳ３）、この命令とコードバッファの中の最後の数命令との間に干渉があるかを調べ（ステップＳ４）、干渉がなければ上記翻訳器から取り出した命令をコードバッファに出力し、（Ａ）に戻る（ステップ５）。また、干渉があれば、上記翻訳器から取り出した命令をＦＩＦＯバッファに入れ、（Ａ）に戻る（ステップＳ６）。
【００１３】
一方、ＦＩＦＯバッファに命令があれば、図４のステップＳ７にいき、ＦＩＦＯバッファから命令を一個取り出し、ＦＩＦＯバッファから取り出した命令とコードバッファの中の最後の数命令との間に干渉があるかを調べ（ステップＳ８）、干渉がなければ、命令をコードバッファに出力し、図３の（Ａ）に戻る（ステップＳ９）。
また、ＦＩＦＯバッファから取り出した命令とコードバッファの中の最後の数命令との間に干渉がある場合には、翻訳器からの命令があるかを調べる（ステップＳ１０）。
翻訳器からの命令がなければ、命令をコードバッファに出力し図３の（Ａ）に戻る（ステップＳ１１）。
翻訳器からの命令があれば、翻訳器から命令を一個取り出し（ステップＳ１２）、翻訳器から取り出した命令と、ＦＩＦＯバッファの中の命令とに依存関係があるかを調べる（ステップＳ１３）。
【００１４】
依存関係があれば、ＦＩＦＯバッファが一杯であるかを調べ（ステップＳ１６）、ＦＩＦＯバッファが一杯でなければ、上記翻訳器から取り出した命令をＦＩＦＯバッファにいれる（ステップＳ１８）。また、ＦＩＦＯバッファが満杯であれば、ＦＩＦＯバッファの中の命令を一つ取り出して、コードバッファに出力した後（ステップＳ１７）、上記翻訳器から取り出した命令をＦＩＦＯバッファにいれる。
また、依存関係がなければ、上記翻訳器から取り出した命令とコードバッファの中の最後の数命令との間に干渉があるかを調べ（ステップＳ１４）、干渉がなければ、命令をコードバッファに出力し、図３の（Ａ）に戻る（ステップＳ１５）。また、干渉があれば、上記翻訳器から取り出した命令をＦＩＦＯバッファに入れ、図３の（Ａ）に戻る（ステップＳ１９）  
【００１５】
以下、具体例により本実施例による命令スケジュリング処理例を説明する。
図５は｛（ａ×３）＋（ｂ×４）＋（ｃ×５）｝の演算を行うジャバプログラムの１例を示し、同図は、コンパイル前のバイトコードとコンパイル後のネイティブコードを示し、命令スケジュリング前の命令列を示している。
また、図６は命令スケジュリング処理の際にコードバッファ、ＦＩＦＯバッファに格納される命令を示し、同図中の(1) 〜(8) は図５の示した(1) 〜(8) の命令に対応する。また図７は命令スケジュリング後にコードバッファに格納された命令列を示す。
【００１６】
図５に示す各バイトコードは、翻訳器により同図に示す命令（ネイティブコード）に翻訳されて翻訳器から出力される。翻訳された各命令は、以下の処理を行う。
（１）ｌｄｉ  ＠（ｇｒ２５，４），ｇ１６
バイトコードｉｌｏａｄ＿１は上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタ（ｇｒ２５，４）［ｇｒ２５はレジスタ番号、４はオフセット］によりポイントされるメモリアドレスから、”ａ”をレジスタｇ１６にロードする命令である（［ｇ１６］←”ａ”）。
（２）ｍｕｌ  ｇｒ１６，３，ｇｒ１７
バイトコードｉｃｏｎｓｔ＿３，ｉｍｕｌは、上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタｇｒ１６に保持された”ａ”と定数”３”を掛けて、レジスタｇｒ１７にロードする命令である（［ｇｒ１７］←”ａ×３”）。
なお、命令（１）（２）がこの順序で続けて実行されるとレジスタｇｒ１６へのアクセスが続いて発生するので、命令（１）（２）は干渉していることになる。
（３）ｌｄｉ  ＠（ｇｒ２５，8 ），ｇ１8 
バイトコードｉｌｏａｄ＿２は上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタ（ｇｒ２５，８）によりポイントされるメモリアドレスから、”ｂ”をレジスタｇ１８にロードする命令である（［ｇ１８］←”ｂ”）。
【００１７】
（４）ｓｌｌｉ，ｇｒ１８，２，ｇｒ１９
バイトコードｉｃｏｎｓｔ＿４，ｉｍｕｌは、上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタｇｒ１８を２桁シフト（４倍することに相当）し、レジスタｇｒ１９にロードする命令である（［ｇｒ１９］←”ｂ×４”）。
なお、命令(3)(4)がこの順序で続けて実行されるとレジスタｇｒ１８へのアクセスが続いて発生することになるので、命令(3)(4)は干渉していることになる。
（５）ａｄｄ  ｇｒ１７，ｇｒ１９，ｇｒ２０
バイトコードｉａｄｄは、上記命令（ネイティブコード）に翻訳される。上記命令は、  レジスタｇｒ１７の内容（”ａ×３”が保持されてい）とレジスタｇｒ１９の内容（”ｂ×４”が保持されている）を加算して、レジスタｇｒ２０にロードする命令である（［ｇｒ２０］←”ａ×３＋ｂ×４”）。
なお、この（５）の命令は、（２）（４）の命令が実行された後でなければ実行できないので、命令（５）は、命令（２）（４）と依存関係にある。
【００１８】
（６）ｌｄｉ  ＠（ｇｒ２５，１２），ｇ２１
バイトコードｉｌｏａｄ＿３は上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタ（ｇｒ２５，１２）によりポイントされるメモリアドレスから、”ｃ”をレジスタｇ２１にロードする命令である（［ｇ２１］←”ｃ”）。
（７）ｍｕｌ  ｇｒ２１，５，ｇｒ２２
バイトコードｉｃｏｎｓｔ＿５，ｉｍｕｌは、上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタｇｒ２１に保持された”ｃ”と定数”５”を掛けて、レジスタｇｒ２２にロードする命令である（［ｇｒ２２］←”ｃ×５”）
なお、命令（６）（７）がこの順序で続けて実行されるとレジスタｇｒ２１へのアクセスが続いて発生するので、命令（６）（７）は干渉していることになる。
（８）ａｄｄ  ｇｒ２０，ｇｒ２２，ｇｒ２３
バイトコードｉａｄｄは、上記命令（ネイティブコード）に翻訳される。上記命令は、レジスタｇｒ２０の内容（”ａ×３＋ｂ×４”が保持されてい）とレジスタｇｒ２２の内容（”ｃ×５”が保持されている）を加算して、レジスタｇｒ２３にロードする命令である（［ｇｒ２３］←”ａ×３＋ｂ×４＋ｃ×５”）。
なお、この（８）の命令は、（５）（７）の命令が実行された後でなければ実行できないので、命令（８）は、命令（５）（７）と依存関係にある。
【００１９】
本実施例により、上記命令列は図６に示すようにＦＩＦＯバッファ５に保持され、命令スケジュリングされた命令列はコードバッファ６に出力される。
(i) 翻訳器３から命令（１）が出力される。コードバッファ６には、命令が入っていないので、命令（１）はコードバッファに出力される。
(ii)翻訳器３から命令（２）が出力される。コードバッファ６の中には、命令（１）があり、命令（１）と命令（２）は干渉するで、命令（２）はＦＩＦＯバッファ５に入れられる。
(iii) ＦＩＦＯバッファ５から命令（２）を取り出すが、ＦＩＦＯバッファ５の中の命令（２）はコードバッファ６の中の命令（１）と干渉するので、翻訳器３から命令（３）が取り出される。コードバッファ６には、命令（１）が入っているが、命令（３）とは干渉しないので、命令（３）はコードバッファ5 に出力される。
(iv)ＦＩＦＯバッファ５から命令（２）を取り出すが、ＦＩＦＯバッファ５の中の命令（２）はコードバッファ６の中の命令（１）と干渉するので、翻訳器３から命令（４）が取り出される。
コードバッファ６の中には、命令（３）があり、命令（３）と命令（４）は干渉するで、命令（４）はＦＩＦＯバッファ５に入れられる。
【００２０】
(v) ＦＩＦＯバッファ５から命令（２）を取り出すが、ＦＩＦＯバッファ５の中の命令（２）はコードバッファ６の中の命令（１）と干渉するので、翻訳器３から命令（５）が取り出される。
命令（５）とＦＩＦＯバッファ５の中の命令（２）（４）は依存関係にあるので、命令（５）はＦＩＦＯバッファ５に入れられる。
(vi)ＦＩＦＯバッファ５から命令（２）を取り出すが、ＦＩＦＯバッファ５の中の命令（２）はコードバッファ６の中の命令（１）と干渉するので、翻訳器３から命令（６）が取り出される。
コードバッファ６の命令は、命令（６）とは干渉しないので命令（６）はコードバッファ5 に出力される。
(vii) ＦＩＦＯバッファ５から命令（２）を取り出す。ＦＩＦＯバッファ５の中の命令（２）はコードバッファ６の中の命令（１）とは干渉しなくなったので、命令（２）をコードバッファ６に出力する。
【００２１】
(viii)ＦＩＦＯバッファ５から命令（４）を取り出す。ＦＩＦＯバッファ５の中の命令（４）はコードバッファ６の中の命令（３）とは干渉しなくなったので、命令（４）をコードバッファ６に出力する。
(ix)ＦＩＦＯバッファ５から命令（５）を取り出すが、ＦＩＦＯバッファ５の中の命令（５）はコードバッファ６の中の命令（４）と干渉するので、翻訳器３から命令（７）が取り出される。
コードバッファ６の中には、命令（６）があり、命令（６）は命令（７）と干渉するで、命令（７）はＦＩＦＯバッファ５に入れられる。
(x) ＦＩＦＯバッファ５から命令（５）を取り出すが、ＦＩＦＯバッファ５の中の命令（５）はコードバッファ６の中の命令（４）と干渉するので、翻訳器３から命令（８）が取り出される。
命令（８）とＦＩＦＯバッファの中の命令（５）（７）は依存関係にあるので、命令（８）はＦＩＦＯバッファ５に入れられる。
【００２２】
(xi)ＦＩＦＯバッファ５から命令（５）を取り出す。翻訳器３からの命令はないので、命令（５）をコードバッファ６に出力する。
(xii) ＦＩＦＯバッファ５から命令（７）を取り出す。翻訳器３からの命令はないので、命令（７）をコードバッファ６に出力する。
(xiii)ＦＩＦＯバッファ５から命令（８）を取り出す。翻訳器３からの命令はないので、命令（８）をコードバッファ６に出力する。
以上の処理を行うことで、コードバッファ６には、命令が（１）（３）（６）（２）（４）（５）（７）（８）の順に出力される。
図７に上記命令スケジュリング後の命令列を示す。同図に示すように、できるだけ干渉が生じないように命令列が並べ替えられ、スケジュリング前の命令列に比べて、実行速度を向上させることができる。
【図面の簡単な説明】
【００２３】
【図１】本発明のジャバ仮想マシンの全体構成を示す図である。
【図２】本発明の実施例のＪＩＴコンパイラ１２の機能構成を示すブロック図である。
【図３】本発明の実施例の命令スケジュリング処理を示すフローチャート（１）である。
【図４】本発明の実施例の命令スケジュリング処理を示すフローチャート（２）である。
【図５】ジャバプログラムにおけるバイトコードとネイティブコード一例を示す図である。
【図６】命令スケジュリング処理の際にコードバッファ、ＦＩＦＯバッファに格納される命令を示す図である。
【図７】命令スケジュリング後のネイティブコードを示す図である。
【符号の説明】
【００２４】
１    バイトコード
２    テンプレート
３    翻訳器
４    評価器
５    ＦＩＦＯバッファ
６    コードバッファ
１０  ジャバ仮想マシン
【図１】
2006120043.tif 000003
【図２】
2006120043.tif 000004
【図３】
2006120043.tif 000005
【図４】
2006120043.tif 000006
【図５】
2006120043.tif 000007
【図６】
2006120043.tif 000008
【図７】
2006120043.tif 000009