(57)【特許請求の範囲】
【請求項１】
プログラミング言語で記述されたプログラムのソースコードを機械語コードに変換するコンパイラにおいて、
前記プログラムにおける関数をインライン展開し当該インライン展開に関する情報を生成するインライン展開処理部と、
前記インライン展開に関する情報に基づいて、当該関数による資源のロックに関するロック情報を生成するロック情報生成部と、
前記ロック情報に基づいて、前記プログラム中の例外ハンドラに当該例外ハンドラの実行時におけるロック回数を付加する情報付加部と
を備えることを特徴とするコンパイラ。
【請求項２】
前記情報付加部は、例外が発生したコードのアドレスから当該コードの実行時におけるロック回数を表引きするための対応表を作成し、前記プログラムの付属情報として付加することを特徴とする請求項１に記載のコンパイラ。
【請求項３】
前記情報付加部は、前記プログラムに設定されたｔｒｙ領域内のコードの実行時における前記ロック回数を当該ｔｒｙ領域の識別情報にエンコードすることを特徴とする請求項１に記載のコンパイラ。
【請求項４】
前記プログラム中に存在する不要なロックを削除し、ロックの削除の結果に応じて前記ロック情報生成部にて生成された前記ロック情報を更新する同期最適化部をさらに備え、
前記情報付加部は、前記同期最適化部により更新されたロック情報に基づいて、前記例外ハンドラにロック回数を付加することを特徴とする請求項１に記載のコンパイラ。
【請求項５】
コンピュータを制御して実行プログラムを変換する変換プログラムであって、
前記実行プログラムにおける関数のインライン展開に関する情報に基づいて、当該関数による資源のロックに関する情報を生成する機能と、
前記ロックに関する情報に基づいて、前記実行プログラム中の各コードの実行時におけるロックの状態を表す情報を前記実行プログラムに付加する機能と
を前記コンピュータに実現させることを特徴とする変換プログラム。
【請求項６】
前記コンピュータに、
前記実行プログラム中に存在する不要なロックを削除し、当該ロックの削除の結果に応じて、前記ロックに関する情報を更新する機能をさらに実現させ、
前記実行プログラムにロックの状態を表す情報を付加する機能は、更新された前記ロックに関する情報に基づいて、前記実行プログラムにロックの状態を表す情報を付加することを特徴とする請求項５に記載の変換プログラム。
【請求項７】
コンピュータを制御してオブジェクト指向プログラミング言語で記述された実行プログラムを変換する変換プログラムであって、
前記実行プログラムにおけるメソッドのインライン展開に関する情報に基づいて、当該メソッドによるオブジェクトのロックに関するロック情報を生成する機能と、
前記ロック情報に基づいて、前記実行プログラム中の各コードの実行時におけるロック回数に関する情報を前記実行プログラムに付加する機能と
を前記コンピュータに実現させることを特徴とする変換プログラム。
【請求項８】
コンピュータを制御して実行プログラムの実行中に発生した例外を処理する例外処理プログラムであって、
前記実行プログラムに付加された、前記実行プログラムにおける各コードのアドレスとコードの実行時における資源のロック回数とを対応付けた対応情報に基づいて、前記例外を発生したコードのアドレスから前記例外の発生時におけるロック回数を求める処理と、
前記実行プログラム中の前記例外に対する例外ハンドラに付加された、当該例外ハンドラの実行時におけるロック回数を取得する処理と、
前記例外の発生時におけるロック回数と前記例外ハンドラの実行時におけるロック回数との差分だけ資源のロックを解除する処理と
を前記コンピュータに実行させることを特徴とする例外処理プログラム。
【請求項９】
コンピュータを制御して実行プログラムの実行中に発生した例外を処理する例外処理プログラムであって、
前記実行プログラムに記述された、ｔｒｙ領域内における各コードの実行時における資源のロック回数がエンコードされたｔｒｙ領域の識別情報を用い、前記例外を発生したコードが含まれるｔｒｙ領域の識別情報をデコードして前記例外の発生時における資源のロック回数を求める処理と、
前記実行プログラム中の前記例外に対する例外ハンドラに付加された、当該例外ハンドラの実行時におけるロック回数を取得する処理と、
前記例外の発生時におけるロック回数と前記例外ハンドラの実行時におけるロック回数との差分だけ資源のロックを解除する処理とを前記コンピュータに実行させることを特徴とする例外処理プログラム。
【請求項１０】
プログラム制御により情報処理を行うコンピュータ装置において、
プログラムを実行する実行手段と、
前記実行手段によるプログラムの実行中に例外が発生した場合に、当該例外を処理する例外処理手段とを備え、
前記例外処理手段は、
当該プログラムに付加された各コードの実行時における資源のロック回数に関する情報に基づいて、前記例外の発生時におけるロック回数と前記例外に対する例外ハンドラの実行時におけるロック回数とを求め、二つの当該ロック回数の差分だけ資源のロックを解除した後に、当該例外に対する処理を実行することを特徴とするコンピュータ装置。
【請求項１１】
前記例外処理手段は、前記プログラムに付加された、前記プログラムにおける各コードのアドレスとコードの実行時における資源のロック回数とを対応付けた対応情報に基づいて、前記例外を発生したコードのアドレスから前記例外の発生時における資源のロック回数を求めることを特徴とする請求項１０に記載のコンピュータ装置。
【請求項１２】
前記例外処理手段は、前記プログラムに記述された、ｔｒｙ領域内における各コードの実行時における資源のロック回数がエンコードされたｔｒｙ領域の識別情報を用い、前記例外を発生したコードが含まれるｔｒｙ領域の識別情報をデコードして前記例外の発生時における資源のロック回数を求めることを特徴とする請求項１０に記載のコンピュータ装置。
【請求項１３】
プログラムのソースコードをコンパイルして機械語コードに変換するコンパイラと、
機械語コードに変換された前記プログラムを実行する処理装置とを備えたコンピュータ装置において、
前記コンパイラは、
前記プログラムにおける関数のインライン展開に関する情報に基づいて、当該関数による資源のロックに関するロック情報を生成するロック情報生成部と、
前記ロック情報に基づいて、前記プログラム中の各コードの実行時におけるロック回数に関する情報を前記プログラムに付加する情報付加部とを備え、
前記処理装置は、
前記プログラムの実行中に例外が発生した場合に、前記ロック回数に関する情報に基づいて、当該例外を発生したコードの実行時におけるロック回数と前記例外に対する例外ハンドラの実行時におけるロック回数とを求め、二つの当該ロック回数の差分だけ資源のロックを解除した後に、当該例外に対する処理を実行することを特徴とするコンピュータ装置。
【請求項１４】
前記コンパイラは、
前記プログラム中に存在する不要なロックを削除し、ロックの削除の結果に応じて前記ロック情報生成部にて生成された前記ロック情報を更新する同期最適化部をさらに備え、
前記情報付加部は、前記同期最適化部により更新されたロック情報に基づいて、前記ロック回数に関する情報を前記プログラムに付加することを特徴とする請求項１３に記載のコンピュータ装置。
【請求項１５】
コンピュータを制御して実行プログラムを変換するプログラム変換方法において、
前記実行プログラムにおける関数のインライン展開に関する情報に基づいて、当該関数による資源のロックに関するロック情報を生成するステップと、
前記ロック情報に基づいて、前記実行プログラム中の各コードの実行時におけるロック回数に関する情報を前記実行プログラムに付加するステップと
を前記コンピュータに実現させることを特徴とするプログラム変換方法。
【請求項１６】
コンピュータを制御して実行プログラムを変換する変換プログラムを当該コンピュータの入力手段が読取可能に記憶した記憶媒体において、
前記変換プログラムは、
前記実行プログラムにおける関数のインライン展開に関する情報に基づいて、当該関数による資源のロックに関するロック情報を生成する機能と、
前記ロック情報に基づいて、前記実行プログラム中の各コードの実行時におけるロック回数に関する情報を前記実行プログラムに付加する機能と
を前記コンピュータに実現させることを特徴とする記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータプログラムの最適化方法に関し、特に例外処理の手法に特徴を有する最適化方法に関する。
【０００２】
【従来の技術】
いくつかのプログラミング言語では、最適化の手法としてインライン展開という手法が用いられる。インライン展開とは、関数の定義内容をそのまま呼び出し元に埋め込むことにより、実際に関数呼び出しを行わずに処理を行うようにプログラムの記述を変更することである。これによれば、関数呼び出しのためのオーバーヘッドがかからないため、実行速度の向上を図ることができる。
【０００３】
また、いくつかのプログラミング言語では、特定の領域を宣言することにより、プログラムの実行に際して当該領域中で発生した例外を当該領域に関連した例外ハンドラで処理するといった仕組みが設けられている。この仕組みを持つプログラミング言語の一つであるＪａｖａでは、この宣言をｔｒｙと呼び、宣言された領域をｔｒｙ領域、ｔｒｙブロックなどと呼ぶ。以下の説明では、Ｊａｖａに倣い、これらの宣言及び領域にｔｒｙ、ｔｒｙ領域といった呼称を用いる。
【０００４】
ところで、ネットワークシステムにおけるサーバやクライアントなど、複雑かつ信頼性が必要なシステムを構築するプログラムを作成するには、同期する複数スレッドを記述できるプログラミング言語を使用することが望まれる。そのような条件を満たすプログラミング言語の例としてＪａｖａがある。
Ｊａｖａは同期メソッドと同期ブロックという２種類のクリティカルセクションを記述することができる。そして、例外発生時には実行システムがそれらのクリティカルセクションを必ず解除する。
【０００５】
また、Ｊａｖａは、上述したインライン展開及びｔｒｙの仕組みをいずれも持つプログラミング言語の一つである。
Ｊａｖａで記述されたプログラムに対するコンパイルを行うコンパイラ（以下、Ｊａｖａコンパイラと称す）において最適化を行う際に、同期メソッドに対してインライン展開を行うと、メソッド呼出コスト削減、定数伝搬、クラス情報伝搬といった通常のインライン展開による効果に加え、冗長な同期を削除できるという効果が得られる。
しかしながら、インライン展開を行う際には、所定の手続きが処理の過程で資源（Ｊａｖａにおいてこの場合はオブジェクト）を排他的に使用するために行う使用制限である資源のロックが、言語仕様上設定される数以上に増加する。このため、同期メソッドをインライン展開したプログラムにおいて、ｔｒｙを用いた例外処理が複雑になる。
【０００６】
図８を参照して、Ｊａｖａにおいて同期メソッド（以下、適宜、単にメソッドと称す）をインライン展開したプログラムにおける従来の例外処理について説明する。
図８に示す例では、メソッドＡがメソッドＢを呼び、次にメソッドＢがメソッドＣを呼ぶ呼び出しがインライン展開されている。メソッドＣはメソッドＢのｔｒｙ領域にインライン展開され、メソッドＢとメソッドＣとは同期メソッドを用いてそれぞれの入口でオブジェクトをロックする。
【０００７】
この例において、インライン展開されたメソッドＣ内で例外Ｅが発生し、メソッドＢのｔｒｙ領域Ｔの例外ハンドラで例外Ｅをキャッチすることを考える。
この場合、ｔｒｙ領域Ｔを越えて例外が処理されるため、例外ハンドラは、メソッドＣのロックを解除し、メソッドＢのロックはそのままにして処理を行う必要がある。そのため、例外ハンドラは、例外Ｅを投げた命令が実行されるときにメソッドＢとメソッドＣとのロックが取得され、ｔｒｙ領域Ｔの例外ハンドラが実行されるときにメソッドＢのロックが取得されていることを知らなければならない。言い換えれば、例外発生時におけるロックと例外ハンドラの実行時におけるロックとに関する情報が必要となる。
【０００８】
ここで、コード領域とインライン展開したメソッドとの対応情報（以下、インライン情報）は、Ｊａｖａコンパイラが持つことができる。このインライン情報は、言い換えれば、コードが元々どのように呼び出されたメソッドに属していたかを表す情報である。したがって図示の例では、例外ハンドラは、例外Ｅの発生アドレスからインライン情報として「メソッドＡ→メソッドＢ→メソッドＣ（元々この順で呼び出されたことを示す。以下、インライン情報において「メソッド」を省略する）」を得、また例外Ｅをキャッチするアドレスからインライン情報として「Ａ→Ｂ」を得る。そして、これらのインライン情報を比べることによって、メソッドＣで行ったロックを特定し、解除する。
【０００９】
従来のＪａｖａコンパイラは、かかるインライン情報として、アドレス区間とインライン情報との表、あるいは例外関連命令（例外発生可能命令、例外ハンドラ先頭命令、メソッド呼出命令）のアドレスとインライン情報との表を作成する。そして、例外ハンドラは、例外が発生した場合に、当該例外の発生アドレス及び当該例外をキャッチするアドレスを用いて当該アドレスに対応する表を見つけだし、さらに当該表において所望のインライン情報を検索していた。
【００１０】
【発明が解決しようとする課題】
しかし、上述した、従来のＪａｖａコンパイラの方法は、インライン情報を取得するために、アドレスに基づいて表を検索する作業と、得られた表に基づいてインライン情報を検索する作業という二つの作業を要する。そのため、この作業に要する時間（作業コスト）は、例外処理全体の作業コストに無視できない影響を与えていた。
【００１１】
また、上述した表を用いてインライン情報を取得する手法では、取得したインライン情報から得られるロックの状態と実際のロックの状況とが一致しない場合があった。例えば、最適化によって冗長なロックが削除された場合、インライン情報でインライン展開された同期メソッドを示したとしても、その同期メソッドによるロックが存在しているとは限らなかった。
【００１２】
そこで、本発明は、例外処理に必要なロックに関する情報を取得するための作業コストを抑え、例外処理における作業コストへの影響を縮減するためのコンパイル方法及び例外処理の実行方法を提供することを目的とする。
また、本発明は、例外発生に対して確実に必要なロックの解除を行い、例外処理を行う例外処理の手法を提供することを他の目的とする。
【００１３】
【課題を解決するための手段】
上記の目的を達成するため、本発明は、プログラミング言語で記述されたプログラムのソースコードを機械語コードに変換するコンパイラにおいて、プログラムにおける関数をインライン展開し、このインライン展開に関する情報を生成するインライン展開処理部と、このインライン展開に関する情報に基づいて、この関数による資源のロックに関するロック情報を生成するロック情報生成部と、このロック情報に基づいて、処理対象であるプログラム中の例外ハンドラにこの例外ハンドラの実行時におけるロック回数を付加する情報付加部とを備えることを特徴とする。
【００１４】
ここで、このプログラムを実行する処理系における例外処理方式がスタック巻き戻し方式である場合、この情報付加部は、例外が発生したコードのアドレスからこのコードの実行時におけるロック回数を表引きするための対応表を作成し、処理対象であるプログラムの付属情報として付加する。
これにより、例外処理の際、例外フィルタは、この対応表を用いて例外の発生時（例外を発生したコードの実行時）におけるロック回数を直接取得することができる。
【００１５】
また、このプログラムを実行する処理系における例外処理方式が構造化例外処理方式である場合、この情報付加部は、処理対象であるプログラムに設定されたｔｒｙ領域内のコードの実行時におけるロック回数を、このｔｒｙ領域の識別情報（ＩＤ）にエンコードする。
これにより、例外処理の際、例外フィルタは、例外が発生したｔｒｙ領域のＩＤから直ちに例外の発生時におけるロック回数を取得することができる。
【００１６】
さらに、上記のコンパイラは、プログラム中に存在する不要なロックを削除し、ロックの削除の結果に応じて、ロック情報生成部にて生成されたロック情報を更新する同期最適化部をさらに備える構成とすることができる。この場合、情報付加部は、この同期最適化部により更新されたロック情報に基づいて、例外ハンドラにロック回数を付加する。
【００１７】
また、本発明は、コンピュータを制御して実行プログラムを変換する変換プログラムとして提供することができる。この変換プログラムは、この実行プログラムにおける関数のインライン展開に関する情報に基づいて、インライン展開された関数による資源の使用制限に関する情報を生成する機能と、この情報に基づいて、処理対象である実行プログラム中の各コードの実行時における使用制限の状態に関する情報をこの実行プログラムに付加する機能とをコンピュータに実現させることを特徴とする。
【００１８】
この変換プログラムは、このコンピュータに、処理対象である実行プログラム中に存在する不要な使用制限を削除し、この削除の結果に応じて、上述した各コードの実行時における使用制限の状態に関する情報を更新する機能をさらに実現させるようにすることができる。この場合、更新された情報に基づいて、この実行プログラムに使用制限の状態に関する情報を付加することとなる。
【００１９】
さらに、この変換プログラムは、オブジェクト指向プログラミング言語で記述された実行プログラムを変換する変換プログラムとして構成することができる。すなわち、この変換プログラムは、実行プログラムにおけるメソッドのインライン展開に関する情報に基づいて、インライン展開されたメソッドによるオブジェクトのロックに関するロック情報を生成する機能と、このロック情報に基づいて、実行プログラム中の各コードの実行時におけるロック回数に関する情報をこの実行プログラムに付加する機能とをコンピュータに実現させる。
【００２０】
また、本発明は、コンピュータを制御して実行プログラムの実行中に発生した例外を処理する例外処理プログラム（実行時ライブラリ）として提供することができる。この例外処理プログラムは、スタック巻き戻し方式で例外処理を行う場合、例外処理の実行に先立って次の処理をコンピュータに実行させる。すなわち、実行プログラムに付加された、各コードのアドレスとコードの実行時における資源のロック回数とを対応付けた対応情報に基づいて、例外を発生したコードのアドレスからこの例外の発生時におけるロック回数を求める処理と、この例外に対する例外ハンドラに付加された、この例外ハンドラの実行時におけるロック回数を取得する処理と、この例外発生時におけるロック回数とこの例外ハンドラの実行時におけるロック回数との差分だけ資源のロックを解除する処理とをコンピュータに実行させる。
【００２１】
さらに、この例外処理プログラムは、構造化例外処理方式で例外処理を行う場合、例外処理の実行に先立って次の処理をコンピュータに実行させる。すなわち、実行プログラムに記述された、ｔｒｙ領域内における各コードの実行時における資源のロック回数がエンコードされたｔｒｙ領域の識別情報を用い、例外を発生したコードが含まれるｔｒｙ領域の識別情報をデコードしてこの例外の発生時における資源のロック回数を求める処理と、この例外に対する例外ハンドラに付加された、この例外ハンドラの実行時におけるロック回数を取得する処理と、この例外発生時におけるロック回数とこの例外ハンドラの実行時におけるロック回数との差分だけ資源のロックを解除する処理とをコンピュータに実行させる。
【００２２】
上述した変換プログラムや、例外処理プログラムは、磁気ディスクや光ディスク、半導体メモリなどの記録媒体に記録して配布したり、プログラム伝送装置の記録装置に格納しネットワークを介して配信したりすることにより、提供することができる。
【００２３】
また、本発明は、このような例外処理プログラムを実行するコンピュータ装置として提供することができる。すなわち、プログラムを実行する実行手段と、この実行手段によるプログラムの実行中に例外が発生した場合に、この例外を処理する例外処理手段とを備え、この例外処理手段は、実行対象であるプログラムに付加された各コードの実行時における資源のロック回数に関する情報に基づいて、例外の発生時におけるロック回数とこの例外に対する例外ハンドラの実行時におけるロック回数とを求め、二つの当該ロック回数の差分だけ資源のロックを解除した後に、この例外に対する処理を実行する。
【００２４】
さらに本発明は、次のように構成されたコンピュータ装置として提供することができる。すなわち、プログラムのソースコードをコンパイルして機械語コードに変換するコンパイラと、機械語コードに変換されたプログラムを実行する処理装置とを備えたコンピュータ装置において、このコンパイラは、このプログラムにおける関数のインライン展開に関する情報に基づいて、インライン展開された関数による資源のロックに関するロック情報を生成するロック情報生成部と、このロック情報に基づいて、このプログラム中の各コードの実行時におけるロック回数に関する情報をこのプログラムに付加する情報付加部とを備え、この処理装置は、このプログラムの実行中に例外が発生した場合に、このロック回数に関する情報に基づいて、例外を発生したコードの実行時におけるロック回数とこの例外に対する例外ハンドラの実行時におけるロック回数とを求め、二つのロック回数の差分だけ資源のロックを解除した後に、この例外に対する処理を実行することを特徴とする。
【００２５】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいて、この発明を詳細に説明する。
本発明は、インライン展開及びｔｒｙに基づく例外処理の仕組みを持つプログラミング言語で記述されたプログラムに対して汎用的に利用できるが、以下では、代表的な例として、Ｊａｖａで記述されたプログラムに対するコンパイラを対象として説明する。
また、本発明は、プログラムのコンパイル時に、プログラム中に例外処理の際に必要となる情報を埋め込むことと、プログラムの実行時に、コンパイル時に埋め込まれた情報に基づいて例外処理を行うこととによって実現される。そこで、以下の実施の形態の説明では、コンパイラによるコンパイル処理と、プロセッサによる実行処理とに分けて説明する。
【００２６】
図１は、本実施の形態におけるコンパイラが用いられるコンピュータ装置のシステム構成を示す図である。
図１において、コンパイラ１００は、バイトコード（byte code）で記述された入力コードを入力して処理し、機械語で記述された出力コードを生成して出力する。この入力コードの入力は、コード生成装置４００にて生成された入力コードを直接入力したり、コード生成装置４００にて生成された入力コードを記憶した記憶装置５００から入力したり、ネットワーク６００上に存在するコード生成装置４００や記憶装置５００からネットワーク６００を介して入力したりすることにより行われる。
なお、本実施の形態において、コンパイラ１００は、ＪａｖａにおけるＪＩＴ（Just In Time）コンパイラのような、実行プログラムを実行する際に動的に実行プログラムのコンパイル処理を行うコンパイラであっても良いし、ソースプログラムを予めコンパイルして生成されたオブジェクトプログラムを実行プログラムとする使用形態におけるコンパイラであっても良い。
コンパイラ１００により生成された出力コードは、プロセッサ２００により実行され、必要に応じて実行時ライブラリ３００を呼び出す。実行時ライブラリ３００には、例外フィルタなど、実行時における例外処理を行うためのプログラムが格納されている。
【００２７】
図２は、本実施の形態におけるコンパイラの構成を説明する図である。
図２を参照すると、本実施の形態のコンパイラ１００は、メソッドのインライン展開を行うインライン展開処理部としての前処理部１１０と、ロック情報を生成するロック情報生成部１２０と、ロック情報と基本ブロックとの対応付けを行う基本ブロック対応付け部１３０と、不要なロックに関するロック情報を削除する同期最適化部１４０と、例外処理を行う場合に必要な情報を保存する情報付加部としての後処理部１５０とを備える。
図２に示したコンパイラ１００の各構成要素は、コンピュータプログラムにより制御されたＣＰＵにて実現される仮想的なソフトウェアブロックである。ＣＰＵを制御する当該コンピュータプログラムは、ＣＤ−ＲＯＭやフレキシブルディスクなどの記憶媒体に格納して配布したり、ネットワークを介して伝送したりすることにより提供される。
なお、図２に示したコンパイラ１００の構成要素は、本実施の形態における特徴的な機能に関して記述したものである。図示しないが、実際にはコンパイラ１００は、入力コードの字句解析や構文解析、機械語のコード生成といったコンパイル処理における一般的な機能を有することは言うまでもない。
【００２８】
前処理部１１０は、入力コードとして入力された処理対象プログラムを解析し、メソッドのインライン展開による最適化を行う。インライン展開されるメソッドには、同期メソッドが含まれる。そして、前処理部１１０は、インライン展開される同期メソッドの入口及び出口で基本ブロックを分け、ロックを確保するコード（以下、ロック確保コード）及びロックを解除するコード（以下、ロック解除コード）を挿入する。なお、基本ブロックとは、ストレートコード、すなわちコントロールフローが途中に入ることもなく、途中から出ることもないようなコード列の範囲をブロックとして把握したものである。
【００２９】
ロック情報生成部１２０は、前処理部１１０のインライン展開によるインライン情報に基づいて、インライン展開された同期メソッドによるロック確保コードに関する情報とロックの回数（以下、ロック回数）とを集める。そして、集めた情報をロック情報として作業用メモリに保存する。
【００３０】
基本ブロック対応付け部１３０は、処理対象プログラムの各基本ブロックに、対応するロック情報へのポインタを付加することにより、基本ブロックとロック情報との対応付けを行う。
【００３１】
同期最適化部１４０は、前処理部１１０により処理対象プログラムに挿入されたロック確保コード及びロック解除コードのうち、不必要なものを削除する最適化を行う。また、同期最適化部１４０は、ロック情報生成部１２０により生成されたロック情報のうち、削除されるロックに関する情報を含むものがあれば、当該ロックに関する情報をロック情報から削除し、ロック回数を１減らす。
【００３２】
後処理部１５０は、同期最適化部１４０により最適化処理されたロック情報を用いて、処理対象プログラム中の各例外ハンドラに、当該例外ハンドラの実行時におけるロック回数を保存する。
また、例外処理の方式が、後述する二つの方式のうち、スタック巻き戻し方式の場合、後処理部１５０は、例外が発生したコードのアドレスからロック回数を表引きするための対応表を作成してメモリに保存する。この対応表は、コンパイル終了後もコードの付属情報として保存される。
また、例外処理の方式が、構造化例外処理方式の場合、ｔｒｙ領域におけるロック回数（以下、ｔｒｙ時のロック回数と称す）を当該ｔｒｙ領域のＩＤにエンコードする。したがって、ｔｒｙ領域内においてロックが確保されたり解除されたりした場合、当該ｔｒｙ領域の元のＩＤは同じであっても、ロック回数がエンコードされたＩＤは変化することとなる。
【００３３】
上記のように構成されたコンパイラ１００により、プログラムのコンパイルの過程で、同期メソッドをインライン展開した当該プログラムに、同期メソッドによるロックに関する情報が埋め込まれることとなる。
図８に示したインライン展開されたプログラムを例として、コンパイラ１００が同期メソッドによるロックに関する情報をプログラムに埋め込む動作を説明する。
コンパイラ１００において、入力コードに対する字句解析や構文解析が行われ、最適化処理として前処理部１１０により同期メソッドを含むメソッドのインライン展開が行われた状態が図８に示す状態である。
【００３４】
この状態のプログラムは、次に、ロック情報生成部１２０により、処理されて、ロック情報が生成される。すなわち、インライン情報「Ａ→Ｂ→Ｃ」からは、ロック確保コードに関する情報（コードを挿入した同期メソッド）としてＢ→Ｃと、ロック回数の２が得られる。また、インライン情報「Ｂ→Ｃ」からは、ロック確保コードに関する情報としてＢと、ロック回数の１が得られる。
次に、基本ブロック対応付け部１３０により、プログラムの基本ブロックに対して、対応するロック情報へのポインタが付加される。
次に、同期最適化部１４０により、不要なロックが削除され、これに伴ってロック情報が処理される。図８のプログラムでは、例えば、メソッドＣのロックが冗長であるとして削除される場合、メソッドＣに対応するロック情報は、ロック確保コードに関する情報Ｂ→Ｃとロック回数２から、ロック確保コードに関する情報Ｂとロック回数１に変わる。
最後に、後処理部１５０により、同期最適化部１４０により不要なロックが削除されたプログラムに、ロック回数が保存される。
【００３５】
次に、上記のようにしてロックに関する情報が埋め込まれたプログラムを実行し、例外が発生した際のプロセッサ２００による例外処理の動作について説明する。
例外処理の方法としては、スタック巻き戻し方式と構造化例外処理方式とがある。図３は、スタック巻き戻し方式により例外処理を行う場合の動作を説明するフローチャートである。
図３に示すように、例外が発生すると、まず、例外を起こした命令のアドレスを着目アドレスとする（ステップ３０１）。そして、例外を起こしたときのスタックフレームを着目するフレームとする。
【００３６】
次に、着目中のフレームで当該例外を処理できるか、すなわち、着目中のフレームが当該例外に対するキャッチフレームであるかどうかを調べる（ステップ３０２）。着目中のフレームがキャッチフレームであれば、当該着目中のフレームが、発生した当該例外を処理できるハンドラを持つかどうか、すなわち、キャッチできるかどうかを調べる（ステップ３０３）。
【００３７】
着目中のフレームが例外をキャッチできるならば、コンパイル時に作成した対応表から、着目アドレスに対応するロック回数を、表引きして取得する（ステップ３０４）。
また、当該例外をキャッチする例外ハンドラから、コンパイル時に当該例外ハンドラに付加された当該例外ハンドラの実行時のロック回数を取得する。そして、ステップ３０４で取得したロック回数（例外発生時のロック回数）から例外ハンドラの実行時のロック回数を減算する（ステップ３０５）。
【００３８】
ところで、プログラムを実行する際、各フレームには、ロック確保コードを実行することによって同期スタックが生成される。同期スタックとは、ロック対象をＬＩＦＯ（Last In First Out）に保持したものである。
そこで、この同期スタックから、ステップ３０５で算出された個数分をポップ（ロックを解除）する（ステップ３０６）。
【００３９】
一方、ステップ３０２において着目中のフレームがキャッチフレームで無かった場合、またはステップ３０３において着目中のフレームが発生した例外をキャッチできなかった場合は、次に、コンパイル時に作成した対応表から、着目アドレスに対応するロック回数を、表引きして取得する（ステップ３０７）。そして、得られたロック回数分、同期スタックからポップする（ステップ３０８）。
次に、着目中のフレームから呼び出し側へ一つ戻ったフレームを新たな着目するフレームとし（ステップ３０９）、この新たな着目中のフレームにおける再開アドレスを新たな着目アドレスとして、ステップ３０２以降の処理をやり直す（ステップ３１０）。
【００４０】
以上のようにして、本実施の形態は、プログラムを実行して例外が発生した場合に、プログラムに埋め込まれたロックに関する情報、及び例外が発生する可能性のあるコードのアドレスとロック回数との対応表に基づいて、必要なロックの解除を行うことが可能である。
本実施の形態においてプログラムに埋め込まれるロックに関する情報は、不要なロックを削除する同期最適化の結果を反映させた情報であるため、この情報から得られるロックの状態と実際のロックの状況とは必ず一致する。
また、例外が発生した時点でのロック回数は上記の対応表から直接取得することができ、例外ハンドラの実行時のロック回数は当該例外ハンドラに付加された情報として得ることができる。また、いずれのロックを解除するかは、プログラムの実行時に作成される同期スタックにおいて機械的に確定する。したがって、従来、インライン情報を取得するために２回の検索作業を必要としていたのに比べて作業コストを短縮することができる。
【００４１】
次に、例外処理の方法として構造化例外処理方式を用いる場合について説明する。図４は、構造化例外処理方式により例外処理を行う場合の動作を説明するフローチャートである。
図４に示すように、例外が発生すると、まず、着目中のｔｒｙ領域におけるＩＤを取得する（ステップ４０１）。そして、当該着目中のｔｒｙ領域に関連した例外ハンドラが発生した例外をキャッチするかどうかを調べる（ステップ４０２）。
【００４２】
当該例外ハンドラが当該例外をキャッチする場合、ステップ４０１で取得したＩＤをデコードし、コンパイル時にＩＤにエンコードされたｔｒｙ時のロック回数を取得する（ステップ４０３）。ここで、上述したように、ｔｒｙ領域内でロックが確保されたり解除されたりしている場合、元のＩＤにエンコードされるロック回数が変化するため、同じｔｒｙ領域であってもエンコード後のＩＤの値は変化し、ロック回数の変化が反映されることとなる。これにより、例外が発生した際に当該ｔｒｙ領域のＩＤをデコードすることにより、直ちに、当該ｔｒｙ領域を識別すると共に、例外が発生した時点におけるロック回数を取得することができる。
次に、当該例外をキャッチする例外ハンドラから、コンパイル時に当該例外ハンドラに付加された当該例外ハンドラの実行時のロック回数を取得する。そして、ステップ４０３で取得したロック回数（ｔｒｙ時のロック回数）から例外ハンドラの実行時のロック回数を減算する（ステップ４０４）。
この後、同期スタックから、ステップ４０４で算出された個数分をポップ（ロックを解除）する（ステップ４０５）。
【００４３】
一方、着目中のｔｒｙ領域に関連する例外ハンドラが発生した例外をキャッチできない場合、当該ｔｒｙ領域を含むｔｒｙ領域に着目し（ステップ４０６）、この新たに着目したｔｒｙ領域に関連する例外ハンドラが発生した当該例外をキャッチするかどうかを調べる（ステップ４０７）。
この動作（ステップ４０６、４０７）を、当該例外をキャッチできる例外ハンドラが見つかるまで繰り返す。
【００４４】
当該例外をキャッチできる例外ハンドラが見つかったならば、次に、同期スタックのエントリ数を数える（ステップ４０８）。そして、当該例外をキャッチできる例外ハンドラに付加されている当該例外ハンドラの実行時のロック回数を、得られたエントリ数から減算する（ステップ４０９）。
この後、同期スタックから、ステップ４０９で算出された個数分をポップ（ロックを解除）する（ステップ４０５）。
【００４５】
以上のようにして、本実施の形態は、プログラムを実行して例外が発生した場合に、プログラムに埋め込まれたロックに関する情報、すなわち、各例外ハンドラに付加された当該例外ハンドラの実行時におけるロック回数と、ｔｒｙ領域のＩＤにエンコードされたｔｒｙ時のロック回数とに基づいて、必要なロックの解除を行うことが可能である。
本実施の形態においてプログラムに埋め込まれるロックに関する情報は、不要なロックを削除する同期最適化の結果を反映させた情報であるため、この情報から得られるロックの状態と実際のロックの状況とは必ず一致する。
また、例外が発生した時点でのロック回数は、ｔｒｙ領域のＩＤをデコードすることにより直接取得することができ、例外ハンドラの実行時のロック回数は当該例外ハンドラに付加された情報として得ることができる。また、いずれのロックを解除するかは、プログラムの実行時に作成される同期スタックにおいて機械的に確定する。したがって、従来、インライン情報を取得するために２回の検索作業を必要としていたのに比べて作業コストを短縮することができる。
【００４６】
次に、例外処理の方法がスタック巻き戻し方式の場合と構造化例外処理方式の場合とのそれぞれについて、具体的な例を挙げて、プログラムに埋め込まれる情報と例外発生時の処理とを説明する。
図５（Ａ）は、図８に対応するコンパイルコードの構成例である。図中の区画はメソッドを表し、文字はメソッド名を表す。「ＳｏｆＡ」はメソッドＡのｔｒｙ領域を表し、「ＴｏｆＢ」はメソッドＢのｔｒｙ領域を表す。また、メソッドＣのコード領域は、基本ブロックの並べ替えによって２カ所（アドレスａ２〜ａ３−１とアドレスａ５〜ａ６−１）に配置されているが、いずれもｔｒｙ領域Ｔのスコープに入っている。
ｔｒｙ領域のＩＤ（図ではｔｒｙＩＤと表記、以下の説明においても、ｔｒｙＩＤと記述する）は、メソッドＢとメソッドＣとのコード領域に対して０を振る。ロック情報（図ではと表記）は、［ロックの回数］同期メソッド１、同期メソッド２、・・・のように表記した。
また、図５（Ｂ）は、コードアドレスからロック回数を表引きするための対応図表である。図５（Ｂ）を参照すると、例えば図５（Ａ）におけるコードアドレスがａ１からａ２−１までの範囲（図ではaddr rangeと表記）はロック回数（図では#lockと表記）が１であることがわかる。
【００４７】
上記のコンパイルコードを実行して、アドレス区間ａ５からａ６の間のａｘで例外が発生したものとする。すると、この例外をキャッチした例外フィルタは、図５（Ｂ）の対応図表を用いて、アドレスａｘを表引きし、ロック回数２を得る。
また、例外フィルタは、ｔｒｙ領域Ｔに関連する例外ハンドラを見つけ、当該例外ハンドラの実行時におけるロック回数１を得る。
そして、ロック回数の差分１だけ同期スタックからロックを解除する。
【００４８】
次に、例外処理の方法が構造化例外処理方式の場合について説明する。
図６は、図８に対応するコンパイルコードの構成例であり、図５（Ａ）の例と同様である。ｔｒｙ領域のＩＤ（ｔｒｙＩＤ）及びロック情報（sync Info）も図５（Ａ）の例と同様である。ただし、図６では、メソッドＣのコード領域が２カ所に分割配置されていないので、図５（Ａ）の最下に位置するメソッドＣ（ＣＸｅｘｃｅｐｔｉｏｎ）は、ｔｒｙ領域Ｔ（ＴｏｆＢ）の間に位置するメソッドＣに含まれている。
また、図６において、ｔｒｙ時のロック回数をエンコードされたＩＤ（図ではenc try IDと表記）を、
ｔｒｙＩＤ＋ロックの回数＊ｔｒｙの総数
とした。例えば、メソッドＢにおいて、ｔｒｙＩＤが１であり、ロック回数が１であり、またｔｒｙの総数は２であるので、エンコード後のＩＤは３（＝１＋１＊２）である。
【００４９】
また、コントロールフロー上、ｔｒｙ領域のＩＤが切り替わる場所でエンコードされたＩＤを更新するのは、エンコードされていない通常のｔｒｙＩＤと同様である。
本実施の形態では、ｔｒｙ領域に同期メソッドがインラインされることによりロック回数が増えるため、エンコードされたＩＤの更新回数は、エンコードしない場合のＩＤ（ｔｒｙＩＤ）の更新回数よりも多くなる。しかし、ＩＤ更新の作業コストは同期コストに比べて相対的に小さく、冗長なロックは削除されてエンコードされないので、実際上は問題とならない。
【００５０】
上記のコンパイルコードを実行して、ｔｒｙ領域Ｔ（ＴｏｆＢ）で例外が発生したものとする。例外フィルタは、例外が起きたときのｔｒｙ領域のＩＤをデコードする。上述したようにｔｒｙＩＤへのロック回数のエンコードは
ｔｒｙＩＤ（＝０）＋ロックの回数（＝２）＊ｔｒｙの総数（＝２）
ただし、括弧内の値はｔｒｙ領域Ｔにおける該当値
であるので、エンコードされたＩＤの値を２（ｔｒｙの総数）で割った値がロック回数、余りがｔｒｙＩＤの値である。ここでは、ロック回数が２（＝４／２）となり、ｔｒｙＩＤが０となる。
また例外フィルタは、ｔｒｙ領域Ｔに関連する例外ハンドラを見つけ、当該例外ハンドラのロック回数１を得る。
そして、ロック回数の差分１だけ同期スタックからロックを解除する。
【００５１】
図７は、図６のコンパイルコードに対して、メソッドＣのロックが冗長であるとして削除された場合の構成例を示す図である。
図６と図７とを比較すると、メソッドＣに対応するロック情報（sync Info）が［２］Ｂ，Ｃから［１］Ｂに変化し、エンコードされたＩＤの値が４（＝０＋２＊２）から２（＝０＋１＊２）に変化している。
このように、本実施の形態によれば、コンパイル時に不要なロックが削除された場合であっても、同期最適化部１４０により、ロックの削除を反映させた情報が生成され、コンパイルコードに埋め込まれることとなる。
【００５２】
【発明の効果】
以上説明したように、本発明によれば、例外処理に必要なロックに関する情報を、プログラムコードから直接取得することができる。これにより、かかる情報を取得するための作業コストを抑え、例外処理における作業コストへの影響を縮減することが可能となる。
また、本発明によれば、不要なロックを削除する最適化処理の結果を反映させた情報をプログラムコードに埋め込むことにより、例外発生に対して確実に必要なロックの解除を行い、例外処理を行うことができる。
【図面の簡単な説明】
【図１】  本実施の形態におけるコンパイラが用いられるコンピュータ装置のシステム構成を示す図である。
【図２】  本実施の形態におけるコンパイラの構成を説明する図である。
【図３】  スタック巻き戻し方式により例外処理を行う場合における本実施の形態の動作を説明するフローチャートである。
【図４】  構造化例外処理方式により例外処理を行う場合における本実施の形態の動作を説明するフローチャートである。
【図５】  スタック巻き戻し方式による例外処理を行う場合に用いられる情報を説明する図であり、（Ａ）はコンパイルコードの構成例、（Ｂ）はコードアドレスからロック回数を表引きするための対応図表である。
【図６】  構造化例外処理方式により例外処理を行う場合に用いられるコンパイルコードの構成例を示す図である。
【図７】  図６のコンパイルコードに対して、メソッドＣのロックが冗長であるとして削除された場合の構成例を示す図である。
【図８】  同期メソッドをインライン展開したＪａｖａのプログラムコードの構成概念を説明する図である。
【符号の説明】
１００…コンパイラ、１１０…前処理部、１２０…ロック情報生成部、１３０…基本ブロック対応付け部、１４０…同期最適化部、１５０…後処理部、２００…プロセッサ、３００…実行時ライブラリ、４００…コード生成装置、５００…記憶装置、６００…ネットワーク
【図１】
0003664478.tif 000002
【図２】
0003664478.tif 000003
【図３】
0003664478.tif 000004
【図４】
0003664478.tif 000005
【図５】
0003664478.tif 000006
【図６】
0003664478.tif 000007
【図７】
0003664478.tif 000008
【図８】
0003664478.tif 000009