(57)【要約】【課題】中間コード命令で記述されたプログラムの実行及びコンパイルを効率的に行うことができる情報処理装置を提供する。【解決手段】ＣＰＵ１００は、実行ルートに沿って中間コード命令を順次読込み、コンパイル結果格納部１５に読み込んだ中間コード命令のコンパイル結果があるか否かを判定し、コンパイル結果が無ければ中間コード命令の解釈を行ない、コンパイル結果があればコンパイル結果を指定するバイトコード解釈部１７と、バイトコード解釈部１７から中間コード命令の解釈結果を受けた場合、中間コード命令を実行し、コンパイル結果の指定を受けた場合、指定されたネイティブコードを実行するプログラム実行部１８とを備える。ＣＰＵ２００は、バイトコード解釈部１７により解釈された中間コード命令をコンパイルしてネイティブコードを生成しコンパイル結果格納部１５に格納するコンパイル実行部１９を備える。【選択図】図１
2013061810.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも２つのＣＰＵ及び中間コード命令のコンパイル結果を記憶する記憶部を有する情報処理装置であって、
一方のＣＰＵは、
中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、前記記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、該中間コード命令のコンパイル結果が無ければ前記中間コード命令の解釈を行ない、該中間コード命令のコンパイル結果があれば該コンパイル結果を指定する中間コード解釈部と、
前記中間コード解釈部から前記中間コード命令の解釈結果を受けた場合、解釈結果に基づき該中間コード命令を実行し、前記中間コード解釈部からコンパイル結果の指定を受けた場合、指定されたコンパイル結果であるネイティブコードを実行することで前記プログラムを実行するプログラム実行部とを備え、
他方のＣＰＵは、
前記中間コード解釈部により解釈された前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを前記記憶部に格納するコンパイル実行部を備えた
ことを特徴とする情報処理装置。
【請求項２】
前記中間コード解釈部は、解釈を行う対象とする、前記プログラムの一部である一まとまりの作業手順を表す中間コード命令群を指定し、さらに、指定した前記中間コード命令群の中の分岐毎に前記メソッドを分割した分割メソッドの中から、解釈を行う対象とする前記分割命令群を特定し、
前記コンパイル実行部は、前記中間コード解釈部により指定された前記中間コード命令群の中で特定された前記分割命令群をコンパイルする
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記中間コード解釈部は、前記中間コード命令群の解釈を開始する毎に、前記コンパイル実行部に対して、解釈を開始した中間コード命令群のコンパイルを指示し、解釈を開始した中間コード命令群の中の分岐を検出すると、前記コンパイル実行部による解釈を開始した中間コード命令群のコンパイルが開始されているか否かを検出し、コンパイルが開始されていなければ、その検出した分岐においてメソッドの分割を行い解釈を行う対象とする前記分割命令群を特定し、
前記コンパイル実行部は、前記中間コード解釈部から複数の前記中間コード命令群のコンパイルの指示を順次受け付け、指示を受けた順に前記中間コード命令群のコンパイルを開始し、コンパイルを開始した中間コード命令群に前記分割命令群が指定されていれば該分割命令群をコンパイルし、コンパイルを開始した中間コード命令群に前記分割命令群が指定されていなければコンパイルを開始した中間コード命令群を１つの前記分割命令群としてコンパイルする
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
２つのＣＰＵを備えた情報処理装置の制御方法であって、
一方のＣＰＵにより、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、中間コード命令のコンパイル結果を記憶する記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、
該中間コード命令のコンパイル結果が無ければ、前記一方のＣＰＵにより、前記中間コード命令の解釈を行ない、解釈結果に基づき該中間コード命令を実行するとともに、他方のＣＰＵにより、解釈した前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを記憶部に格納し
該中間コード命令のコンパイル結果があれば、前記一方のＣＰＵにより該コンパイル結果を指定し、指定したコンパイル結果であるネイティブコードを実行する
処理をコンピュータに実行させることを特徴とする情報処理装置制御方法。
【請求項５】
２つのＣＰＵを備えたコンピュータに処理を行わせる中間コード命令実行プログラムであって、
一方のＣＰＵに対して、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込ませ、中間コード命令のコンパイル結果を記憶する記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定させ、
該中間コード命令のコンパイル結果が無ければ、前記一方のＣＰＵに対して、前記中間コード命令の解釈を行わせ、解釈結果に基づき該中間コード命令を実行させるとともに、他方のＣＰＵに対して、解釈した前記中間コード命令をコンパイルさせてネイティブコードを生成させ、生成したネイティブコードを記憶部に格納させ
該中間コード命令のコンパイル結果があれば、前記一方のＣＰＵに対して、該コンパイル結果を指定させ、指定したコンパイル結果であるネイティブコードを実行させる
処理をコンピュータに実行させることを特徴とする中間コード命令実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムに関する。
【背景技術】
【０００２】
Ｊａｖａ（登録商標）プログラムなどを情報処理装置で実行する場合、従来いくつかの方法が知られている。
【０００３】
一つの方法として、インタプリタ方式と呼ばれる方式がある。インタプリタ方式の場合、まず、情報処理装置はソースファイルをコンパイルしてＪａｖａバイトコードと呼ばれる中間コードに変換する。そして、情報処理装置は、ＪａｖａＶＭ（Virtual  Machine）でＪａｖａバイトコードを解釈し、その解釈に基づいてＣＰＵ（Central  Processing  Unit）で処理を実行することで、プログラムを実行していく。
【０００４】
また、他の方法として、アクセラレータ方式という方式がある。アクセラレータ方式は、Ｊａｖａバイトコードをハードウェアにより実行する方式である。例えば、プログラム中のＪａｖａバイトコードのうち一部のコードをハードウェアで実行し、比較的複雑な動作が必要なＪａｖａバイトコードの実行はソフトウェアにより実行するといった方式である。アクセラレータ方式は、インタプリタ方式と比較して、一般的には処理を高速に実行できる。
【０００５】
さらに、他の方法として、ＪＩＴ（Just  In  Time）コンパイラ方式という方式がある。ＪＩＴコンパイラ方式は、Ｊａｖａバイトコードを一部ずつコンパイルして実行コード（ネイティブコードとも呼ばれる。）に変換しながら、実行コードをＣＰＵが直接実行する方式である。ＪＩＴコンパイラ方式では、連続したＪａｖａバイトコードを、最適化してコンパイル（実行命令展開）することが可能なため、コンパイル結果は高速に実行できる。
【０００６】
さらに、プログラムの実行に係る時間を短縮する技術として、次のような従来技術があった。第１として、シングルＣＰＵシステムにおけるマルチタスク処理により、バイトコード実行とコンパイル処理を並列に行う従来技術があった（例えば特許文献１）。また、第２として、Ｊａｖａプログラムを一つのＣＰＵにより中間コードで表現し、他のＣＰＵによりクラスファイル単位でのコンパイルを行い、当該他のＣＰＵによりコンパイル結果を実行する従来技術があった（例えば特許文献２）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００４−３５５２７７号公報
【特許文献２】特開２００５−１０８１２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、従来のインタプリタ方式では、実行時にＪａｖａバイトコードの解釈を行ないながらプログラムを実行するため、個々の処理の実行が遅くなり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Ｊａｖａプログラムの実行を効率的に行うことが困難であった。
【０００９】
また、従来のアクセラレータ方式では、ハードウェアのＪａｖａアクセラレータ回路を実装しなければならず、コストがかかってしまう。また、ハードウェア回路にて命令を実行する場合、冗長な処理が存在しても最適化できず、処理の実行が遅くなり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Ｊａｖａプログラムの実行を効率的に行うことが困難であった。
【００１０】
また、ＪＩＴコンパイル方式では、Ｊａｖａバイトコードをコンパイルするための時間が必要となる。Ｊａｖａプログラムは、Ｊａｖａバイトコードのクラスファイル単位又はクラスファイルに含まれる処理単位（「メソッド」と呼ばれる）でコンパイルを行い、当該クラスファイル又はメソッドのコンパイルが完了した時点で、その処理を呼び出して実行する。そのため、長大なクラスファイル又はメソッドの場合、コンパイルに時間がかかってしまい、処理の開始が遅延するため、プログラムの実行における全体的な時間が長くなってしまう。また、長大なクラスファイル又はメソッドでは、実際に実行させる処理はそのクラスファイル又はメソッドの一部である場合も多く、その場合、無駄なコンパイル処理に時間がかかってしまうという問題があった。そのため、Ｊａｖａプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【００１１】
さらに、第１の従来技術では、複数のＣＰＵを用いた場合コンパイル要求のキューの入れ替えなどで不具合が発生するため、マルチコアシステムに適応することが困難であった。そのため、コンパイルとＪａｖａバイトコードの実行とを並列で行うことができず、コンパイルの時間により、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Ｊａｖａプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【００１２】
また、第２の従来技術では、メソッドのようなブロック単位でのコンパイルに適用しようとしても、コンパイルのタイミングやコンパイル結果の受け渡しなどの動作が不明であり、ブロック単位でのコンパイルに適用することは困難である。クラス単位でのコンパイルでは、無駄なコンパイルなどが発生するおそれがあり、やはり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Ｊａｖａプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【００１３】
開示の技術は、上記に鑑みてなされたものであって、Ｊａｖａプログラムの実行及びコンパイルを効率的に行うことができる情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１４】
本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムは、一つの態様において、少なくとも２つのＣＰＵ及び中間コード命令のコンパイル結果を記憶する記憶部を有する情報処理装置であって、一方のＣＰＵは、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、前記記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、該中間コード命令のコンパイル結果が無ければ前記中間コード命令の解釈を行ない、該中間コード命令のコンパイル結果があれば該コンパイル結果を指定する中間コード解釈部と、前記中間コード解釈部から前記中間コード命令の解釈結果を受けた場合、解釈結果に基づき該中間コード命令を実行し、前記中間コード解釈部からコンパイル結果の指定を受けた場合、指定されたコンパイル結果であるネイティブコードを実行することで前記プログラムを実行するプログラム実行部とを備える。また、他方のＣＰＵは、前記中間コード解釈部により解釈された前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを前記記憶部に格納するコンパイル実行部を備える。
【発明の効果】
【００１５】
本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムの一つの態様によれば、Ｊａｖａプログラムの実行及びコンパイルを効率的に行うことができるという効果を奏する。
【図面の簡単な説明】
【００１６】
【図１】図１は、実施例に係る情報処理装置のブロック図である。
【図２】図２は、メソッドアドレステーブルを説明するための図である。
【図３】図３は、実行フラグを説明するための図である。
【図４】図４は、コンパイル状態フラグを説明するための図である。
【図５】図５は、メイン処理のフローチャートである。
【図６】図６は、コンパイル処理のフローチャートである。
【図７】図７は、Ｊａｖａプログラミング言語で記述されたサンプルプログラムのソースコードを示す図である。
【図８】図８は、サンプルプログラムのＪａｖａコンパイル結果の概要を示す図である。
【図９】図９は、サンプルプログラムから生成されたメソッドアドレステーブルを示す図である。
【図１０−１】図１０−１は、サンプルプログラムから生成された実行コードを示す第１の図である。
【図１０−２】図１０−２は、サンプルプログラムから生成された実行コードを示す第２の図である。
【図１１】図１１は、実施例に係る情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【００１７】
以下に、本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムが限定されるものではない。特に、以下の説明ではＪａｖａのプログラムを例に説明するが、中間コードを用いて実行させるプログラムであれば他のプログラムでもよい。
【実施例】
【００１８】
図１は、実施例に係る情報処理装置のブロック図である。図１に示すように、本実施例に係る情報処理装置１は、Ｊａｖａワーク領域部１１、ランタイムライブラリ記憶部１２、コンパイルワーク領域部１３、Ｊａｖａバイトコード命令記憶部１４、コンパイル結果格納部１５、関数アドレステーブル格納部１６、バイトコード解釈部１７、プログラム実行部１８及びコンパイル実行部１９を有している。
【００１９】
そして、図１において点線で囲まれたブロックはＣＰＵ１００及びＣＰＵ２００によって機能が実現されるブロックを表している。そして、ＣＰＵ１００によって、バイトコード解釈部１７及びプログラム実行部１８の機能が実現される。また、ＣＰＵ２００によって、コンパイル実行部１９の機能が実現される。すなわち、バイトコード解釈部１７及びプログラム実行部１８における処理とコンパイル実行部１９における処理とは異なるＣＰＵによって実行される。図１において点線で囲まれたブロックの範囲外に図示された構成は、ＣＰＵ１００又はＣＰＵ２００の内部に設けられた記憶手段により実現されてもよいし、ＣＰＵ１００及びＣＰＵ２００の外部に設けられた記憶手段により実現されてもよい。
【００２０】
Ｊａｖａワーク領域部１１は、Ｊａｖａプログラムの実行において、計算などの処理が行われている間に使用される記憶領域である。例えば、計算途中のデータは、Ｊａｖａワーク領域部１１に記憶され、その後、再度計算に用いられる。そして、Ｊａｖａワーク領域部１１に記憶されているデータが再度計算に用いられる場合、Ｊａｖａワーク領域部１１から当該データが読み出され、Ｊａｖａワーク領域部１１に格納されていたデータは削除される。このように、Ｊａｖａワーク領域部１１には、Ｊａｖａプログラムを実行している間に、データの読書きの場所として一時的に用いられる。
【００２１】
ランタイムライブラリ記憶部１２は、Ｊａｖａプログラムを実行するための予め定義された関数群などを記憶している。
【００２２】
コンパイルワーク領域部１３は、コンパイル処理が行われている間に使用される記憶領域である。例えば、コンパイル処理途中のデータは、コンパイルワーク領域部１３に記憶され、その後、再度コンパイル処理に用いられる。そして、コンパイルワーク領域部１３にあるデータが再度コンパイルに用いられる場合、コンパイルワーク領域部１３から当該データが読み出され、コンパイルワーク領域部１３に格納されていたデータは削除される。このように、コンパイルワーク領域部１３は、コンパイル処理を実行している間に、データの読書きの場所として一時的に用いられる。
【００２３】
Ｊａｖａバイトコード命令記憶部１４は、Ｊａｖａバイトコードで記述されたＪａｖａプログラムを記憶している。このＪａｖａバイトコードで記述されたＪａｖａプログラム（クラスファイル）は、Ｊａｖａプログラミング言語で記述されているソースコードをコンパイルすることによって、中間コードであるＪａｖａバイトコードに変換することで生成される。以下では、Ｊａｖａバイトコードで記述されたＪａｖａプログラムに含まれる命令を、「Ｊａｖａバイトコード命令」という。Ｊａｖａバイトコード命令は、一般的には、ＣＰＵによって直接実行可能な命令セットではなく、例えば、Ｊａｖａ仮想マシン仕様により規定される仮想的な命令セットである。そのため、実行時の動作環境に応じてＣＰＵで実行可能な命令セットに解釈された後に、ＣＰＵによって実行される。
【００２４】
コンパイル結果格納部１５は、後述するコンパイル実行部１９によって行なわれたＪａｖａバイトコード命令のコンパイル結果を格納する。
【００２５】
関数アドレステーブル格納部１６は、コンパイルに用いる関数のアドレスが記載された関数アドレステーブルを記憶している。また、関数アドレステーブル格納部１６は、後述するバイトコード解釈部１７が生成するメソッドアドレステーブルを記憶している。メソッドアドレステーブルについては後で詳細に説明する。
【００２６】
バイトコード解釈部１７は、ＪａｖａＶＭにより実現される。バイトコード解釈部１７は、Ｊａｖａプログラムの実行開始が指示されると、Ｊａｖａバイトコード命令記憶部１４からＪａｖａバイトコードで記述されたＪａｖａプログラムを順次読み込む。
【００２７】
そして、バイトコード解釈部１７は、読み込んだＪａｖａプログラム（クラスファイル）に記載されているＪａｖａバイトコード命令を順次解釈していく。バイトコード解釈部１７が読み込むＪａｖａプログラムには、ランタイムライブラリファイルと呼ばれる処理の集まりを含む。クラスファイルには、メソッドと呼ばれる手続き（処理）が規定されている。から構成されている。このメソッドが「中間コード命令群」の一例にあたる。そして、メソッドは、処理の開始から終了までが記載されている。メソッドにおける処理の終了は、「ｒｅｔｕｒｎ」命令（例えば、０ｘｂ１などのバイトコード）などで指定される。
【００２８】
バイトコード解釈部１７は、Ｊａｖａバイトコード命令を順次解釈していく間に、メソッドの呼出し命令が出現すると、呼出し先のメソッドの開始アドレスを取得する。呼び出し先のメソッド開始アドレスとは、そのメソッドの開始点となる命令が格納されたメモリアドレスを指す。そして、バイトコード解釈部１７は、取得したメソッドの開始アドレスをエントリーポイントとする。
【００２９】
バイトコード解釈部１７は、関数アドレステーブル格納部１６に格納されているメソッドアドレステーブルに見つけたメソッドが登録されているか否かを検索する。メソッドがメソッドアドレステーブルに登録されていない場合、バイトコード解釈部１７は、新たにメソッドを表すエレメントの領域をメソッドアドレステーブルに確保する。
【００３０】
その後、バイトコード解釈部１７は、メソッドアドレステーブルに確保されたエレメントの領域にメソッド名やエントリーポイントテーブルなどの各種情報を登録していく。ここでバイトコード解釈部１７によるメソッドアドレステーブルへの各種情報の登録の説明の前に、メソッドアドレステーブルについて説明する。
【００３１】
図２は、メソッドアドレステーブルを説明するための図である。図２に示すテーブル３００がメソッドアドレステーブルの大枠を示している。また、テーブル３１０は、メソッドアドレステーブルの各エレメントのデータ構造を表している。さらに、テーブル３２０は、エレメントに記載されたエントリーポイントテーブル３１５のデータ構造を表している。
【００３２】
メソッドアドレステーブルには、実行するＪａｖａプログラムに含まれるメソッドに対応させて連番で各エレメントの領域が確保されている。バイトコード解釈部１７は、Ｊａｖａプログラムの実行を開始して最初に見つけたメソッドに対して０番をふり、メソッドアドレステーブルにエレメント＃０の領域３０１を確保する。また、バイトコード解釈部１７は、メソッドアドレステーブルに既にエレメントの領域が確保されている場合、メソッドに対して既に使用されている最大の番号の次の順番の番号を割り当て、その番号を付加したエレメントの領域を確保する。例えば、ｎ番目に見つけたメソッドであれば、そのメソッドに対してエレメント＃ｎの領域３０２を確保する。このように、バイトコード解釈部１７は、メソッドを見つけるたびに、見つけたメソッドに対して順番に番号を割り当て、その番号を付加したエレメントの領域をメソッドアドレステーブルに確保していく。
【００３３】
さらに、エレメントの領域には、テーブル３１０に示すようにそのエレメントに対応するメソッドのメソッド名３１１、開始アドレス３１２、メソッドサイズ３１３、実行フラグ３１４及びエントリーポイントテーブル３１５が登録される。図２では、一例としてエレメント＃０を例に記載しているが、バイトコード解釈部１７は、他のエレメントにおいても同様のデータ構造を持つようにメソッドアドレステーブルを作成する。以下では、メソッド名３１１、開始アドレス３１２、メソッドサイズ３１３、実行フラグ３１４及びエントリーポイントテーブル３１５を任意のメソッド対応するデータとして説明する。
【００３４】
メソッド名３１１は、エレメントに対応するメソッドの名前である。バイトコード解釈部１７は、エレメントの領域を確保した時点で、そのエレメントに対応するメソッドの名前をメソッド名３１１に登録する。
【００３５】
また、開始アドレス３１２は、エレメントに対応するメソッドの開始アドレスである。後述する、コンパイル実行部１９は、メソッドのコンパイルが終了すると、メソッドの開始アドレスを開始アドレス３１２に登録する。
【００３６】
メソッドサイズ３１３は、エレメントに対応するメソッドのサイズである。バイトコード解釈部１７は、エレメントの領域を確保した時点で、メソッドの先頭からｒｅｔｕｒｎ命令までのサイズを確認し、確認したサイズをそのエレメントに対応するメソッドのサイズとしてメソッドサイズ３１３に登録する。
【００３７】
実行フラグ３１４は、例えば図３に示すようなフラグ３４１〜３４４を有している。図３は、実行フラグを説明するための図である。フラグ３４１〜３４４は、いずれも記載された値が１の場合がＯＮであり、記載された値が０であればＯＦＦである。フラグ３４１は、最適化が完了しているか否かを表すフラグである。フラグ３４１がＯＮの場合には、そのメソッドに対して最適化が完了していることを表している。ここで、最適化とは、例えば、連続して呼び出される処理のコンパイル結果を統合することなどである。フラグ３４２は、複数個所からの呼び出しがあり最適化が必要か否かを示すフラグである。フラグ３４２がＯＮの場合には、そのメソッドに対して複数個所からの呼び出しがあることを表している。フラグ３４３は、メソッド呼出しアドレスがメソッドアドレステーブルに設定済みか否かを表すフラグである。フラグ３４３がＯＮの場合には、Ｊａｖａプログラムの中でそのメソッドをコンパイル結果である実行コードの呼出しアドレスが設定済みであることを表している。フラグ３４４は、コンパイル済みか否かを表している。フラグ３４４がＯＮの場合には、そのメソッドが既にコンパイルされていることを表している。例えば、図３に示す実行フラグ３１４の状態では、フラグ３４３及びフラグ３４４がＯＮであるので、コンパイル済みで且つメソッド呼出しアドレスが設定済みであることを示している。フラグ３４１〜３４４は、後述するコンパイル実行部１９により設定される。フラグ３４１〜３４４のコンパイル実行部１９による設定の詳細については後で説明する。
【００３８】
次に、エントリーポイントテーブル３１５について説明する。エントリーポイントテーブル３１５は、テーブル３２０に示すように、そのメソッドについて、いくつのエントリーがあるかを示すエントリーカウンタ３２１を有する。エントリーとは、コンパイル実行部１９によってコンパイル処理が行われる単位である。コンパイル単位は、後述するようにバイトコード解釈部１７によって指定される。このエントリーが「分割命令群」の一例にあたる。
【００３９】
ここで、コンパイル単位について説明する。例えば、あるメソッドについて、コンパイル実行部１９がそのメソッドの開始点からｒｅｔｕｒｎ命令までをまとめてコンパイルした場合、そのメソッドについてのエントリーの数は１となる。また、後述するように、メソッドの中で他のメソッドを呼び出すなどの分岐がバイトコード解釈部１７によって指定されている場合、メソッドの開始からその分岐までが一つのコンパイル単位であり、一つのエントリーとなる。例えば、（０ｘＢ６）ｉｎｖｏｋｅｖｉｒｔｕａｌなどの呼び出し命令や、（０ｘＡ７）ｇｏｔｏ命令などによる分岐までが一つのコンパイル単位となり得る。さらに、他のメソッドの呼出し後、呼出しもとのメソッドに戻ってきた後に、さらに分岐がバイトコード解釈部１７によって指定されている場合、戻ってきた位置から次の分岐までが一つのコンパイル単位であり、一つのエントリーとなる。また、戻ってきた後に、分岐がなくｒｅｔｕｒｎ命令まで進んだ場合には、戻ってきた位置からｒｅｔｕｒｎ命令までが一つのコンパイル単位であり、一つのエントリーとなる。
【００４０】
さらに、エントリーポイントテーブル３１５における各エントリーのデータ構造について説明する。図２では、エントリーとして、最初（０番目）のエントリー３３０及びｎ番目のエントリー３３１を例に記載しているが、０〜ｎまでの全てのエントリーが、エントリーポイントテーブル３１５に記載されている。
【００４１】
エントリーポイント３２２は、エントリーの開始のＪａｖａバイトコードにおけるアドレスを表している。
【００４２】
コンパイル状態フラグ３２３は、そのエントリーのコンパイル状態を示すフラグである。図４は、コンパイル状態フラグを説明するための図である。本実施例では、コンパイル状態フラグ３２３には、フラグ３５１〜３５３までのフラグが設けられている。
【００４３】
フラグ３５１は、最適化済みか否かを表すフラグである。フラグ３５２は、コンパイル中か否かを表すフラグである。フラグ３５３は、コンパイル済みか否かを表すフラグである。フラグ３５１〜３５３は、コンパイル実行部１９によって設定される。コンパイル実行部１９によるフラグ３５１〜３５３の設定については後で説明する。
【００４４】
リーブポイント３２４は、エントリーの終了位置である分岐のＪａｖａバイトコードにおけるアドレスを表している。例えば、（０ｘＢ１）ｒｅｔｕｒｎ命令や、（０ｘＢ６）ｉｎｖｏｋｅｖｉｒｔｕａｌなどの呼出し命令や、（０ｘＡ７）ｇｏｔｏ命令などの処理の流れが変わる命令コードが出現する位置（アドレス）をエントリーの終了位置とすればよい。
【００４５】
エントリー生成アドレス３２５は、コンパイル結果の開始アドレスを示している。
【００４６】
出口アドレス３２６は、コンパイル結果である実行コードの戻り先アドレスを示している。出口アドレス２３６は、次の処理されるバイトコードの所在を示し、複数回に亘って処理が呼出される場合に、後述するコンパイル実行部１９による処理の最適化における指標となる。
【００４７】
次に、バイトコード解釈部１７によるエントリーポイントテーブル３１５の生成について説明する。
【００４８】
バイトコード解釈部１７は、Ｊａｖａバイトコード命令で記載されたＪａｖａプログラムを読み込み、メソッドの呼出し命令を見つけると、まずメソッドの開始アドレスをそのメソッドの最初のエントリーポイントとする。そして、バイトコード解釈部１７は、そのエントリーポイントが既にエントリーポイントテーブル３１５に登録されているか否かを判定する。
【００４９】
（エントリーポイントが登録されていない場合）
エントリーポイントがエントリーポイントテーブル３１５に登録されていなければ、バイトコード解釈部１７は、エントリーポイントテーブル３１５の最初のエントリーとしてエントリーポイント３２２にメソッドの開始アドレスを登録する。そして、バイトコード解釈部１７は、コンパイルの実行をコンパイル実行部１９に指示する。その後、バイトコード解釈部１７は、そのメソッドの解釈を進める。そして、バイトコード解釈部１７は、解釈結果をプログラム実行部１８へ出力する。
【００５０】
エントリーポイント作成後、バイトコード解釈部１７は、メソッドの解釈を進めて、メソッドの分岐を検出した場合、そのエントリーのコンパイル状態フラグ３２３を確認し、そのエントリーがコンパイル中か否かを判定する。コンパイル中の場合、バイトコード解釈部１７は、そのままメソッドの解釈を進める。その後、分岐を検出する都度、バイトコード解釈部１７は、コンパイル中であることを確認し、Ｊａｖａバイトコードの解釈を進める。そして、バイトコード解釈部１７は、メソッドのｒｅｔｕｒｎ命令を検出すると、ｒｅｔｕｒｎ命令のアドレスをリーブポイント３２４としてエントリーポイントテーブル３１５に記載する。そして、ｒｅｔｕｒｎ命令の検出によりそのメソッドの解釈が終了すると、バイトコード解釈部１７は、次のメソッドを検出後、検出したメソッドに対して上述したメソッドの開始を見つけた場合の処理を開始する。
【００５１】
これに対して、分岐を検出したときにそのエントリーがコンパイル中で無い場合、バイトコード解釈部１７は、分岐命令のアドレスをリーブポイント３２４としてエントリーポイントテーブル３１５に記載する。ここで、リーブポイントで指定されている戻り先アドレスは、分岐における呼出し先のメソッドである。そこで、バイトコード解釈部１７は、上述したメソッドの開始を見つけた場合の処理を開始する。
【００５２】
さらに、分岐後、ｒｅｔｕｒｎ命令などにより分岐前のメソッドに戻ってきた場合、バイトコード解釈部１７は、分岐命令の次に位置する命令コードのアドレスをそのメソッドにおける次のエントリーポイントとする。そして、バイトコード解釈部１７は、エントリーポイントテーブル３１５の次のエントリーとしてエントリーポイント３２２にメソッドの開始アドレスを登録する。そして、バイトコード解釈部１７は、そのエントリーポイントから始まるエントリーのコンパイルの実行をコンパイル実行部１９に指示する。その後、バイトコード解釈部１７は、そのメソッドの解釈を進める。そして、バイトコード解釈部１７は、解釈結果をプログラム実行部１８へ出力する。その後、バイトコード解釈部１７は、上述した分岐の処理を繰り返す。そして、バイトコード解釈部１７は、メソッドのｒｅｔｕｒｎ命令を検出すると、ｒｅｔｕｒｎ命令のアドレスをリーブポイント３２４としてエントリーポイントテーブル３１５に記載する。そして、ｒｅｔｕｒｎ命令の検出によりそのメソッドの解釈が終了すると、バイトコード解釈部１７は、次のメソッドを検出後、検出したメソッドに対して上述したメソッドの開始を見つけた場合の処理を開始する。
【００５３】
（エントリーポイントが登録されている場合）
これに対して、エントリーポイントテーブル３１５に既に登録されている場合、コンパイル状態フラグ３２３を確認し、そのエントリーがコンパイル済みであるか否かを判定する。コンパイル済みであれば、バイトコード解釈部１７は、エントリー生成アドレス３２５を確認し、エントリー生成アドレス３２５に記載されたアドレスにあるコンパイル済みの実行コードを実行する。その後、バイトコード解釈部１７は、実行コードのリーブポイントに指定されたＪａｖａバイトコードの戻り先アドレスから解釈を開始する。ここでリーブポイントは、分岐かｒｅｔｕｒｎ命令のいずれかにあたる。例えば、（０ｘＢ１）ｒｅｔｕｒｎ命令や、（０ｘＢ６）ｉｎｖｏｋｅｖｉｒｔｕａｌなどの呼出し命令や、（０ｘＡ７）ｇｏｔｏ命令などの処理の流れが変わる命令コードが出現する位置を、リーブポイントとすればよい。その他にも、Ｊａｖａ仮想マシン仕様（http://java.sun.com/docs/books/jvms/second_edition/html/Mnemonics.doc.html）に規定されている命令コードのうち、ifeq,ifnull,iflt,ifle,ifne,ifnonnull,ifgt,ifge,if_icmpeq,if_icmpne,if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,goto,goto_w,jsr,jsr_w,ret,lookupswitch,tableswitch,invokevirtual,invokespecial,invokestatic,invokeinterface,return,ireturn,lreturn,freturn,dreturn,areturnなどの命令コードをリーブポイントの対象としてもよい。例えば、リーブポイントで指定されている戻り先アドレスは、分岐における呼出し先のメソッドか、メソッドの終了位置である。戻り先アドレスが呼出し先のメソッドの場合、バイトコード解釈部１７は、上述したメソッドの開始を見つけた場合の処理を開始する。戻り先アドレスがメソッドの終了位置の場合、バイトコード解釈部１７は、そこからＪａｖａバイトコードの解釈を進め次のメソッドを見つけると、上述したメソッドの開始を見つけた場合の処理を開始する。
【００５４】
また、バイトコード解釈部１７は、一つのエントリーを作成する毎に、エントリーカウンタ３２１をインクリメントしていく。
【００５５】
バイトコード解釈部１７は、プログラムに記載されたＪａｖａバイトコード命令を実行する処理を行ないながら、各メソッドに対して以上に説明したエントリーポイントの作成処理を繰り返す。これにより、バイトコード解釈部１７は、プログラムの実行の流れに合わせて、メソッドの中で使用されるエントリーを抽出してコンパイル対象として指定することができる。
【００５６】
また、バイトコード解釈部１７は、コンパイルが終了したエントリーを再度呼び出した場合、そのエントリーに該当するＪａｖａバイトコード命令にそのエントリーのコンパイル結果である実行コードの呼出しアドレスを埋め込む。そして、バイトコード解釈部１７は、該当する実行コードのアドレスをプログラム実行部１８に通知する。また、バイトコード解釈部１７は、実行コードの呼出しアドレスの埋め込みをコンパイル実行部１９へ通知する。
【００５７】
また、バイトコード解釈部１７は、Ｊａｖａバイトコードの中にメソッドに対応した実行コードの呼出しアドレスが設定されている場合には、呼び出されているアドレスをプログラム実行部１８に通知する。
【００５８】
また、バイトコード解釈部１７は、最適化を行う閾値である、メソッドの呼び出し回数の閾値を記憶している。そして、バイトコード解釈部１７は、メソッドが呼び出された回数をカウントしていき、そのカウント数が閾値以上となったかを確認する。メソッドの呼び出された回数が閾値以上となった場合、バイトコード解釈部１７は、そのメソッドの最適化処理の実行をコンパイル実行部１９に通知する。
【００５９】
バイトコード解釈部１７は、Ｊａｖａバイトコード命令の解釈及びメソッドアドレステーブルの作成などにおけるデータの読書きをＪａｖａワーク領域部１１に対して行いながら、以上の処理を行う。
【００６０】
コンパイル実行部１９は、エントリーのコンパイルの指示をバイトコード解釈部１７から受ける。この時、コンパイル実行部１９は、コンパイル対象のエントリーのメソッド名及びエントリーポイントの入力もバイトコード解釈部１７から受ける。コンパイル実行部１９は、コンパイルの指示を受けた順にエントリーのコンパイルを行なっていく。ここで、本実施例では、コンパイルは１つのＣＰＵであるＣＰＵ２００が行うため、バイトコード解釈部１７は、１つのエントリーのコンパイルを完了しなければ、次のエントリーのコンパイルを行なえない。すなわち、コンパイル実行部１９は、バイトコード解釈部１７からのコンパイルの指示を受けたエントリーのコンパイルを直ぐに始められるとは限らない。そのため、上述したように、バイトコード解釈部１７は、エントリーポイントを登録し直ぐにエントリーのコンパイルの指示をコンパイル実行部１９に通知しても、その後で、そのエントリーの分岐などによるリーブポイントの指定が行える。
【００６１】
コンパイル実行部１９は、コンパイルを行う場合、必要な関数を関数アドレステーブル格納部１６から取得する。また、コンパイル実行部１９は、コンパイル実行の間、コンパイルワーク領域部１３に対してコンパイル処理におけるデータの読書きを行う。
【００６２】
コンパイル実行部１９は、エントリーのコンパイルを開始するときに、コンパイルの指示を受けたエントリーのメソッド名及びエントリーポイントを用いてメソッドアドレステーブルを検索し、指定されたエントリーを特定する。その後、コンパイル実行部１９は、メソッドアドレステーブルに指定されたエントリーのリーブポイントが登録されているか否かを判定する。リーブポイントが登録されていない場合は、コンパイル実行部１９は、エントリーポイントからそのエントリーを含むメソッドのｒｅｔｕｒｎ命令までをまとめてコンパイルする。リーブポイントが登録されている場合は、コンパイル実行部１９は、エントリーポイントからそのエントリーのリーブポイントまでをまとめてコンパイルする。すなわち、リーブポイントの指定が無い場合は、コンパイル実行部１９は、そのメソッドのエントリーポイント以下の部分をまとめてコンパイルしてしまうため、プログラムの処理に使用しない部分までコンパイルしてしまうことも考えられる。これに対して、リーブポイントが設定されている場合、プログラムの実行に沿ったエントリーポイントからリーブポイントまでのコンパイルが行えるので、無駄なコンパイルを削減することができる。
【００６３】
そして、コンパイル実行部１９は、指定されたエントリーのコンパイルを開始すると、エントリーポイントテーブル３１５に記載されたそのエントリーのコンパイル状態フラグ３２３（図２参照）のコンパイル中のフラグ３５２（図４参照）をＯＮにする。
【００６４】
また、コンパイル実行部１９は、指定されたエントリーのコンパイルが終了すると、エントリーポイントテーブル３１５に記載されたそのエントリーのコンパイル状態フラグ３２３（図２参照）のコンパイル済みのフラグ３５３（図４参照）をＯＮにする。この時、コンパイル実行部１９は、コンパイル中のフラグ３５２をＯＦＦにする。さらに、コンパイル実行部１９は、エントリーのコンパイル結果である実行コードをコンパイル結果格納部１５に格納させる。そして、コンパイル実行部１９は、エントリーポイントテーブル３１５のエントリー生成アドレス３２５にそのエントリーのコンパイル結果である実行コードの開始アドレスを登録する。また、コンパイル実行部１９は、エントリーポイントテーブル３１５の出口アドレス３２６にそのエントリーのコンパイル結果である実行コードの戻り先アドレスを登録する。
【００６５】
さらに、コンパイル実行部１９は、メソッドのｒｅｔｕｒｎ命令までのコンパイルを終了すると、メソッドアドレステーブルにおけるそのメソッドの開始アドレス３１２（図２参照）に、そのメソッドの最初のエントリーの実行コードの開始アドレスを登録する。さらに、コンパイル実行部１９は、メソッドアドレステーブルにおけるそのメソッドの実行フラグ３１４（図２参照）のフラグ３４４（図３参照）をＯＮにする。
【００６６】
さらに、コンパイル実行部１９は、２回以上の呼び出しがあったメソッドに関しては、実行フラグ３１４の最適化が必要であることを示すフラグ３４２をＯＮにする。
【００６７】
また、コンパイル実行部１９は、実行コードの呼出しアドレスの埋め込みの通知をバイトコード解釈部１７から受けると、その実行コードが表すメソッドにおける実行フラグ３１４のフラグ３４３をＯＮにする。
【００６８】
また、コンパイル実行部１９は、メソッドの最適化処理の実行の通知をバイトコード解釈部１７から受ける。そして、コンパイル実行部１９は、指定されたメソッドのエントリーポイントテーブル３１５に記載された各エントリーのコンパイル結果をコンパイル結果格納部１５から取得する。そして、コンパイル実行部１９は、取得した実行コードに対して最適化処理を行う。例えば、コンパイル実行部１９は、取得した実行コードを結合することで最適化処理を行う。ここで、コンパイル実行部１９は、プログラムの実行ルートを追うために、各エントリーの出口アドレス３２６を確認し、次のエントリーがどこにあるかを特定して行く。ここで、「実行ルート」とは、命令内容に従って実際に中間コード命令を実行していった場合の、実行した中間コード命令の順番である。これにより、コンパイル実行部１９は、実行コードを全て確認しなくても、プログラムの実行ルートが簡単に把握でき、結合するエントリーの組合せを容易に取得することができる。そして、最適化が終了すると、コンパイル実行部１９は、エントリーポイントテーブル３１５の最適化を行ったエントリーのコンパイル状態フラグ３２３（図２参照）のフラグ３５１（図４参照）をＯＮにする。さらに、バイトコード解釈部１７は、最適化処理を行なったメソッドの実行フラグ３１４のフラグ３４１（図３参照）をＯＮにする。ここで、本実施例では、最適化処理としてエントリーを結合する処理を例に説明したが、この最適化処理には、既存のコンパイラ技術で実現されている最適化処理を用いてもよい。
【００６９】
プログラム実行部１８は、Ｊａｖａバイトコード命令や実行コードに記載された内容に沿って、処理を実行していく機能を有する。プログラム実行部１８は、バイトコード解釈部１７によるＪａｖａバイトコード命令の解釈結果の入力を受ける。これは、バイトコード解釈部１７が解釈するＪａｖａバイトコード命令が未だコンパイルされていない場合である。そして、プログラム実行部１８は、バイトコード解釈部１７が行なったＪａｖａバイトコード命令の解釈に基づいて処理を実行する。
【００７０】
また、プログラム実行部１８は、実行コードの実行命令をバイトコード解釈部１７から受ける。これは、バイトコード解釈部１７が解釈しようとするＪａｖａバイトコード命令が既にコンパイルされている場合である。これには、解釈対象のメソッド全てのコンパイルが終了している場合及び解釈対象のメソッドの中で、さらに解釈対象となっているエントリーのコンパイルが終了している場合がある。解釈対象のメソッド全てのコンパイルが終了している場合とは、実行フラグ３１４のフラグ３４４がＯＮの場合又は実行フラグ３１４のフラグ３４３がＯＮ、すなわちＪａｖａバイトコード命令に実行コードの呼出しアドレスが埋め込まれている場合である。また、解釈対象となっているエントリーのコンパイルが終了している場合とは、エントリーポイントテーブル３１５のそのエントリーのコンパイル状態フラグ３２３のフラグ３５３がＯＮになっている場合である。そして、プログラム実行部１８は、実行命令を受けた実行コードをコンパイル結果格納部１５から読込む。そして、プログラム実行部１８は、読み込んだ実行コードに基づいて処理を実行する。
【００７１】
そして、プログラム実行部１８は、Ｊａｖａバイトコードの解釈基づく処理及び実行コードに基づく処理を実行するにあたり、Ｊａｖａワーク領域部１１を用いて処理の実行におけるデータの読書きを行う。また、プログラム実行部１８は、ランタイムライブラリから処理に用いる関数を読込み使用する。
【００７２】
次に、図５を参照して、本実施例に係る情報処理装置におけるＪａｖａプログラム実行のメインの処理について説明する。図５は、メイン処理のフローチャートである。
【００７３】
ＣＰＵ１００は、Ｊａｖａプログラムの実行開始命令を受けて、ＪａｖａＶＭの起動などのＪａｖａ実行開始処理を行う（ステップＳ１０１）。ＪａｖａＶＭが起動することで、バイトコード解釈部１７が起動する。
【００７４】
バイトコード解釈部１７は、Ｊａｖａバイトコード命令記憶部１４からＪａｖａバイトコード命令を読み出す（ステップＳ１０２）。
【００７５】
バイトコード解釈部１７は、読み出したバイトコード命令がメソッドの呼出しであるか否かを判定する（ステップＳ１０３）。
【００７６】
メソッドの呼び出しである場合（ステップＳ１０３：肯定）、バイトコード解釈部１７は、メソッドアドレステーブルに対象メソッドが未登録か否かを判定する（ステップＳ１０４）。ここで対象メソッドとは、コンパイルが必要か否かの判定を行う対象のメソッドのことを言う。
【００７７】
そして、対象メソッドが未登録の場合（ステップＳ１０４：肯定）、バイトコード解釈部１７は、対象メソッドの開始アドレスを対象メソッドの最初のエントリーのエントリーポイントとして登録する（ステップＳ１０５）。
【００７８】
これに対して、対象メソッドが登録済みの場合（ステップＳ１０４：否定）、バイトコード解釈部１７は、エントリーポイントテーブルに対象エントリーが未登録か否かを判定する（ステップＳ１０６）。ここで対象エントリーとは、コンパイルが必要か否かの判定を行う対象のエントリーのことを言う。
【００７９】
そして、対象エントリーが未登録の場合（ステップＳ１０６：肯定）、バイトコード解釈部１７は、対象エントリーの開始アドレスをエントリーポイントとして登録する（ステップＳ１０７）。
【００８０】
そして、バイトコード解釈部１７は、エントリーポイントとされたアドレスをコンパイル対象として指定して、コンパイル実行部１９にコンパイルの実行を指示する（ステップＳ１０８）。
【００８１】
これに対して、対象エントリーが登録済みの場合（ステップＳ１０６：否定）、バイトコード解釈部１７は、メソッドアドレステーブルの実行フラグを参照して、対象エントリーがコンパイル済みか否かを判定する（ステップＳ１０９）。対象エントリーがコンパイル済みの場合（ステップＳ１０９：肯定）、バイトコード解釈部１７は、対象メソッドの呼出し回数が閾値を超えているか否かにより、最適化を行うか否かを判定する（ステップＳ１１０）。
【００８２】
最適化を行う場合（ステップＳ１１０：肯定）、バイトコード解釈部１７は、メソッドアドレステーブルの実行フラグを参照して、対象メソッドが最適済みか否かを判定する（ステップＳ１１１）。最適化していない場合（ステップＳ１１１：否定）、バイトコード解釈部１７は、そのメソッドの最初のエントリーのエントリーポイントを指定して、最適化の実行をコンパイル実行部１９に指示する（ステップＳ１１２）。これに対して、最適化を行わない場合（ステップＳ１１０：否定）及び最適化済みの場合（ステップＳ１１１：肯定）、バイトコード解釈部１７は、対象メソッドの実行コードを実行するようプログラム実行部１８に指示する。プログラム実行部１８は、指定された実行コードを実行する（ステップＳ１１３）。
【００８３】
次に、バイトコード解釈部１７は、実行コードの最後がｒｅｔｕｒｎ命令か否かを判定する（ステップＳ１１４）。ｒｅｔｕｒｎ命令の場合（ステップＳ１１４：肯定）、バイトコード解釈部１７は、ステップＳ１０４に戻る。これに対して、ｒｅｔｕｒｎ命令で無い場合（ステップＳ１１４：否定）、バイトコード解釈部１７は、実行した実行コードで表されるエントリーのＪａｖａバイトコードにおける次の命令を対象エントリーとしてステップＳ１０２に戻る。
【００８４】
一方、メソッドの呼び出しでない場合（ステップＳ１０３：否定）、ステップＳ１０８を処理した場合及び対象エントリーがコンパイル完了ではない場合（ステップＳ１０９：否定）、バイトコード解釈部１７は、Ｊａｖａバイトコード命令を解釈する。そして、プログラム実行部１８は、解釈されたＪａｖａバイトコード命令を実行する（ステップＳ１１５）。
【００８５】
その後、バイトコード解釈部１７は、分岐命令を検出したか否かを判定する（ステップＳ１１６）。分岐命令を検出した場合（ステップＳ１１６：肯定）、バイトコード解釈部１７は、分岐命令を含むエントリーがコンパイル中であるか否かを判定する（ステップＳ１１７）。エントリーがコンパイル中である場合（ステップＳ１１７：肯定）、バイトコード解釈部１７は、ステップＳ１１５に戻る。
【００８６】
これに対して、エントリーがコンパイル中でない場合（ステップＳ１１７：否定）、バイトコード解釈部１７は、分岐命令のアドレスをリーブポイントとしてエントリーポイントテーブルに登録する（ステップＳ１１８）。そして、バイトコード解釈部１７は、分岐における呼出し先のメソッドを対象メソッドとし、呼出し先のメソッドの最初のエントリーを対象エントリーとしてステップＳ１０４に戻る。
【００８７】
これに対して、分岐命令を検出しない場合（ステップＳ１１６：否定）、バイトコード解釈部１７は、解釈しているメソッドの終了時点で、そのメソッドが他のメソッドの分岐により呼び出されたメソッドであり、分岐前のメソッドに戻るか否かを判定する（ステップＳ１１９）。分岐前のメソッドに戻る場合（ステップＳ１１９：肯定）、分岐前のメソッドを対象メソッドとし、分岐前のメソッドの戻り先の命令以下を対象エントリーとし、ステップＳ１０４に戻る。
【００８８】
これに対して、分岐前のメソッドに戻らない場合（ステップＳ１１９：否定）、バイトコード解釈部１７は、プログラム終了か否かを判定する（ステップＳ１２０）。
【００８９】
プログラムが終了しない場合（ステップＳ１２０：否定）、バイトコード解釈部１７は、ステップＳ１０２へ戻る。
【００９０】
これに対して、プログラムが終了する場合（ステップＳ１２０：肯定）、ＣＰＵ１００は、プログラムの実行処理を終了する（ステップＳ１２１）。
【００９１】
次に、図６を参照して、本実施例に係る情報処理装置のコンパイル処理について説明する。図６は、コンパイル処理のフローチャートである。
【００９２】
コンパイル実行部１９は、エントリーのコンパイル実行の指示をバイトコード解釈部１７から受ける。そして、コンパイル実行部１９は、エントリーのコンパイル状態フラグのコンパイル中のフラグをＯＮに設定する（ステップＳ２０１）。
【００９３】
コンパイル実行部１９は、１つのＪａｖａバイトコード命令のコンパイルを行う（ステップＳ２０２）。
【００９４】
次に、コンパイル実行部１９は、次のＪａｖａバイトコード命令がｒｅｔｕｒｎ命令か否かを判定する（ステップＳ２０３）。
【００９５】
ｒｅｔｕｒｎ命令の場合（ステップＳ２０３：肯定）、コンパイル実行部１９は、ステップＳ２０９へ進む。
【００９６】
これに対して、ｒｅｔｕｒｎ命令でない場合（ステップＳ２０３：否定）、コンパイル実行部１９は、次のＪａｖａバイトコード命令がリーブポイントか否かを判定する（ステップＳ２０４）。
【００９７】
リーブポイントでない場合（ステップＳ２０４：否定）、コンパイル実行部１９は、ステップＳ２０２へ戻る。
【００９８】
これに対して、リーブポイントの場合（ステップＳ２０４：肯定）、コンパイル実行部１９は、リーブポイントが示すエントリーポイントがメソッドアドレステーブルにあるか否かを判定する（ステップＳ２０５）。
【００９９】
エントリーポイントがある場合（ステップＳ２０５：肯定）、コンパイル実行部１９は、リーブポイントが示すエントリーポイントを開始アドレスとする次のエントリーのコンパイル状態フラグのコンパイル中のフラグをＯＮにする（ステップＳ２０６）。そして、コンパイル実行部１９は、次のエントリーポイントからコンパイル元のアドレス、すなわち、コンパイルするＪａｖａバイトコード命令のアドレスを取得する（ステップＳ２０７）。その後、コンパイル実行部１９は、ステップＳ２０２に戻る。
【０１００】
これに対して、エントリーポイントがない場合（ステップＳ２０５：否定）、コンパイル実行部１９は、現在コンパイルしているエントリーのリーブポイントにおいてＪａｖａ戻り命令と戻り先のアドレスを設定する（ステップＳ２０８）。
【０１０１】
そして、コンパイル実行部１９は、メソッドアドレステーブルの開始アドレスにコンパイル結果のアドレス、すなわちメソッドの最初のエントリーポイントのアドレスを登録する（ステップＳ２０９）。
【０１０２】
そして、コンパイル実行部１９は、コンパイルを行なった各エントリーのコンパイル状態フラグにおけるコンパイル済みのフラグをＯＮに設定し、さらに、メソッドの実行フラグにおけるコンパイル済みのフラグをＯＮに設定する（ステップＳ２１０）。
【０１０３】
また、コンパイル実行部１９は、コンパイルを行なった各エントリーのコンパイル状態フラグにおけるコンパイル中のフラグをＯＦＦに設定する（ステップＳ２１１）。
【０１０４】
次に、図７〜図１０−２を参照して、サンプルプログラムを例に本実施例に係る情報処理装置の処理の全体的な流れについて説明する。図７は、Ｊａｖａプログラミング言語で記述されたサンプルプログラムのソースコードを示す図である。図８は、サンプルプログラムのＪａｖａコンパイル結果の概要を示す図である。図９は、サンプルプログラムから生成されたメソッドアドレステーブルを示す図である。図１０−１は、サンプルプログラムから生成された実行コードを示す第１の図である。また、図１０−２は、サンプルプログラムから生成された実行コードを示す第２の図である。図１０−２は図１０−１のプログラムの続きである。
【０１０５】
図７に示すように、ここで用いるサンプルプログラムは、１つのクラスファイルでできている。そして、そのクラスファイルは、メソッド４０１とメソッド４０２という２つのメソッドを有している。
【０１０６】
図８に示すコードは、図７のサンプルプログラムのソースコードをコンパイルしてＪａｖａバイトコードに変換したものである。
【０１０７】
図８に示すようなＪａｖａバイトコードで記述されたプログラムが、Ｊａｖａバイトコード命令記憶部１４に格納されている。
【０１０８】
そして、バイトコード解釈部１７によって、図８に示すプログラムは、エントリー５０１〜５０４及び５１１〜５１４で構成されていると認識される。図７のメソッド４０１がエントリー５０１〜５０４に対応し、メソッド４０２がエントリー５１１〜５１４に対応している。
【０１０９】
具体的には、エントリー５０１の次の行（（０ｘＡ２）ｉｃｍｐｇｅの命令コードを含む行）で条件による分岐が発生し、リーブポイントとなるため、エントリー５０１が一つのエントリーとなる。また、エントリー５０２の次の行（（０ｘＢ８）ｉｎｖｏｋｅｓｔａｔｉｃの命令コードを含む行）でメソッド４０２を呼出す分岐が発生し、リーブポイントとなるので、エントリー５０２が一つのエントリーとなる。さらに、エントリー５０３の次の行（（０ｘＡ７）ｇｏｔｏの命令コードを含む行）で他の行への分岐が発生し、リーブポイントなるので、エントリー５０３が一つのエントリーとなる。そして、エントリー５０３の後、メソッド４０１のｒｅｔｕｒｎ命令まで分岐が無いので、エントリー５０３の後からｒｅｔｕｒｎ命令までが一つのエントリー５０４となる。
【０１１０】
また、エントリー５１１の次の行（（０ｘＡ２）ｉｃｍｐｇｅの命令コードを含む行）で条件による分岐が発生し、リーブポイントとなるため、エントリー５１１が一つのエントリーとなる。また、また、エントリー５１２の次の行（（０ｘＢ８）ｉｎｖｏｋｅｓｔａｔｉｃの命令コードを含む行）でメソッド４０１を呼出す分岐が発生し、リーブポイントとなるので、エントリー５１２が一つのエントリーとなる。さらに、エントリー５１３の次の行（（０ｘＡ７）ｇｏｔｏの命令コードを含む行）で他の行への分岐が発生し、リーブポイントなるので、エントリー５１３が一つのエントリーとなる。そして、エントリー５１３の後、メソッド４０２のｒｅｔｕｒｎ命令まで分岐が無いので、エントリー５１３の後からｒｅｔｕｒｎ命令までが一つのエントリー５１４となる。
【０１１１】
そして、図８におけるエントリー５０１〜５０４及び５１１〜５１４に基づいて、バイトコード解釈部１７が生成したメソッドアドレステーブルが図９に示すメソッドアドレステーブルである。図９におけるテーブル６０２は、メソッドアドレステーブル６０１におけるエレメント＃０の中身を表している。また、テーブル６０３は、テーブル６０２におけるエントリーポイントテーブルの中身を表している。また、図９のメソッドアドレステーブルは、バイトコード解釈部１７によるエントリーポイント及びリーブポイントの設定が終わった後に、コンパイル実行部１９によってコンパイルが終了した状態を表している。
【０１１２】
まず、メソッド４０１及び４０２という２つのメソッドがあるので、各メソッドに対応させてエレメント＃０及び＃１の領域が確保される。図９では、エレメント＃０がメソッド４０２に対応し、エレメント＃１がメソッド４０１に対応している。
【０１１３】
そして、例えば、エレメント＃０には、メソッド名として、メソッド４０２の名前である「ｍａｉｎ」が登録されている。また、開始アドレスとして、メソッド４０２の開始アドレスが登録されている。また、メソッドサイズには、メソッド４０２のサイズである２１が登録されている。また、実行フラグには、コンパイル実行部１９によりコンパイル済みフラグがＯＮに設定されている。
【０１１４】
そして、テーブル６０３は、図８におけるエントリー５０１〜５０４及び５１１〜５１４に基づいて、バイトコード解釈部１７が生成したエントリーポイントテーブルである。
【０１１５】
メソッド４０１の中のエントリーは全部で４つあるので、バイトコード解釈部１７は、エントリーカウンタを４とする。さらに、バイトコード解釈部１７は、最初のエントリーのエントリーポイントとしてエントリー５１１の開始アドレスを登録する。さらに、最初のエントリーのコンパイルが開始されているので、コンパイル実行部１９によりコンパイル済みのフラグがＯＮにされている。そして、バイトコード解釈部１７は、リーブポイントとして、エントリー５１１の分岐のアドレスである２１のアドレスを登録している。さらに、コンパイル実行部１９により、エントリー生成アドレスとして、エントリー５１１をコンパイルした実行コードの開始アドレスが登録されている。そして、コンパイル実行部１９により、出口アドレスとして、エントリー５１１をコンパイルした実行コードの戻り先のアドレスが登録されている。
【０１１６】
同様に、バイトコード解釈部１７は、エントリー５１２〜５１４までの登録を行い。また、コンパイル実行部１９は、エントリー５１２〜５１４における実行フラグの設定、エントリー生成アドレスの登録及び出口アドレスの登録を行う。ここで、図９では、エントリーポイントテーブルにおけるエントリー５１２及び５１３に対する登録は図示を省略している。
【０１１７】
そして、図９に示すメソッドアドレステーブル６０１を用いて、コンパイル実行部１９がＪａｖａバイトコード命令のコンパイルを行なった結果が図１０−１及び図１０−２に示す実行コードのプログラムである。実行コード７０１が、エントリー５１３にあたる。また、実行コード７０２が、エントリー５１４にあたる。また、実行コード７０３が、エントリー５０１にあたる。また、実行コード７０４が、エントリー５０２にあたる。また、実行コード７０５が、エントリー５１１にあたる。また、実行コード７０６が、エントリー５１２にあたる。また、実行コード７０７が、エントリー５０３にあたる。また、実行コード７０８が、エントリー５０４にあたる。このように、実際に実行される処理だけコンパイル対象とすることにより、コンパイル時間及びメモリ資源の消費量を抑えることができる。
【０１１８】
［ハードウェア構成］
以下では、図１１を用いて、本実施例に係る情報処理装置のハードウェア構成について説明する。図１１は、実施例に係る情報処理装置のハードウェア構成図である。
【０１１９】
図１１に示すように、本実施例に係る情報処理装置１は、メモリ８０１、キャッシュ８０２、ハードディスク８０３、ＣＰＵ１００及びＣＰＵ２００を有する。
【０１２０】
メモリ８０１、キャッシュ８０２、ハードディスク８０３、ＣＰＵ１００及びＣＰＵ２００は、バス８０４によって接続されている。
【０１２１】
ハードディスク８０３には、Ｊａｖａバイトコード命令で記述されたプログラム、ランタイムライブラリなどが格納されている。また、ハードディスク８０３には、図１に示す情報処理装置１の機能を実現するための各種プログラムが格納されている。
【０１２２】
そして、ＣＰＵ１００は、これらの各種プログラムを読み出して実行する。これによりＪａｖａＶＭがメモリ８０１上に展開される。ＣＰＵ１００は、ＪａｖａＶＭを制御してバイトコード解釈部１７の機能を実現させる。さらに、ＪａｖａＶＭからの命令を受けて、ＣＰＵ２００は、コンパイル実行部１９の機能を有するコンパイラを起動する。
【０１２３】
また、ＣＰＵ１００は、ハードディスク８０３のＪａｖａバイトコード命令で記述されたプログラム及びランタイムライブラリを読み込みメモリ８０１上に展開する。これにより、メモリ８０１が、ランタイムライブラリ記憶部１２及びＪａｖａバイトコード命令記憶部１４の機能を実現する。
【０１２４】
また、メモリ８０１及びキャッシュ８０２が、Ｊａｖａワーク領域部１１、コンパイルワーク領域部１３、コンパイル結果格納部１５及び関数アドレステーブル格納部１６の機能を実現する。
【０１２５】
なお、上記した図１に示す情報処理装置１の機能を実現するためのプログラムについては、必ずしもハードディスク８０３に記憶させなくてもよい。例えば、情報処理装置１に挿入されるフレキシブルディスク、ＣＤ−ＲＯＭ（Compact  Disk  Read  Only  Memory）、ＤＶＤ（Digital  Versatile  Disk）又はＩＣ（Integrated  Circuit）カードなどの「可搬用の物理媒体」にプログラムを記憶させてもよい。または、情報処理装置１の外に備えられるハードディスクドライブなどの「固定用の物理媒体」にプログラムを記憶させてもよい。または、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介して情報処理装置１に接続される「他のコンピュータ（またはサーバ）」にプログラムを記憶させてもよい。そして、情報処理装置１は、上述したフレキシブルディスク等から各プログラムを読み出して実行するようにしてもよい。
【０１２６】
以上に説明したように、本実施例に係る情報処理装置は、プログラムの処理の実行要求が発生した場合に、コンパイルを待つことなくバイトコード解釈部及びプログラム実行部が直ぐに実行を開始できるので、実行開始までの待機時間が軽減できる。また、コンパイル完了後には、ＣＰＵによるコンパイル結果の直接実行が行なえるので、処理を高速に実行することができる。さらに、マルチコアシステムにおいては、異なるＣＰＵ間でテーブルなどのデータを共有する場合、同じデータのアクセス競合を避けるために、ＣＰＵ間の同期やインターロックを行う必要があり、処理性能の低下を招くことが多い。これに対して、本実施例に係る情報処理装置では、互いに同じ情報を書き込むことがなくデータの不整合が発生しないので、ＣＰＵ間の同期やインターロック処理が不要である。これにより、本実施例に係る情報処理装置においては、マルチコアシステムを用いたＪａｖａプログラムの実行及びコンパイルを効率よく行なうことができる。
【０１２７】
また、本実施例に係る情報処理装置は、Ｊａｖａバイトコードの解釈及び実行を行うＣＰＵと異なるＣＰＵによりコンパイル処理を独立して行う。これにより、コンパイラ処理の負荷が高くても、Ｊａｖａバイトコードの解釈及び実行の処理に影響を与えず、高速処理が可能となる。
【０１２８】
また、以上の説明では、マルチコアシステムとして、ＣＰＵが２つの場合で説明したが、３つ以上のＣＰＵを備えている場合にも同様の処理が可能である。例えば、複数のＣＰＵにてメソッド毎にコンパイルを実行させるなどができ、よりコンパイル処理を高速化することができる。
【符号の説明】
【０１２９】
１  情報処理装置
１１  Ｊａｖａワーク領域部
１２  ランタイムライブラリ記憶部
１３  コンパイルワーク領域部
１４  Ｊａｖａバイトコード命令記憶部
１５  コンパイル結果格納部
１６  関数アドレステーブル格納部
１７  バイトコード解釈部
１８  プログラム実行部
１９  コンパイル実行部
１００、２００  ＣＰＵ
【図１】
2013061810.tif 000003
【図２】
2013061810.tif 000004
【図３】
2013061810.tif 000005
【図４】
2013061810.tif 000006
【図５】
2013061810.tif 000007
【図６】
2013061810.tif 000008
【図７】
2013061810.tif 000009
【図８】
2013061810.tif 000010
【図９】
2013061810.tif 000011
【図１０−１】
2013061810.tif 000012
【図１０−２】
2013061810.tif 000013
【図１１】
2013061810.tif 000014