(57)【要約】【課題】  ジャバ仮想マシンの命令語実行方法及びその装置を提供する。【解決手段】  （ａ）ジャバクラスを構成するメソードのバイトコードを抽出するステップと、（ｂ）抽出されたバイトコードを、バイトコード内の演算コードに対応する動作を行う演算コードハンドラの位置に関する情報を含み、かつ１６ビットのメモリ要素を使用する第２コードに変換するステップと、（ｃ）第２コードを行うステップとを含む。【選択図】    図５
2006302272.tif 000002
【特許請求の範囲】
【請求項１】
（ａ）ジャバクラスを構成するメソードのバイトコードを抽出するステップと、
（ｂ）前記抽出されたバイトコードを、前記バイトコード内の演算コードに対応する動作を行う演算コードハンドラの位置に関する情報を含み、かつ１６ビットのメモリ要素を使用する第２コードに変換するステップと、
（ｃ）前記第２コードを行うステップと、を含むジャバ仮想マシンの命令実行方法。
【請求項２】
前記（ｃ）ステップは、
（ｃ１）前記第２コードをランタイム状態でリンキングするステップと、
（ｃ２）前記リンキングされた第２コードが行えるように初期化するステップと、
（ｃ３）前記初期化された第２コードを行うステップと、を含む請求項１に記載のジャバ仮想マシンの命令実行方法。
【請求項３】
前記（ｃ１）ステップは、
（ｃ１１）前記第２コード内の前記演算コードハンドラの位置に関する情報及び前記演算コードハンドラに対応する前記演算コードを含むテーブルを参照して、前記第２コードを検証するステップを含む請求項２に記載のジャバ仮想マシンの命令実行方法。
【請求項４】
前記演算コードハンドラの位置を表す値は、前記演算コードハンドラのオフセットである請求項１に記載のジャバ仮想マシンの命令実行方法。
【請求項５】
前記（ｂ）ステップは、
（ｂ１）前記バイトコード内のバイト単位の被演算子を、１６ビットのメモリ要素を使用する第２被演算子に変換するステップを含む請求項１に記載のジャバ仮想マシンの命令実行方法。
【請求項６】
前記（ｂ１）ステップは、
（ｂ１１）前記バイトコード内のバイト単位の被演算子を左側に２ビットシフトするステップを含む請求項５に記載のジャバ仮想マシンの命令実行方法。
【請求項７】
前記（ｂ）ステップは、
（ｂ１）前記バイトコード内の被演算子を表す連続的なバイトを組み合わせて、１６ビットのメモリ要素を使用する第２被演算子に変換するステップを含む請求項１に記載のジャバ仮想マシンの命令実行方法。
【請求項８】
前記（ｂ１）ステップは、
（ｂ１１）前記バイトコード内の被演算子を表す１以上の連続的なバイトをＯＲ演算及びシフト演算で組み合わせるステップと、
（ｂ１２）前記組み合わせられた結果を左側に２ビットシフトするステップと、を含む請求項７に記載のジャバ仮想マシンの命令実行方法。
【請求項９】
前記第２被演算子は、前記バイトコード内の被演算子がオフセットである場合、基礎アドレスに前記オフセットを加えたメモリアドレスである請求項７に記載のジャバ仮想マシンの命令実行方法。
【請求項１０】
前記（ｂ）ステップは、前記入力されたバイトコード内の演算コードがワイド被演算子を使用する演算コードである場合、前記演算コードをワイド被演算子を使用しない演算コードに変更するステップを含む請求項１に記載のジャバ仮想マシンの命令実行方法。
【請求項１１】
ジャバクラスを構成するメソードのバイトコードを抽出するバイトコード抽出部と、
前記バイトコード抽出部により抽出されたバイトコードを、前記バイトコード内の演算コードに対応する動作を行う演算コードハンドラの位置に関する情報を含み、１６ビットのメモリ要素を使用する第２コードに変換する第２コード変換部と、
前記第２コード変換部により変換された前記第２コードを行う命令語実行部と、を備えるジャバ仮想マシン。
【請求項１２】
前記第２コードをランタイム状態にするリンキング作業を行うリンキング部と、
前記リンキングされた第２コードが行われるように初期化する初期化部と、をさらに備える請求項１１に記載のジャバ仮想マシン。
【請求項１３】
前記リンキング部は、前記第２コード内の前記演算コードハンドラの位置に関する情報及び前記演算コードハンドラに対応する前記演算コードを含むテーブルを参照して前記第２コードを検証する請求項１２に記載のジャバ仮想マシン。
【請求項１４】
前記演算コードハンドラの位置を表す値は、前記演算コードハンドラのオフセットである請求項１１に記載のジャバ仮想マシン。
【請求項１５】
前記第２コード変換部は、前記バイトコード内のバイト単位の被演算子を１６ビット単位の第２被演算子に変換する請求項１１に記載のジャバ仮想マシン。
【請求項１６】
前記第２コード変換部は、前記バイトコード内のバイト単位の被演算子を左側に２ビットシフトする請求項１１に記載のジャバ仮想マシンの命令実行方法。
【請求項１７】
前記第２コード変換部は、前記バイトコード内の被演算子を表す連続的なバイトを組み合わせて１６ビット単位の第２被演算子に変換する請求項１１に記載のジャバ仮想マシン。
【請求項１８】
前記第２被演算子は、前記バイトコード内の被演算子がオフセットである場合、基礎アドレスに前記オフセットを加えたメモリアドレスである請求項１７に記載のジャバ仮想マシン。
【請求項１９】
前記第２コード変換部は、前記バイトコード内の被演算子を表す１以上の連続的なバイトをＯＲ演算及びシフト演算で組み合わせ、前記組み合わせられた結果を左側に２ビットシフトする請求項１１に記載のジャバ仮想マシンの命令実行方法。
【請求項２０】
前記第２コード変換部は、前記入力されたバイトコード内の演算コードがワイド被演算子を使用する演算コードである場合、前記演算コードを、ワイド被演算子を使用しない演算コードに変更する請求項１１に記載のジャバ仮想マシン。
【請求項２１】
請求項１ないし請求項１０のうちいずれか１項による方法を実行するためのコンピュータ可読プログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ジャバ仮想マシン（Ｊａｖａ(登録商標)Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）の命令語実行方法及びその装置に係り、さらに詳細には、ジャバ仮想マシンで行われるバイトコードを、１６ビットのメモリ要素（１６−ｂｉｔ  ｍｅｍｏｒｙ  ｅｌｅｍｅｎｔ）を使用する第２コードに変換することによって、さらに速い命令語の実行速度を提供するジャバ仮想マシンの命令語実行方法及びその装置に関する。
【背景技術】
【０００２】
ジャバプログラミング言語（Ｊａｖａ（登録商標）ｐｒｏｇｒａｍｍｉｎｇ  ｌａｎｇｕａｇｅ）は、１９９０年代中盤に発表された以降、急速に伝播されてきたが、ＣやＣ＋＋などの言語で作成されたコードに比べて速度が遅いという短所がある。このような短所を克服するために、既存のインタープリタ（ｉｎｔｅｒｐｒｅｔｅｒ）方式のジャバ仮想マシンにＪＩＴ（ジャストインタイム）コンパイラーのような動的コード生成技法、またはＡＯＴ（アヘッドオブタイム）コンパイラーのような静的なコード生成技法が考案された。
【０００３】
ジャバプラットホームは、主にジャバ仮想マシンとクラスとで構成される。クラスファイルは、クラスの資料構造に関する情報及びフィールドとメソード情報などで構成されるが、そのうちメソードの実行コードは、ハードウェアまたは運用体制（ＯＳ）に独立的なバイトコードからなっている。
【０００４】
従来のジャバ仮想マシンを実行エンジンを基準に分類すれば、インタープリティング方式のジャバ仮想マシンと、ＪＩＴコンパイル方式のジャバ仮想マシン、インタープリティングとＪＩＴコンパイルとをいずれも使用する方式のジャバ仮想マシン、または、ＡＯＴコンパイル方式のジャバ仮想マシンに分類できる。
【０００５】
インタープリティング方式のジャバ仮想マシンは、行うべきメソードのバイトコードを一つずつ解釈してアプリケーションを行い、ＪＩＴコンパイラーは、前記バイトコードをコンパイルして現在のジャバプラットホームに従属的な機械語コードを得た後、前記機械語コードを行うことによってアプリケーションを行う。
【０００６】
図１は、従来のジャバクラスファイルの一般的な構成を示す例示図である。
【０００７】
クラスファイルは、クラスやインターフェースの定義を含むが、クラスに定義されたいろいろな属性、フィールド情報、メソード情報などで構成されている。メソード情報のうち、インタープリタで行うバイトコードと呼ばれるバイトストリームが定義されている。前記バイトコードは、ジャバ原始言語文章を含んでいるファイル（例えば、拡張子が‘ジャバ’であるファイル）をコンパイルして、その結果物として得たものである。
【０００８】
前記バイトコードは、一回に１バイトずつコンピュータ内で行われるという側面では、行う準備ができたプログラムモジュールと類似しているが、前記バイトコード命令語は、論理的かつ抽象的なジャバ仮想マシンに送る実際命令語である。前記バイトコードは、一回に１バイトずつ翻訳される形式以外にも、特定のシステムプラットホームに合わせてＪＩＴコンパイラーにより再びコンパイルされることもあるが、このようにすれば、ジャバプログラムの実行がさらに速くなる。
【０００９】
図２は、従来のジャバ仮想マシンで行われるバイトコードを示す例示図である。
【００１０】
バイトコード命令語は、実行動作を区別するためのバイトサイズの演算コード（ｏｐｃｏｄｅ）と被演算子（ｏｐｅｒａｎｄ）とで構成される。一つの演算コードは複数の被演算子を持つことができる。演算コードおよび被演算子いずれもバイト単位で保存されるので、１バイト以上のサイズを持つ被演算子を表現するために連続したバイトとして表現される。例えば、１６ビット値は２個の連続したバイトで、３２ビット値は４個の連続したバイトでなる。
【００１１】
前記図２で、上段は実際バイトコードの１６進数値であり、下段はそれぞれのバイトコードを演算コードと被演算子とに区分して表したものである。
【００１２】
図３は、従来のジャバインタープリタでそれぞれのバイトコードを行う動作を示す一実施形態のフローチャートである。
【００１３】
アプリケーションクラスはジャバ仮想マシンのクラスローダにより積載され、リンク過程（リンキング）及び初期化過程（イニシャライぜーション）を経てランタイムシステム内の資料構造に該当情報が保存され、インタープリタまたはＪＩＴコンパイラーのような実行エンジン（Ｅｘｅｃｕｔｉｏｎ  Ｅｎｇｉｎｅ）によりメソードが行われる。
【００１４】
典型的なインタープリタでは、前記図３で図示した方法でバイトコードを行う。インタープリタは、メソードが呼び出されれば前記メソードのバイトコードを示すプログラムカウンタを増加させた後（Ｓ３１０）、前記メソードのバイトコードの終端であるかどうかを判断する（Ｓ３２０）。もし、前記メソードのバイトコードの終端でなければ（Ｓ３２０のいいえ）、１バイト演算コード（ｏｐｃｏｄｅ）をフェッチし（Ｓ３３０）、プログラム内のスイッチ（ｓｗｉｔｃｈ）文を利用して前記フェッチされた演算コードに該当するハンドラに移動（Ｓ３４０）して、前記ハンドラが行われる（Ｓ３５０）。このような過程をバイトコードのサイズほど反復すれば、前記メソードに対するインタープリティング過程が終了する。
【００１５】
前述した過程を擬似コードで表せば、次の通りである。
【００１６】
Ｌｏｏｐ｛
Ｏｐ＝＊ｐｃ＋＋；
ｓｗｉｔｃｈ（Ｏｐ）｛
ｃａｓｅ  ｏｐ＿１：
／／ｏｐ＿１’ｓ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎ
ｂｒｅａｋ；
ｃａｓｅ  ｏｐ＿２：
／／ｏｐ＿２’ｓ  ｉｍｐｌ  ｅｍｅｎｔａｔｉｏｎ
ｂｒｅａｋ；
ｃａｓｅ  ｏｐ＿３：
／／ｏｐ＿３’ｓ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎ
ｂｒｅａｋ；
…
｝
それぞれの演算コードに対するハンドラで、もし前記演算コードが必要とする被演算子が一バイトより大きければ、前記被演算子の値は連続したバイトで保存される。したがって、前記連続したバイトをそれぞれのビット別に、ＯＲ演算子及びシフト（ｓｈｉｆｔ）演算子を通じて一つの意味のある値に再構成する。例えば、リトルエンディアン（ｌｉｔｔｌｅ  ｅｎｄｉａｎ）を使用するＣＰＵで、もしある演算コードＡが必要とする被演算子が、後続のｂｙｔｅ１、ｂｙｔｅ２、ｂｙｔｅ３、ｂｙｔｅ４にあれば、ｂｙｔｅ４は、論理的に表そうとする３２ビット値の１番目ビットから８番目ビットまで、ｂｙｔｅ３は、論理的に表そうとする３２ビット値の９番目ビットから１６番目ビットまで、ｂｙｔｅ２は、論理的に表そうとする３２ビット値の１７番目ビットから２４番目ビットまで、ｂｙｔｅ１は、論理的に表そうとする３２ビット値の２５番目ビットから３２番目ビットまでを表している。
【００１７】
したがって、‘（ｂｙｔｅ１＜＜２４）｜（ｂｙｔｅ２＜＜１６）｜（ｂｙｔｅ３＜＜８）｜ｂｙｔｅ４’のような演算を通じて演算コードＡが実際必要とする３２ビットの被演算子の値を求めることができる。既存のジャバ仮想マシンでは、かかる被演算子を組み合わせる過程がメソードが行われる度に発生する。
【００１８】
したがって、被演算子の場合に、前記被演算子が１バイトより大きい場合に連続したバイトで羅列され、前記連続的に羅列されたバイトはメソードが行われる度にそれぞれのビット別にＯＲ演算子及びシフト演算子を通じて再構成されるが、かかる過程は、ジャバプログラム実行において相当なオーバーヘッドとして作用できる。
【００１９】
また、バイトコードは演算コードを使用するので、一つのバイトコードを機械語に変換する度に前記擬似コードのスイッチ文の条件を判断する過程を経るという問題点がある。したがって、前記のような制約を克服することによって、ジャバ仮想マシンの性能を向上させる必要がある。
【特許文献１】米国特許第２００３−０４１３２２号公報
【発明の開示】
【発明が解決しようとする課題】
【００２０】
本発明が解決しようとする技術的課題は、ジャバ仮想マシンがバイトコードをインタープリット（Ｉｎｔｅｒｐｒｅｔ）する前に、１６ビットのメモリ要素を使用する第２コードに変換させる前処理（Ｐｒｅｃｏｍｐｕｔａｔｉｏｎ）過程を行うことによって、ジャバプログラムの実行速度を向上させることができるジャバ仮想マシンの命令語実行方法及びその装置を提供することである。
【００２１】
本発明が解決しようとする他の技術的課題は、バイトコードを１６ビットのメモリ要素を使用する第２コードに変換することによって、さらに多くのメモリを要求するコードへの変換に比べてメモリ増加によるオーバーヘッドが比較的少ないジャバ仮想マシンの命令語実行方法及びその装置を提供することである。
【００２２】
本発明の目的は、以上で言及した目的に制限されず、言及されていない他の目的は下の記載から当業者に明確に理解されうる。
【課題を解決するための手段】
【００２３】
前記目的を達成するために、本発明の実施形態によるジャバ仮想マシンの命令語実行方法は、（ａ）ジャバクラスを構成するメソードのバイトコードを抽出するステップと、（ｂ）前記抽出されたバイトコードを、前記バイトコード内の演算コードに対応する動作を行う演算コードハンドラの位置に関する情報を含み、かつ１６ビットのメモリ要素を使用する第２コードに変換するステップと、（ｃ）前記第２コードを行うステップと、を含む。
【００２４】
一方、本発明の実施形態によるジャバ仮想マシンは、ジャバクラスを構成するメソードのバイトコードを抽出するバイトコード抽出部と、前記バイトコード抽出部により抽出されたバイトコードを、前記バイトコード内の演算コードに対応する動作を行う演算コードハンドラの位置に関する情報を含み、１６ビットのメモリ要素を使用する第２コードに変換する第２コード変換部と、前記第２コード変換部により変換された前記第２コードを行う命令語実行部と、を備える。
【００２５】
その他の実施例の具体的な事項は詳細な説明及び図面に含まれている。
【発明の効果】
【００２６】
本発明のジャバ仮想マシンの命令語実行方法及びその装置によれば、次のような効果が一つあるいはそれ以上ある。
【００２７】
第１に、バイトコードを１６ビットのメモリ要素を使用する第２コードに変換することによって、ジャバプログラムの実行速度を向上させることができる。
【００２８】
第２に、バイトコードを１６ビットのメモリ要素を使用する第２コードに変換することによって、さらに多くのメモリを要求するコードへの変換に比べてメモリ増加によるオーバーヘッドが比較的少ない。
【発明を実施するための最良の形態】
【００２９】
本発明の利点及び特徴、そしてこれを達成する方法は添付された図面に基づいて詳細に後述されている実施例を参照すれば明確になる。しかし、本発明は以下で開示される実施例に限定されるものではなく、この実施例から外れて多様な形に具現でき、本明細書で説明する実施例は本発明の開示を完全にし、本発明が属する技術分野で当業者に発明の範ちゅうを完全に報せるために提供されるものであり、本発明は請求項及び発明の詳細な説明により定義されるだけである。一方、明細書全体に亙って同一な参照符号は同一な構成要素を示す。
【００３０】
以下、添付された図面を参照して本発明の望ましい実施形態を詳細に説明する。
【００３１】
図４は、本発明の実施形態によるジャバ仮想マシンの構成を示すブロック図である。
【００３２】
本実施形態で、ジャバ仮想マシン４００は、バイトコード抽出部４２０、第２コード変換部４３０、リンキング部４４０、初期化部４５０、及び命令語実行部４６０を備えて構成できる。
【００３３】
バイトコード抽出部４２０は、ジャバ仮想マシンにローディングされて積載されるクラス４１０からメソードのバイトコードを抽出して、第２コード変換部４３０に提供する。
【００３４】
第２コード変換部４３０は、８ビット単位のバイトコードを１６ビットのメモリ要素を使用する第２コードに変換する。第２コードへの変換過程は、バイトコードの演算コードを１６ビットの演算コードハンドラオフセットに変換するステップと、被演算子がある場合、バイトコード内の被演算子フィールドのビットを適切に組み合わせて１６ビットまたは３２ビットのインデックスまたはメモリアドレスに変換するステップを含む。第２コードへの変換過程の詳細な事項は、図６ないし図１０を参照して後述する。
【００３５】
リンキング部４４０は、変換された第２コードを検証（ｖｅｒｉｆｉｃａｔｉｏｎ）、準備（ｐｒｅｐａｒａｔｉｏｎ）、及び分析（ｒｅｓｏｌｕｔｉｏｎ）を含むリンキング作業を行って、ジャバ仮想マシンのランタイム状態に加える。
【００３６】
初期化部４５０は、リンクされた第２コードを、静的初期化部及びクラスに宣言された静的フィールドのための初期化部の実行を経て初期化させる。
【００３７】
命令語実行部４６０は、ジャバクラスメソードの第２コードを解釈して行う。命令語実行部の一実施形態はインタープリタであってもよく、他の実施形態でコンパイラーであってもよい。インタープリティング方式のジャバ仮想マシンは、行うべきメソードのバイトコードを一つずつ解釈してアプリケーションを行い、ＪＩＴコンパイラーを使用するジャバ仮想マシンは、バイトコードをコンパイルして現在のジャバプラットホームに従属的な機械語コードを得た後、その機械語コードを行うことによってアプリケーションを行う。
【００３８】
前記図４の各構成要素は、ソフトウェアまたはＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）または注文型半導体（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ；ＡＳＩＣ）のようなハードウェア構成要素を意味する。しかし、前記構成要素は、ソフトウェアまたはハードウェアに限定されるものではない。アドレッシング可能な保存媒体に存在すべく構成されても良く、１つまたはそれ以上のプロセッサーを実行させるように構成されても良い。構成要素から提供される機能は、より少数の構成要素及びモジュールで結合されるか、追加的な構成要素とモジュールにさらに分離されうる。複数の構成要素を結合して特定の機能を行う一つの構成要素で具現されることもある。
【００３９】
図５は、本発明の実施形態によるジャバ仮想マシンの命令語実行過程を示すフローチャートである。
【００４０】
新たなクラス４１０は、クラスローダを通じてローディングされてジャバ仮想マシン４００の内部に積載され、バイトコード抽出部４００が積載されたクラスからメソードを行うためのバイトコードを抽出（Ｓ５１０）する。抽出されたバイトコードは、第２コード変換部４３０により１６ビットのメモリ要素を使用する第２コードに変換（Ｓ５２０）される。変換された第２コードは検証、準備、及び分析を含むリンキングステップ（Ｓ５３０）を経てジャバ仮想マシンのランタイム状態に加えられる（ｃｏｍｂｉｎｅ）。リンクされた第２コードは、静的初期化部及びクラスに宣言された静的フィールドのための初期化部の実行を経て初期化（Ｓ５４０）される。初期化された第２コードは、命令語実行部４４０により翻訳されるか、または機械語にコンパイルされた後に行われる（Ｓ５５０）。
【００４１】
バイトコードを第２コードに変換するステップの詳細は、図６を参照して説明する。
【００４２】
図６は、本発明の実施形態によるジャバ仮想マシンの命令語実行過程のうち、バイトコードを第２コードに変換するステップの詳細過程を示すフローチャートである。
【００４３】
バイトコードは、図２に示すように、バイト単位の演算コード及び被演算子でなる。バイトコードを第２コードに変換する過程は、次の通りである。
【００４４】
バイトコードの１バイト（８ビット）の演算コードは、該当演算コードハンドラの１６ビットオフセットで代替される（Ｓ６１０）。演算コードハンドラオフセットを基礎アドレス（Ｂａｓｅ  ａｄｄｒｅｓｓ）に加えることによって、演算コードに該当する動作を行うハンドラのメモリアドレスが分かる。したがって、第２コードをインタープリタまたはコンパイラーが行う場合、演算コードハンドラオフセットから直ちにハンドラのアドレスが分かるので、インタープリタループ内で図３で説明したスイッチ文を行う必要なく直ちに該当演算コードハンドラに分岐する。これにより、ジャバプログラムの実行時間を短縮できる。
【００４５】
演算コードが被演算子を持つ場合（Ｓ６２０の例）、バイト単位の被演算子を１６ビット単位の被演算子に変換する。バイトコードで１バイトを占める被演算子は、符号または非符号ワード（Ｓｉｇｎｅｄ  ｏｒ  ｕｎｓｉｇｎｅｄ  ｗｏｒｄ）に転換されて、第２コードに１６ビットで満たされる（ｐａｃｋｅｄ）。バイトコードで２バイトを占める被演算子は、符号または非符号ワードに転換されて、第２コードに２個の連続する（ｃｏｎｓｅｃｕｔｉｖｅ）１６ビットで満たされる。また、バイトコードで４バイトを占める被演算子は、符号または非符号ワードに転換されて第２コードに２個の連続する１６ビットで満たされる。
【００４６】
被演算子の変換ステップはまた、被演算子がインデックスである場合と被演算子がオフセット値である場合に細分化できる。バイトコードの被演算子がインデックスである場合（Ｓ６３０のはい）、バイトコードのインデックスを１６ビットのメモリ要素に適するように変換する。本実施形態は１６ビットのメモリ要素を使用するので、バイトコードのインデックスを左側に２ビットシフトして第２コードのインデックス値を生成する。被演算子としてインデックスを持つバイトコードの変換例は、図７で後述する。
【００４７】
バイトコードの被演算子がオフセット値である場合（Ｓ６３０のいいえ）、オフセット値を基礎アドレスに加えて３２ビットのメモリアドレスに変換する（Ｓ６５０）。被演算子としてオフセットを持つバイトコードの変換例は、図８ないし図９で後述する。
【００４８】
第２コードが翻訳されて行われる過程を擬似コードで表現すれば、次の通りである。
【００４９】
ｎｏｐ＿ｌａｂｅｌ：
＋＋ｐｃ；ｇｏｔｏ＊（ｎｏｐ＿ｌａｂｅｌ＋ｐｃ［０］）；
ａｃｏｎｓｔ＿ｎｕｌｌ＿ｌａｂｅｌ：
＊ｓｐ＝０；
＋＋ｓｐ；
＋＋ｐｃ；ｇｏｔｏ＊（ｎｏｐ＿ｌａｂｅｌ＋ｐｃ［０］）；
…
／／ｏｔｈｅｒ  ｏｐｃｏｄｅ  ｈａｎｄｌｅｒｓ
ジャバ仮想マシンでのリンキングステップ（Ｓ５３０）は、２進形態のクラスまたはインターフェースタイプをとってジャバ仮想マシンのランタイム状態に加える過程をいう。本実施形態でリンキングステップは、初期化ステップ（Ｓ５４０）前に行われると図示されているが、命令語の実行ステップ（Ｓ５５０）でも行える融通性を持つ。
【００５０】
本実施形態で、バイトコードから第２コードへの変換は検証過程より先に行われるので、第２コードの検証は、第２コード命令語のレイアウト、命令語被演算子の変換及び先計算（ｐｒｅｃｏｍｐｕｔａｔｉｏｎ）を考慮する。第２コードの検証過程でいかなる演算コードが検証さるかを決定するためにハンドラオフセット−演算コードルックアップテーブルが使われる。ハンドラオフセット−演算コードルックアップテーブルの構造は、図１０で後述する。本実施形態によるジャバ仮想マシンは、メソードを翻訳する過程で他のクラスに対する参照を分析（ｒｅｓｏｌｖｅ）するために、分析を必要とするあらゆる命令語のための共通の関数を持つことができる。分析のための一つの共通の関数を持つことは、インタープリタループサイズをさらに小さくし、コードキャッシュミス（ｃｏｄｅ  ｃａｃｈｅ  ｍｉｓｓ）を減らすことができる。その結果、インタープリタの性能を向上させる。共通の関数内部でいかなる演算コードが分析されるか決定するために、ハンドラオフセット−演算コードルックアップテーブルが使われる。ハンドラオフセット−演算コードルックアップテーブルの構造は、図１０で後述する。
【００５１】
図７は、バイトコードを第２コードに変換する第１実施形態を示す図面であり、バイトコードの被演算子がインデックスである場合の第２コードのレイアウトを示す。８ビットの演算コード７１０及び８ビットの被演算子として地域変数インデックス７２０を含むバイトコード命令語、例えば、ａｌｏａｄ、ａｓｔｏｒｅなどの命令語は、１６ビットの演算コードハンドラオフセット７３０及び１６ビットの被演算子７４０を持つ第２コードに変換される。１６ビットの被演算子は、目的プロセッサー（ｔａｒｇｅｔ  ｐｒｏｃｅｓｓｏｒ）がバイトアドレッシングモード（ｂｙｔｅ  ａｄｄｒｅｓｓｉｎｇ  ｍｏｄｅ）のみを持つならば、左側に２ビットあらかじめシフトされた（ｐｒｅ−ｓｈｉｆｔｅｄ）地域変数インデックスを持つ。
【００５２】
図８は、バイトコードを第２コードに変換する第２実施形態を示す図面であり、被演算子が２コードのオフセットである場合の第２コードのレイアウトを示す。
【００５３】
８ビットの演算コード８１０及び一つの被演算子として２バイトでなるオフセット８２０、８３０を含むバイトコード命令語、例えば、ｇｏｔｏ、ｉｆなどの命令語は、第２コードで３個の１６ビット要素を占める。３個の１６ビット要素は、一つの演算コードハンドラオフセット８４０及び、命令語実行ステップで使われる命令語の３２ビットアドレスを構成する２個の１６ビット要素８５０である。
【００５４】
一方、８ビットの演算コード８１０及び一つの被演算子として２バイトでなるフィールドオフセット（ｆｉｅｌｄ−ｏｆｆｓｅｔ）８２０、８３０を含むバイトコード命令語、例えば、ｇｅｔｆｉｅｌｄ＿ｑｕｉｃｋ、ｐｕｔｆｉｅｌｄ＿ｑｕｉｃｋなどの命令語も、第２コードで３個の１６ビット要素を占める。３個の１６ビット要素は、一つの演算コードハンドラオフセット８４０及び３２ビットフィールドオフセットを構成する２個の１６ビット要素である。被演算子のための１６ビット要素は、目的プロセッサーがバイトアドレッシングモードのみを持つならば、左側に２ビットほどあらかじめシフトされた３２ビットフィールドオフセットを持つ。
【００５５】
ワイド演算、例えばｇｏｔｏ＿ｗ、ｊｓｒ＿ｗなどの命令語は、８ビットの演算コード及び４バイトの被演算子で構成される。第２コードの場合、一般演算とワイド演算とを区別する必要がないので、ワイド演算の代わりに普通演算コード（ｇｏｔｏ＿ｗの代わりにｇｏｔｏ）のハンドラオフセットに代え、３２ビットの被演算子を作るために２個の連続する１６ビット要素を使用する。
【００５６】
本実施形態では、第２コードの被演算子が３２ビットアドレスである場合を中心に説明したが、バイトコードのオフセットを組み合わせて３２ビットのオフセット値に変換する場合も含まれうるということは、当業者に自明な事項である。
【００５７】
図９は、バイトコードを第２コードに変換する第３実施形態を示す図面である。
【００５８】
バイトコード命令語がｔａｂｌｅｓｗｉｔｃｈであり、命令語全体としてＮバイトを占めるならば、第２コード命令語は、ｔａｂｌｅｓｗｉｔｃｈの１６ビットの演算コードハンドラオフセット９１０から始める。ｔａｂｌｅｓｗｉｔｃｈの演算コードハンドラオフセット９１０に後続する被演算子を３２ビット境界に整列させるための選択的パッド９３０が位置できる。下限アドレス（ｌｏｗ  ａｄｄｒｅｓｓ）９６０は、バイトコードのデフォルトバイト９４０に下限バイト（ｌｏｗ  ｂｙｔｅ）９５０を加えて生成し、上限アドレス（ｈｉｇｈ  ａｄｄｒｅｓｓ）９８０は、バイトコードのデフォルトバイト９４０に上限バイト（ｈｉｇｈ  ｂｙｔｅ）９５０を加えて生成する。バイトコードの４バイトの分岐オフセット９９０は、３２ビットの分岐アドレス９９５に変換される。
【００５９】
本実施形態では、第２コードの被演算子が３２ビットアドレスである場合を中心に説明したが、バイトコードのオフセットを組み合わせて３２ビットのオフセット値に変換する場合も含まれうるということは当業者に自明な事項である。
【００６０】
図１０は、本発明の実施形態による演算コードハンドラオフセット−演算コードテーブルの資料構造を示す図面である。
【００６１】
ジャバ仮想マシンは、一定の命令語に対して演算コードを必要とする時があるが、この場合、オフセットに対応する演算コードを探せるルックアップテーブルを使用すれば便利である。図１０に図示されたオフセット−演算コードルックアップテーブルは、演算コードハンドラオフセットがインデックスになって、探そうとする演算コードハンドラオフセットに該当する演算コードの値が配列に入っている。
【００６２】
第２コードのためのスタックマップを計算するために、ジャバ仮想マシンは第２コード命令語をスキャンする。このスキャン過程で、ハンドラオフセットを演算コードに変換するためにハンドラオフセット−演算コードルックアップテーブルが使われうる。
【００６３】
以上、添付図を参照して本発明の実施例を説明したが、本発明が属する技術分野で当業者ならば本発明がその技術的思想や必須特徴を変更せずとも他の具体的な形に実施されうるということが理解できるであろう。したがって、前述した実施例は全ての面で例示的なものであって、限定的なものではないと理解せねばならない。
【産業上の利用可能性】
【００６４】
本発明は、ジャバ仮想マシンの命令語実行装置の関連技術分野に好適に用いられる。
【図面の簡単な説明】
【００６５】
【図１】従来のジャバクラスファイルの一般的な構成を示す例示図である。
【図２】従来のジャバ仮想マシンで行われるバイトコードを示す例示図である。
【図３】従来のジャバインタープリタでそれぞれのバイトコードを行う動作を示す一実施形態のフローチャートである。
【図４】本発明の実施形態によるジャバ仮想マシンの構成を示すブロック図である。
【図５】本発明の実施形態によるジャバ仮想マシンの命令語実行過程を示すフローチャートである。
【図６】本発明の実施形態によるジャバ仮想マシンの命令語実行過程のうち、バイトコードを第２コードに変換するステップの詳細過程を示すフローチャートである。
【図７】バイトコードを第２コードに変換する第１実施形態を示す図である。
【図８】バイトコードを第２コードに変換する第２実施形態を示す図である。
【図９】バイトコードを第２コードに変換する第３実施形態を示す図である。
【図１０】本発明の実施形態による演算コードハンドラオフセット−演算コードテーブルの資料構造を示す図である。
【符号の説明】
【００６６】
４００      ジャバ仮想マシン
４１０      クラス
４２０      バイトコード抽出部
４３０      第２コード変換部
４４０      命令語実行部
【図１】
2006302272.tif 000003
【図２】
2006302272.tif 000004
【図３】
2006302272.tif 000005
【図４】
2006302272.tif 000006
【図５】
2006302272.tif 000007
【図６】
2006302272.tif 000008
【図７】
2006302272.tif 000009
【図８】
2006302272.tif 000010
【図９】
2006302272.tif 000011
【図１０】
2006302272.tif 000012