(57)【要約】【課題】ＪＩＴコンパイラによるイベント応答性の劣化を回避する。【解決手段】このＪＩＴコンパイラによるイベント応答性の劣化を回避する方法は、システムプログラムとは独立してノンプリエンプティブなマルチタスク環境を実現するための機能を備え、実行するクラスファイルの情報を取得するためのネイティブメソッドと、Ｊａｖａ（Ｒ）言語で作成され、当該ネイティブメソッドを利用してクラスファイルのコンパイルを動的に行うＪＩＴコンパイラとを有するＪａｖａ（Ｒ）実行環境で、実行するクラスファイルとＪＩＴコンパイラとをＪａｖａ（Ｒ）実行環境上で並行的に動作させ、クラスファイルをＪＩＴコンパイラで動的にコンパイルしながら実行する。【選択図】      図１
2006039879.tif 000002
【特許請求の範囲】
【請求項１】
Ｊａｖａ（Ｒ）実行環境でクラスファイルを実行する方法であって、
インタープリタが前記クラスファイルを解釈・実行する第１のステップと、
前記インタープリタがＪａｖａ（Ｒ）で作成されたコンパイラを実行して前記クラスファイルを動的にコンパイルしてネィティブコードを生成する第２のステップと、
前記コンパイラが前記クラスファイルをコンパイルすることにより生成されたネィティブコードを実行する第３のステップとを有し、
前記第１および第２のステップでは前記インタープリタがイベントフラグを周期的にチェックするポーリング処理を行い、前記第２のステップでは前記第３のステップで前記ポーリング処理が周期的に行われるように所定の命令を前記ネィティブコードに埋め込む処理を行うことを特徴とするクラスファイルの実行方法。
【請求項２】
プロセッサ上で実行することにより、
イベントフラグを周期的にチェックするポーリング処理を行いながらクラスファイルを解釈実行し、イベントフラグがセットされている場合には所定のイベント応答を呼び出す機能を実現するインタープリタプログラムと、
Ｊａｖａ（Ｒ）言語で作成され、クラスファイルをコンパイルして前記プロセッサのネイティブコードを生成し、当該生成されたコードには前記ポーリング処理を周期的に実行するための命令が埋め込まれるコンパイラプログラムと
を含むことを特徴とするＪａｖａ（Ｒ）実行環境プログラム。
【請求項３】
前記Ｊａｖａ（Ｒ）実行環境は、実行するクラスファイルの情報を取得するネィティブメソッドを有し、前記コンパイラプログラムは当該ネィティブメソッドを利用してクラスファイルのコンパイルを行うことを特徴とする請求項２に記載のＪａｖａ（Ｒ）実行環境プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、クラスファイル実行方法およびＪａｖａ（Ｒ）実行環境プログラムに関する。
【背景技術】
【０００２】
Ｊａｖａ（Ｒ）は、１９９５年に米サン・マイクロシステムズ社により発表されたプログラム言語であり、Ｊａｖａ（Ｒ）で作成されたプログラムは、Ｊａｖａ（Ｒ）実行環境を備えていればコンピュータのプロセッサやオペレーティングシステム（以下、ＯＳという）に関わらず実行することができるという特徴を持っている。そして、近時では、Ｊａｖａ（Ｒ）実行環境はパーソナルコンピュータやサーバといったコンピュータシステムのみならず、携帯電話機や家電製品等の様々な機器に搭載されるようになってきている。
【０００３】
ここで、Ｊａｖａ（Ｒ）実行環境を例えば携帯電話や家電製品の組み込みシステムにおいて使用するためには、組み込みシステムのマルチタスク環境にＪａｖａ（Ｒ）実行環境を対応させる必要がある。例えばシステムリソースに比較的余裕を持つ組み込みシステムの場合には、ＯＳのイベント応答機構をそのまま利用して、ＯＳのマルチタスク環境をＪａｖａ（Ｒ）実行環境に適用することができる。しかしながら、この方法では、Ｊａｖａ（Ｒ）プログラム実行中のイベントに対する応答性はネイティブプログラムと同様に確保されるものの、ＣＰＵの処理能力やメモリ容量といったシステムリソースの消費量が多くなってしまうため、これらの制限が厳しい組み込みシステムでは利用することができない。
【０００４】
そこで、システムリソースの制限が厳しい組み込みシステムでは、例えば以下に示す機構をＪａｖａ（Ｒ）実行環境に導入することで、ノンプリエンプティブなマルチタスクを実現している。すなわち、インタープリタでバイトコード命令を解釈・実行中に、所定間隔でイベント発生の有無をチェックする。或いは、ＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイラでバイトコードをネイティブコードにコンパイルする際にイベント発生の有無をチェックする為の命令をネイティブコード中に所定間隔で埋め込む。このようにすることでＪａｖａ（Ｒ）アプリケーションを実行している間は、所定間隔でイベント発生の有無がチェックされ、イベントが発生していれば必要に応じてＪａｖａ（Ｒ）アプリケーションの実行を停止し、所定の応答がなされる。
【０００５】
以下、従来法における処理およびイベント応答性の遷移を図４の例を参照しながら説明する。
【０００６】
この処理では、先ずインタープリタがクラスファイルを解釈・実行する（ステップＳ１１）。このとき、インタープリタはクラスファイルからバイトコード命令を一つずつ取り出して解釈・実行するとともに、周期的にイベントフラグの値をチェックするポーリング処理を行い、イベントフラグの値がセットされていれば所定のイベント処理を行う。次いで、ＪＩＴコンパイラがクラスファイルをコンパイルし（ステップＳ１２）、コンパイラの生成したコードが実行される（ステップＳ１３）。ここで、生成されたコードにはポーリング処理のための命令が埋め込まれていて、ステップＳ１１と同様にイベントフラグの値に応じて所定のイベント処理が実行される。コンパイラの生成したコードの実行が終了すると、再びインタープリタがクラスファイルを解釈・実行する（ステップＳ１４）。このときインタープリタが行うポーリング処理や、コンパイラの生成したコードに埋め込まれた命令によるポーリング処理により、ＯＳの機能に依存することなくイベント応答が実現される。すなわち、イベントが発生した場合にはイベントフラグがセットされ、各ポーリング処理によりイベントフラグの状態が検出され、当該イベントに応じた処理が実行されて所定のイベント応答がなされる（以下、図４の例を従来例１と称する）。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
Ｊａｖａ（Ｒ）実行環境に含まれているクラスローダ（ｃｌａｓｓｌｏａｄｅｒ）、ネイティブメソッド（ｎａｔｉｖｅｍｅｔｈｏｄ）、ガーベジコレクタ（ｇａｒｂａｇｅ  ｃｏｌｌｅｃｔｏｒ）、ＪＩＴコンパイラといったプログラムは、通常ネイティブコードで作成されているためＪＩＴコンパイラやインタープリタを利用することなく実行される。このため、Ｊａｖａ（Ｒ）実行環境においてこれらのプログラムを実行している間はイベント発生の有無がチェックされず、イベント応答性が劣化してしまうという問題が生じている。そして、これらのうち、クラスローダ、ネイティブメソッド、ガーベジコレクタは、いずれも特異的なタイミング（クラスローダはクラスファイルをロードする時点、ネイティブメソッドはプラットフォーム固有機能等を利用する時点、ガーベジコレクタはメモリが不足した時点）で実行されるものであることから、これらによるイベント応答性の劣化は比較的限定される。
【０００８】
これに対してＪＩＴコンパイラについては、不特定のタイミングで必要なだけのコンパイルを繰り返す方式を採った場合には、コンパイルを行う度にイベント応答性が劣化することから、イベント応答性の劣化する頻度は相応に高いものとなってしまう。Ｊａｖａ（Ｒ）プログラムの実行速度を高めるためには、より多くコンパイルすることが望ましいだけに、それがコンパイル中におけるイベント応答性の劣化とトレードオフの関係にあることは改善されるべき問題であるといえる。
【０００９】
より具体的に説明すれば、上記従来例１（図４）のステップＳ１２におけるコンパイル中は、ポーリング処理を行う有効な手段がないことから、第１にコンパイル完了までイベント処置しない、第２にＪＩＴコンパイラにポーリング処理を行う命令を埋め込む、といった対策を施すことになるが、前者ではコンパイル中のイベント応答が不可能なり、後者ではポーリング間隔の短縮に限界があるばかりかＪＩＴコンパイラのコードの可読性やメンテナンス性も悪くなる。このため、どちらの対策も適切であるとは言い難い。また、別の問題点としては、Ｊａｖａ（Ｒ）スレッドはＪａｖａ（Ｒ）実行環境によりスケジューリングされ、コンテキストスイッチにより切り替えられるが、非Ｊａｖａ（Ｒ）スレッドはＪａｖａ（Ｒ）実行環境によりコンテキストが保存されないので、中断されると途中結果は破棄されてしまう。
【００１０】
本発明の目的とするところは、イベント応答性を劣化させることなく、ＪＩＴコンパイラを利用してクラスファイルを実行することができるクラスファイル実行方法およびＪａｖａ（Ｒ）実行環境プログラムを提供することにある。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明の第１の態様では、Ｊａｖａ（Ｒ）実行環境でクラスファイルを実行する方法であって、
インタープリタが前記クラスファイルを解釈・実行する第１のステップと、
前記インタープリタがＪａｖａ（Ｒ）で作成されたコンパイラを実行して前記クラスファイルを動的にコンパイルしてネィティブコードを生成する第２のステップと、
前記コンパイラが前記クラスファイルをコンパイルすることにより生成されたネィティブコードを実行する第３のステップとを有し、
前記第１および第２のステップでは前記インタープリタがイベントフラグを周期的にチェックするポーリング処理を行い、前記第２のステップでは前記第３のステップで前記ポーリング処理が周期的に行われるように所定の命令を前記ネィティブコードに埋め込む処理を行うことを特徴とするクラスファイルの実行方法が提供される。
【００１２】
また、本発明の第２の態様では、プロセッサ上で実行することにより、
イベントフラグを周期的にチェックするポーリング処理を行いながらクラスファイルを解釈実行し、イベントフラグがセットされている場合には所定のイベント応答を呼び出す機能を実現するインタープリタプログラムと、
Ｊａｖａ（Ｒ）言語で作成され、クラスファイルをコンパイルして前記プロセッサのネイティブコードを生成し、当該生成されたコードには前記ポーリング処理を周期的に実行するための命令が埋め込まれるコンパイラプログラムと
を含むことを特徴とするＪａｖａ（Ｒ）実行環境プログラムが提供される。
【００１３】
上記第２の態様にかかるＪａｖａ（Ｒ）実行環境プログラムにおいては、前記Ｊａｖａ（Ｒ）実行環境は、実行するクラスファイルの情報を取得するネィティブメソッドを有し、前記コンパイラプログラムは当該ネィティブメソッドを利用してクラスファイルのコンパイルを行うことが好適である。
【発明の効果】
【００１４】
本発明によれば、ノンプリエンプティブなマルチタスクを実現したＪａｖａ（Ｒ）実行環境において、Ｊａｖａ（Ｒ）で作成されたＪＩＴコンパイラを利用することで、ＪＩＴコンパイラがコンパイルを行っている間におけるイベント応答性の劣化を回避することが可能なクラスファイルの実行方法およびＪａｖａ（Ｒ）実行環境プログラムを提供することができる。
【発明を実施するための最良の形態】
【００１５】
以下、図面を参照して本発明の実施の形態について説明する。
【００１６】
図１は本発明の一実施の形態にかかるクラスファイルの実行方法を実施するためのハードウェア構成図であり、図２は同方法を実施するソフトウェアの構成図である。図１のハードウェア構成図は、例えば組込み機器等にて適用可能なものであり、全体の制御を司るＣＰＵ１とメモリ２、表示部３、入出力部４からなる。
【００１７】
ＣＰＵ１は、不図示のＡＬＵ（ａｒｉｔｈｍｅｔｉｃ  ｌｏｇｉｃ  ｕｎｉｔ）やＣＵ（ｃｏｎｔｒｏｌ  ｕｎｉｔ）、各種レジスタやバス等を有する。メモリ２は、不図示ではあるがＲＡＭとＲＯＭ等からなる。
【００１８】
ＲＡＭは、ＣＰＵによる処理を実行する際にヒープ領域等として使用される。  ＲＯＭには、ＣＰＵ１で実行することによりＪａｖａ（Ｒ）実行環境をなすＪａｖａ（Ｒ）ＶＭ１３およびクラスライブラリ１４、ＯＳ、Ｊａｖａ（Ｒ）アプリケーション１５、各種ネイティブアプリケーション１６，１７が格納されており、それらの一部は各プログラムの実行時に必要に応じてＲＡＭに展開されて使用される。
【００１９】
Ｊａｖａ（Ｒ）ＶＭ１３は、クラスファイルに含まれるバイトコード命令を逐次的に解釈・実行するインタープリタと、バイトコード命令を所定の単位（例えばメソッド単位）で動的にＣＰＵ１のネイティブコードにコンパイルするＪＩＴコンパイラとを含んでいる。このＪａｖａ（Ｒ）実行環境は、インタープリタとＪＩＴコンパイラとを適宜使い分けてクラスファイルを実行する。例えば、どの部分をコンパイルするべきかを動的に判断するスケジューラをＪａｖａ（Ｒ）実行環境に設け、スケジューラの判断によってインタープリタとＪＩＴコンパイラとを使い分けるようにしてもよい。
【００２０】
また、ＪＩＴコンパイラがバイトコード命令をネイティブコードに変換して実行されたプログラム部分については、コンパイル後のネイティブコードを保存しておき、次回以降は直接ネイティブコードを実行するようにしてもよい。
【００２１】
クラスライブラリ１４には、様々な機能をもったメソッドや変数を含むクラスファイルのセットが含まれている。
【００２２】
ＯＳとしては、複数のタスクを並列処理することが可能なマルチタスクＯＳを使用することができる。そのようなＯＳとしては、例えばＩＴＲＯＮ仕様に準拠したものを挙げることができるが、その他のマルチタスクＯＳであっても利用することが可能である。
【００２３】
以上の構成により、図２に示されるように、プラットフォーム（ＯＳ、ハードウェア）１１上でＪａｖａ（Ｒ）アプリケーション１５および各種ネイティブアプリケーション１６，１７が実行される。
【００２４】
ここで、上記ＯＳはＪａｖａ（Ｒ）側にイベントの発生を通知するためのイベントフラグを持っており、Ｊａｖａ（Ｒ）側で応答するべきイベントが発生した場合には当該イベントフラグに値をセットする。また、上記Ｊａｖａ（Ｒ）ＶＭ１３はＯＳのマルチタスク環境に対応するためにノンプリエンプティブなマルチタスク機能を実装している。すなわち、インタープリタはバイトコード命令を解釈・実行中に所定間隔でイベントフラグの状態をチェックする機能を持っており、かつ、ＪＩＴコンパイラはイベントフラグの状態をチェックする為の命令を所定間隔で埋め込んだネイティブコードを生成する機能を持っている。
【００２５】
さらに、この実施の形態では、Ｊａｖａ（Ｒ）ＶＭ１３が内部的に持っているクラスファイルの情報に関するデータ構造の読み書きができるネイティブメソッドをＪａｖａ（Ｒ）ＶＭ１３に追加し、当該ネイティブメソッドを利用するＪａｖａ（Ｒ）で作成されたＪＩＴコンパイラを使用することが特徴的である。したがって、本実施形態におけるクラスファイルのコンパイルは、Ｊａｖａ（Ｒ）で書かれたＪＩＴコンパイラをインタープリタで解釈・実行するか、あるいは、ＪＩＴコンパイラをＪＩＴコンパイラ自身でコンパイルして得られたネイティブコードを実行するかのいずれかにより行われる。
【００２６】
このため、本実施形態のＪａｖａ（Ｒ）実行環境においては、クラスファイルをインタープリタで実行している間やＪＩＴコンパイラの生成したコードを実行している間ばかりでなく、ＪＩＴコンパイラをインタープリタで実行してクラスファイルをコンパイルしている間もイベントフラグをチェックするポーリング処理が実行される。したがって、ＪＩＴコンパイラがコンパイルを行っている間もイベント応答性が劣化することはない。
【００２７】
また、本実施形態のＪａｖａ（Ｒ）実行環境はマルチスレッドに対応しており、Ｊａｖａ（Ｒ）で作成されたプログラムは複数のＪａｖａ（Ｒ）スレッドで並行的に実行することができる。各Ｊａｖａ（Ｒ）スレッドはシステムリソースを共有しておりコンテキストが保存されるためスレッドの中断／再開が可能であり、また、そのスケジューリングはＪａｖａ（Ｒ）実行環境で制御することが可能である。ただし、Ｊａｖａ（Ｒ）実行環境に含まれるネィティブコードで実装されたプログラムは、Ｊａｖａ（Ｒ）スレッドでは実行されず、コンテキストが保存されないため一時停止／再開することはできない。
【００２８】
ここで、本実施形態におけるＪＩＴコンパイラはＪａｖａ（Ｒ）で作成されているので、Ｊａｖａ（Ｒ）スレッド上で動作する。このため、ＪＩＴコンパイラによるクラスファイルのコンパイル中も通常のＪａｖａ（Ｒ）アプリケーションの実行中と同じようにして、スレッドスケジューリングを受け、一時停止／再開し、入力イベントに応答することが可能である。すなわち、本実施の形態では、ＪＩＴコンパイラの一時停止／再開も可能となり、その利便性は極めて高いものとなる。
【００２９】
このように、本実施形態では、システムプログラムとは独立してノンプリエンプティブなマルチタスク環境を実現するための機能を備え、実行するクラスファイルの情報を取得するためのネイティブメソッドと、Ｊａｖａ（Ｒ）言語で作成され当該ネイティブメソッドを利用してクラスファイルのコンパイルを動的に行うＪＩＴコンパイラとを有するＪａｖａ（Ｒ）実行環境で、実行するクラスファイルとＪＩＴコンパイラとをＪａｖａ（Ｒ）実行環境上で並行的に動作させ、クラスファイルをＪＩＴコンパイラで動的にコンパイルしながら実行する。
【００３０】
以下、本実施形態にかかるクラスファイル実行方法における処理およびイベントの応答性の遷移を図３を参照しながら説明する。ここでは、従来技術の項で説明した図２と同様の場合を示す。
【００３１】
まずインタープリタがＪａｖａ（Ｒ）スレッド上でクラスファイルを解釈・実行する（ステップＳ１）。このとき、インタープリタは、周期的にイベントフラグの値をチェックするポーリング処理を行う。すなわち周期的にイベントフラグとして利用されるアドレスの値をチェックし、イベントが発生して値がセットされている場合には当該イベントに応答するための処理が行われる。したがって、この段階では、正しいイベント応答が可能である。
【００３２】
次いで、インタープリタがＪＩＴコンパイラを実行してクラスファイルをコンパイルする（ステップＳ２）。このＪＩＴコンパイラによるコンパイル中においてもインタープリタがポーリング処理を行うので、コンパイル中であってもイベント応答性は劣化しない。
【００３３】
ステップＳ２におけるコンパイルが終了すると、次にＪＩＴコンパイラの生成したコードが実行される（ステップＳ３）。ここで、コンパイラの生成したネィティブコードには、周期的にポーリング処理を行うように所定の命令が埋め込まれているので、ステップＳ３においてもイベント応答性が劣化することはない。その後、再度インタープリタがＪａｖａ（Ｒ）スレッドのクラスファイルを解釈・実行する（ステップＳ４）。ここでもインタープリタはポーリング処理を行うので、正しくイベント応答が可能である。
【００３４】
以上のように、本実施形態によれば、ＪＩＴコンパイラを利用してＪａｖａ（Ｒ）クラスファイルを実行する場合であっても、コンパイル中にイベント応答性が劣化せず、シームレスに正しくイベント応答することが可能である。また、図３に示したように主要な処理の全てがＪａｖａ（Ｒ）スレッド上で実行されるので、ＪＩＴコンパイラを実行するＪａｖａ（Ｒ）スレッドから、Ｊａｖａ（Ｒ）アプリケーションを実行するＪａｖａ（Ｒ）スレッド等へコンテキストを保存しつつスレッドディスパッチすることができ、生成途中のコードを破棄することなくコンパイルの中断・再開が可能となる。
【００３５】
以上詳述したように、本発明の一実施の形態に係るＪＩＴコンパイラによるイベント応答性の劣化を回避する方法によれば、実行するクラスファイルとＪＩＴコンパイラとが、いずれもＪａｖａ（Ｒ）実行環境のノンプリエンプティブなマルチタスク環境で実行されるのでコンパイル中もクラスファイル実行中と同等のイベント応答性が確保される。
【００３６】
さらに、副次的な効果としては、コンパイルによるイベント応答性の劣化を気にすることなく、ユーザ入力待ちの時間などの細かい空き時間を利用する等、時間をかけてよりよいコードを生成することができる。また、従来技術ではコンパイルを中断して別のＪａｖａ（Ｒ）スレッドにディスパッチする場合、途中結果を破棄しなければならず、後で最初からやり直さなければならなかったが、本実施の形態の方法によれば、Ｊａｖａ（Ｒ）実行環境のスレッドディスパッチ機構が利用できるので、途中結果を破棄することなく、コンパイルの中断・再開が可能である。また、本実施の形態では、ＪＩＴコンパイラ自身がＪａｖａ（Ｒ）で記述されているため、ＪＩＴコンパイラをバージョンアップしたり、何種類かのものを用意して、ＪＩＴコンパイラを差し替えて使用したりすることも容易になる。
【００３７】
以上、本発明の一実施の形態について説明したが、本発明はこれに限定されることはなく、その趣旨を逸脱しない範囲で種々の改良・変更が可能である。
【図面の簡単な説明】
【００３８】
【図１】本発明の一実施の形態に係るＪＩＴコンパイラによるイベント応答性の劣化を回避する方法を実施するためのハードウェア構成図である。
【図２】本発明の一実施の形態に係るＪＩＴコンパイラによるイベント応答性の劣化を回避する方法を実施するソフトウェアの構成図である。
【図３】本発明の一実施の形態に係るＪＩＴコンパイラによるイベント応答性の劣化を回避する方法よる処理およびイベントの応答性の遷移を示す図である。
【図４】従来法における処理およびイベントの応答性の遷移を示す図である。
【符号の説明】
【００３９】
１・・・ＣＰＵ、２・・・メモリ、３・・・表示部、４・・・入出力部、１１・・・プラットフォーム、１３・・・ＶＭ、１４・・・クラスライブラリ、１５・・・Ｊａｖａ（Ｒ）アプリケーション、１６，１７・・・ネイティブアプリケーション。
【図１】
2006039879.tif 000003
【図２】
2006039879.tif 000004
【図３】
2006039879.tif 000005
【図４】
2006039879.tif 000006