(57)【要約】【課題】仮想マシンの実行時の演算処理を高速化でき、その構成を簡素化できる。【解決手段】中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行装置であり、仮想マシンエンジンは、中間コードを主記憶装置にロードされたクラスを有するクラス配列と、実行時の情報を格納するランタイムを有するランタイム配列とを含む。クラスは、オペコードを含む処理手順情報を記述したメソッドを有するメソッドメンバーとフィールドメンバーとを含む。中間コードを主記憶装置にロードしたときに、メソッドに含まれるオペコードのアドレスを主記憶装置のアドレスで表しかつ各クラスのデータ領域に格納する。ランタイムは、変数を格納するローカル変数領域と、オペランドを含み処理途中の計算結果を一時的に格納するスタック領域とを含み、スタック領域に格納されたオペランドは、そのデータ型とその値の形式で表す。【選択図】図６
2006195644.tif 000002
【特許請求の範囲】
【請求項１】
中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行装置において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納したことを特徴とする仮想マシン実行装置。
【請求項２】
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする請求項１記載の仮想マシン実行装置。
【請求項３】
中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行装置において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする仮想マシン実行装置。
【請求項４】
中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行方法において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納するステップを含むことを特徴とする仮想マシン実行方法。
【請求項５】
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする請求項４記載の仮想マシン実行方法。
【請求項６】
中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行方法において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする仮想マシン実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機のハードウェアアーキテクチャに依存しない中間コードを実行し、例えばＪａｖａ仮想マシンなどの仮想マシンを実行する仮想マシン実行装置及び方法に関する。
【背景技術】
【０００２】
中間コード方式とは、人間が理解できる表面言語から機械が理解できる実行コードへ変換し実行するまでにおいて、一旦予め定められたコード体系である中間コードへ変換し、実行時は実行処理モジュールが中間コードを読み込み解釈しながら処理を実現していく方式である。これらの技術は、Ｊａｖａ技術の出現によって一般的なものとなった（ここで、ＪａｖａはＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社の登録商標である。）。中間コード実行装置を「仮想マシン」と呼び、中間コードをまた「バイトコード」と呼ぶこともある。
【０００３】
非特許文献１では、Ｊａｖａ仮想マシンの仕様について説明しており、非特許文献１の第６章ではバイトコードの命令セットを定義している。例えば算術命令に関しては、加算では（ｉａｄｄ／ｌａｄｄ／ｆａｄｄ／ｄａｄｄ）、乗算では（ｉｍｕｌ／ｌｍｕｌ／ｆｍｕｌ／ｄｍｕｌ）といった命令を用意している。このように整数と浮動小数点数に対する命令では、オーバーフロー及びゼロ除算の際における振る舞いが異なるため、従来の仮想マシンでは、それぞれに対して命令を用意する。
【０００４】
また、中間コード方式によって異なる種類の計算機に対して同一のプログラムを配信することを可能とする。ワークステーションやパソコンなど、強力な処理能力を持つＣＰＵ及び充分なメモリを搭載した計算機がある一方、組込みシステムなどのように処理能力の劣るＣＰＵ及び限られたメモリを搭載した計算機でも利用される。また、仮想マシンなどの中間コード実行装置は多くの場合、インタプリタ方式で実現されており、実行速度はネイティブコードによる実行速度と比較して遅いという問題点があった。
【０００５】
この問題点に対して、特許文献１では、「限られたリソースにおいて高速にＪａｖａのバイトコードを実行可能とするコンパイラを提供するために、バイトコードを、各バイトコードに対応する処理ルーチンのアドレスをオペコードとする中間コードに変換し、中間コードの順番に処理ルーチンを実行し、この時中間コードを固定長にし、その中でオペコードのビット位置も固定する。また処理ルーチンを、メモリ上の連続領域に配置し、オペコードには処理ルーチン群１０４の先頭アドレスからのオフセットを用いる。さらに、ＣＰＵのパイプラインの空きを利用して、中間コードのための本来の処理に並行して、次の中間コードの処理ルーチンにジャンプするための命令群の一部（オペランドの生成及びジャンプ）、及び次の次の中間コードの処理ルーチンにジャンプするための命令群の一部（中間コードのプリフェッチと処理ルーチンのアドレス計算）を実行する。」すなわち、特許文献１に開示された装置（以下、第１の従来例という。）では、中間コード列をロード時に高速実行可能な内部中間コード列に変換することで高速化しており、具体的には、ロード時の中間コード変換処理により、各命令に対して、該当する命令実行モジュールの基準アドレスからのオフセットを算出し変換する。そして実行時には取得オフセットと基準アドレスを加算し、命令実行モジュール開始アドレスを算出する。
【０００６】
また、特許文献２では、「計算機のハードウェアアーキテクチャに依存しない中間コードを実行する中間コード実行装置において、中間コードの実行を高速化しながら、中央処理装置のレジスタを高速化目的に使用することを避け、なおかつ使用記憶領域の増加を抑制するために、入力された中間コード列中の各命令を、直前命令実行モジュール終端アドレスから当該命令実行モジュール開始アドレスへの相対アドレスに置換する置換手段により内部中間コード列を用意しておき、前記相対アドレスの取得手段と、前記相対アドレスを用いる相対ジャンプ手段により内部中間コードを順次実行すること」を特徴としている。すなわち、特許文献２に開示された中間コード実行装置（以下、第２の従来例という。）においては、各モジュールの開始アドレス及び終了アドレスのテーブルを持たせ、現在モジュールから次期モジュールへ移行する場合、現在モジュールの終了アドレス及び次期モジュールの開始アドレスから、相対アドレスを算出し、相対ジャンプをすることによって、次期モジュールへ移動する。
【０００７】
さらに、特許文献３では、「共通のアルゴリズムに基づく異なったデータ型に対する計算を、同一の実行プログラムで実行することができる情報処理装置を提供するために、演算を行うデータのデータ型を指示するレジスタと、当該レジスタにデータ型を設定する手段を有し、複数のデータ型のうちの少なくとも１つに対して共通の命令手段を持ち、当該命令手段と上記レジスタの内容に対応させてそれぞれのデータ型の演算を行うことにより、共通のアルゴリズムに基づく異なったデータ型に対する計算を同一の実行プログラムで実行すること」を特徴としている。すなわち、特許文献３に開示された情報処理装置（以下、第３の従来例という。）では、高級言語によるソースプログラムを機械語プログラムに変換して出力するコンパイラ装置においてレジスタを用意することにより、コンパイラ装置自体を簡素化している。
【０００８】
【特許文献１】特開平１１−１７５３４９号公報。
【特許文献２】特開２００３−２１６４４３号公報。
【特許文献３】特開昭６０−１６９９４４号公報。
【非特許文献１】ティム・リンドホルムほか著，村上雅章訳，「Ｊａｖａ仮想マシン仕様第２版」，ピアソン・エデュケーション，２００１年５月発行。
【発明の開示】
【発明が解決しようとする課題】
【０００９】
整数と浮動小数点数とでは振る舞いが異なることから、Ｊａｖａ仮想マシンをはじめとして、従来技術に係る中間コード実行装置では、それぞれに対して命令を用意している。加算・減算・乗算・除算・剰余・符号反転など、あらゆる算術命令に対して、データ型に対応した命令セットを必要とするため、テーブルサイズが膨れ上がり、中間コード実行装置をコンパクトなものとすることが困難であった。第１の従来例に開示されている手法では、実行時に基準アドレスと取得されているオフセットを加算し、命令実行モジュール開始アドレスを算出する必要がある。従って、実行時に依然として演算処理を必要とするという問題点があった。
【００１０】
また、第２の従来例に係る中間コード実行装置においては、実行速度を高速化するための技術が開示されているが、上述のように、各モジュールの開始アドレス及び終了アドレスのテーブルを持たせ、現在モジュールから次期モジュールへ移行する場合、現在モジュールの終了アドレス及び次期モジュールの開始アドレスから、相対アドレスを算出し、相対ジャンプをすることによって、次期モジュールへ移動しているために、いまだ実行速度を大幅に向上できないという問題点があった。さらに、第３の従来例に係る情報処理装置においては、コンパイラの構成を簡素化できるが、インタプリタ型の仮想マシンの構成を簡素化できないという問題点があった。
【００１１】
本発明の目的は以上の問題点を解決し、従来技術に比較して、仮想マシンの実行時の演算処理を高速化できる仮想マシン実行装置及び方法を提供することにある。
【００１２】
また、本発明の別の目的は以上の問題点を解決し、従来技術に比較して、仮想マシンの構成を簡素化できる仮想マシン実行装置及び方法を提供することにある。
【課題を解決するための手段】
【００１３】
第１の発明に係る仮想マシン実行装置は、中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行装置において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納したことを特徴とする。
【００１４】
上記仮想マシン実行装置において、上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする。
【００１５】
第２の発明に係る仮想マシン実行装置は、中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行装置において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする。
【００１６】
第３の発明に係る仮想マシン実行方法は、中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行方法において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納するステップを含むことを特徴とする。
【００１７】
上記仮想マシン実行方法において、上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする。
【００１８】
第４の発明に係る仮想マシン実行方法は、中間コードを二次記憶装置から主記憶装置にロードして実行する仮想マシン実行方法において、
中間コードを主記憶装置にロードされた少なくとも１つのクラスを有するクラス配列と、実行時の情報を格納する少なくとも１つのランタイムを有するランタイム配列とを含む仮想マシンエンジンを備え、
上記クラスは、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバーと、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を有するフィールドメンバーとを備え、
上記ランタイムは、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域を確保することが可能であり、処理途中の計算結果を一時的に格納するスタック領域を備え、
上記スタック領域にデータ型とその値の形式で表されたオペランドが格納されることを特徴とする。
【発明の効果】
【００１９】
従って、本発明によれば、上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納するので、仮想マシンの実行時においてアドレス変換処理を行う必要がないので、従来技術に比較して仮想マシンを高速で実行できる。
【００２０】
また、本発明によれば、上記スタック領域に格納されたオペランドは、そのデータ型とその値の形式で表すので、データ型の組み合わせによる命令コードの増大をおさえ、コンパクトな仕様を有する仮想マシンを実現することができる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明に係る実施形態について図面を参照して説明する。なお、同様の構成要素については同一の符号を付している。
【００２２】
実施形態．
図１は本発明の一実施形態に係る仮想マシン実行装置１０００の構成を示すブロック図である。本実施形態に係る仮想マシン実行装置１０００は、ディジタル計算機のハードウェアアーキテクチャに依存しない中間コードを実行する仮想マシンの実行装置であって、図１に示すように、中央処理装置１１００と、二次記憶装置１２００と、主記憶装置１３００とを備え、これら装置１１００，１２００，１３００がバスを介して接続されて構成され、二次記憶装置１２００には、実行内容を記述したクラス中間コード１２０１が予め格納されている。
【００２３】
図２は図１の中央処理装置１１００によって実行される仮想マシンのインストール処理を示すフローチャートである。また、図４は図２のステップＳ１の処理後の仮想マシン実行装置１０００の構成を示すブロック図であり、図５は図２のステップＳ３の処理後の仮想マシン実行装置１０００の構成を示すブロック図である。
【００２４】
図２において、まず、ステップＳ１では、図４に示すように、クラス中間コード１２０１に含まれる仮想マシンエンジン１４００及び処理ルーチン群１４１０を、二次記憶装置１２００から主記憶装置１３００にロードする。ここで、ロードされた仮想マシン１４００では、後にロードされるクラスを登録するクラス配列を有している。クラスとは少なくとも１つのメンバー変数と少なくとも１つのメンバー関数を有しており、ある程度概念的に関連ある変数及び関数をまとめたソフトウェアである。また、処理ルーチン群１４１０は、仮想マシン１４００で提供する基本的な処理であり、各処理に番号が割り振られている。クラスにおけるメンバー関数は、具体的には実行する処理ルーチン群１４１０で割り当てたれている番号とそれに対するパラメータを、実行順に並べた配列である。図４の例では、処理ルーチン群１４１０は、オペコードａ実行モジュール１４１０ａと、オペコードｂ実行モジュール１４１０ｂと、オペコードｃ実行モジュール１４１０ｃなどを含む。
【００２５】
次いで、ステップＳ２において、図５に示すように、二次記憶装置１２００から、クラス中間コード１２０１に含まれ、仮想マシンの実行時に使用されるクラスファイル群を主記憶装置１３００にロードする。二次記憶装置１２００には少なくとも１つのクラスが保存されている。クラスはすべてロードするのではなく、必要なクラスのみをロードする。ユーザ又は仮想マシンを使用する他のシステムは、最初どのクラスのどのメンバー関数を起動関数とするかを指定する。これによって、二次記憶装置１２００からロードするべきクラスが決定されてロードされる。クラスは、他のクラスの機能を利用することもあり、その情報もロードするファイル内に記述されている。この情報に基づいて、さらに必要なクラスがロードされる。
【００２６】
そして、ステップＳ３では、主記憶装置１３００にロードしたクラスファイル群で、お互いに名前で参照している箇所を、実際の主記憶装置１３００上のメモリアドレスに置き換えることによりリンク処理を行って、当該仮想マシンによる実行準備処理を終了する。当該ステップＳ３では、すべての必要なクラスのロードが完了した時点でリンク作業が実行される。二次記憶装置１２００で保存されている状態では、クラス内における他クラス参照情報は、クラス名や関数名という文字列情報で記述されている。二次記憶装置１２００から主記憶装置１４００へロードが完了すると、主記憶装置１４００におけるクラスのアドレスが明らかとなるので、他クラス参照情報に基づいて、主記憶装置１４００におけるアドレスへ置き換える処理を実行する。
【００２７】
すなわち、主記憶装置１３００では、図４及び図５に示すように、仮想マシンの実行時にすべての情報を管理する仮想マシンエンジン１４００が存在し、仮想マシンエンジン１４００はクラス配列及びランタイム配列を有する。仮想マシンエンジン１４００は、中間コードのバイナリデータであるクラス中間コード１２０１を、実行に必要なコードだけ二次記憶装置１２００から主記憶装置１３００へロードし、少なくとも１つのクラス１５００を生成して配列として管理する。また、ランタイム配列は実際に所定の起動メソッドから処理を実行する段階で、必要な情報を格納するために生成される。ここで、クラス１５００とは、ある概念に基づいたデータ及び関数を１つのグループにまとめたプログラムモジュールのことであり、クラス１５００は、図５に示すように、オペコードを含む処理手順情報を記述した少なくとも１つのメソッドを有するメソッドメンバー１５１０と、数値データ又は文字列データもしくは他のクラスへの少なくとも１つの参照情報を含む少なくとも１つのフィールドデータ（少なくとも１つのオペランドを含む）を有するフィールドメンバー１５２０と、後述するようにオペコードのアドレスを含むデータ領域とを含む。クラス配列とは、このようなクラスを１個以上有する配列である。仮想マシン実行装置１０００によって、なんらかの処理を実行するときは必ず１個以上のクラスが仮想マシンエンジン１４００にロードされる。クラスの関数内で他のクラスが利用されている場合は、さらに利用しているクラスがロードされる。
【００２８】
上述のように、起動時の処理では、初期化した後、二次記憶装置１２００よりクラスファイル群をロードし、リンク処理を実行しており、クラスファイルをロードする前段階の仮想マシン起動直後の主記憶装置１３００の状態が図４に図示されている。この時点では、データ管理用の配列を有する仮想マシンエンジン１４００や、プリミティブ機能の処理ルーチン及びプリミティブなデータ型とその値を含むオペランド１４２０のみが存在している。これに対して、二次記憶装置１２００よりクラスファイル群をロードし、リンク処理を実行した後の主記憶装置１３００の状態を図５に図示している。このとき、ファイルではオペコード（整数）で示されていたメソッドの処理手順は、オペコードに対応する処理関数へのポインタへ置き換えられている。すなわち、メソッドにアドレス管理用配列（クラス内のデータ領域にあるオペコードのアドレス）を用意し、配列に格納されている関数ポインタを順々に実行して行くことで処理が実現できる。また、実際にはクラスファイルが複数存在し、自己のメソッドや自己以外のメソッドを呼び出す。このようなメソッド呼び出し機能については、メソッドが管理している関数配列へのポインタを呼び出し側が知っていることで、直接に呼び出すことが可能となる。以上のような、実メモリ（主記憶装置１３００）上におけるアドレスを検索し、利用側にその情報を記録することをリンク処理と呼ぶ。これらは起動直後に行い、実際の処理が始まった段階ではアドレスへダイレクトにジャンプするのみとなっており、従って、本実施形態は、従来技術における相対アドレスの計算などの余分なアドレス計算が発生しないことを特徴としている。
【００２９】
また、図５に示すように、各メソッドメンバー１５１０の各メソッドに対応するメソッド１５３０は、複数のオペコードを含み、そのアドレスがメソッド内に記載されており、処理ルーチン群１４１０の各オペコード実行モジュールとリンクされている。図９は本実施形態に係る仮想マシンエンジン１４００中のクラスの構成を示すブロック図である。図９において、クラスＡ１５００Ａにおいて、クラスＢのオペコードＱを引用している場合、クラスＡ１５００Ａにおけるデータ領域においてオペコードＱのアドレスを格納することによりリンクされている。さらに、図５に示すように、フィールドメンバー１５２０の各オペランド１４２０はデータ型とその値との形式を有する。
【００３０】
図３は図１の中央処理装置１１００によって実行される仮想マシンの実行処理を示すフローチャートである。また、図６は図３の仮想マシンの実行処理時の仮想マシン実行装置１０００の構成を示すブロック図である。
【００３１】
図３において、まず、ステップＳ１１において、仮想マシンエンジン１４００のクラス配列から所定の起動メンバー関数アドレスを取得し、ステップＳ１２でそれに対応するランタイムを生成する。次いで、ステップＳ１３において、当該ランタイム１６００においてメソッドフレーム１６１０を生成し、実行するメンバー関数のアドレスを登録し、ステップＳ１４においてメソッドフレーム１６１０のプログラムカウンタ値を０に初期化する。さらに、ステップＳ２２において、現在のメソッドフレーム１６１０のプログラムカウンタ値に登録されている初期化ルーチンを取得する。ステップＳ２３では、当該処理ルーチン１４１０が関数呼び出しであるか否かが判断され、ＹＥＳのときはステップＳ１３に戻る一方、ＮＯのときはステップＳ１５に進む。ステップＳ１５において、現在のメソッドフレームの１６１０のプログラムカウンタ値に登録されている処理ルーチン１４１０はジャンプ命令であるか否かが判断され、ＹＥＳのときはステップＳ１６に進む一方、ＮＯのときはステップＳ１７に進む。ステップＳ１６では、ジャンプ命令に従ってプログラムカウンタ値を増減した後、ステップＳ１９に進む。一方、ステップＳ１７では、当該処理ルーチン１４１０を実行し、ステップＳ１８においてプログラムカウンタ値を１だけインクリメントし、ステップＳ１９に進む。ステップＳ１９では、当該メンバー関数の終了であるか否かが判断され、ＹＥＳのときはステップＳ２０に進む一方、ＮＯのときはステップＳ２２に戻る。ステップＳ２０では、当該メソッドフレーム１６１０を開放し、呼び出し元のメソッドフレームに戻り、ステップＳ２１では、プログラムの終了であるか否かが判断され、ＮＯであるときはステップＳ２２に戻る一方、ＹＥＳのときは当該仮想マシンの実行処理を終了する。
【００３２】
図６には、仮想マシンがクラスメソッドを実行するときの主記憶装置１３００の状態を図示している。図６を参照して、図３の実行処理について以下に詳述する。
【００３３】
仮想マシンの実行時処理では、上述のように、ランタイム１６００及びメソッドフレーム１６１０を生成し主記憶装置１４００へロードしたクラス情報から、処理ルーチン群１４１０を実行していく。まず、最初に実行する起動クラスの起動メンバー関数のアドレスを取得し、ランタイム１６００を生成する。ランタイム１６００は、１つの処理の流れに対して１つ生成される。すなわち、マルチタスクで実行したい場合は、複数のランタイム１６００が生成される。ここでは、シングルタスクのケースで説明する。次に、メソッドフレーム１６１０を生成し、先に取得してある起動クラスの起動メンバー関数を登録する。メソッドフレーム１６１０とは、１つのメンバー関数の実行時に１つ用意される。メソッドフレーム１６１０は、プログラムカウンタ、ローカル変数配列、スタック領域を所有する。メンバー関数は処理ルーチン群１６１０で割り振られている番号を実行順に格納した配列であることを上述したが、プログラムカウンタは本配列において、どこまで実行したかを示すものである。ローカル変数配列は、メンバー関数内でのみ使用される変数の配列である。また、スタック領域とは処理ルーチン群を順々に実行していく段階で生じる途中の計算結果などを格納する領域である。さらに、メソッドフレーム１６１０を生成し、起動メンバー関数が登録されたら、プログラムカウンタを初期化する。関数に登録されている処理ルーチン１４１０を順に実行する。関数終了まで到達すると、本メソッドフレームの実行を完了したこととなる。ただし、処理ルーチン１４１０の中には関数コールの機能があり、これを実行すると、該当するクラスのメンバー関数取得が行われ、新たなメソッドフレーム１６１０を生成しメンバー関数のアドレスを登録した後、実行は生成したメソッドフレームへ移行する。関数呼び出しによって生成されたメソッドフレームは、同様に処理ルーチンを実行しながらプログラムカウンタを進め、関数終了と同時に、メソッドフレームを開放し、呼び出しもとのメソッドフレームへ戻ってくる。以上のようにして、関数実行がすべて終了し、残っているメソッドフレームもない状態になるとプログラム実行を完了する。
【００３４】
仮想マシンの実行時におけるランタイム配列とは、上述のように、実際にクラスのメソッドを実行する段階で生成され、ランタイム１６００で格納する情報は起動メソッドへのアドレス及びメソッドフレームの配列である。仮想マシンエンジン１４００が複数のランタイム１６００を格納するためにランタイム配列を具備する理由は、マルチタスク処理を実現するためである。また、ランタイム１６００において生成されるメソッドフレーム１６１０とは、新たにメソッドを実行するたびに生成される。例えば起動メソッド内で別のメソッドを起動した場合、メソッドフレーム配列には２つのメソッドフレームが格納される。メソッドフレーム１６１０では、実行メソッドへのアドレス、メソッド内で何番目のオペコードを実行中であるかを示すプログラムカウンタ、実行メソッドへのアドレス及びメソッド内だけで生成され使用される少なくとも１つの変数を格納するローカル変数領域１６２０、及び少なくとも１つのオペランドを含み処理途中の計算結果を一時的に格納するスタック領域１６３０を情報として格納する。メソッドフレーム１６１０によるメソッド実行の動作原理では、まずメソッドを起動すると、プログラムカウンタ値を初期化し、ローカル変数が用意される。そして実行メソッドアドレスへアクセスし、オペコードのアドレスを実行順に格納した配列をプログラムカウンタ値に従って実行していく。ローカル変数に対する演算を実施した途中経過はスタック領域へ格納する。オペコードの処理が完了するたびにプログラムカウンタ値を１つずつ増やし、次のオペコードを実行する。また、ジャンプ命令を意味するオペコードでは、プログラムカウンタを増減させることで実現し、余計なアドレス計算を不要なものとしている。
【００３５】
本実施形態においては、各クラス１５００毎に生成されるフィールドメンバー１５２０と、各メソッドフレーム１６１０に対して生成されるローカル変数領域１６２０及びスタック領域１６３０において、データタグ及びデータ値とを格納したオペランド１４２０をプリミティブなデータ型とその値とを含む形式で構成したことを特徴としている。すなわち、特に、メソッドフレーム１６１０が有するローカル変数領域１６２０、スタック領域１６３０及び各クラスのフィールドメンバー１５２０のデータはオペランドの配列であることを特徴としている。通常、スタック領域へ記録する内容はデータ値のみを格納する。このため仮想マシンのプリミティブな命令では、整数用の加算であるｉａｄｄや浮動小数点用の加算であるｆａｄｄといった具合にデータ型を区別して命令を用意し、スタックの値を操作する。そのため、オペコードの増加を招くが、本実施形態に係る仮想マシンでは、図８に示すように、スタック領域１６３０にもデータ型を区別する当該データコードを配置し、コードを一本化することによって、命令体系の簡素化を実現した。
【００３６】
図７は本実施形態に係る仮想マシン実行装置１０００で用いるオペコードの一例を示す表である。図７に示すように、オペコードは非負の整数で表され、例えば０ｘ０００１ならば仮想マシンに対して加算処理を、０ｘ０００２ならば仮想マシンに対して減算処理を実行させる。実際の処理内容は、オペコードごとに処理ルーチン群１４１０として存在し、オペコードａに対する実行モジュール１４１０ａ、オペコードｂに対する実行モジュール１４１０ｂ、オペコードｃに対する実行モジュール１４１０ｃなどという具合に、オペコードのＩＤごとに実行モジュールが存在する。クラス中間コード１２０１を二次記憶装置に記録している段階では、クラスのメソッドはオペコードのＩＤを記録するが、メモリへロードするタイミングで、オペコードのＩＤから実行モジュールへのアドレスへ変更する。例えばメソッドの最初の実行がオペコードｃであるならば、オペコードの実行モジュール１４１０ｃのアドレスへ変換する。これによって、実行時にＩＤによる検索を無くし高速な実行を可能とする。また、直接的に主記憶装置１３００のアドレスを記述することによって、（基準アドレス＋オフセット）といったアドレス計算を不要なものとしている。
【００３７】
図８は本実施形態に係る仮想マシン実行装置１０００で用いるデータコードの一例を示す表である。図８に示すように、データコードは非負の整数で表され、例えば０ｘ０００２ならば２バイト整数を示し、０ｘ０００３ならば４バイト整数を示す。本実施形態に係る仮想マシンでは、スタック領域１６３０にもデータ型を区別する当該データコードを配置し、コードを一本化することによって、命令体系の簡素化を実現した。
【００３８】
変形例．
図１０は本発明の変形例に係る仮想マシン実行装置１０００Ａの構成を示すブロック図である。図１の実施形態に係る仮想マシン実行装置１０００では、仮想マシン実行装置１０００に設けた二次記憶装置１２００に格納されているクラス中間コードをロードし、主記憶装置１３００へ展開して実行しているが、本発明はこれに限らず、図１０の仮想マシン実行装置１０００Ａのごとく構成してもよい。すなわち、仮想マシン実行装置１０００Ａにおいて通信インターフェース回路１７１０を備え、例えばインターネットなどのネットワーク１８００を経由してリモートにあるディジタル計算機のサーバ装置１９００内の二次記憶装置からクラス中間コードを、ネットワーク１８００を介して主記憶装置１３００にダウンロードして展開した後実行してもよい。
【００３９】
以上の実施形態において、ランタイム１６００は、実行メソッドへのアドレス及びメソッド内だけで生成され使用される変数を格納するローカル変数領域１６２０を確保することが可能であるように構成され、また、ランタイム１６００は、処理途中の計算結果を一時的に格納するスタック領域１６３０を備え、スタック領域１６３０にデータ型とその値の形式で表されたオペランド１４２０が格納されるように構成してもよい。
【産業上の利用可能性】
【００４０】
以上詳述したように、本発明によれば、上記中間コードを主記憶装置にロードしたときに、上記メソッドに含まれるオペコードのアドレスを上記主記憶装置のアドレスで表しかつ上記各クラスのデータ領域に格納するので、仮想マシンの実行時においてアドレス変換処理を行う必要がないので、従来技術に比較して仮想マシンを高速で実行できる。
【００４１】
また、本発明によれば、上記スタック領域に格納されたオペランドは、そのデータ型とその値の形式で表すので、データ型の組み合わせによる命令コードの増大をおさえ、コンパクトな仕様を有する仮想マシンを実現することができる。
【図面の簡単な説明】
【００４２】
【図１】本発明の一実施形態に係る仮想マシン実行装置１０００の構成を示すブロック図である。
【図２】図１の中央処理装置１１００によって実行される仮想マシンのインストール処理を示すフローチャートである。
【図３】図１の中央処理装置１１００によって実行される仮想マシンの実行処理を示すフローチャートである。
【図４】図２のステップＳ１の処理後の仮想マシン実行装置１０００の構成を示すブロック図である。
【図５】図２のステップＳ３の処理後の仮想マシン実行装置１０００の構成を示すブロック図である。
【図６】図３の仮想マシンの実行処理時の仮想マシン実行装置１０００の構成を示すブロック図である。
【図７】本実施形態に係る仮想マシン実行装置１０００で用いるオペコードの一例を示す表である。
【図８】本実施形態に係る仮想マシン実行装置１０００で用いるデータコードの一例を示す表である。
【図９】本実施形態に係る仮想マシンエンジン１４００中のクラスの構成を示すブロック図である。
【図１０】本発明の変形例に係る仮想マシン実行装置１０００Ａの構成を示すブロック図である。
【符号の説明】
【００４３】
１０００…仮想マシン実行装置、
１１００…中央処理装置、
１２００…二次記憶装置、
１２０１…クラス中間コード、
１３００…主記憶装置、
１４００…仮想マシンエンジン、
１４１０…処理ルーチン群、
１４１０ａ…オペコードａ実行モジュール、
１４１０ｂ…オペコードｂ実行モジュール、
１４１０ｃ…オペコードｃ実行モジュール、
１４２０…オペランド、
１５００，１５００Ａ，１５００Ｂ…クラス、
１５１０…メソッドメンバー、
１５２０…フィールドメンバー、
１５３０…メソッド、
１６００…ランタイム、
１６１０…メソッドフレーム、
１６２０…ローカル変数領域、
１６３０…スタック領域、
１７００…バス、
１７１０…通信インターフェース回路、
１８００…ネットワーク、
１９００…サーバ装置。
【図１】
2006195644.tif 000003
【図２】
2006195644.tif 000004
【図３】
2006195644.tif 000005
【図４】
2006195644.tif 000006
【図５】
2006195644.tif 000007
【図６】
2006195644.tif 000008
【図７】
2006195644.tif 000009
【図８】
2006195644.tif 000010
【図９】
2006195644.tif 000011
【図１０】
2006195644.tif 000012