(57)【要約】【課題】中間コードで記述されたプログラムの初期化処理の高速化を実現可能な技術を提供する。【解決手段】  ネイティブコードを実行するネイティブ環境と中間コードを実行する仮想マシン環境とを備えプログラムを記憶する記憶手段を備える情報処理装置において、プログラムを構成する１以上のメソッドを逐次解釈するインタプリタ手段と、プログラムの起動時に実行されると解釈されたメソッドをネイティブコードに変換する変換手段と、ネイティブコードをメソッドと関連付けて記憶手段に登録する登録手段と、ネイティブコードが登録されている場合には当該ネイティブコードを読み出しネイティブ環境で実行し、登録されていない場合にはメソッドを仮想マシン環境で実行するよう制御する制御手段とを備える。【選択図】図２
2007233472.tif 000002
【特許請求の範囲】
【請求項１】
第１命令群に基づいて構成されたネイティブコードを実行するネイティブ環境と、前記第１命令群とは独立に定義された第２命令群に基づいて構成された中間コードを実行する仮想マシン環境とを備え、少なくとも前記中間コードにより構成されるプログラムを記憶する記憶手段を備える情報処理装置であって、
前記プログラムを読み込み、該プログラムを構成する１以上のメソッドを逐次解釈するインタプリタ手段と、
前記インタプリタ手段により、前記プログラムの起動時に実行されると解釈されたメソッドを、ネイティブコードに変換する変換手段と、
前記変換手段により得られた前記ネイティブコードを前記メソッドと関連付けて前記記憶手段に登録する登録手段と、
前記メソッドを実行する際、前記記憶手段に該メソッドに対応するネイティブコードが登録されているか否かを確認し、ネイティブコードが登録されている場合には該ネイティブコードを読み出しネイティブ環境で実行し、ネイティブコードが登録されていない場合には前記メソッドを仮想マシン環境で実行するよう制御する制御手段と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記プログラムを構成する１以上の各メソッドの実行回数に基づいて、前記記憶手段に登録された各メソッドに対応するネイティブコードを更新する更新手段をさらに備えることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記記憶手段に登録されたネイティブコードはアドレス解決がなされていないリロケータブルなネイティブコードであることを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記登録手段は、１以上のネイティブコードとともに、該１以上のネイティブコードの読み出し順序情報を記憶手段に登録することを特徴とする請求項１乃至請求項３の何れか１項に記載の情報処理装置。
【請求項５】
１以上のプログラムに対応するネイティブコードの前記記憶手段への登録管理を行う管理手段をさらに備え、
前記管理手段は、アプリケーションを登録管理対象からはずす場合、前記ネイティブコードを併せて削除することを特徴とする請求項１乃至請求項４の何れか１項に記載の情報処理装置。
【請求項６】
前記管理手段は、前記１以上のプログラムに共通するメソッドに対応するネイティブコードを前記記憶手段に設けられた共通領域に登録管理することを特徴とする請求項５に記載の情報処理装置。
【請求項７】
第１命令群に基づいて構成されたネイティブコードを実行するネイティブ環境と、前記第１命令群とは独立に定義された第２命令群に基づいて構成された中間コードを実行する仮想マシン環境とを備え、少なくとも前記中間コードにより構成されるプログラムを記憶する記憶手段を備える情報処理装置の制御方法であって、
前記プログラムを読み込み、該プログラムを構成する１以上のメソッドを逐次解釈するインタプリタ工程と、
前記インタプリタ工程により、前記プログラムの起動時に実行されると解釈されたメソッドを、ネイティブコードに変換する変換工程と、
前記変換工程により得られた前記ネイティブコードを前記メソッドと関連付けて前記記憶手段に登録する登録工程と、
前記メソッドを実行する際、前記記憶手段に該メソッドに対応するネイティブコードが登録されているか否かを確認し、ネイティブコードが登録されている場合には該ネイティブコードをネイティブ環境で実行し、ネイティブコードが登録されていない場合には前記メソッドを仮想マシン環境で実行するよう制御する制御工程と、
を備えることを特徴とする制御方法。
【請求項８】
第１命令群に基づいて構成されたネイティブコードを実行するネイティブ環境と、前記第１命令群とは独立に定義された第２命令群に基づいて構成された中間コードを実行する仮想マシン環境とを備え、少なくとも前記中間コードにより構成されるプログラムを記憶する記憶手段を備える情報処理装置の制御プログラムであって、
前記プログラムを読み込み、該プログラムを構成する１以上のメソッドを逐次解釈するインタプリタ工程を実行するためのプログラムコードと、
前記インタプリタ工程により、前記プログラムの起動時に実行されると解釈されたメソッドを、ネイティブコードに変換する変換工程を実行するためのプログラムコードと、
前記変換工程により得られた前記ネイティブコードを前記メソッドと関連付けて前記記憶手段に登録する登録工程を実行するためのプログラムコードと、
前記メソッドを実行する際、前記記憶手段に該メソッドに対応するネイティブコードが登録されているか否かを確認し、ネイティブコードが登録されている場合には該ネイティブコードをネイティブ環境で実行し、ネイティブコードが登録されていない場合には前記メソッドを仮想マシン環境で実行するよう制御する制御工程を実行するためのプログラムコードと、
を備えることを特徴とする制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、中間コードで記述されたプログラムを実行するための仮想マシン技術に関するものである。
【背景技術】
【０００２】
従来から、中間コードにより記述されたプログラムを実行するための仮想マシン（Ｖｉｒｔｕａｌ Ｍａｃｈｉｎｅ）技術が知られている。仮想マシン環境は逐次実行するインタプリタとして実現されることが多いが、一般的にインタプリタを用いたプログラムの実行処理速度は遅い。そこで、プログラムを構成する中間コードをネイティブコードに変換する（以下、コンパイルと呼ぶ）方法が用いられることがある。すなわち、プログラムを構成する中間コードを仮想マシンを実現しているＣＰＵで直接実行可能なデータ形式に変換するのである。
【０００３】
コンパイル方法としては、ＡＯＴ（Ａｈｅａｄ  Ｏｆ  Ｔｉｍｅ）コンパイルとＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイルがある。ＡＯＴコンパイルでは、仮想マシンがプログラムをロードする前に前もってコンパイル処理がなされ前もってされる。つまり、ロードされる時点で既にネイティブコードになっている。一方、ＪＩＴコンパイルでは、中間コードでプログラムをロードした後、実行時にネイティブコードにコンパイルする。そのため、コンパイル後の動作は速いものの、最初の実行時にはコンパイルの処理が必要なため必要な処理量が多くなる。
【０００４】
ところで、ＪＩＴコンパイルの場合、たいていは、コンパイルされたネイティブコードはメモリ中に置かれ、当該プログラムを仮想マシン上で実行する時にのみ利用される。そして、プログラムの実行が終了した時、ネイティブコードは破棄（以降、デコンパイルと呼ぶ）される。従って、再度同じプログラムを動作させるときには、新たにプログラムの同じ部分をコンパイル処理する必要がある。
【０００５】
その問題に対処するため、特許文献１には、コンパイルされたネイティブコードのプレロードクラスを生成し、次回の仮想マシンの起動時に再利用できる技術が提案されている。
【特許文献１】特開２００３−３１６５８４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、コンパイルされたネイティブコードは中間コードに比較し容量が大きい。そのため、中間コードのプログラムに対応するネイティブコードを全てメモリ中に記憶する場合、膨大なメモリが必要になる。通常は、コンパイルされたネイティブコードの一時記憶用に確保されたメモリ領域（コードキャッシュとも呼ばれる）が一杯になると、たとえば実行頻度の少ないネイティブコードから順にコードキャッシュから破棄される。そして、新たにコンパイルされたネイティブコードのための空きメモリが確保される。そのため、プレロードクラスを出力しようとした時点で既にデコンパイルされてしまったネイティブコードはプレロードクラスの中に入れることができない。そのため、特許文献１に開示される技術には以下のような課題が存在する。すなわち、プレロードクラスの中に保存されるネイティブコードは、プレロードクラスを出力しようとした時点でコードキャッシュに記憶されているネイティブコードのみということである。
【０００７】
比較的性能の低いＣＰＵを用いてプログラムの起動を高速化しようとしたとき、プログラムの起動に関する処理（以降、初期化処理と呼ぶ）を予めコンパイルしておくことが望ましい。しかし、初期化処理が大規模である場合、あるいは、コードキャッシュの容量が小さい場合は、上述したデコンパイルが発生してしまう。
【０００８】
特に、搭載メモリ容量が少ない機器では、必然的にコードキャッシュの容量も小さくなるので、ＪＩＴコンパイラを利用した際のデコンパイルは避けられないものとなる。そのため、結果的にプログラムの起動時には毎回中間コードのコンパイルが必要となり初期化処理の高速化を実現することができない。
【０００９】
本発明は上記問題点に鑑みなされたものであり、中間コードで記述されたプログラムの初期化処理の高速化を実現可能な技術を提供することに有る。
【課題を解決するための手段】
【００１０】
上記課題を解決すべく、本発明の情報処理装置は以下の構成を備える。第１命令群に基づいて構成されたネイティブコードを実行するネイティブ環境と前記第１命令群とは独立に定義された第２命令群に基づいて構成された中間コードを実行する仮想マシン環境とを備え、少なくとも前記中間コードにより構成されるプログラムを記憶する記憶手段を備える情報処理装置において、プログラムを読み込み当該プログラムを構成する１以上のメソッドを逐次解釈するインタプリタ手段と、インタプリタ手段によりプログラムの起動時に実行されると解釈されたメソッドをネイティブコードに変換する変換手段と、変換手段により得られたネイティブコードをメソッドと関連付けて記憶手段に登録する登録手段と、メソッドを実行する際記憶手段に当該メソッドに対応するネイティブコードが登録されているか否かを確認しネイティブコードが登録されている場合には当該ネイティブコードを読み出しネイティブ環境で実行し、ネイティブコードが登録されていない場合にはメソッドを仮想マシン環境で実行するよう制御する制御手段と、を備える。
【発明の効果】
【００１１】
本発明によれば、中間コードで記述されたプログラムの初期化処理の高速化を実現可能とする技術を提供することができる。
【発明を実施するための最良の形態】
【００１２】
以下に、図面を参照して、この発明の好適な実施の形態を例示的に詳しく説明する。ただし、この実施の形態に記載されている構成要素はあくまで例示であり、この発明の範囲をそれらのみに限定する趣旨のものではない。
【００１３】
（第１実施形態）
本発明に係る情報処理装置の第１実施形態として、Ｊａｖａ（登録商標）仮想マシン（ＶＭ：Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）を例に挙げて以下に説明する。Ｊａｖａ（登録商標）ＶＭは、Ｊａｖａ（登録商標）における中間コードであるＪａｖａ（登録商標）バイトコードで記述されたアプリケーションプログラムを実行する。
【００１４】
＜装置構成＞
図１は、第１実施形態に係る仮想マシンが動作している情報処理機器の内部構成を示すブロック図である。
【００１５】
情報処理機器１００は、機器全体を制御するためのＣＰＵ１０１、各種制御プログラムを格納したＲＯＭ１０２、プログラム実行中の一時記憶に用いるＲＡＭ１０３を備えている。そして、各種時間を計測するタイマ１０４、各種設定メニューなどを表示するディスプレイ１０５、音声の入力に用いるマイク１０６、音声出力に用いるスピーカ１０７を備える。また、各種操作ボタン１０８、各種設定ファイルなどを保存しておくための書き換え可能な不揮発性メモリであるＦｌａｓｈＲＯＭ１０９、ネットワークを介して機器外部と接続するインタフェースであるネットワークＩ／Ｆ１１０、各種データファイルを保存しておくためのハードディスク１１１を備える。
【００１６】
＜仮想マシン（ＶＭ）およびアプリケーションプログラムの構成と基本動作＞
図２は、第１実施形態に係る仮想マシンの内部構成を示すブロック図である。なお、仮想マシン環境は、ネイティブ環境で動作する仮想マシンプログラムを実行することにより実現される。
【００１７】
２０１はＶＭ（仮想マシン）であり、２２０はＶＭ２０１が実行するアプリケーションプログラム（以降、単にアプリケーションと呼ぶ）である。なお、アプリケーション２２０は１以上のクラス２３１から構成されている。なお、クラス２３１はＪａｖａ（登録商標）バイトコード（以降、単にバイトコードと呼ぶ）で記述されている。さらに、クラス２３１はメソッド、フィールド、定数プール及びその他の情報から構成される。なお、メソッドとはクラスを構成している実行単位の命令のことを示している。
【００１８】
アプリケーション２２０には、バイトコードがコンパイルされた結果であるネイティブコード２３２と、使用順序及びデコンパイル順序についての情報が格納された順序情報２３３も併せて格納される。ただし、ネイティブコード２３２および順序情報２３３は、後述するアプリケーションの実行により、生成されるものであり、アプリケーション未実行時には存在しない。詳細は後述する。
【００１９】
また、アプリケーション２２０の格納場所としては、ＦｌａｓｈＲＯＭ１０９やハードディスク１１１の他、ＲＯＭ１０２やＲＡＭ１０３でもよい。または、ネットワークＩ／Ｆ１１０を経由して不図示の外部機器からアプリケーション１２０を読み込むよう構成してもよい。なお、メモリ２０５は仮想マシンがＲＡＭ１０３内に確保した領域として実現されている。
【００２０】
なお、上述したようにアプリケーション２２０には、クラス２３１、ネイティブコード２３２、順序情報２３３は格納される。しかし、クラス２３１、ネイティブコード２３２、順序情報２３３は、全てまとまって一つの記憶媒体に格納されていなければならないということはない。つまり、図におけるアプリケーション１２０を示す矩形は、上記３つのデータが同じアプリケーション２２０に関連付けられていることを概念的に示しているだけである。
【００２１】
そのため、クラス２３１、ネイティブコード２３２、順序情報２３３は、実際には異なる記憶媒体に格納されていても良い。例えば、アプリケーション２２０がハードディスク１１１において、上記３つのデータが各々異なるファイルとして格納されるよう構成しても良い。あるいは、一般に変更が少ないクラス２３１はＲＯＭ１０２上に記憶され、更新されうるネイティブコード２３２および順序情報２３３は書き換え可能な媒体であるＦｌａｓｈＲＯＭ１０９に記憶されるようにしてもよい。
【００２２】
ＶＭ２０１は、アプリケーションプログラム２２０を構成するクラス２３１を外部からロードするためのクラスローダ２０２を備える。そして、クラス２３１の中の実行単位であるメソッドを逐次解釈し実行するためのインタプリタ２０３を備える。さらに、中間コードをＣＰＵのネイティブコードにコンパイルするＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイラ（以降、単にコンパイラと呼ぶ）２０４を備える。
【００２３】
また、各種データを一時記憶するためのメモリ２０５、アプリケーション２２０のネイティブコード２３２をメモリ２０５にロードし、かつ、アプリケーション２２０の順序情報２３３をメモリ２０５に読み出すためのネイティブコードローダ２１０を備える。そして、メモリ２０５に格納されたネイティブコード２３２を外部に保存するためのネイティブコードセーバ２１１を備える。さらに、メモリ２０５の所定の場所に格納されたネイティブコード２３２を破棄するためのデコンパイラ２１２及びその他の制御部（以降ではＶＭ２０１で総称する）を備える。
【００２４】
メモリ２０５には、クラスローダ２０２がロードしたクラス２０６が一時記憶される。また、コンパイラ２０４がコンパイルしたメソッドであるネイティブコード２０７が一時記憶される。さらに、ネイティブコードローダ２１０がロードしたネイティブコード２１５および順序情報２１６が一時記憶される。そして、デコンパイラ２１２が破棄したネイティブコード２１７が一時記憶される。
【００２５】
図２においては、ネイティブコード２０７およびネイティブコード２１５は別々に表記してあるが、区別せずにメモリ２０５内の一つの領域で実現してもよい。なお、以下では、ネイティブコード２０７およびネイティブコード２１５が一時記憶される領域をコードキャッシュ２１８と呼ぶ。前述したように、コードキャッシュ２１８に置かれたネイティブコードはＣＰＵ１０１によって直接、実行可能なコードである。
【００２６】
デコンパイラ２１２はコードキャッシュ２１８中のネイティブコードを後述する条件のもとでコードキャッシュ２１８から破棄し、破棄したネイティブコードをデコンパイルしたネイティブコード２１７として記憶する。ただし、ネイティブコード２１７はＣＰＵにより直接実行されることは無い領域に記憶される。
【００２７】
＜アプリケーションプログラム実行時の仮想マシンの動作（ネイティブコード生成・登録）＞
図３は、第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである。特に、ここでは、アプリケーションを最初に実行する際の動作について説明する。前述したように、アプリケーション１２０を最初に動作させるときは、クラス２３１のみ存在している。ここでは、主に、２回目以降の実行時に利用されるネイティブコード２３２および順序情報２３３の生成手順・登録手順を主に説明する。
【００２８】
ステップＳ３０１では、ユーザによる操作ボタン１０８によるアプリケーション２２０の実行指示などに基づき、ＣＰＵ１０１はＶＭ２０１環境を動作開始する。例えば、ＣＰＵ１０１がＶＭ２０１環境を実現するためのＶＭプログラムを実行することにより実現される。
【００２９】
ステップＳ３０２では、ＶＭ２０１は、ユーザにより指定されたアプリケーション２２０を開始する。このとき、クラスローダ２０２がクラス２３１をメモリ２０５にロードする。
【００３０】
ステップＳ３０３では、ＶＭ２０１は、このアプリケーション２２０のネイティブコード２３２がロード可能か否か判断する。ここては、アプリケーション２２０のネイティブコード２３２は存在しないため、ステップＳ３０４に進む。なお、存在する場合の動作については後述する。
【００３１】
ステップＳ３０４では、ステップＳ３０２でロードしたクラス２０６のバイトコードをインタプリタ２０３が解釈、実行する。あるいは、コンパイラ２０４がコンパイルしたネイティブコード（メソッド２０７）をＣＰＵ１０１が直接実行する。なお、インタプリタ２０３はクラス２０６を構成する１以上のメソッドの実行頻度（実行回数）の情報（不図示）をメモリ２０５の中に蓄積している。
【００３２】
ステップＳ３０５では、ＶＭ２０１はアプリケーション２２０の初期化が完了したか否かを判断する。初期化が完了していなければステップＳ３０６に進み、完了したならばステップＳ３１６に進む。なお、アプリケーション２２０の初期化完了の判断は、初期化終了をＶＭ２０１に通知するようなメソッド呼び出しを行ったか、あるいは、アプリケーション２２０の最初の表示画面を表示し終えたかというようなことから行うことができる。
【００３３】
ステップＳ３０６では、ステップＳ３０２でロードしたクラス２０６内のメソッドのコンパイルを必要としているかどうかを調べる。前述の実行頻度情報に基づいて、実行頻度が高いと判断されると、そのメソッドはコンパイルが必要と判断される。なお、コンパイルが必要と判断されるのは実行頻度が高い場合に限らない。例えば、初期化が終了するまでに実行されるメソッドを全てコンパイルしてもよい。その際、１回目のアプリケーション２２０の初期化にはコンパイル処理を要するため、より多くの時間を必要とする。しかし、２回目以降のアプリケーション２２０の初期化には一切コンパイル処理が走らず、ネイティブコードがＣＰＵ１０１により直接実行されるため、より短い時間に収まる。コンパイルが必要であると判断された場合はステップＳ３０７に進み、必要でないと判断された場合は、ステップＳ３０４に戻る。
【００３４】
ステップＳ３０７では、ＶＭ２０１はコードキャッシュ２１８に空きがあるかどうかを調べる。すなわち、コードキャッシュ２１８の空き容量が、新たなメソッドをコンパイルして生成したネイティブコード２０７を格納するのに十分なものかどうかを判定する。コードキャッシュ２１８に空きがある場合ステップＳ３１３に進み、空きがない場合ステップＳ３０８に進む。
【００３５】
ステップＳ３０８では、ＶＭ２０１はデコンパイルするネイティブコード（メソッド２０７）を決定する。なお、ＶＭ２０１は、コンパイルした後もメソッドの実行頻度情報を蓄積し続けており、実行頻度が低いメソッドがデコンパイル対象となる。
【００３６】
ステップＳ３０９では、ＶＭ２０１は、現在のデコンパイル順序をデコンパイル順序５５３に記憶する。デコンパイル順序については図５を用いて後述するが、当該メソッドが何番目にデコンパイルされたかという順序を示し、ＶＭ２０１開始時（Ｓ３０１）に０に初期化される。
【００３７】
ステップＳ３１０では、ＶＭ２０１は、デコンパイル順序の数字をインクリメントする。
【００３８】
ステップＳ３１１では、デコンパイラ２１２は、デコンパイル対象メソッドのネイティブコードをコードキャッシュ２１８外の領域１１７にコピーする。なお、ここではデコンパイルされたネイティブコードをメモリ２０５の内部として説明するが、もちろん他の場所に格納しても良い。例えばハードディスク１１１上に格納しても良い。
【００３９】
ステップＳ３１２では、デコンパイラ２１２はデコンパイル対象メソッドをコードキャッシュ２１８から破棄する。その後、ステップＳ３０７に戻って、コードキャッシュ２１８に十分空きができるまで、上述のステップ（Ｓ３０７〜Ｓ３１２）を繰り返す。
【００４０】
なお、上述のステップ（Ｓ３０７〜Ｓ３１２）ではデコンパイル順序が重複してメソッドに付加されることはないが、重複させるよう構成しても良い。そのためには、ステップＳ３１０のインクリメント処理を行わなければ良い。このように構成することにより、同じデコンパイル順序が付加されたメソッドを後でまとめてデコンパイルするのが容易になる。
【００４１】
ステップＳ３１３では、コンパイラ２０４はコンパイルが必要になったメソッドのバイトコードをコンパイルしてネイティブコードを生成し、コードキャッシュ２１８に記憶する。なお、後でリロケータブルなネイティブコード２３２を生成するためにシンボル情報が必要であれば、ここでシンボル情報とネイティブコードからの参照情報を生成・記憶しておき、メモリ２０５の図示しない部分あるいは他の記憶媒体に格納しておくとよい。
【００４２】
ステップＳ３１４では、ＶＭ２０１は、現在の使用順序を使用順序５５２に記憶する。使用順序については図５を用いて後述するが、当該メソッドのネイティブコードが何番目に使用（実行）されたかという順序を示し、ＶＭ２０１開始時（Ｓ３０１）に０に初期化される。
【００４３】
ステップＳ３１５では、ＶＭ２０１は、現在の使用順序の数字をインクリメントする。その後、ステップＳ３０４に戻る。
【００４４】
ステップＳ３１６では、ネイティブコードセーバ２１１は、使用順序５５２およびデコンパイル順序５５３などに基づいて生成される順序情報２１６を順序情報２３３として登録する。詳しく述べると、まずネイティブコードセーバ２１１はメモリ２０５に蓄えられた各メソッドについてのメソッド情報５５１を走査し、使用順序５５２の若い方からソートし、メモリ２０５内に新たに順序情報２１６を作成する。
【００４５】
ステップＳ３１７では、ネイティブコードセーバ２１１はコードキャッシュ２１８からネイティブコードを読み出し、ネイティブコード２３２として登録する。シンボル情報をメモリ２０５から読み出し、リロケータブルなコードとして合わせて保存するようにしても良い。
【００４６】
ステップＳ３１８では、デコンパイルされたネイティブコード２１７をネイティブコード２３２の中に追加保存する。
【００４７】
なお、上述の手順では初期化終了と判断された時点で、順序情報２１６およびネイティブコードの登録を行った。しかし、登録処理のタイミングは必要に応じて任意に決定してよい。例えば、ある特定の処理までの時間がかかるので、それまでの処理をネイティブコードを実行することで高速化を図りたい場合には、そのタイミングに達したときに保存を行うようにしてもよい。
【００４８】
＜データ構造＞
図４は、ネイティブコードおよび順序情報の関係および内部構造（構造体）を説明する図である。なお、ネイティブコードおよび順序情報に関するデータフォーマットはＶＭ２０１の外部及び内部において共通である。但し、ポインタデータ等の値については変化する。
【００４９】
順序情報４０１は、その順序情報４０１が含むメソッドの数を示すメソッド個数４０２を含む。さらに、メソッド毎に、使用順序４０３、デコンパイル順序４０４、メソッド名ポインタ４０５、コードポインタ４０６、コード長４０７を含む。これらメソッド毎に存在するデータはメソッド個数４０２が示す個数分、存在する。さらに、メソッドの名前を示すテキストデータであるメソッド名４１３がメソッド個数４０２が示す個数分、連続する。なお、メソッド名４１３は可変長データである。データの終端はヌル文字で表される。
【００５０】
メソッド０のメソッド名ポインタ４０５には、メソッド名０  ４１３の先頭を指すポインタが格納される。この値は、順序情報４０１の格納場所によって変わる。例えば、順序情報４０１がハードディスク１１１のファイルとして存在する場合、メソッド名ポインタ４０５にはメソッド名０  ４１３先頭のファイル先頭からのオフセットが格納される。順序情報４０１がメモリ２０５の中に存在する場合、メソッド名ポインタ４０５にはメソッド名０  ４１３先頭のアドレスが格納される。ネイティブコードローダ２１０が順序情報２３３を読み出して順序情報２１６としてメモリ２０５に格納する際、上述したようにメソッド名ポインタ４０５が書き換えられる。
【００５１】
ネイティブコード４５１は、各メソッドに対応するネイティブコードである。ところで、ここに格納されるネイティブコードはリロケータブルである場合と、リロケータブルでない場合がある。なお、リロケータブルであるとはメモリ上の位置について再配置可能であることを意味する。
【００５２】
コンパイラ２０４がバイトコードをネイティブコードに変換するとき、あるいは、ネイティブコードローダ２１０がネイティブコード２３２をロードするとき、ネイティブコード４５１はコードキャッシュ２１８中に置かれる。ただし、ネイティブコード４５１は、ＣＰＵ１０１による直接実行を可能とするためアドレス解決がなされた非リロケータブルなコードである。一方、ネイティブコードセーバ２１１が登録するネイティブコード２３２は、コードキャッシュ２１８のどのアドレスにも配置可能とするために、リロケータブルなコードとなっている。
【００５３】
順序情報４０１とネイティブコード４５１が共にハードディスク１１１上のファイルとして置かれる場合は、メソッド０のコードポインタ４０６には、ネイティブコード４５１中のメソッドコード０  ４５２先頭のファイル先頭からのオフセットが格納される。また、メソッド０のコード長４０７には、メソッドコード０のバイトレングスが格納される。他のメソッドについても同様である。
【００５４】
一方、順序情報４０１とネイティブコード４５１が共にメモリ２０５中に置かれる場合は、メソッド０のコードポインタ４０６には、ネイティブコード４５１中のメソッドコード０  ４５２先頭アドレスが格納される。また、メソッド０のコード長４０７には、メソッドコード０のバイトレングスが格納される。
【００５５】
ところで、ネイティブコード４５１がハードディスク１１１上のファイルとして置かれるか、メモリ２０５中に置かれるかで、メソッドコード４５２の長さが変わる場合がある。例えば、リロケータブルなネイティブコードの場合シンボル情報を含むため、非リロケータブルな場合に比べより長くなる。その場合は、ネイティブコード４５１がメモリ２０５に読み出されたときに、メソッドコード４５２自身の変更に基づき、コード長４０７に格納する値の更新がなされる。つまり、アドレス解決が済むとシンボル情報は不要になるので取り除かれ、コード長は短くなるからである。
【００５６】
メモリ２０５に格納された順序情報４０１は図４ではメソッド０、１、．．．と並んでいるが、この並びは事前に使用順序４０３の昇順にソートされているものとする。また、メソッド毎に用意された使用順序４０３からコード長４０７までのデータは固定長サイズである。このようにすることによって、使用順序４０３の若い順にメソッドを選択する操作を高速に行うことができる。
【００５７】
図５は、デコンパイル順序情報、デコンパイルメソッド情報及びメソッド情報のデータ内部構造（構造体）を説明する図である。いずれもメモリ２０５に一時記憶されるデータの構造を示す。
【００５８】
デコンパイル順序情報５０１は、デコンパイル順序の昇順に並べられたデータであり、その各々のデータはデコンパイル順序５０２とデコンパイルメソッドポインタ５０３から構成される。デコンパイル順序５０２には、デコンパイル順序４０４の値が格納される。ネイティブコードローダ２１０が順序情報２３３を読み出したとき、順序情報４０１がメモリ１０５に格納されると共に、順序情報４０１が有する全メソッドを走査し、デコンパイル順序４０４を調べ、デコンパイル順序４０４の若い方から並べていく。なお、デコンパイル順序４０４は重複することがあり得る、すなわち、同じデコンパイル順序４０４を持ったメソッドが複数存在し得る。デコンパイルメソッドポインタ５０３には、デコンパイル順序５０２に格納された値をデコンパイル順序として持つメソッドについて情報を格納した、デコンパイルメソッド情報５３１の先頭アドレスが格納される。
【００５９】
デコンパイルメソッド情報５３１のメソッド個数５３２には、同じデコンパイル順序を持つメソッドの個数が格納される。その後ろには、メソッド個数分のメソッドポインタ５３３が続く。メソッドポインタ５３３には、対応するメソッドについてのメソッド情報５５１の先頭アドレスが格納される。
【００６０】
メソッド情報５５１は各メソッドについての情報を格納したもので、多くのデータは順序情報４０１から持ってこられる。メソッド情報５５１は、実際にメソッドを実行した時点での使用順序を格納する使用順序５５２、実際にメソッドを実行した時点でのデコンパイル順序を格納するデコンパイル順序５５３が格納される。また、そのメソッドについてのメソッド名ポインタ４０５を格納したメソッド名ポインタ５５４が格納される。また、そのメソッドについてのコードポインタ４０６を格納したコードポインタ５５５が格納される。さらに、そのメソッドについてのコード長４０７を格納したコード長５５６が格納される。そして、デコンパイルされたネイティブコード２１７中のネイティブコードへのポインタを格納するデコンパイルドコードポインタ５５７が格納される。さらに、そのメソッドについての使用順序４０３を格納したロードされた使用順序５５８、及びそのメソッドについてのデコンパイル順序４０４を格納したロードされたデコンパイル順序５５９が格納される。
【００６１】
図５においては、各メソッドについての情報にどんなものがあるか分かりやすく示すために、あえて順序情報４０１と重複するデータをメソッド情報５５１中にも置いている。しかし、重複させなければならないということはない。もちろん、同じメソッドについての情報であるということで、両者をリンクさせ、重複したデータはどちらか一方にだけ持つようにしても良い。
【００６２】
＜アプリケーションプログラム実行時の仮想マシンの動作（ネイティブコード読出による実行）＞
図６は、第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである。２回目以降のアプリケーション実行においては、クラス２３１の他、ネイティブコード２３２及び順序情報２３３が保存・登録されている。ここでは、主に、ネイティブコード２３２および順序情報２３３を用いたアプリケーションの実行を主に説明する。なお、ここでは、前述したステップＳ３０３において、ネイティブコード２３２がロード可能と判断された後の手順について説明を行う。
【００６３】
ステップＳ６０１では、ネイティブコードローダ２１０は順序情報２３３を読み出し、メモリ２０５中に順序情報２１６として記憶する。図４に示した通り、順序情報４０１は、予め使用順序の昇順にソートされているが、デコンパイル順序の昇順にはソートされていない。通常、使用順序とデコンパイル順序の間に関連性はないので、使用順序をキーにソートすればデコンパイル順序の順に並ぶことは無い。ただし、この場合、デコンパイル順序の若い順からメソッドを走査が実行しにくい。そこでネイティブコードローダ２１０は読み出した順序情報４０１を解析してデコンパイル順序の昇順にソートされたデコンパイル順序情報６０１のデータとデコンパイルメソッド情報６３１のデータを生成する。また、各メソッドについての情報であるメソッド情報６５１のデータも生成する。その際、使用順序４０３の値はロードされた使用順序５５８に格納される。デコンパイル順序４０４はロードされたデコンパイル順序５５９に格納される。
【００６４】
なお、使用順序にしてもデコンパイル順序にしてもソート処理は後に行うメソッド探索処理を高速化するためであり、必須の処理ではない。そのため、ソート処理自体の時間がかかるのを避けたい、あるいは、消費メモリを少なくしたいということであればソート処理はしなくともよい。
【００６５】
ステップＳ６０２では、ネイティブコードローダ２１０は、使用順序４０３の若い方からコードキャッシュ２１８がフルになるまでネイティブコード２３２をロードする。コードポインタ４０６に、目指すメソッドのネイティブコード２３２におけるオフセットが格納されており、コード長４０７に、目指すメソッドのネイティブコード２３２における長さが格納されている。そのため、ネイティブコード２３２中の個々のメソッドデータにアクセスできる。なお、ロードの際には、ネイティブコードローダ２１０はアドレス解決処理を行い、ＣＰＵ１０１が直接実行可能な形式に変換する。また、コードポインタ４０６とコード長４０７をコードキャッシュ２１８におけるメソッドコード４５２に適合するように更新する。
【００６６】
ステップＳ６０３では、ＶＭ２０１はアプリケーション２２０のコードを実行する。
【００６７】
ステップＳ６０４では、ＶＭ２０１はアプリケーション１２０の初期化が完了したか否かを調べる。初期化が完了した場合については、図８を用いて後述する。初期化が完了していない場合はステップＳ６０５に進む。
【００６８】
ステップＳ６０５では、ＶＭ２０１は、次のコード実行がメソッド呼び出しであり、かつ、そのメソッドのネイティブコードを実行すべきかどうかを判断する。Ｙｅｓの場合はステップＳ６０６に進み、Ｎｏの場合はステップＳ６０３に戻る。
【００６９】
ステップＳ６０６では、ＶＭ２０１は、メソッドのネイティブコードがコードキャッシュ２１８の中に存在するかどうかを調べる。コードキャッシュ２１８の中に存在する場合はステップＳ６０７に進み、無い場合はステップＳ６１１に進む。
【００７０】
ステップＳ６０７では、メソッドが既に一度実行されたことのあるネイティブコードかどうかを調べる。実行されたことがある場合はステップＳ６０３に戻り、実行されたことのないメソッドの場合にはステップＳ６０８に進む。
【００７１】
ステップＳ６０８では、ＶＭ２０１は現在の使用順序の番号を使用順序５５２に記憶する。
【００７２】
ステップＳ６０９では、ＶＭ２０１は現在の使用順序の番号をインクリメントする。
【００７３】
ステップＳ６１０では、使用順序ずれ評価ポイント７０２を更新する。使用順序ずれ評価ポイント７０２は、ステップＳ６０８で記憶された使用順序５５２とロードされた使用順序５５８のずれ状態を示すデータである。具体的には、ずれ状態を各メソッド毎に評価、点数化したものをＶＭ２０１全体で加算したものである。例えば、単純に使用順序５５２とロードされた使用順序５５８の差の絶対値をそのメソッドのポイントとしてもよい。そして、そのポイントを現在の使用順序ずれ評価ポイントに加算することで更新処理とする。
【００７４】
図７は、メモリ２０５上に置かれる図２に示したデータ以外のデータの例を示している。これらのデータはＶＭ２０１に対し各々存在し、例えば、新たにコンパイルしたメソッドの数７０１、使用順序ずれ評価ポイント７０２、及びデコンパイル順序ずれ評価ポイント７０３がある。
【００７５】
ステップＳ６１１では、ＶＭ２０１はメソッドのネイティブコードは登録先であるネイティブコード２３２の中に存在するかどうかを調べる。これは順序情報４０１を調べることによって判断される。必要とするメソッドが順序情報４０１の中にあれば、そのネイティブコードはネイティブコード２３２の中に存在する。存在する場合はステップＳ６１２に進み、存在しない場合はステップＳ６１６に進む。
【００７６】
ステップＳ６１２では、ＶＭ２０１はコードキャッシュ２１８に十分な空き領域があるか否かを判断する。空きがある場合はステップＳ６１３に進み、無い場合はステップＳ６２０に進む。
【００７７】
ステップＳ６１３では、ＶＭ２０１は使用順序が若い他のネイティブコードもロードすべきかどうかを判定する。なお、判定の基準となる情報は、ＶＭ２０１起動時あるいは他の方法による指定によって予め設定されている。例えば、起動するアプリケーション２２０が毎回同じで、かつ、アプリケーション２２０のコマンドオプションやコンフィギュレーションも同じである場合、ＶＭ２０１が実行するメソッドの順番も変わらないということはしばしば起こり得る。そのような場合、メソッドの使用順序は同じであるから、メソッドのネイティブコードを一つづつロードするよりも、まとめてロードした方が保存先にアクセスする回数、時間が減って高速化される。特に、ＦｌａｓｈＲＯＭ１０９、ネットワークＩ／Ｆ１１０、及びハードディスク１１１等へのＩ／Ｏアクセスは非常に時間がかかる処理なので、できるだけ回数を減らした方がよい。そのために、使用順序が若い他のネイティブコードもロードすべきと設定しておくのは有用である。他のコードもロードすべきと判断した場合はステップＳ６１５に進み、ロードしないと判断した場合はステップＳ６１４に進む。
【００７８】
ステップＳ６１４では、ＶＭ２０１はステップＳ６０５で指定されたメソッドに対応するネイティブコードをロードする。その後、ステップＳ６０８に戻る。
【００７９】
ステップＳ６１５では、順序情報４０１の中でまだロードしていないメソッドを使用順序４０３の若い方から順にコードキャッシュ２１８にロードする。もちろん、使用順序４０３の若い方から探索されるネイティブコードのロードは、コードキャッシュ２１８の容量に制限される。その後、ステップＳ６０８に戻る。
【００８０】
ステップＳ６２０では、ＶＭ２０１は順序情報３０１の中にデコンパイル順序４０４があるかどうかを判断する。デコンパイル順序４０４がある場合はステップＳ６２１に進み、ない場合はステップＳ６２９に進む。なお、図３に示した手順ではデコンパイル順序を保存するよう構成したが、保存しなければならないということはない。その場合、ステップＳ６２０があることで、例えデコンパイル順序が保存されなくても動作することができる。
【００８１】
ステップＳ６２１では、ＶＭ２０１はデコンパイル順序４０４の若い方からコードキャッシュ２１８中のネイティブコードを選択する。この若い方から選択する処理に、上述のデコンパイル順序情報６０１、デコンパイルメソッド情報６３１、及びメソッド情報６５１が用いられる。なお、同じ値のデコンパイル順を持つ複数のメソッドが存在する場合は複数のネイティブコードが選択される。
【００８２】
ステップＳ６２２では、ＶＭ２０１は選択したネイティブコードの実行頻度は予め指定された頻度より低いかどうかを判断する。低い場合はステップＳ８２３に進み、高い場合はステップＳ８３０に進む。なお、ステップＳ６２１で複数のネイティブコードが選択されている場合は各々に対し判断される。
【００８３】
ステップＳ６２３では、ＶＭ２０１は、現在のデコンパイル順序の番号をデコンパイル順序５５３に記憶する。
【００８４】
ステップＳ６２４では、ＶＭ２０１は現在のデコンパイル順序の番号をインクリメントする。
【００８５】
ステップＳ６２５では、デコンパイラ２１２は、デコンパイル対象メソッドのネイティブコードをコードキャッシュ２１８外の領域１１７にコピーする。
【００８６】
ステップＳ６２６では、デコンパイラ２１２はデコンパイル対象メソッドをコードキャッシュ２１８から破棄する。
【００８７】
ステップＳ６２７では、ＶＭ２０１はデコンパイル順序ずれ評価ポイント７０３を更新する。デコンパイル順序ずれ評価ポイント７０３は上述した使用順序ずれ評価ポイントと同様に評価され、ポイントが更新される。
【００８８】
ステップＳ６２８では、ＶＭ２０１はコードキャッシュ２１８に十分な空きがあるか否かを確認する。十分な空きがある場合にはステップＳ６１３に戻り、無い場合にはステップＳ６２０に戻る。
【００８９】
ステップＳ６２９では、ＶＭ２０１はデコンパイル順序４０４の実行頻度情報を参照してデコンパイル対象メソッドを決定する。以降はそのネイティブコードに対し前述のステップＳ６２３から始まるデコンパイル処理を行う。
【００９０】
但し、ステップＳ６２７のデコンパイル順序ずれ評価ポイントの更新処理に関しては、このシーケンスの場合、ロードされたデコンパイル順序５５９が存在しない。そのため、デコンパイル順序５５３とロードされたデコンパイル順序５５９の差の絶対値を取るなどということはできない。従って、この場合の処理としては、例えばデコンパイル順序ずれ評価ポイント７０３を最大値に設定する。このようにすることで、後で必ずデコンパイル順序が保存されるようになる。なお、デコンパイル順序を保存しなくてよい場合はデコンパイル順序ずれ評価ポイント７０３を変化させないようにしてもよい。
【００９１】
ステップＳ６３０では、デコンパイル順序ずれ評価ポイント７０３は更新する。この場合、実際にデコンパイルされたわけではないので、デコンパイル順序５５３は有効な値が設定されていない。そのため、デコンパイル順序５５３とロードされたデコンパイル順序５５９の差の絶対値を取る操作は行えない。しかし、デコンパイル順序４０４（すなわち、ロードされたデコンパイル順序５５９）は若い値を示している。にもかかわらずデコンパイルすべきでないということは、やはりデコンパイル順序として異変があったとことを示している。
【００９２】
そこで、ここでは、例えばある定数値からロードされたデコンパイル順序５５９の値を差し引いた値を加算することによりデコンパイル順序ずれ評価ポイント７０３を更新する。このようにすることにより、デコンパイル順序の若いネイティブコードほど、大きいずれとしてデコンパイル順序ずれ評価ポイント７０３に加算することができる。
【００９３】
ステップＳ６１６では、コンパイラ２０４はコンパイルが必要になったメソッドのバイトコードをコンパイルしてネイティブコードを生成し、コードキャッシュ２１８に記憶する。
【００９４】
ステップＳ６１７では、ＶＭ２０１は現在の使用順序の番号を使用順序５５２に記憶する。
【００９５】
ステップＳ６１８では、ＶＭ２０１は現在の使用順序の番号をインクリメントする。
【００９６】
ステップＳ６３１では、ＶＭ２０１は使用順序ずれ評価ポイント７０２を更新する。ここでは新たなメソッドのコンパイルが必要になっているため、このメソッドに対しロードされた使用順序５５８は存在しない。従って、使用順序５５２とロードされた使用順序５５８の差の絶対値を取ることはできない。そこで、上述のデコンパイル順序ずれ評価ポイント７０３についての処理と同様に、使用順序ずれ評価ポイントを最大値に設定するなどの方法が考えられる。
【００９７】
ステップＳ６１９では、新たにコンパイルしたメソッドの数７０１の数字をインクリメントする。その後、ステップＳ６０３に戻る。
【００９８】
＜アプリケーションプログラム実行後の仮想マシンの動作（ネイティブコードの更新）＞
ところで、アプリケーションの初期化動作に必要なメソッドはパラメータの変更などにより変化する。つまり、同一のアプリケーションに対して、異なるネイティブコードが必要となることがある。以下では、そのような場合における仮想マシンの動作、特にネイティブコードの更新動作について説明する。
【００９９】
図８は、第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである。図６の場合と同様、２回目以降のアプリケーション実行においては、クラス２３１の他、ネイティブコード２３２及び順序情報２３３が保存・登録されている。なお、ここでは、前述したステップＳ６０４において、アプリケーション２２０の初期化が完了したと判断された後の手順について説明を行う。つまり、以下の動作は、アプリケーション２２０が起動した後のタイミングで実行される動作である。
【０１００】
ステップＳ８０１では、ＶＭ２０１はデコンパイル順序ずれ評価ポイント７０３が予め指定された値を超えたか否かを判断する。超えた場合はステップＳ８０２に進み、超えていない場合はステップＳ８０３に進む。
ステップＳ８０２では、ＶＭ２０１はデコンパイル順序５５３が設定されているメソッドについて、メモリ２０５中の順序情報４０１のデコンパイル順序４０４をデコンパイル順序５５３の値で更新する。
【０１０１】
ステップＳ８０３では、ＶＭ２０１は使用順序ずれ評価ポイント７０２が予め指定された値を超えたか否かを判断する。超えた場合はステップＳ８０４に進み、超えていない場合はステップＳ８０５に進む。
【０１０２】
ステップＳ８０４では、ＶＭ２０１は使用順序５５２が設定されているメソッドについて、メモリ２０５中の順序情報４０１の使用順序４０３を使用順序５５２の値で更新する。
【０１０３】
ステップＳ８０５では、ＶＭ２０１は新たにコンパイルしたメソッドの数７０１が予め指定された数を超えたか否かを判断する。超えた場合はステップＳ８０６に進み、超えていない場合はステップＳ８０７に進む。
【０１０４】
ステップＳ８０６では、ＶＭ２０１は新たにコンパイルしたメソッドについて、順序情報４０１を作成する。
【０１０５】
ステップＳ８０７では、ＶＭ２０１はメソッド情報５５１を走査する。そして、ロードされた使用順序５５８がセットされているにも関わらず、使用順序５５２がセットされていないメソッド、つまりロードされたが使用されなかったメソッドの数が予め指定された数を超えたか否かを判断する。超えた場合はステップＳ８０８に進み、超えていない場合はステップＳ８０９に進む。
【０１０６】
ステップＳ８０８では、ＶＭ２０１は該当するメソッドに関する順序情報４０１を削除する。また、ＶＭ２０１は順序情報４０１を削除したメソッドは何かを記憶しておく。
【０１０７】
ステップＳ８０９では、ＶＭ２０１は順序情報４０１のコードポインタ４０６がファイルオフセットのままで、アドレスに変換されていないメソッドの数が予め指定された数を超えたか否かを判断する。つまり、順序情報４０１は読み出されたが、ネイティブコード２３２からそのネイティブコードは読み出されなかったメソッドの数が予め指定された数を超えたか否かを判断する。超えた場合はステップＳ８１０に進み、超えていない場合はステップＳ８１１に進む。なお、コードポインタ４０６がファイルオフセットかアドレスか区別がつかない場合は、順序情報４０１のメソッド毎にネイティブコードをロード済みか否か示す情報を追加し、それによって判断してもよい。
【０１０８】
ステップＳ８１０では、ＶＭ２０１はネイティブコード１３２を削除する。この場合は、ネイティブコード１３２を完全に入れ替えることになる。
【０１０９】
ステップＳ８１１では、ＶＭ２０１は、ステップＳ８０１、ステップＳ８０３、ステップＳ８０５、ステップＳ８０７、ステップＳ８０９のいずれかでＹｅｓになったか否かを判断する。つまり、順序情報４０１およびネイティブコードの何れか保存が必要になったかどうかを判断する。保存が必要でないと判断されれば、終了する。
【０１１０】
ステップＳ８１２では、ＶＭ２０１はステップＳ８０５またはステップＳ８０９でＹになった、つまりネイティブコードの保存が必要になったかどうかを判断する。ネイティブコードの保存が必要になったと判断されればステップＳ８１３へ進み、ネイティブコードの保存が必要でないと判断された場合はステップＳ８１５に進む。
【０１１１】
ステップＳ８１３では、ＶＭ２０１は保存対象のネイティブコードのセットを生成する。なお、保存対象のネイティブコードはコードキャッシュ２１８あるいはデコンパイルされたネイティブコード２１７に記憶されている。このステップにより、非リロケータブルなネイティブコードはリロケータブルなネイティブコードになる。また、ネイティブコード４５１のように各メソッドが連続した領域に配置すると好適である。つまり、このように配置することにより、後述する保存が容易になる。
【０１１２】
ステップＳ８１４では、ＶＭ２０１は順序情報４０１中の各メソッドに関する情報を設定する。ここでコードポインタ４０６、コード長４０７はネイティブコード２３２として保存されるときに合わせて更新される。メソッド名ポインタ４０５も順序情報４０１が保存されるときに併せて更新される。
【０１１３】
ステップＳ８１５では、ＶＭ２０１は使用順序４０３の値で順序情報４０１のメソッド毎のデータ部分をソートする。
【０１１４】
ステップＳ８１６では、ネイティブコードセーバ２１１は順序情報４０１を順序情報２３３として保存する。
【０１１５】
ステップＳ８１７では、ＶＭ２０１はネイティブコードの全保存が必要かどうかを判定する。具体的には、ステップＳ８１０で保存先のネイティブコード２３２を削除した場合に全保存が必要と判定される。全保存が必要な場合はステップＳ８１８に進み、全保存が必要でない場合はステップＳ８１９に進む。
【０１１６】
ステップＳ８１８では、ネイティブコードセーバ２１１はネイティブコードをネイティブコード２３２に全保存して、終了する。
【０１１７】
ステップＳ８１９では、ＶＭ２０１はネイティブコードの追加が必要かどうかを判定する。具体的には、ステップＳ８０６で新たなメソッドの順序情報４０１を生成した場合、追加が必要と判定される。必要な場合はステップＳ８２０に進み、不必要な場合はステップＳ８２１に進む。
【０１１８】
ステップＳ８２０では、ネイティブコードセーバ２１１はステップＳ８０６で順序情報４０１を作成したメソッドのネイティブコードをネイティブコード２３２に追加する。
【０１１９】
ステップＳ８２１では、ＶＭ２０１はネイティブコードの削除が必要かどうかを判定する。具体的には、ステップＳ８０８で順序情報４０１が削除されたメソッドがある場合、削除が必要と判定される。必要な場合はステップＳ８２２に進み、不必要な場合は終了する。
【０１２０】
ステップＳ８２２では、ＶＭ２０１はネイティブコード２３２からステップＳ８０８で記憶した削除対象メソッドについて、ネイティブコードを削除する。その後終了する。
【０１２１】
以上説明したように、第１実施形態の情報処理装置によれば、バイトコードで記述されたプログラムをより速く初期化完了することが可能となる。また、アプリケーション２２０の初期化完了後に初期化時のネイティブコードの利用状態に応じて更新処理を行うことにより、より効率的なネイティブコード２３２を保存することが可能となる。
【０１２２】
すなわち、コードキャッシュのサイズが小さく、初期化処理の際にデコンパイル処理が避けられないような場合でも、デコンパイルされたコードが再利用でき、次回のプログラムの起動を高速化することが可能となる。従って、ＰＣあるいは複写機や複合機といった比較的メモリ資源に余裕のある機器だけでは無く、パーソナルプリンタやデジタルカメラなどのメモリが少ないコンシューマ向け機器にも利用可能である。特に、コンシューマ向け機器では製造コストを抑えるため、中央演算処理装置などに必要最低限の性能のものが使用されており、本発明のような高速化技法は有効である。
【０１２３】
また、外部記憶装置に記憶されたコンパイル済みコードをコードキャッシュにロードしてプログラムを実行する場合、使用順序を参照しコードをロードすることにより効率の良いロードが可能となり高速化に寄与する。
【０１２４】
（第２実施形態）
第２実施形態では、アプリケーション２２０毎にネイティブコード２３２および順序情報２３３の管理を行うことにより、複数のアプリケーションに対し、効率的なネイティブコードの管理を可能としている。なお、装置構成および、個々のアプリケーションに対する実行時の仮想マシン２０１の動作については第１実施形態と同様であるため、詳細な説明は省略する。
【０１２５】
＜仮想マシン（ＶＭ）およびアプリケーションプログラムの構成＞
図９は、複数のアプリケーションを実行する際のソフトウェア階層構造の概念図である。図９において、ＶＭ２０１の上でアプリケーション管理マネージャ９０１が動作しており、複数のアプリケーション２２０ａ〜ｃはアプリケーション管理マネージャ９０１により管理され実行される。
【０１２６】
図１０は、第２実施形態に係る仮想マシンの内部構成を示すブロック図である。なお、仮想マシン環境は、ネイティブ環境で動作する仮想マシンプログラムを実行することにより実現される。なお、図が煩雑になるのを避けるため、図１０においては図２に比較しいくつか矢印を削除してある。以下では、図２に対して追加された部分について説明を行う。
【０１２７】
アプリケーション管理マネージャ９０１は、インストーラ１００１、アンインストーラ１００２、実行開始指示部１００３、停止指示部１００４および初期化完了通知部１００５を備えている。インストーラ１００１は、１つ以上のアプリケーション２２０をインストール（登録）する機能を有する。アンインストーラ１００２、インストールされているアプリケーション２２０をアンインストール（登録解除）する機能を有する。また、実行開始指示部１００３は、アプリケーション２２０を指定し実行開始を指示する機能を有する。停止指示部１００４は、実行中のアプリケーション２２０を指定し停止を指示する機能を有する。さらに、初期化完了通知部１００５は、アプリケーション２２０の初期化完了をＶＭ２０１に通知する機能を有する。
【０１２８】
一方、ＶＭ２０１は、図２に示された各部に加え、ネイティブコード削除部１０２１、順序情報削除部１０２２、メモリ順序情報削除部１０２３および初期化終了検出部１０２４を備えている。ネイティブコード削除部１０２１は、ネイティブコード２３２を削除する機能を有する。順序情報削除部１０２２は、順序情報２３３を削除する機能を有する。メモリ順序情報削除部１０２３は、順序情報２１６の中にある各メソッドについての順序情報を削除する機能を有する。初期化完了検出部１０２４は、アプリケーション２２０の初期化完了を検出する機能を有する。
【０１２９】
＜アプリケーションのインストール（登録）および管理＞
図１１は、第２実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである。ここでは、アプリケーションとして２２０ａ、２２０ｂおよび２２０ｃの３つがＲＯＭ１０２に記憶され、予めインストーラ１００１によりアプリケーション管理マネージャ９０１に登録されているとする。なお、インストーラ１００１による登録動作はアプリケーションの起動とは独立して行っても良いが、あるアプリケーションが最初に実行指示される際に自動的に登録動作がなされるように構成しても良い。
【０１３０】
ステップＳ１１０１では、ユーザによる操作ボタン１０８によるアプリケーション２２０の実行指示などに基づき、ＣＰＵ１０１はＶＭ２０１環境を動作開始する。例えば、ＣＰＵ１０１がＶＭ２０１環境を実現するためのＶＭプログラムを実行することにより実現される。
【０１３１】
ステップＳ１１０２では、ＶＭ２０１は、アプリケーション管理マネージャ９０１を開始する。
【０１３２】
ステップＳ１１０３では、実行開始指示部１００３は、既にインストールされたアプリケーション２２０ａ〜ｃの中から、ユーザにより指定されたアプリケーション２２０を選んで開始する。以下では、アプリケーション２２０ａが選択されたものとして説明をする。
【０１３３】
ステップＳ１１０４では、ＶＭ２０１はアプリケーション２２０ａを実行開始する。具体的には、第１実施形態において、図３および図６を用いて説明した動作を行う。つまり、アプリケーション２２０ａのネイティブコード２３２及び順序情報２３３のロード及び読み出し、順序情報４０１の更新処理等を行う。  ステップＳ１１０５では、アプリケーション２２０ａの初期化が完了したか否かを判断する。完了していなければ、引き続き初期化動作を行う。完了した場合はステップＳ１１０６に進む。なお、初期化の完了は、例えば、初期化完了通知部１００５によるＶＭ２０１への通知、あるいは、初期化完了検出部１０２４による初期化完了の検出により実現される。
【０１３４】
ステップＳ１１０６では、ＶＭ２０１は、アプリケーション２２０ａのネイティブコード２３２および順序情報２３３を保存する。
【０１３５】
ステップＳ１１０７では、ＶＭ２０１は、コードキャッシュ２１８に十分な空きがあるか否かを判断する。空きがある場合はステップＳ１１１４に進み、無い場合はステップＳ１１０８に進む。なお、このステップは第１実施形態で述べたステップ（例えば、Ｓ３０７）とは意味合いが異なる。つまり、ここでは、他のアプリケーション（２２０ｂ、ｃ）を起動するために必要なコードキャッシュ２１８に十分な空きがあるか否かを判断するのである。
【０１３６】
ステップＳ１１０８では、ＶＭ２０１はデコンパイル対象と判定する実行頻度の基準を決定する。決定方法としてはユーザからの入力を受け付けるよう構成しても良いし、予め指定した初期パラメータ（不図示）を用いて決定しても良い。
【０１３７】
ステップＳ１１０９では、ＶＭ２０１は、複数のアプリケーション２２０の中で、アプリケーション２２０ａのクラス２３１のみが有するメソッドで、かつ、実行頻度が前述の実行頻度より低いものがあるか否かを判断する。低いものがない場合はステップＳ１１１０に進み、低いものがある場合はステップＳ１１１２に進む。
【０１３８】
ステップＳ１１１０では、ＶＭ２０１は、複数のアプリケーション２２０間で共通に使用されるのメソッド（以降、共通メソッドと呼ぶ）でかつ、実行頻度が前述の実行頻度より低いものがあるか否かを判断する。低いものがない場合はステップＳ１１１１に進み、低いものがある場合はステップＳ１１１２に進む。ステップＳ１１１０をステップＳ１１０９と分けることにより、共通メソッドのデコンパイルの優先度を、アプリケーション２２０ａ固有のメソッドに比較し下げることが可能となる。
【０１３９】
ステップＳ１１１１では、ＶＭ２０１はデコンパイル対象と判定する実行頻度の基準を上げる。その後、ステップＳ１１０９に戻る。ステップＳ１１０９〜ステップＳ１１１１のステップを繰り返すことによりにより、ステップＳ１１０９またはステップＳ１１１０によりデコンパイル対象となるメソッドが決定される。
【０１４０】
ステップＳ１１１２では、デコンパイラ２１２はデコンパイル対象として選択されたメソッドのネイティブコードをデコンパイルする。これは第１実施形態で説明したデコンパイルと同様の処理である。ただし、デコンパイルされたネイティブコードは領域２１７にコピーはされない。なぜなら次回の起動に必要なネイティブコードは既にステップＳ１１０６で保存されているためコピーは必要ないからである。
【０１４１】
ステップＳ１１１３では、メモリ順序情報削除部１０２３はデコンパイルしたメソッドの順序情報２１６を削除する。そしてステップＳ１１０７に戻る。
【０１４２】
ステップＳ１１１４では、ＶＭ２０１はアプリケーション１２０ａのメソッド及び共通メソッドの順序情報（使用順序５５２及びデコンパイル順序５５３）を初期化する。次に起動するアプリケーション１２０ａ〜ｃの実行時に、古い順序情報が残らないようにするためである。
【０１４３】
ステップＳ１１１５では、実行開始指示部１００３は、既にインストールされたアプリケーション２２０ａ〜ｃの中から、ユーザにより指定された２つ目のアプリケーション２２０を選んで開始する。そして、２つ目のアプリケーション（例えば、２２０ｂ）について、ステップＳ１１０３に戻り同様に処理を行う。
【０１４４】
＜アプリケーションのアンインストール（登録削除）＞
図１２は、第２実施形態に係る仮想マシン上でアプリケーションをアンインストールする際の動作フローチャートである。ここでは、アプリケーションとして２２０ａ、２２０ｂおよび２２０ｃの３つがＲＯＭ１０２に記憶され、予めインストーラ１００１によりアプリケーション管理マネージャ９０１に登録されているとする。
【０１４５】
ステップＳ１２０１では、ユーザによる操作ボタン１０８によるアプリケーション２２０の実行指示などに基づき、ＣＰＵ１０１はＶＭ２０１環境を動作開始する。例えば、ＣＰＵ１０１がＶＭ２０１環境を実現するためのＶＭプログラムを実行することにより実現される。
【０１４６】
ステップＳ１２０２では、ＶＭ２０１は、アプリケーション管理マネージャ９０１を開始する。
【０１４７】
ステップＳ１２０３では、アンインストーラ１００２は例えばユーザにより指定されたアプリケーション（例えば２２０ｃ）のアンインストールを開始する。具体的には、ショートカットの削除などアプリケーション２２０ｃを即座に起動できない状態にする。
【０１４８】
ステップＳ１２０４では、ネイティブコード削除部１０２１はアプリケーション２２０ｃに対応するネイティブコード２３２ｃを削除する。
【０１４９】
ステップＳ１２０５では、順序情報削除部１０２２はアプリケーション２２０ｃに対応する順序情報２３３ｃを削除する。
【０１５０】
以上のステップを経て、アプリケーション２２０ｃをインストールしていない状態に戻すのである。なお、停止指示部１００４の指示によりネイティブコード削除部１０２１および順序情報削除部１０２２を動作させるようにしても良い。その場合、ネイティブコード２３２ｃおよび順序情報２３３ｃのみ削除され、ショートカットなどは削除されず、残すことが可能となる。
【０１５１】
＜共通メソッドに対応するネイティブコードの保存＞
前述したように、複数のアプリケーション２２０が存在する場合、２以上のアプリケーションに共通するメソッド（共通メソッド）が存在する場合がある。特に、第１実施形態で述べたように、初期化処理に対応したメソッドの場合共通メソッドの存在する確率は高いものとなる。
【０１５２】
その場合、例えば、アプリケーション２２０ａのネイティブコード２３２ａとアプリケーション２２０ｂのネイティブコード２３２ｂに共通メソッドが存在しているとする。その場合、アプリケーション２２０ａの初期化完了時、アプリケーション２２０ｂを初期化開始する場合、共通メソッドに対応するネイティブコード２３２ｂをさらにロードするのは効率が悪い。また、記憶領域に対する効率も悪いものになってしまうことになる。
【０１５３】
そこで、共通メソッドが存在する際には、当該メソッドに対応するネイティブコードは１つにまとめて登録するのが望ましい。そして、それぞれのアプリケーションに対応するコード領域には、共通コードの位置（ポインタ）のみを格納するように構成するとよい。
【０１５４】
図１３は、共通メソッドに対応するネイティブコードの保存形式を説明する図である。
【０１５５】
１３０１は、アプリケーション２２０ａのネイティブコード２３２ａの内部構造を示している。また、１３２１は、アプリケーション２２０ｂのネイティブコード２３２ｂの内部構造を示している。アプリケーション２２０ａに特有のメソッドに対応するネイティブコード１３０２は、ネイティブコード２３２ａに直接格納されている。また、アプリケーション２２０ｂに特有のメソッドに対応するネイティブコード１３２２は、ネイティブコード２３２ｂに直接格納されている。
【０１５６】
一方、アプリケーション２２０ａおよびアプリケーション２２０ｂの共通メソッドに対応するネイティブコード１３５２は、共通ネイティブコード１３５１の内部に格納される。そして、ネイティブコード２３２ａおよびネイティブコード２３２ｂの内部には、ネイティブコード１３５２に対するポインタのみ格納されている。
【０１５７】
なお、共通ネイティブコード１３５１は、ＶＭ２０１からアクセスできる場所に記憶される。ただし、アプリケーション２２０ａ関連ネイティブコード１３０１およびアプリケーション２２０ｂ関連ネイティブコード１３２１などと同じ場所に置く必要はない。
【０１５８】
以上説明したように、第２実施形態の情報処理装置によれば、第１実施形態で述べた利点に加え、複数のアプリケーションを動作させる際により効率よくコードキャッシュを利用することが可能となる。その結果、初期化の高速化にも寄与することとなる。
【０１５９】
また複数のアプリケーションに共通するメソッドについて、ネイティブコードを共用領域に記憶することにより、より少ない記憶容量でより多くのネイティブコードを記憶可能となる。
【０１６０】
（他の実施形態）
なお、本発明は、前述した実施形態の機能を実現するプログラムを、システム或いは装置に直接或いは遠隔から供給し、そのシステム或いは装置が、供給されたプログラムコードを読み出して実行することによっても達成される。従って、本発明の機能処理をコンピュータで実現するために、コンピュータにインストールされるプログラムコード自体も本発明の技術的範囲に含まれる。
【０１６１】
プログラムを供給するための記録媒体としては、例えば、フロッピー（登録商標）ディスク、ハードディスク、光ディスク（ＣＤ，ＤＶＤ）、光磁気ディスク、ＭＯ、磁気テープ、不揮発性の半導体メモリなどがある。
【０１６２】
また、コンピュータが、読み出したプログラムを実行することによって、前述した実施形態の機能が実現される他、そのプログラムの指示に基づき、コンピュータ上で稼動しているＯＳなどが、実際の処理の一部または全部を行い、その処理によっても前述した実施形態の機能が実現され得る。
【０１６３】
さらに、記録媒体から読み出されたプログラムが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれた後、そのプログラムの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行い、その処理によっても前述した実施形態の機能が実現される。
【図面の簡単な説明】
【０１６４】
【図１】第１実施形態に係る仮想マシンが動作している情報処理機器の内部構成を示すブロック図である。
【図２】第１実施形態に係る仮想マシンの内部構成を示すブロック図である。
【図３】第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである（１回目）。
【図４】ネイティブコードおよび順序情報の関係および内部構造（構造体）を説明する図である。
【図５】デコンパイル順序情報、デコンパイルメソッド情報及びメソッド情報のデータ内部構造（構造体）を説明する図である。
【図６】第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである（２回目以降）。
【図７】メモリ２０５上に置かれる図２に示したデータ以外のデータの例を示している。
【図８】第１実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである（初期化完了後）。
【図９】複数のアプリケーションを実行する際のソフトウェア階層構造の概念図である。
【図１０】第２実施形態に係る仮想マシンの内部構成を示すブロック図である。
【図１１】第２実施形態に係る仮想マシン上でアプリケーションを実行する際の動作フローチャートである。
【図１２】第２実施形態に係る仮想マシン上でアプリケーションをアンインストールする際の動作フローチャートである。
【図１３】共通メソッドに対応するネイティブコードの保存形式を説明する図である。
【図１】
2007233472.tif 000003
【図２】
2007233472.tif 000004
【図３】
2007233472.tif 000005
【図４】
2007233472.tif 000006
【図５】
2007233472.tif 000007
【図６】
2007233472.tif 000008
【図７】
2007233472.tif 000009
【図８】
2007233472.tif 000010
【図９】
2007233472.tif 000011
【図１０】
2007233472.tif 000012
【図１１】
2007233472.tif 000013
【図１２】
2007233472.tif 000014
【図１３】
2007233472.tif 000015