説明

情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラム

【課題】中間コード命令で記述されたプログラムの実行及びコンパイルを効率的に行うことができる情報処理装置を提供する。
【解決手段】CPU100は、実行ルートに沿って中間コード命令を順次読込み、コンパイル結果格納部15に読み込んだ中間コード命令のコンパイル結果があるか否かを判定し、コンパイル結果が無ければ中間コード命令の解釈を行ない、コンパイル結果があればコンパイル結果を指定するバイトコード解釈部17と、バイトコード解釈部17から中間コード命令の解釈結果を受けた場合、中間コード命令を実行し、コンパイル結果の指定を受けた場合、指定されたネイティブコードを実行するプログラム実行部18とを備える。CPU200は、バイトコード解釈部17により解釈された中間コード命令をコンパイルしてネイティブコードを生成しコンパイル結果格納部15に格納するコンパイル実行部19を備える。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムに関する。
【背景技術】
【0002】
Java(登録商標)プログラムなどを情報処理装置で実行する場合、従来いくつかの方法が知られている。
【0003】
一つの方法として、インタプリタ方式と呼ばれる方式がある。インタプリタ方式の場合、まず、情報処理装置はソースファイルをコンパイルしてJavaバイトコードと呼ばれる中間コードに変換する。そして、情報処理装置は、JavaVM(Virtual Machine)でJavaバイトコードを解釈し、その解釈に基づいてCPU(Central Processing Unit)で処理を実行することで、プログラムを実行していく。
【0004】
また、他の方法として、アクセラレータ方式という方式がある。アクセラレータ方式は、Javaバイトコードをハードウェアにより実行する方式である。例えば、プログラム中のJavaバイトコードのうち一部のコードをハードウェアで実行し、比較的複雑な動作が必要なJavaバイトコードの実行はソフトウェアにより実行するといった方式である。アクセラレータ方式は、インタプリタ方式と比較して、一般的には処理を高速に実行できる。
【0005】
さらに、他の方法として、JIT(Just In Time)コンパイラ方式という方式がある。JITコンパイラ方式は、Javaバイトコードを一部ずつコンパイルして実行コード(ネイティブコードとも呼ばれる。)に変換しながら、実行コードをCPUが直接実行する方式である。JITコンパイラ方式では、連続したJavaバイトコードを、最適化してコンパイル(実行命令展開)することが可能なため、コンパイル結果は高速に実行できる。
【0006】
さらに、プログラムの実行に係る時間を短縮する技術として、次のような従来技術があった。第1として、シングルCPUシステムにおけるマルチタスク処理により、バイトコード実行とコンパイル処理を並列に行う従来技術があった(例えば特許文献1)。また、第2として、Javaプログラムを一つのCPUにより中間コードで表現し、他のCPUによりクラスファイル単位でのコンパイルを行い、当該他のCPUによりコンパイル結果を実行する従来技術があった(例えば特許文献2)。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2004−355277号公報
【特許文献2】特開2005−108126号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、従来のインタプリタ方式では、実行時にJavaバイトコードの解釈を行ないながらプログラムを実行するため、個々の処理の実行が遅くなり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Javaプログラムの実行を効率的に行うことが困難であった。
【0009】
また、従来のアクセラレータ方式では、ハードウェアのJavaアクセラレータ回路を実装しなければならず、コストがかかってしまう。また、ハードウェア回路にて命令を実行する場合、冗長な処理が存在しても最適化できず、処理の実行が遅くなり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Javaプログラムの実行を効率的に行うことが困難であった。
【0010】
また、JITコンパイル方式では、Javaバイトコードをコンパイルするための時間が必要となる。Javaプログラムは、Javaバイトコードのクラスファイル単位又はクラスファイルに含まれる処理単位(「メソッド」と呼ばれる)でコンパイルを行い、当該クラスファイル又はメソッドのコンパイルが完了した時点で、その処理を呼び出して実行する。そのため、長大なクラスファイル又はメソッドの場合、コンパイルに時間がかかってしまい、処理の開始が遅延するため、プログラムの実行における全体的な時間が長くなってしまう。また、長大なクラスファイル又はメソッドでは、実際に実行させる処理はそのクラスファイル又はメソッドの一部である場合も多く、その場合、無駄なコンパイル処理に時間がかかってしまうという問題があった。そのため、Javaプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【0011】
さらに、第1の従来技術では、複数のCPUを用いた場合コンパイル要求のキューの入れ替えなどで不具合が発生するため、マルチコアシステムに適応することが困難であった。そのため、コンパイルとJavaバイトコードの実行とを並列で行うことができず、コンパイルの時間により、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Javaプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【0012】
また、第2の従来技術では、メソッドのようなブロック単位でのコンパイルに適用しようとしても、コンパイルのタイミングやコンパイル結果の受け渡しなどの動作が不明であり、ブロック単位でのコンパイルに適用することは困難である。クラス単位でのコンパイルでは、無駄なコンパイルなどが発生するおそれがあり、やはり、プログラムの実行における全体的な時間が長くなってしまっていた。そのため、Javaプログラムの実行及びコンパイルを効率的に行うことが困難であった。
【0013】
開示の技術は、上記に鑑みてなされたものであって、Javaプログラムの実行及びコンパイルを効率的に行うことができる情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムを提供することを目的とする。
【課題を解決するための手段】
【0014】
本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムは、一つの態様において、少なくとも2つのCPU及び中間コード命令のコンパイル結果を記憶する記憶部を有する情報処理装置であって、一方のCPUは、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、前記記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、該中間コード命令のコンパイル結果が無ければ前記中間コード命令の解釈を行ない、該中間コード命令のコンパイル結果があれば該コンパイル結果を指定する中間コード解釈部と、前記中間コード解釈部から前記中間コード命令の解釈結果を受けた場合、解釈結果に基づき該中間コード命令を実行し、前記中間コード解釈部からコンパイル結果の指定を受けた場合、指定されたコンパイル結果であるネイティブコードを実行することで前記プログラムを実行するプログラム実行部とを備える。また、他方のCPUは、前記中間コード解釈部により解釈された前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを前記記憶部に格納するコンパイル実行部を備える。
【発明の効果】
【0015】
本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムの一つの態様によれば、Javaプログラムの実行及びコンパイルを効率的に行うことができるという効果を奏する。
【図面の簡単な説明】
【0016】
【図1】図1は、実施例に係る情報処理装置のブロック図である。
【図2】図2は、メソッドアドレステーブルを説明するための図である。
【図3】図3は、実行フラグを説明するための図である。
【図4】図4は、コンパイル状態フラグを説明するための図である。
【図5】図5は、メイン処理のフローチャートである。
【図6】図6は、コンパイル処理のフローチャートである。
【図7】図7は、Javaプログラミング言語で記述されたサンプルプログラムのソースコードを示す図である。
【図8】図8は、サンプルプログラムのJavaコンパイル結果の概要を示す図である。
【図9】図9は、サンプルプログラムから生成されたメソッドアドレステーブルを示す図である。
【図10−1】図10−1は、サンプルプログラムから生成された実行コードを示す第1の図である。
【図10−2】図10−2は、サンプルプログラムから生成された実行コードを示す第2の図である。
【図11】図11は、実施例に係る情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【0017】
以下に、本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラムが限定されるものではない。特に、以下の説明ではJavaのプログラムを例に説明するが、中間コードを用いて実行させるプログラムであれば他のプログラムでもよい。
【実施例】
【0018】
図1は、実施例に係る情報処理装置のブロック図である。図1に示すように、本実施例に係る情報処理装置1は、Javaワーク領域部11、ランタイムライブラリ記憶部12、コンパイルワーク領域部13、Javaバイトコード命令記憶部14、コンパイル結果格納部15、関数アドレステーブル格納部16、バイトコード解釈部17、プログラム実行部18及びコンパイル実行部19を有している。
【0019】
そして、図1において点線で囲まれたブロックはCPU100及びCPU200によって機能が実現されるブロックを表している。そして、CPU100によって、バイトコード解釈部17及びプログラム実行部18の機能が実現される。また、CPU200によって、コンパイル実行部19の機能が実現される。すなわち、バイトコード解釈部17及びプログラム実行部18における処理とコンパイル実行部19における処理とは異なるCPUによって実行される。図1において点線で囲まれたブロックの範囲外に図示された構成は、CPU100又はCPU200の内部に設けられた記憶手段により実現されてもよいし、CPU100及びCPU200の外部に設けられた記憶手段により実現されてもよい。
【0020】
Javaワーク領域部11は、Javaプログラムの実行において、計算などの処理が行われている間に使用される記憶領域である。例えば、計算途中のデータは、Javaワーク領域部11に記憶され、その後、再度計算に用いられる。そして、Javaワーク領域部11に記憶されているデータが再度計算に用いられる場合、Javaワーク領域部11から当該データが読み出され、Javaワーク領域部11に格納されていたデータは削除される。このように、Javaワーク領域部11には、Javaプログラムを実行している間に、データの読書きの場所として一時的に用いられる。
【0021】
ランタイムライブラリ記憶部12は、Javaプログラムを実行するための予め定義された関数群などを記憶している。
【0022】
コンパイルワーク領域部13は、コンパイル処理が行われている間に使用される記憶領域である。例えば、コンパイル処理途中のデータは、コンパイルワーク領域部13に記憶され、その後、再度コンパイル処理に用いられる。そして、コンパイルワーク領域部13にあるデータが再度コンパイルに用いられる場合、コンパイルワーク領域部13から当該データが読み出され、コンパイルワーク領域部13に格納されていたデータは削除される。このように、コンパイルワーク領域部13は、コンパイル処理を実行している間に、データの読書きの場所として一時的に用いられる。
【0023】
Javaバイトコード命令記憶部14は、Javaバイトコードで記述されたJavaプログラムを記憶している。このJavaバイトコードで記述されたJavaプログラム(クラスファイル)は、Javaプログラミング言語で記述されているソースコードをコンパイルすることによって、中間コードであるJavaバイトコードに変換することで生成される。以下では、Javaバイトコードで記述されたJavaプログラムに含まれる命令を、「Javaバイトコード命令」という。Javaバイトコード命令は、一般的には、CPUによって直接実行可能な命令セットではなく、例えば、Java仮想マシン仕様により規定される仮想的な命令セットである。そのため、実行時の動作環境に応じてCPUで実行可能な命令セットに解釈された後に、CPUによって実行される。
【0024】
コンパイル結果格納部15は、後述するコンパイル実行部19によって行なわれたJavaバイトコード命令のコンパイル結果を格納する。
【0025】
関数アドレステーブル格納部16は、コンパイルに用いる関数のアドレスが記載された関数アドレステーブルを記憶している。また、関数アドレステーブル格納部16は、後述するバイトコード解釈部17が生成するメソッドアドレステーブルを記憶している。メソッドアドレステーブルについては後で詳細に説明する。
【0026】
バイトコード解釈部17は、JavaVMにより実現される。バイトコード解釈部17は、Javaプログラムの実行開始が指示されると、Javaバイトコード命令記憶部14からJavaバイトコードで記述されたJavaプログラムを順次読み込む。
【0027】
そして、バイトコード解釈部17は、読み込んだJavaプログラム(クラスファイル)に記載されているJavaバイトコード命令を順次解釈していく。バイトコード解釈部17が読み込むJavaプログラムには、ランタイムライブラリファイルと呼ばれる処理の集まりを含む。クラスファイルには、メソッドと呼ばれる手続き(処理)が規定されている。から構成されている。このメソッドが「中間コード命令群」の一例にあたる。そして、メソッドは、処理の開始から終了までが記載されている。メソッドにおける処理の終了は、「return」命令(例えば、0xb1などのバイトコード)などで指定される。
【0028】
バイトコード解釈部17は、Javaバイトコード命令を順次解釈していく間に、メソッドの呼出し命令が出現すると、呼出し先のメソッドの開始アドレスを取得する。呼び出し先のメソッド開始アドレスとは、そのメソッドの開始点となる命令が格納されたメモリアドレスを指す。そして、バイトコード解釈部17は、取得したメソッドの開始アドレスをエントリーポイントとする。
【0029】
バイトコード解釈部17は、関数アドレステーブル格納部16に格納されているメソッドアドレステーブルに見つけたメソッドが登録されているか否かを検索する。メソッドがメソッドアドレステーブルに登録されていない場合、バイトコード解釈部17は、新たにメソッドを表すエレメントの領域をメソッドアドレステーブルに確保する。
【0030】
その後、バイトコード解釈部17は、メソッドアドレステーブルに確保されたエレメントの領域にメソッド名やエントリーポイントテーブルなどの各種情報を登録していく。ここでバイトコード解釈部17によるメソッドアドレステーブルへの各種情報の登録の説明の前に、メソッドアドレステーブルについて説明する。
【0031】
図2は、メソッドアドレステーブルを説明するための図である。図2に示すテーブル300がメソッドアドレステーブルの大枠を示している。また、テーブル310は、メソッドアドレステーブルの各エレメントのデータ構造を表している。さらに、テーブル320は、エレメントに記載されたエントリーポイントテーブル315のデータ構造を表している。
【0032】
メソッドアドレステーブルには、実行するJavaプログラムに含まれるメソッドに対応させて連番で各エレメントの領域が確保されている。バイトコード解釈部17は、Javaプログラムの実行を開始して最初に見つけたメソッドに対して0番をふり、メソッドアドレステーブルにエレメント#0の領域301を確保する。また、バイトコード解釈部17は、メソッドアドレステーブルに既にエレメントの領域が確保されている場合、メソッドに対して既に使用されている最大の番号の次の順番の番号を割り当て、その番号を付加したエレメントの領域を確保する。例えば、n番目に見つけたメソッドであれば、そのメソッドに対してエレメント#nの領域302を確保する。このように、バイトコード解釈部17は、メソッドを見つけるたびに、見つけたメソッドに対して順番に番号を割り当て、その番号を付加したエレメントの領域をメソッドアドレステーブルに確保していく。
【0033】
さらに、エレメントの領域には、テーブル310に示すようにそのエレメントに対応するメソッドのメソッド名311、開始アドレス312、メソッドサイズ313、実行フラグ314及びエントリーポイントテーブル315が登録される。図2では、一例としてエレメント#0を例に記載しているが、バイトコード解釈部17は、他のエレメントにおいても同様のデータ構造を持つようにメソッドアドレステーブルを作成する。以下では、メソッド名311、開始アドレス312、メソッドサイズ313、実行フラグ314及びエントリーポイントテーブル315を任意のメソッド対応するデータとして説明する。
【0034】
メソッド名311は、エレメントに対応するメソッドの名前である。バイトコード解釈部17は、エレメントの領域を確保した時点で、そのエレメントに対応するメソッドの名前をメソッド名311に登録する。
【0035】
また、開始アドレス312は、エレメントに対応するメソッドの開始アドレスである。後述する、コンパイル実行部19は、メソッドのコンパイルが終了すると、メソッドの開始アドレスを開始アドレス312に登録する。
【0036】
メソッドサイズ313は、エレメントに対応するメソッドのサイズである。バイトコード解釈部17は、エレメントの領域を確保した時点で、メソッドの先頭からreturn命令までのサイズを確認し、確認したサイズをそのエレメントに対応するメソッドのサイズとしてメソッドサイズ313に登録する。
【0037】
実行フラグ314は、例えば図3に示すようなフラグ341〜344を有している。図3は、実行フラグを説明するための図である。フラグ341〜344は、いずれも記載された値が1の場合がONであり、記載された値が0であればOFFである。フラグ341は、最適化が完了しているか否かを表すフラグである。フラグ341がONの場合には、そのメソッドに対して最適化が完了していることを表している。ここで、最適化とは、例えば、連続して呼び出される処理のコンパイル結果を統合することなどである。フラグ342は、複数個所からの呼び出しがあり最適化が必要か否かを示すフラグである。フラグ342がONの場合には、そのメソッドに対して複数個所からの呼び出しがあることを表している。フラグ343は、メソッド呼出しアドレスがメソッドアドレステーブルに設定済みか否かを表すフラグである。フラグ343がONの場合には、Javaプログラムの中でそのメソッドをコンパイル結果である実行コードの呼出しアドレスが設定済みであることを表している。フラグ344は、コンパイル済みか否かを表している。フラグ344がONの場合には、そのメソッドが既にコンパイルされていることを表している。例えば、図3に示す実行フラグ314の状態では、フラグ343及びフラグ344がONであるので、コンパイル済みで且つメソッド呼出しアドレスが設定済みであることを示している。フラグ341〜344は、後述するコンパイル実行部19により設定される。フラグ341〜344のコンパイル実行部19による設定の詳細については後で説明する。
【0038】
次に、エントリーポイントテーブル315について説明する。エントリーポイントテーブル315は、テーブル320に示すように、そのメソッドについて、いくつのエントリーがあるかを示すエントリーカウンタ321を有する。エントリーとは、コンパイル実行部19によってコンパイル処理が行われる単位である。コンパイル単位は、後述するようにバイトコード解釈部17によって指定される。このエントリーが「分割命令群」の一例にあたる。
【0039】
ここで、コンパイル単位について説明する。例えば、あるメソッドについて、コンパイル実行部19がそのメソッドの開始点からreturn命令までをまとめてコンパイルした場合、そのメソッドについてのエントリーの数は1となる。また、後述するように、メソッドの中で他のメソッドを呼び出すなどの分岐がバイトコード解釈部17によって指定されている場合、メソッドの開始からその分岐までが一つのコンパイル単位であり、一つのエントリーとなる。例えば、(0xB6)invokevirtualなどの呼び出し命令や、(0xA7)goto命令などによる分岐までが一つのコンパイル単位となり得る。さらに、他のメソッドの呼出し後、呼出しもとのメソッドに戻ってきた後に、さらに分岐がバイトコード解釈部17によって指定されている場合、戻ってきた位置から次の分岐までが一つのコンパイル単位であり、一つのエントリーとなる。また、戻ってきた後に、分岐がなくreturn命令まで進んだ場合には、戻ってきた位置からreturn命令までが一つのコンパイル単位であり、一つのエントリーとなる。
【0040】
さらに、エントリーポイントテーブル315における各エントリーのデータ構造について説明する。図2では、エントリーとして、最初(0番目)のエントリー330及びn番目のエントリー331を例に記載しているが、0〜nまでの全てのエントリーが、エントリーポイントテーブル315に記載されている。
【0041】
エントリーポイント322は、エントリーの開始のJavaバイトコードにおけるアドレスを表している。
【0042】
コンパイル状態フラグ323は、そのエントリーのコンパイル状態を示すフラグである。図4は、コンパイル状態フラグを説明するための図である。本実施例では、コンパイル状態フラグ323には、フラグ351〜353までのフラグが設けられている。
【0043】
フラグ351は、最適化済みか否かを表すフラグである。フラグ352は、コンパイル中か否かを表すフラグである。フラグ353は、コンパイル済みか否かを表すフラグである。フラグ351〜353は、コンパイル実行部19によって設定される。コンパイル実行部19によるフラグ351〜353の設定については後で説明する。
【0044】
リーブポイント324は、エントリーの終了位置である分岐のJavaバイトコードにおけるアドレスを表している。例えば、(0xB1)return命令や、(0xB6)invokevirtualなどの呼出し命令や、(0xA7)goto命令などの処理の流れが変わる命令コードが出現する位置(アドレス)をエントリーの終了位置とすればよい。
【0045】
エントリー生成アドレス325は、コンパイル結果の開始アドレスを示している。
【0046】
出口アドレス326は、コンパイル結果である実行コードの戻り先アドレスを示している。出口アドレス236は、次の処理されるバイトコードの所在を示し、複数回に亘って処理が呼出される場合に、後述するコンパイル実行部19による処理の最適化における指標となる。
【0047】
次に、バイトコード解釈部17によるエントリーポイントテーブル315の生成について説明する。
【0048】
バイトコード解釈部17は、Javaバイトコード命令で記載されたJavaプログラムを読み込み、メソッドの呼出し命令を見つけると、まずメソッドの開始アドレスをそのメソッドの最初のエントリーポイントとする。そして、バイトコード解釈部17は、そのエントリーポイントが既にエントリーポイントテーブル315に登録されているか否かを判定する。
【0049】
(エントリーポイントが登録されていない場合)
エントリーポイントがエントリーポイントテーブル315に登録されていなければ、バイトコード解釈部17は、エントリーポイントテーブル315の最初のエントリーとしてエントリーポイント322にメソッドの開始アドレスを登録する。そして、バイトコード解釈部17は、コンパイルの実行をコンパイル実行部19に指示する。その後、バイトコード解釈部17は、そのメソッドの解釈を進める。そして、バイトコード解釈部17は、解釈結果をプログラム実行部18へ出力する。
【0050】
エントリーポイント作成後、バイトコード解釈部17は、メソッドの解釈を進めて、メソッドの分岐を検出した場合、そのエントリーのコンパイル状態フラグ323を確認し、そのエントリーがコンパイル中か否かを判定する。コンパイル中の場合、バイトコード解釈部17は、そのままメソッドの解釈を進める。その後、分岐を検出する都度、バイトコード解釈部17は、コンパイル中であることを確認し、Javaバイトコードの解釈を進める。そして、バイトコード解釈部17は、メソッドのreturn命令を検出すると、return命令のアドレスをリーブポイント324としてエントリーポイントテーブル315に記載する。そして、return命令の検出によりそのメソッドの解釈が終了すると、バイトコード解釈部17は、次のメソッドを検出後、検出したメソッドに対して上述したメソッドの開始を見つけた場合の処理を開始する。
【0051】
これに対して、分岐を検出したときにそのエントリーがコンパイル中で無い場合、バイトコード解釈部17は、分岐命令のアドレスをリーブポイント324としてエントリーポイントテーブル315に記載する。ここで、リーブポイントで指定されている戻り先アドレスは、分岐における呼出し先のメソッドである。そこで、バイトコード解釈部17は、上述したメソッドの開始を見つけた場合の処理を開始する。
【0052】
さらに、分岐後、return命令などにより分岐前のメソッドに戻ってきた場合、バイトコード解釈部17は、分岐命令の次に位置する命令コードのアドレスをそのメソッドにおける次のエントリーポイントとする。そして、バイトコード解釈部17は、エントリーポイントテーブル315の次のエントリーとしてエントリーポイント322にメソッドの開始アドレスを登録する。そして、バイトコード解釈部17は、そのエントリーポイントから始まるエントリーのコンパイルの実行をコンパイル実行部19に指示する。その後、バイトコード解釈部17は、そのメソッドの解釈を進める。そして、バイトコード解釈部17は、解釈結果をプログラム実行部18へ出力する。その後、バイトコード解釈部17は、上述した分岐の処理を繰り返す。そして、バイトコード解釈部17は、メソッドのreturn命令を検出すると、return命令のアドレスをリーブポイント324としてエントリーポイントテーブル315に記載する。そして、return命令の検出によりそのメソッドの解釈が終了すると、バイトコード解釈部17は、次のメソッドを検出後、検出したメソッドに対して上述したメソッドの開始を見つけた場合の処理を開始する。
【0053】
(エントリーポイントが登録されている場合)
これに対して、エントリーポイントテーブル315に既に登録されている場合、コンパイル状態フラグ323を確認し、そのエントリーがコンパイル済みであるか否かを判定する。コンパイル済みであれば、バイトコード解釈部17は、エントリー生成アドレス325を確認し、エントリー生成アドレス325に記載されたアドレスにあるコンパイル済みの実行コードを実行する。その後、バイトコード解釈部17は、実行コードのリーブポイントに指定されたJavaバイトコードの戻り先アドレスから解釈を開始する。ここでリーブポイントは、分岐かreturn命令のいずれかにあたる。例えば、(0xB1)return命令や、(0xB6)invokevirtualなどの呼出し命令や、(0xA7)goto命令などの処理の流れが変わる命令コードが出現する位置を、リーブポイントとすればよい。その他にも、Java仮想マシン仕様(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などの命令コードをリーブポイントの対象としてもよい。例えば、リーブポイントで指定されている戻り先アドレスは、分岐における呼出し先のメソッドか、メソッドの終了位置である。戻り先アドレスが呼出し先のメソッドの場合、バイトコード解釈部17は、上述したメソッドの開始を見つけた場合の処理を開始する。戻り先アドレスがメソッドの終了位置の場合、バイトコード解釈部17は、そこからJavaバイトコードの解釈を進め次のメソッドを見つけると、上述したメソッドの開始を見つけた場合の処理を開始する。
【0054】
また、バイトコード解釈部17は、一つのエントリーを作成する毎に、エントリーカウンタ321をインクリメントしていく。
【0055】
バイトコード解釈部17は、プログラムに記載されたJavaバイトコード命令を実行する処理を行ないながら、各メソッドに対して以上に説明したエントリーポイントの作成処理を繰り返す。これにより、バイトコード解釈部17は、プログラムの実行の流れに合わせて、メソッドの中で使用されるエントリーを抽出してコンパイル対象として指定することができる。
【0056】
また、バイトコード解釈部17は、コンパイルが終了したエントリーを再度呼び出した場合、そのエントリーに該当するJavaバイトコード命令にそのエントリーのコンパイル結果である実行コードの呼出しアドレスを埋め込む。そして、バイトコード解釈部17は、該当する実行コードのアドレスをプログラム実行部18に通知する。また、バイトコード解釈部17は、実行コードの呼出しアドレスの埋め込みをコンパイル実行部19へ通知する。
【0057】
また、バイトコード解釈部17は、Javaバイトコードの中にメソッドに対応した実行コードの呼出しアドレスが設定されている場合には、呼び出されているアドレスをプログラム実行部18に通知する。
【0058】
また、バイトコード解釈部17は、最適化を行う閾値である、メソッドの呼び出し回数の閾値を記憶している。そして、バイトコード解釈部17は、メソッドが呼び出された回数をカウントしていき、そのカウント数が閾値以上となったかを確認する。メソッドの呼び出された回数が閾値以上となった場合、バイトコード解釈部17は、そのメソッドの最適化処理の実行をコンパイル実行部19に通知する。
【0059】
バイトコード解釈部17は、Javaバイトコード命令の解釈及びメソッドアドレステーブルの作成などにおけるデータの読書きをJavaワーク領域部11に対して行いながら、以上の処理を行う。
【0060】
コンパイル実行部19は、エントリーのコンパイルの指示をバイトコード解釈部17から受ける。この時、コンパイル実行部19は、コンパイル対象のエントリーのメソッド名及びエントリーポイントの入力もバイトコード解釈部17から受ける。コンパイル実行部19は、コンパイルの指示を受けた順にエントリーのコンパイルを行なっていく。ここで、本実施例では、コンパイルは1つのCPUであるCPU200が行うため、バイトコード解釈部17は、1つのエントリーのコンパイルを完了しなければ、次のエントリーのコンパイルを行なえない。すなわち、コンパイル実行部19は、バイトコード解釈部17からのコンパイルの指示を受けたエントリーのコンパイルを直ぐに始められるとは限らない。そのため、上述したように、バイトコード解釈部17は、エントリーポイントを登録し直ぐにエントリーのコンパイルの指示をコンパイル実行部19に通知しても、その後で、そのエントリーの分岐などによるリーブポイントの指定が行える。
【0061】
コンパイル実行部19は、コンパイルを行う場合、必要な関数を関数アドレステーブル格納部16から取得する。また、コンパイル実行部19は、コンパイル実行の間、コンパイルワーク領域部13に対してコンパイル処理におけるデータの読書きを行う。
【0062】
コンパイル実行部19は、エントリーのコンパイルを開始するときに、コンパイルの指示を受けたエントリーのメソッド名及びエントリーポイントを用いてメソッドアドレステーブルを検索し、指定されたエントリーを特定する。その後、コンパイル実行部19は、メソッドアドレステーブルに指定されたエントリーのリーブポイントが登録されているか否かを判定する。リーブポイントが登録されていない場合は、コンパイル実行部19は、エントリーポイントからそのエントリーを含むメソッドのreturn命令までをまとめてコンパイルする。リーブポイントが登録されている場合は、コンパイル実行部19は、エントリーポイントからそのエントリーのリーブポイントまでをまとめてコンパイルする。すなわち、リーブポイントの指定が無い場合は、コンパイル実行部19は、そのメソッドのエントリーポイント以下の部分をまとめてコンパイルしてしまうため、プログラムの処理に使用しない部分までコンパイルしてしまうことも考えられる。これに対して、リーブポイントが設定されている場合、プログラムの実行に沿ったエントリーポイントからリーブポイントまでのコンパイルが行えるので、無駄なコンパイルを削減することができる。
【0063】
そして、コンパイル実行部19は、指定されたエントリーのコンパイルを開始すると、エントリーポイントテーブル315に記載されたそのエントリーのコンパイル状態フラグ323(図2参照)のコンパイル中のフラグ352(図4参照)をONにする。
【0064】
また、コンパイル実行部19は、指定されたエントリーのコンパイルが終了すると、エントリーポイントテーブル315に記載されたそのエントリーのコンパイル状態フラグ323(図2参照)のコンパイル済みのフラグ353(図4参照)をONにする。この時、コンパイル実行部19は、コンパイル中のフラグ352をOFFにする。さらに、コンパイル実行部19は、エントリーのコンパイル結果である実行コードをコンパイル結果格納部15に格納させる。そして、コンパイル実行部19は、エントリーポイントテーブル315のエントリー生成アドレス325にそのエントリーのコンパイル結果である実行コードの開始アドレスを登録する。また、コンパイル実行部19は、エントリーポイントテーブル315の出口アドレス326にそのエントリーのコンパイル結果である実行コードの戻り先アドレスを登録する。
【0065】
さらに、コンパイル実行部19は、メソッドのreturn命令までのコンパイルを終了すると、メソッドアドレステーブルにおけるそのメソッドの開始アドレス312(図2参照)に、そのメソッドの最初のエントリーの実行コードの開始アドレスを登録する。さらに、コンパイル実行部19は、メソッドアドレステーブルにおけるそのメソッドの実行フラグ314(図2参照)のフラグ344(図3参照)をONにする。
【0066】
さらに、コンパイル実行部19は、2回以上の呼び出しがあったメソッドに関しては、実行フラグ314の最適化が必要であることを示すフラグ342をONにする。
【0067】
また、コンパイル実行部19は、実行コードの呼出しアドレスの埋め込みの通知をバイトコード解釈部17から受けると、その実行コードが表すメソッドにおける実行フラグ314のフラグ343をONにする。
【0068】
また、コンパイル実行部19は、メソッドの最適化処理の実行の通知をバイトコード解釈部17から受ける。そして、コンパイル実行部19は、指定されたメソッドのエントリーポイントテーブル315に記載された各エントリーのコンパイル結果をコンパイル結果格納部15から取得する。そして、コンパイル実行部19は、取得した実行コードに対して最適化処理を行う。例えば、コンパイル実行部19は、取得した実行コードを結合することで最適化処理を行う。ここで、コンパイル実行部19は、プログラムの実行ルートを追うために、各エントリーの出口アドレス326を確認し、次のエントリーがどこにあるかを特定して行く。ここで、「実行ルート」とは、命令内容に従って実際に中間コード命令を実行していった場合の、実行した中間コード命令の順番である。これにより、コンパイル実行部19は、実行コードを全て確認しなくても、プログラムの実行ルートが簡単に把握でき、結合するエントリーの組合せを容易に取得することができる。そして、最適化が終了すると、コンパイル実行部19は、エントリーポイントテーブル315の最適化を行ったエントリーのコンパイル状態フラグ323(図2参照)のフラグ351(図4参照)をONにする。さらに、バイトコード解釈部17は、最適化処理を行なったメソッドの実行フラグ314のフラグ341(図3参照)をONにする。ここで、本実施例では、最適化処理としてエントリーを結合する処理を例に説明したが、この最適化処理には、既存のコンパイラ技術で実現されている最適化処理を用いてもよい。
【0069】
プログラム実行部18は、Javaバイトコード命令や実行コードに記載された内容に沿って、処理を実行していく機能を有する。プログラム実行部18は、バイトコード解釈部17によるJavaバイトコード命令の解釈結果の入力を受ける。これは、バイトコード解釈部17が解釈するJavaバイトコード命令が未だコンパイルされていない場合である。そして、プログラム実行部18は、バイトコード解釈部17が行なったJavaバイトコード命令の解釈に基づいて処理を実行する。
【0070】
また、プログラム実行部18は、実行コードの実行命令をバイトコード解釈部17から受ける。これは、バイトコード解釈部17が解釈しようとするJavaバイトコード命令が既にコンパイルされている場合である。これには、解釈対象のメソッド全てのコンパイルが終了している場合及び解釈対象のメソッドの中で、さらに解釈対象となっているエントリーのコンパイルが終了している場合がある。解釈対象のメソッド全てのコンパイルが終了している場合とは、実行フラグ314のフラグ344がONの場合又は実行フラグ314のフラグ343がON、すなわちJavaバイトコード命令に実行コードの呼出しアドレスが埋め込まれている場合である。また、解釈対象となっているエントリーのコンパイルが終了している場合とは、エントリーポイントテーブル315のそのエントリーのコンパイル状態フラグ323のフラグ353がONになっている場合である。そして、プログラム実行部18は、実行命令を受けた実行コードをコンパイル結果格納部15から読込む。そして、プログラム実行部18は、読み込んだ実行コードに基づいて処理を実行する。
【0071】
そして、プログラム実行部18は、Javaバイトコードの解釈基づく処理及び実行コードに基づく処理を実行するにあたり、Javaワーク領域部11を用いて処理の実行におけるデータの読書きを行う。また、プログラム実行部18は、ランタイムライブラリから処理に用いる関数を読込み使用する。
【0072】
次に、図5を参照して、本実施例に係る情報処理装置におけるJavaプログラム実行のメインの処理について説明する。図5は、メイン処理のフローチャートである。
【0073】
CPU100は、Javaプログラムの実行開始命令を受けて、JavaVMの起動などのJava実行開始処理を行う(ステップS101)。JavaVMが起動することで、バイトコード解釈部17が起動する。
【0074】
バイトコード解釈部17は、Javaバイトコード命令記憶部14からJavaバイトコード命令を読み出す(ステップS102)。
【0075】
バイトコード解釈部17は、読み出したバイトコード命令がメソッドの呼出しであるか否かを判定する(ステップS103)。
【0076】
メソッドの呼び出しである場合(ステップS103:肯定)、バイトコード解釈部17は、メソッドアドレステーブルに対象メソッドが未登録か否かを判定する(ステップS104)。ここで対象メソッドとは、コンパイルが必要か否かの判定を行う対象のメソッドのことを言う。
【0077】
そして、対象メソッドが未登録の場合(ステップS104:肯定)、バイトコード解釈部17は、対象メソッドの開始アドレスを対象メソッドの最初のエントリーのエントリーポイントとして登録する(ステップS105)。
【0078】
これに対して、対象メソッドが登録済みの場合(ステップS104:否定)、バイトコード解釈部17は、エントリーポイントテーブルに対象エントリーが未登録か否かを判定する(ステップS106)。ここで対象エントリーとは、コンパイルが必要か否かの判定を行う対象のエントリーのことを言う。
【0079】
そして、対象エントリーが未登録の場合(ステップS106:肯定)、バイトコード解釈部17は、対象エントリーの開始アドレスをエントリーポイントとして登録する(ステップS107)。
【0080】
そして、バイトコード解釈部17は、エントリーポイントとされたアドレスをコンパイル対象として指定して、コンパイル実行部19にコンパイルの実行を指示する(ステップS108)。
【0081】
これに対して、対象エントリーが登録済みの場合(ステップS106:否定)、バイトコード解釈部17は、メソッドアドレステーブルの実行フラグを参照して、対象エントリーがコンパイル済みか否かを判定する(ステップS109)。対象エントリーがコンパイル済みの場合(ステップS109:肯定)、バイトコード解釈部17は、対象メソッドの呼出し回数が閾値を超えているか否かにより、最適化を行うか否かを判定する(ステップS110)。
【0082】
最適化を行う場合(ステップS110:肯定)、バイトコード解釈部17は、メソッドアドレステーブルの実行フラグを参照して、対象メソッドが最適済みか否かを判定する(ステップS111)。最適化していない場合(ステップS111:否定)、バイトコード解釈部17は、そのメソッドの最初のエントリーのエントリーポイントを指定して、最適化の実行をコンパイル実行部19に指示する(ステップS112)。これに対して、最適化を行わない場合(ステップS110:否定)及び最適化済みの場合(ステップS111:肯定)、バイトコード解釈部17は、対象メソッドの実行コードを実行するようプログラム実行部18に指示する。プログラム実行部18は、指定された実行コードを実行する(ステップS113)。
【0083】
次に、バイトコード解釈部17は、実行コードの最後がreturn命令か否かを判定する(ステップS114)。return命令の場合(ステップS114:肯定)、バイトコード解釈部17は、ステップS104に戻る。これに対して、return命令で無い場合(ステップS114:否定)、バイトコード解釈部17は、実行した実行コードで表されるエントリーのJavaバイトコードにおける次の命令を対象エントリーとしてステップS102に戻る。
【0084】
一方、メソッドの呼び出しでない場合(ステップS103:否定)、ステップS108を処理した場合及び対象エントリーがコンパイル完了ではない場合(ステップS109:否定)、バイトコード解釈部17は、Javaバイトコード命令を解釈する。そして、プログラム実行部18は、解釈されたJavaバイトコード命令を実行する(ステップS115)。
【0085】
その後、バイトコード解釈部17は、分岐命令を検出したか否かを判定する(ステップS116)。分岐命令を検出した場合(ステップS116:肯定)、バイトコード解釈部17は、分岐命令を含むエントリーがコンパイル中であるか否かを判定する(ステップS117)。エントリーがコンパイル中である場合(ステップS117:肯定)、バイトコード解釈部17は、ステップS115に戻る。
【0086】
これに対して、エントリーがコンパイル中でない場合(ステップS117:否定)、バイトコード解釈部17は、分岐命令のアドレスをリーブポイントとしてエントリーポイントテーブルに登録する(ステップS118)。そして、バイトコード解釈部17は、分岐における呼出し先のメソッドを対象メソッドとし、呼出し先のメソッドの最初のエントリーを対象エントリーとしてステップS104に戻る。
【0087】
これに対して、分岐命令を検出しない場合(ステップS116:否定)、バイトコード解釈部17は、解釈しているメソッドの終了時点で、そのメソッドが他のメソッドの分岐により呼び出されたメソッドであり、分岐前のメソッドに戻るか否かを判定する(ステップS119)。分岐前のメソッドに戻る場合(ステップS119:肯定)、分岐前のメソッドを対象メソッドとし、分岐前のメソッドの戻り先の命令以下を対象エントリーとし、ステップS104に戻る。
【0088】
これに対して、分岐前のメソッドに戻らない場合(ステップS119:否定)、バイトコード解釈部17は、プログラム終了か否かを判定する(ステップS120)。
【0089】
プログラムが終了しない場合(ステップS120:否定)、バイトコード解釈部17は、ステップS102へ戻る。
【0090】
これに対して、プログラムが終了する場合(ステップS120:肯定)、CPU100は、プログラムの実行処理を終了する(ステップS121)。
【0091】
次に、図6を参照して、本実施例に係る情報処理装置のコンパイル処理について説明する。図6は、コンパイル処理のフローチャートである。
【0092】
コンパイル実行部19は、エントリーのコンパイル実行の指示をバイトコード解釈部17から受ける。そして、コンパイル実行部19は、エントリーのコンパイル状態フラグのコンパイル中のフラグをONに設定する(ステップS201)。
【0093】
コンパイル実行部19は、1つのJavaバイトコード命令のコンパイルを行う(ステップS202)。
【0094】
次に、コンパイル実行部19は、次のJavaバイトコード命令がreturn命令か否かを判定する(ステップS203)。
【0095】
return命令の場合(ステップS203:肯定)、コンパイル実行部19は、ステップS209へ進む。
【0096】
これに対して、return命令でない場合(ステップS203:否定)、コンパイル実行部19は、次のJavaバイトコード命令がリーブポイントか否かを判定する(ステップS204)。
【0097】
リーブポイントでない場合(ステップS204:否定)、コンパイル実行部19は、ステップS202へ戻る。
【0098】
これに対して、リーブポイントの場合(ステップS204:肯定)、コンパイル実行部19は、リーブポイントが示すエントリーポイントがメソッドアドレステーブルにあるか否かを判定する(ステップS205)。
【0099】
エントリーポイントがある場合(ステップS205:肯定)、コンパイル実行部19は、リーブポイントが示すエントリーポイントを開始アドレスとする次のエントリーのコンパイル状態フラグのコンパイル中のフラグをONにする(ステップS206)。そして、コンパイル実行部19は、次のエントリーポイントからコンパイル元のアドレス、すなわち、コンパイルするJavaバイトコード命令のアドレスを取得する(ステップS207)。その後、コンパイル実行部19は、ステップS202に戻る。
【0100】
これに対して、エントリーポイントがない場合(ステップS205:否定)、コンパイル実行部19は、現在コンパイルしているエントリーのリーブポイントにおいてJava戻り命令と戻り先のアドレスを設定する(ステップS208)。
【0101】
そして、コンパイル実行部19は、メソッドアドレステーブルの開始アドレスにコンパイル結果のアドレス、すなわちメソッドの最初のエントリーポイントのアドレスを登録する(ステップS209)。
【0102】
そして、コンパイル実行部19は、コンパイルを行なった各エントリーのコンパイル状態フラグにおけるコンパイル済みのフラグをONに設定し、さらに、メソッドの実行フラグにおけるコンパイル済みのフラグをONに設定する(ステップS210)。
【0103】
また、コンパイル実行部19は、コンパイルを行なった各エントリーのコンパイル状態フラグにおけるコンパイル中のフラグをOFFに設定する(ステップS211)。
【0104】
次に、図7〜図10−2を参照して、サンプルプログラムを例に本実施例に係る情報処理装置の処理の全体的な流れについて説明する。図7は、Javaプログラミング言語で記述されたサンプルプログラムのソースコードを示す図である。図8は、サンプルプログラムのJavaコンパイル結果の概要を示す図である。図9は、サンプルプログラムから生成されたメソッドアドレステーブルを示す図である。図10−1は、サンプルプログラムから生成された実行コードを示す第1の図である。また、図10−2は、サンプルプログラムから生成された実行コードを示す第2の図である。図10−2は図10−1のプログラムの続きである。
【0105】
図7に示すように、ここで用いるサンプルプログラムは、1つのクラスファイルでできている。そして、そのクラスファイルは、メソッド401とメソッド402という2つのメソッドを有している。
【0106】
図8に示すコードは、図7のサンプルプログラムのソースコードをコンパイルしてJavaバイトコードに変換したものである。
【0107】
図8に示すようなJavaバイトコードで記述されたプログラムが、Javaバイトコード命令記憶部14に格納されている。
【0108】
そして、バイトコード解釈部17によって、図8に示すプログラムは、エントリー501〜504及び511〜514で構成されていると認識される。図7のメソッド401がエントリー501〜504に対応し、メソッド402がエントリー511〜514に対応している。
【0109】
具体的には、エントリー501の次の行((0xA2)icmpgeの命令コードを含む行)で条件による分岐が発生し、リーブポイントとなるため、エントリー501が一つのエントリーとなる。また、エントリー502の次の行((0xB8)invokestaticの命令コードを含む行)でメソッド402を呼出す分岐が発生し、リーブポイントとなるので、エントリー502が一つのエントリーとなる。さらに、エントリー503の次の行((0xA7)gotoの命令コードを含む行)で他の行への分岐が発生し、リーブポイントなるので、エントリー503が一つのエントリーとなる。そして、エントリー503の後、メソッド401のreturn命令まで分岐が無いので、エントリー503の後からreturn命令までが一つのエントリー504となる。
【0110】
また、エントリー511の次の行((0xA2)icmpgeの命令コードを含む行)で条件による分岐が発生し、リーブポイントとなるため、エントリー511が一つのエントリーとなる。また、また、エントリー512の次の行((0xB8)invokestaticの命令コードを含む行)でメソッド401を呼出す分岐が発生し、リーブポイントとなるので、エントリー512が一つのエントリーとなる。さらに、エントリー513の次の行((0xA7)gotoの命令コードを含む行)で他の行への分岐が発生し、リーブポイントなるので、エントリー513が一つのエントリーとなる。そして、エントリー513の後、メソッド402のreturn命令まで分岐が無いので、エントリー513の後からreturn命令までが一つのエントリー514となる。
【0111】
そして、図8におけるエントリー501〜504及び511〜514に基づいて、バイトコード解釈部17が生成したメソッドアドレステーブルが図9に示すメソッドアドレステーブルである。図9におけるテーブル602は、メソッドアドレステーブル601におけるエレメント#0の中身を表している。また、テーブル603は、テーブル602におけるエントリーポイントテーブルの中身を表している。また、図9のメソッドアドレステーブルは、バイトコード解釈部17によるエントリーポイント及びリーブポイントの設定が終わった後に、コンパイル実行部19によってコンパイルが終了した状態を表している。
【0112】
まず、メソッド401及び402という2つのメソッドがあるので、各メソッドに対応させてエレメント#0及び#1の領域が確保される。図9では、エレメント#0がメソッド402に対応し、エレメント#1がメソッド401に対応している。
【0113】
そして、例えば、エレメント#0には、メソッド名として、メソッド402の名前である「main」が登録されている。また、開始アドレスとして、メソッド402の開始アドレスが登録されている。また、メソッドサイズには、メソッド402のサイズである21が登録されている。また、実行フラグには、コンパイル実行部19によりコンパイル済みフラグがONに設定されている。
【0114】
そして、テーブル603は、図8におけるエントリー501〜504及び511〜514に基づいて、バイトコード解釈部17が生成したエントリーポイントテーブルである。
【0115】
メソッド401の中のエントリーは全部で4つあるので、バイトコード解釈部17は、エントリーカウンタを4とする。さらに、バイトコード解釈部17は、最初のエントリーのエントリーポイントとしてエントリー511の開始アドレスを登録する。さらに、最初のエントリーのコンパイルが開始されているので、コンパイル実行部19によりコンパイル済みのフラグがONにされている。そして、バイトコード解釈部17は、リーブポイントとして、エントリー511の分岐のアドレスである21のアドレスを登録している。さらに、コンパイル実行部19により、エントリー生成アドレスとして、エントリー511をコンパイルした実行コードの開始アドレスが登録されている。そして、コンパイル実行部19により、出口アドレスとして、エントリー511をコンパイルした実行コードの戻り先のアドレスが登録されている。
【0116】
同様に、バイトコード解釈部17は、エントリー512〜514までの登録を行い。また、コンパイル実行部19は、エントリー512〜514における実行フラグの設定、エントリー生成アドレスの登録及び出口アドレスの登録を行う。ここで、図9では、エントリーポイントテーブルにおけるエントリー512及び513に対する登録は図示を省略している。
【0117】
そして、図9に示すメソッドアドレステーブル601を用いて、コンパイル実行部19がJavaバイトコード命令のコンパイルを行なった結果が図10−1及び図10−2に示す実行コードのプログラムである。実行コード701が、エントリー513にあたる。また、実行コード702が、エントリー514にあたる。また、実行コード703が、エントリー501にあたる。また、実行コード704が、エントリー502にあたる。また、実行コード705が、エントリー511にあたる。また、実行コード706が、エントリー512にあたる。また、実行コード707が、エントリー503にあたる。また、実行コード708が、エントリー504にあたる。このように、実際に実行される処理だけコンパイル対象とすることにより、コンパイル時間及びメモリ資源の消費量を抑えることができる。
【0118】
[ハードウェア構成]
以下では、図11を用いて、本実施例に係る情報処理装置のハードウェア構成について説明する。図11は、実施例に係る情報処理装置のハードウェア構成図である。
【0119】
図11に示すように、本実施例に係る情報処理装置1は、メモリ801、キャッシュ802、ハードディスク803、CPU100及びCPU200を有する。
【0120】
メモリ801、キャッシュ802、ハードディスク803、CPU100及びCPU200は、バス804によって接続されている。
【0121】
ハードディスク803には、Javaバイトコード命令で記述されたプログラム、ランタイムライブラリなどが格納されている。また、ハードディスク803には、図1に示す情報処理装置1の機能を実現するための各種プログラムが格納されている。
【0122】
そして、CPU100は、これらの各種プログラムを読み出して実行する。これによりJavaVMがメモリ801上に展開される。CPU100は、JavaVMを制御してバイトコード解釈部17の機能を実現させる。さらに、JavaVMからの命令を受けて、CPU200は、コンパイル実行部19の機能を有するコンパイラを起動する。
【0123】
また、CPU100は、ハードディスク803のJavaバイトコード命令で記述されたプログラム及びランタイムライブラリを読み込みメモリ801上に展開する。これにより、メモリ801が、ランタイムライブラリ記憶部12及びJavaバイトコード命令記憶部14の機能を実現する。
【0124】
また、メモリ801及びキャッシュ802が、Javaワーク領域部11、コンパイルワーク領域部13、コンパイル結果格納部15及び関数アドレステーブル格納部16の機能を実現する。
【0125】
なお、上記した図1に示す情報処理装置1の機能を実現するためのプログラムについては、必ずしもハードディスク803に記憶させなくてもよい。例えば、情報処理装置1に挿入されるフレキシブルディスク、CD−ROM(Compact Disk Read Only Memory)、DVD(Digital Versatile Disk)又はIC(Integrated Circuit)カードなどの「可搬用の物理媒体」にプログラムを記憶させてもよい。または、情報処理装置1の外に備えられるハードディスクドライブなどの「固定用の物理媒体」にプログラムを記憶させてもよい。または、公衆回線、インターネット、LAN、WANなどを介して情報処理装置1に接続される「他のコンピュータ(またはサーバ)」にプログラムを記憶させてもよい。そして、情報処理装置1は、上述したフレキシブルディスク等から各プログラムを読み出して実行するようにしてもよい。
【0126】
以上に説明したように、本実施例に係る情報処理装置は、プログラムの処理の実行要求が発生した場合に、コンパイルを待つことなくバイトコード解釈部及びプログラム実行部が直ぐに実行を開始できるので、実行開始までの待機時間が軽減できる。また、コンパイル完了後には、CPUによるコンパイル結果の直接実行が行なえるので、処理を高速に実行することができる。さらに、マルチコアシステムにおいては、異なるCPU間でテーブルなどのデータを共有する場合、同じデータのアクセス競合を避けるために、CPU間の同期やインターロックを行う必要があり、処理性能の低下を招くことが多い。これに対して、本実施例に係る情報処理装置では、互いに同じ情報を書き込むことがなくデータの不整合が発生しないので、CPU間の同期やインターロック処理が不要である。これにより、本実施例に係る情報処理装置においては、マルチコアシステムを用いたJavaプログラムの実行及びコンパイルを効率よく行なうことができる。
【0127】
また、本実施例に係る情報処理装置は、Javaバイトコードの解釈及び実行を行うCPUと異なるCPUによりコンパイル処理を独立して行う。これにより、コンパイラ処理の負荷が高くても、Javaバイトコードの解釈及び実行の処理に影響を与えず、高速処理が可能となる。
【0128】
また、以上の説明では、マルチコアシステムとして、CPUが2つの場合で説明したが、3つ以上のCPUを備えている場合にも同様の処理が可能である。例えば、複数のCPUにてメソッド毎にコンパイルを実行させるなどができ、よりコンパイル処理を高速化することができる。
【符号の説明】
【0129】
1 情報処理装置
11 Javaワーク領域部
12 ランタイムライブラリ記憶部
13 コンパイルワーク領域部
14 Javaバイトコード命令記憶部
15 コンパイル結果格納部
16 関数アドレステーブル格納部
17 バイトコード解釈部
18 プログラム実行部
19 コンパイル実行部
100、200 CPU

【特許請求の範囲】
【請求項1】
少なくとも2つのCPU及び中間コード命令のコンパイル結果を記憶する記憶部を有する情報処理装置であって、
一方のCPUは、
中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、前記記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、該中間コード命令のコンパイル結果が無ければ前記中間コード命令の解釈を行ない、該中間コード命令のコンパイル結果があれば該コンパイル結果を指定する中間コード解釈部と、
前記中間コード解釈部から前記中間コード命令の解釈結果を受けた場合、解釈結果に基づき該中間コード命令を実行し、前記中間コード解釈部からコンパイル結果の指定を受けた場合、指定されたコンパイル結果であるネイティブコードを実行することで前記プログラムを実行するプログラム実行部とを備え、
他方のCPUは、
前記中間コード解釈部により解釈された前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを前記記憶部に格納するコンパイル実行部を備えた
ことを特徴とする情報処理装置。
【請求項2】
前記中間コード解釈部は、解釈を行う対象とする、前記プログラムの一部である一まとまりの作業手順を表す中間コード命令群を指定し、さらに、指定した前記中間コード命令群の中の分岐毎に前記メソッドを分割した分割メソッドの中から、解釈を行う対象とする前記分割命令群を特定し、
前記コンパイル実行部は、前記中間コード解釈部により指定された前記中間コード命令群の中で特定された前記分割命令群をコンパイルする
ことを特徴とする請求項1に記載の情報処理装置。
【請求項3】
前記中間コード解釈部は、前記中間コード命令群の解釈を開始する毎に、前記コンパイル実行部に対して、解釈を開始した中間コード命令群のコンパイルを指示し、解釈を開始した中間コード命令群の中の分岐を検出すると、前記コンパイル実行部による解釈を開始した中間コード命令群のコンパイルが開始されているか否かを検出し、コンパイルが開始されていなければ、その検出した分岐においてメソッドの分割を行い解釈を行う対象とする前記分割命令群を特定し、
前記コンパイル実行部は、前記中間コード解釈部から複数の前記中間コード命令群のコンパイルの指示を順次受け付け、指示を受けた順に前記中間コード命令群のコンパイルを開始し、コンパイルを開始した中間コード命令群に前記分割命令群が指定されていれば該分割命令群をコンパイルし、コンパイルを開始した中間コード命令群に前記分割命令群が指定されていなければコンパイルを開始した中間コード命令群を1つの前記分割命令群としてコンパイルする
ことを特徴とする請求項2に記載の情報処理装置。
【請求項4】
2つのCPUを備えた情報処理装置の制御方法であって、
一方のCPUにより、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込み、中間コード命令のコンパイル結果を記憶する記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定し、
該中間コード命令のコンパイル結果が無ければ、前記一方のCPUにより、前記中間コード命令の解釈を行ない、解釈結果に基づき該中間コード命令を実行するとともに、他方のCPUにより、解釈した前記中間コード命令をコンパイルしてネイティブコードを生成し、生成したネイティブコードを記憶部に格納し
該中間コード命令のコンパイル結果があれば、前記一方のCPUにより該コンパイル結果を指定し、指定したコンパイル結果であるネイティブコードを実行する
処理をコンピュータに実行させることを特徴とする情報処理装置制御方法。
【請求項5】
2つのCPUを備えたコンピュータに処理を行わせる中間コード命令実行プログラムであって、
一方のCPUに対して、中間コード命令で記述された所定のプログラムから、各前記中間コード命令の実行していく順番である実行ルートに沿って前記中間コード命令を順次読込ませ、中間コード命令のコンパイル結果を記憶する記憶部に読み込んだ前記中間コード命令のコンパイル結果があるか否かを判定させ、
該中間コード命令のコンパイル結果が無ければ、前記一方のCPUに対して、前記中間コード命令の解釈を行わせ、解釈結果に基づき該中間コード命令を実行させるとともに、他方のCPUに対して、解釈した前記中間コード命令をコンパイルさせてネイティブコードを生成させ、生成したネイティブコードを記憶部に格納させ
該中間コード命令のコンパイル結果があれば、前記一方のCPUに対して、該コンパイル結果を指定させ、指定したコンパイル結果であるネイティブコードを実行させる
処理をコンピュータに実行させることを特徴とする中間コード命令実行プログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10−1】
image rotate

【図10−2】
image rotate

【図11】
image rotate