(57)【要約】【課題】インタプリタおよび動的コンパイラを備える言語処理実行システムにおいて、動的コンパイラの異常終了により言語処理実行システム全体の異常終了を防止する。【解決手段】動的コンパイラ部１１１は、動的コンパイル中に発生した異常を自己検知し、言語処理実行システム（ＪａｖａＶＭ１０４）に影響を与えないように停止する。言語処理実行システムは、メソッド実行部１１２のインタプリタ実行部１３３を利用し処理を継続する。【選択図】図１
2007249736.tif 000002
【特許請求の範囲】
【請求項１】
メモリに格納されプロセッサによって実行される言語処理実行プログラムとして、インタプリタ実行部と、動的コンパイラ部と、コンパイルコード実行部とを有し、ユーザプログラム中の各メソッドを入力し、実行対象のメソッドがコンパイル済であれば前記コンパイルコード実行部によりコンパイルコードを実行し、当該メソッドが所定のコンパイル条件を満たせば前記動的コンパイラ部によりコンパイルコードを生成し、当該メソッドがコンパイル済でなく前記コンパイル条件を満たさなければ前記インタプリタ実行部により解釈実行する言語処理実行方法において、
各メソッドに対応してコンパイラに適用する最適化レベルを示す情報を前記メモリに設定し、前記最適化レベルはレベルが高いほど多くの最適化機能を適用するように設定されたものであり、前記言語処理実行プログラムを前記プロセッサにより実行することによって実現される方法は、
前記動的コンパイラ部によるコンパイル中に異常が発生したとき、コンパイル中のメソッドに対応する前記最適化レベルを低下させるように再設定するステップと、
前記動的コンパイラ部の動作を停止させるステップと、
前記動的コンパイラの停止を検出するステップと、
前記動的コンパイラ部を再起動するステップとを有することを特徴とする言語処理実行方法。
【請求項２】
前記最適化レベルを低下させるように再設定するステップにおいて、前記最適化レベルの低下が不可能となったとき、当該メソッドのコンパイルを抑止し、以後前記インタプリタ実行部による実行とすることを特徴とする請求項１記載の言語処理実行方法。
【請求項３】
メモリに格納される言語処理実行プログラムをプロセッサによって実行することによって実現される言語処理実行手段として、各々独立して動作可能なメソッド実行手段と、動的コンパイラ手段と、動的コンパイラ監視手段とを有し、ユーザプログラム中の各メソッドを入力し、実行対象のメソッドがコンパイル済であれば前記メソッド実行手段がそのコンパイルコードを実行し、当該メソッドが所定のコンパイル条件を満たせば前記動的コンパイラ手段によりコンパイルコードを生成し、当該メソッドがコンパイル済でなく前記コンパイル条件を満たさなければ前記メソッド実行手段がインタプリタにより解釈実行する計算機システムであって、
前記メモリは、さらに各メソッドに対応してコンパイラに適用する最適化レベルを示す情報を保存し、前記最適化レベルはレベルが高いほど多くの最適化機能を適用するように設定されたものであり、
前記動的コンパイラ手段は、さらに、コンパイル中に異常が発生したとき、コンパイル中のメソッドに対応する前記最適化レベルを低下させるように再設定する手段と、当該動的コンパイラ手段自身の動作を停止させる手段とを有し、
前記動的コンパイラ監視手段は、監視によって前記動的コンパイラの停止を検出する手段と、前記動的コンパイラ手段を再起動する手段とを有することを特徴とする計算機システム。
【請求項４】
前記最適化レベルを低下させるように再設定する手段は、さらに、前記最適化レベルの低下が不可能となったとき、当該メソッドのコンパイルを抑止する手段を有し、以後前記メソッド実行手段によるインタプリタ実行とすることを特徴とする請求項３記載の計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、インタプリタおよび動的コンパイラを備える言語処理実行システム（以後、言語処理実行システム）において、動的コンパイラ異常終了時のフェールオーバ機構を実現するための技術に関するものである。
【背景技術】
【０００２】
非特許文献１にあるように、言語処理実行システムにおける一般的な従来技術として、実行頻度の高い部分に関して、インタプリタによる実行から動的コンパイラでコンパイルしたコードの実行へ切り替えることで実行性能の改善を図るという方法が挙げられる。言語処理実行システムであるＪａｖａ（ＴＭ）仮想マシン（以後、ＪａｖａＶＭという）（ＪａｖａおよびすべてのＪａｖａ関連の商標およびロゴは、米国およびその他の国における米国Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ、Ｉｎｃ．の商標または登録商標である）においては、呼び出し回数等の履歴情報から実行頻度の高いメソッドを判定し、メソッド単位で実行方式の切り替えを行う方法が一般的である。
【０００３】
他の従来技術としては、特許文献１のように、動的コンパイルにより無効な結果またはエラーを生じるメソッドに関する情報を含むデータベースを持ち、これを参照して、動的コンパイルを行うか否か決定するものが挙げられる。また、特許文献２のように、異なる動的コンパイラを複数用意し、まずはある動的コンパイラでコンパイルを行い、実行時に別の方法でのコンパイルが望ましいと判断した場合は、異なる動的コンパイラでリコンパイルを行う技術が挙げられる。
【０００４】
【特許文献１】特開２０００−１７２５１２号公報
【特許文献２】特開２０００−１８１７２４号公報
【非特許文献１】中田育男著「コンパイラの構成と最適化」朝倉書店、１９９９年９月２０日、Ｐ．２２１−２２６
【発明の開示】
【発明が解決しようとする課題】
【０００５】
通常、言語処理実行システムと動的コンパイラとは、同一のプロセスで動作するため、動的コンパイラの異常終了は、言語処理実行システムそのものの異常終了を伴う。従来技術では、予め登録してある特定のメソッドの動的コンパイルを抑止することや、最適化のために複数の動的コンパイラを使い分けることは可能であるが、動的コンパイラの異常終了には対処できないという問題があった。
【０００６】
本発明は、言語処理実行システムにおいて、動的コンパイラの異常終了に伴って言語処理実行システムの異常終了を発生させず、インタプリタへの実行の引き継ぎや、条件を変更しての再度の動的コンパイルなどのフェールオーバ機構を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記目標を達成するために、言語処理実行システムは、各メソッドに付随する情報として、そのメソッドをコンパイルする条件（最適化レベル）を保持する。動的コンパイラがメソッドをコンパイルする際には、この最適化レベルでコンパイルを行う。最適化レベルが高いほど、高速な実行が可能なコンパイルコードが生成される。あるメソッドをそのメソッドに付随する最適化レベルでコンパイル中に異常が発生した場合は、異常処理に移行する。異常処理は、そのメソッドについて、異常が発生したコンパイルの最適化レベルより低い最適化レベルに再設定し、言語処理実行システムに影響を与えないように処置した後に、停止する。この際、言語処理実行システムは停止しない。また、言語処理実行システムは、動的コンパイラを監視する機構を備え、この異常処理により動的コンパイラが停止している場合は、動的コンパイラの再起動を行う。動的コンパイル中に異常が発生したメソッドについては、インタプリタ実行を継続する。そのメソッドの次のコンパイルの機会には、先に設定した最適化レベルで、再度のコンパイルを試みる。最適化レベルの変更と動的コンパイラの異常発生の繰り返しにより、最適化レベルが設定した閾値を下回った場合には、そのメソッドをコンパイルの対象外とし、動的コンパイルを試みない。
【発明の効果】
【０００８】
本発明によれば、動的コンパイラ異常発生時にそれを検出し、動的コンパイラのみを終了させることにより、言語処理実行システム全体の異常終了を防ぎ、実行を継続できるという利点がある。本発明はさらに、動的コンパイラの監視機構が、異常の発生により終了させた動的コンパイラを再起動することにより、言語処理実行システム全体を再起動することなく、動的コンパイラによるメソッドのコンパイルを継続できる利点がある。また、１度異常が発生したメソッドのコンパイルも、最適化レベルを変更し複数回試みることにより、コンパイルが成功する可能性が高まり、性能の劣化を最小限に抑える利点がある。
【発明を実施するための最良の形態】
【０００９】
以下、言語処理実行システムとしてＪａｖａＶＭを使用した場合の実施例について図面に基づいて詳細に説明する。
【００１０】
図１は、実施形態のＪａｖａＶＭが動作する計算機システム上におけるＪａｖａＶＭの構成とその入出力データの図である。計算機システム１１８は、主記憶（メモリ）１０５に格納されるＪａｖａＶＭ１０４の実行を行うプロセッサ１１７、ＪａｖａＶＭ１０４がロードされ、各種領域が確保される主記憶１０５、ファイル等が保存される補助記憶１１９から構成され、主記憶１０５とプロセッサ１１７は、バス１１６によって結合されている。Ｊａｖａヒープ領域１０６およびコンパイルコード格納領域１１０は、ＪａｖａＶＭ内に確保された記憶領域である。メソッド読み取り部１０７、動的コンパイラ監視部１０８、動的コンパイラ部１１１およびメソッド実行部１１２は、言語処理実行システムを構成するプログラムである。
【００１１】
補助記憶１１９に格納されているＪａｖａソースプログラム１０３は、Ｊａｖａコンパイラ１０２により、ＪａｖａＶＭ１０４で解釈・実行できる形式であるＪａｖａバイトコードを保持するＪａｖａクラスファイル１０１に変換され、これがＪａｖａＶＭ１０４に入力される。ＪａｖａＶＭ１０４に入力されたＪａｖａクラスファイル１０１は、メソッド読み取り部１０７によって解析されて、Ｊａｖａヒープ領域１０６内にメソッド情報１０９を作成する。メソッド実行部１１２は、通常、インタプリタ実行部１１３がメソッド情報１０９を読み込んで、インタプリタ実行を行う。インタプリタ実行を繰り返すうちに、実行頻度が高いと判断したメソッドに関しては、メソッド実行部１１２が動的コンパイラ部１１１に対して、そのメソッドのコンパイルを要求する。コンパイル要求を受けた動的コンパイラ部１１１は、メソッド情報１０９を読み、コンパイルを行う。
【００１２】
本発明の対象は、このコンパイル中に内的または外的要因により、動的コンパイラ部１１１に異常が発生し、それに伴いＪａｖａＶＭ１０４も異常終了することを防ぐことである。動的コンパイラ部１１１は、自身に発生した異常を検出した場合、ＪａｖａＶＭ１０４に影響を与えないように停止する。動的コンパイラ監視部１０８は、動的コンパイラ部１１１が動作しているか否かの監視を定期的に行い、停止している場合は、動的コンパイラ部１１１の再起動を行う。動的コンパイラ部１１１は、コンパイルが成功した場合には、コンパイルコード格納領域１１０内にコンパイルコード１１４を配置する。メソッド実行部１１２は、コンパイル要求が受け入れられた結果として、そのメソッドのコンパイルコード１１４が生成されると、コンパイルコード実行部１１５が、そのコンパイルコード１１４を利用してその後のこのメソッドの実行を行う。コンパイルコードが生成されなかった場合は、インタプリタ実行部１１３がメソッド情報１０９を読み込んで、インタプリタ実行を継続する。動的コンパイラ監視部１０８、動的コンパイラ部１１１およびメソッド実行部１１２は、各々別々のスレッドで動作する。なお主記憶１０５上には、他にオペレーティングシステム（ＯＳ）が存在するが、通常用いられるＯＳでよいので、その説明を省略する。
【００１３】
図２は、メソッド情報１０９およびコンパイルコード１１４を詳細化した図である。メソッド情報１０９は、メソッドごとにＪａｖａヒープ領域１０６内に必ず作成される情報である。バイトコード列２０４は、Ｊａｖａプログラムのメソッドの処理を表現する命令列のことであり、元々はＪａｖａクラスファイル１０１に格納されており、メソッド読み取り部１０７によってメソッド情報１０９内に格納される。インタプリタ実行部１１５は、バイトコード列２０４の構成要素であるバイトコードをひとつずつ読み込んで実行を行う（インタプリタ実行）。コンパイルコードへのポインタ２０１は、該メソッドがコンパイルされていない場合には０、コンパイル済みである場合は、コンパイルコード格納領域１１０内の該メソッドに対応するコンパイルコード１１４へのアドレスを保持している。コンパイルコード１１４は、ヘッダー２０５および機械語コード列２０６からなり、バイトコード列２０４を入力として動的コンパイラ部１１１がコンパイルにより生成する。機械語コード列２０６は、プロセッサ１１７が解することのできる機械語コードの列である。コンパイル抑止フラグ２０２は動的コンパイラがコンパイルを行うかどうか判断するフラグであり、真のとき動的コンパイラ部１１１はコンパイルを行わず、インタプリタ実行部１１３がインタプリタ実行を継続する。初期値は偽である。
【００１４】
最適化レベル２０３は、動的コンパイラが該メソッドをコンパイルする際の最適化レベルを指示するものである。最適化レベル２０３は、最適化レベルと適用する最適化の対応表２０７により、適用する最適化群と関連付けられる。対応表２０７に例示されるように、最適化レベルが高いほど多くの最適化機能を適用するように設定されている。最低の最適化レベルでは、いずれの最適化機能も適用されない。図２では、例として値３が設定されている。この状態でコンパイルが行われた場合、最適化Ａ・Ｃが適用され、最適化Ｂは適用されない。通常、より多くの最適化を適用しコンパイルを行った方が高速に実行可能なコンパイルコードが生成される。反面、コンパイル中に異常が発生する可能性は高くなる。コンパイル中に動的コンパイラに異常が発生した場合は、この値が減ぜられる。減ぜられた結果、値が１未満になると、コンパイル抑止フラグ２０２が真となる。最適化レベル２０３の初期値および最適化レベルと適用する最適化の対応表２０７は、言語処理実行システム内部に静的保持する方法や、設定ファイル等で外部から動的に与えるなどの方法が考えられるが、ここでは特に限定しない。最適化Ａ，Ｂ，Ｃの例として、エスケープ解析による冗長モニタの削除、インライン展開すること、ループ展開などがある。最適化レベル２０３は、ユーザによって指定されてもよいし、処理開始時に自動的に最高位レベルを設定されてもよい。
【００１５】
図３は、メソッド実行部１１２のメソッド実行処理を、メソッド実行前処理を中心に表したフローチャートである。メソッド実行部１１２は、対象とするメソッドが既に動的コンパイラ部１１１によりコンパイルされていて、コンパイルコード１１４が存在するかどうかを、メソッド情報１０９内のコンパイルコードへのポインタ２０１がアドレス保持しているか否かによって判定する（ステップ３０１）。コンパイルコード１１４が存在する場合は、コンパイルコード実行部１１５が、コンパイルコード１１４の実行を行う（ステップ３０６）。コンパイルコード１１４が存在しない場合は、該メソッドがコンパイル条件を満たすかどうかを判定する（ステップ３０２）。コンパイル条件を満たす条件としては、該メソッドの実行回数が既定回数を上回るなどがある。コンパイル条件を満たさない場合はインタプリタ実行部１１３がインタプリタ実行を行う（ステップ３０５）。満たす場合は、メソッド情報１０９のコンパイル抑止フラグ２０２の真偽を判定し（ステップ３０３）、真ならばインタプリタ実行を行う（ステップ３０５）。偽ならば、メソッド実行部１１２は、動的コンパイラ部１１１に対し、該メソッドのコンパイルを依頼し（ステップ３０４）、インタプリタ実行を行う（ステップ３０５）。該メソッドの次の実行までに動的コンパイラ部１１１によるコンパイルが終了していれば、次の実行からはコンパイルコード１１４による実行となる。
【００１６】
図４は、動的コンパイラ部１１１のコンパイル処理を表したフローチャートである。動的コンパイラ部１１１は、メソッド実行部１１２からのメソッドのコンパイル要求が存在するか判定を行う（ステップ４０１）。要求がない場合は、要求が発生するまで待つ。要求がある場合は、メソッド情報１０９の最適化レベル２０３に対応する最適化群に従ってコンパイルを行う。図２の例では最適化レベルが３であるので、最適化Ａ，Ｃを適用し、最適化Ｂを適用しないでコンパイルを行う（ステップ４０２）。本発明では、コンパイル（ステップ４０２）中に、異常が発生した場合にＪａｖａＶＭ１０６が異常終了することを防ぐために、異常発生時の処理が存在する。処理の詳細は図５で説明する。コンパイル（ステップ４０２）が正常に終了した場合には、動的コンパイラ部１１１は、生成したコンパイルコード１１４をコンパイルコード格納領域１１０に保存し（ステップ４０３）、該メソッドのメソッド情報１０９のコンパイルコードへのポインタ２０１に、コンパイルコード１１４のアドレスを保存する（ステップ４０４）。保存後は、次のコンパイル要求が存在するかどうかの判定（ステップ４０１）に戻る。コンパイル（ステップ４０２）中に異常が発生したとき、ＯＳの例外ハンドラを経由して図５に示す異常処理プログラムに制御が渡る。
【００１７】
図５は、動的コンパイラ部１１１でコンパイル中に異常が発生した場合の処理を表したフローチャートである。動的コンパイラ部１１１中の異常処理プログラムは、ＪａｖａＶＭ１０４の他の箇所でも利用する共有資源（ロックなど）を動的コンパイラ部１１１が保持しているか判定を行う（ステップ５０１）。保持している場合は解放を行う（ステップ５０２）。解放後、または共有資源を保持していない場合には、動的コンパイラ部１１１は、メソッド情報１０９の最適化レベル２０３を１減ずる（ステップ５０３）。図２の例では最適化レベルが３から２に減ずる。その結果として、メソッド情報１０９と対応するメソッドの次回のコンパイルでは、最適化Ａが有効となり、最適化Ｂ，Ｃが無効となる。最適化レベル２０３を減じた後、最適化レベル２０３が１未満となっているか判定をする（ステップ５０４）。下回っている場合には、動的コンパイラ部１１１は、メソッド情報１０９のコンパイル抑止フラグ２０２を真にする（ステップ５０５）。コンパイル抑止フラグ２０２を真にした後、または最適化レベル２０３が１以上の場合には、動的コンパイラ部１１１自身を停止させる（ステップ５０６）。動的コンパイラ部１１１の停止は、そのスレッドを終了させるが、メソッド実行部１１２は継続して実行できるので、インタプリタの実行は継続する。
【００１８】
図６は、動的コンパイラ監視部１０８の処理を表したフローチャートである。動的コンパイラ監視部１０８は、動的コンパイラ部１１１が停止しているか否かの判定を行い（ステップ６０１）、停止していた場合は動的コンパイラを再起動する（ステップ６０２）。起動後、または停止していなかった場合は、動的コンパイラ部１１１が停止しているかの判定（ステップ６０１）に戻る。ステップ６０２の動的コンパイラの再起動により、動的コンパイラの実行は、そのスレッドに割り当てられたメモリ領域中の異常発生前の情報がリセットされた状態から始まる。
【００１９】
本実施形態により、動的コンパイラに起因する障害の多くと、ハードエラーなど外的要因による障害のいくらかを回避して動的コンパイラによるメソッドのコンパイルを継続できる。
【図面の簡単な説明】
【００２０】
【図１】実施形態の計算機システムのＪａｖａＶＭの構成図である。
【図２】メソッド情報、コンパイルコード、および最適化レベルの関連を表した図である。
【図３】メソッド実行処理を表したフローチャートである。
【図４】動的コンパイラ部のコンパイル実行処理を表したフローチャートである。
【図５】コンパイル中に異常が発生した場合の動的コンパイラ部の実行処理を表したフローチャートである。
【図６】動的コンパイラ監視部の実行処理を表したフローチャートである。
【符号の説明】
【００２１】
１０４  ＪａｖａＶＭ、１０８  動的コンパイラ監視部、１０９  メソッド情報、１１１  動的コンパイラ部、１１２  メソッド実行部、１１３  インタプリタ実行部、１１４  コンパイルコード、１１５  コンパイルコード実行部。
【図１】
2007249736.tif 000003
【図２】
2007249736.tif 000004
【図３】
2007249736.tif 000005
【図４】
2007249736.tif 000006
【図５】
2007249736.tif 000007
【図６】
2007249736.tif 000008