(57)【特許請求の範囲】
【請求項１】
例外処理の仕組みを持つプログラミング言語で記述された実行プログラムを実行するコンピュータ装置において、
前記実行プログラムの実行に伴う例外処理における例外ハンドラの検索に関する実行コンテキストである例外パスを取得する例外パス取得部と、
前記例外パス取得部にて取得された前記例外パスに例外の発生に関する情報を付加する例外発生情報付加部と、
前記例外発生情報付加部により前記例外パスに付加された前記例外の発生に関する情報に基づいて例外が発生する頻度を計算する例外発生頻度計算部と、
前記例外発生頻度計算部により計算された例外の発生頻度に基づいて、最適化を行うべき前記例外パスを決定する最適化対象決定部と
を備えることを特徴とするコンピュータ装置。
【請求項２】
前記例外発生情報付加部は、前記例外パスに、少なくとも前記実行プログラムの実行に伴い当該例外パス上で発生した例外の発生回数を前記例外の発生に関する情報として付加することを特徴とする請求項１に記載のコンピュータ装置。
【請求項３】
前記例外発生頻度計算部は、前記例外パス取得部による例外パスの取得に要した時間あたりの前記例外の発生回数を前記例外が発生する頻度として計算することを特徴とする請求項１に記載のコンピュータ装置。
【請求項４】
前記実行プログラムのソースコードを読み込み、機械語コードに変換する変換部をさらに備え、
前記変換部は、
前記最適化対象決定部により決定された前記例外パスにおける例外のタイプを解析する例外タイプ解析部と、
前記最適化対象決定部により決定された前記例外パスにおける例外の発生位置をカバーする例外ハンドラを検索する例外ハンドラ解析部と、
前記例外タイプ解析部にて求められた例外のタイプに含まれる各例外クラスと前記例外ハンドラ解析部にて検索された前記例外ハンドラとを対応づけた例外フローを作成する例外フロー解析部と、
前記例外フロー解析部にて得られた前記例外クラスと前記例外ハンドラとの対応関係に基づいて、例外を投げるコードと対応する例外ハンドラとをつなぐコード変形を行う分岐変換処理部と
を備えることを特徴とする請求項１に記載のコンピュータ装置。
【請求項５】
前記分岐変換処理部は、前記例外を投げるコードを削除し、前記実行プログラムにおける当該コードの位置から対応する前記例外ハンドラへの分岐コードを生成することを特徴とする請求項４に記載のコンピュータ装置。
【請求項６】
例外処理の仕組みを持つプログラミング言語で記述されたプログラムのソースコードをコンパイルして機械語コードに変換するコンパイラと、
機械語コードに変換された当該プログラムを実行するプログラム実行部とを備え、
前記プログラム実行部は、
前記プログラムの実行時に、例外処理における例外ハンドラを探した実行コンテキストの動的頻度を求める手段と、
前記動的頻度に基づいて、前記実行コンテキストのうちで最適化の対象となる実行コンテキストを決定する手段とを備え、
前記コンパイラは、
前記プログラム実行部において決定された最適化の対象である前記実行コンテキストに対応する例外処理において発生した例外を処理する例外ハンドラを決定する手段と、
前記例外が投げられてから前記例外ハンドラに受け取られるまでの処理のパスをコード生成する手段とを備えることを特徴とするコンピュータ装置。
【請求項７】
コンピュータを制御して、当該コンピュータが例外処理の仕組みを持つプログラミング言語で記述された実行プログラムを実行する際に発生した例外に対する例外処理を実行させる例外処理プログラムであって、
前記例外処理における例外ハンドラの検索に関する実行コンテキストである例外パスを取得する例外パス取得手段と、
前記例外パス取得手段にて取得された前記例外パスに例外の発生に関する情報を付加する例外発生情報付加手段と、
前記例外発生情報付加手段により前記例外パスに付加された前記例外の発生に関する情報に基づいて例外が発生する頻度を計算する例外発生頻度計算手段と、
前記例外発生頻度計算手段により計算された例外の発生頻度に基づいて、最適化を行うべき前記例外パスを決定する最適化対象決定手段として、
前記コンピュータを機能させることを特徴とする例外処理プログラム。
【請求項８】
前記最適化対象決定手段において決定された前記例外パスにおける例外のタイプを解析する例外タイプ解析手段と、
前記最適化対象決定手段により決定された前記例外パスにおける例外の発生位置をカバーする例外ハンドラを検索する例外ハンドラ解析手段と、
前記例外タイプ解析手段にて求められた例外のタイプに含まれる各例外クラスと前記例外ハンドラ解析手段にて検索された前記例外ハンドラとを対応づける対応関係解析手段と、
前記対応関係解析手段にて得られた前記例外クラスと前記例外ハンドラとの対応関係に基づいて、例外を投げるコードと対応する例外ハンドラとをつなぐコード変形を行うコード変形手段として、
前記コンピュータをさらに機能させることを特徴とする請求項７に記載の例外処理プログラム。
【請求項９】
前記コード変形手段は、前記例外を投げるコードを削除し、前記実行プログラムにおける当該コードの位置から対応する前記例外ハンドラへの分岐コードを生成することを特徴とする請求項８に記載の例外処理プログラム。
【請求項１０】
コンピュータを制御して、当該コンピュータが例外処理の仕組みを持つオブジェクト指向プログラミング言語で記述された実行プログラムを実行する際に発生した例外に対する例外処理を実行させる例外処理プログラムであって、
前記コンピュータによる前記実行プログラムの実行に伴って発生した例外の発生頻度を計算し、記憶手段に格納する処理と、
前記記憶手段に格納された前記例外の発生頻度に基づいて、前記例外に対する例外処理に関する実行コンテキストのうちで最適化の対象となる実行コンテキストを決定し、最適化の対象とされた当該実行コンテキストを、当該実行コンテキストに対応する例外を捕るキャッチメソッドに登録する処理とを、
前記コンピュータに実行させることを特徴とする例外処理プログラム。
【請求項１１】
コンピュータを制御して、当該コンピュータが例外処理の仕組みを持つプログラミング言語で記述された実行プログラムを実行する際に発生した例外に対する例外処理を実行させる例外処理プログラムであって、
前記コンピュータによる前記実行プログラムの実行に伴って、例外処理における例外ハンドラを探した実行コンテキストの動的頻度を求めて記憶手段に格納する処理と、
前記記憶手段に格納された前記動的頻度に基づいて、予め定められた閾値を超える頻度で発生する前記実行コンテキストを最適化の対象として決定する処理とを、
前記コンピュータに実行させることを特徴とする例外処理プログラム。
【請求項１２】
前記実行コンテキストの動的頻度を求めて記憶手段に格納する処理は、前記実行プログラムを実行した時間あたりの例外の発生回数を求め、かつ求めた値を当該実行プログラムの実行状態に応じたコードの実行速度に基づいて正規化することにより当該動的頻度を求めることを特徴とする請求項１１に記載の例外処理プログラム。
【請求項１３】
最適化の対象として決定された前記実行コンテキストに関して、例外を投げる各地点における例外のタイプを決定し、当該例外を投げる地点から投げられる例外を受け取る例外ハンドラを決定する処理と、
前記例外を投げる地点から当該例外を受け取る前記例外ハンドラまでのパスをコード生成する処理とを
前記コンピュータにさらに実行させることを特徴とする請求項１１に記載の例外処理プログラム。
【請求項１４】
最適化の対象として決定された前記実行コンテキストに対して、例外を投げる地点を含むメソッドから例外を受け取る例外ハンドラを含むキャッチメソッドまでを当該キャッチメソッドにインライン展開する処理と、
インライン展開された前記実行コンテキストに関して、例外を投げる各地点における例外のタイプを決定し、当該例外を投げる地点から投げられる例外を受け取る例外ハンドラを決定する処理と、
前記例外を投げる地点から当該例外を受け取る前記例外ハンドラまでのパスをコード生成する処理とを
前記コンピュータにさらに実行させることを特徴とする請求項１１に記載の例外処理プログラム。
【請求項１５】
コンピュータ装置におけるプログラムの実行状況に応じて適当な最適化を含むコンパイル処理を動的に行うコンパイル方法において、
前記プログラムの実行に伴って発生した例外の発生頻度を計算し、記憶手段に格納するステップと、
前記記憶手段に格納された前記例外の発生頻度に基づいて、前記例外に対する例外処理に関する実行コンテキストのうちで最適化の対象となる実行コンテキストを決定するステップと、
前記プログラムを前記コンピュータ装置に読み込んで最適化の対象として決定された前記実行コンテキストに対応する例外処理を試行し、当該試行において発生した例外を処理する例外ハンドラを決定するステップと、
前記例外が投げられてから前記例外ハンドラに受け取られるまでの処理のパスをコード生成するステップと
を含むことを特徴とするコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータプログラムの最適化方法に関し、特に例外処理における処理コストを削減する方法に関する。
【０００２】
【従来の技術】
プログラミング言語には、プログラムの実行中に有効範囲外のデータ入力やデータ処理の結果が発生した場合を例外として扱い、この例外に対する処理（例外処理）を行うことができるものがある。今日、広く使用されているＪａｖａは、この例外処理を支援する代表的な言語である。
ここで、例外には大きく分けて２通りある。１つは、実行を継続できない状況の発生であり、他の１つは、アルゴリズムの主コントロールフローから外れた状況の発生である。今日、複雑な処理を行うと共に信頼性が要求されるプログラムを作成するための便利な手法として、コントロールフローを変更する後者のタイプの例外を活用することが行われている。
【０００３】
Ｊａｖａにおける例外の処理について簡単に説明する。
Ｊａｖａでは、１つのｔｒｙブロックと１つまたは複数のｃａｔｃｈブロックとを対応させる。ここで、ｃａｔｃｈブロックとは、いわゆるハンドラ（例外ハンドラ）であり、当該ｃａｔｃｈブロックで処理が可能な例外のクラスを属性として持つ。プログラムを実行する際、所定のｔｒｙブロック内で発生した例外は、その例外のクラスに対応したｃａｔｃｈブロックで処理される。
典型的な例外処理は次のような手続きを含む。
Ｊａｖａが実装されたコンピュータシステム（以下、単にシステムと称す）において例外が発生すると、システムは、まず、例外クラスのオブジェクトを生成し、オブジェクトの初期化を行う。Ｊａｖａでは、例外オブジェクトからその生成時のスタックトレースを参照できると定められているので、初期化時にスタックトレースを作成する。次に、例外オブジェクトをオペランドとし、その例外を投げるathrowバイトコードを実行し、これによりシステムが例外状態になる。
【０００４】
システムは、例外状態になると、例外を発生させているathrowバイトコードをカバーしているｔｒｙブロックを探す。そして、かかるｔｒｙブロックが見つかったならば、次にシステムは、そのｔｒｙブロックに対応するｃａｔｃｈブロックのリストを順に調べ、現在の例外のクラスを処理できるｃａｔｃｈブロックがあるか検索する。そのようなｃａｔｃｈブロックがあれば、制御をそのｃａｔｃｈブロックに移してプログラムの実行を継続する。そのようなｃａｔｃｈブロックがないならば、システムは、さらに外側のｔｒｙブロックを探し、同様の検索を続ける。
【０００５】
こうしたプログラムの実行時における例外処理の処理コストには、大きく分けて、例外ハンドラの検索コストと例外オブジェクトの生成、初期化における処理コストとがある。
このうち、例外ハンドラの検索コストの削減を目的とした従来技術として、次の文献１に開示された技術がある。
文献１：S. Lee, B.-S. Yang, S. Kim, S. Park, S.-M. Moon, and K. Ebcio¢ glu. Efficient Java exception handling in Just-in-Time compilation. In Proceedings of the ACM 2000 Conference on Java Grande, pages 1-8, New York, NY, USA, June 2000. ACM, ACM Press.
同文献に記載された技術によれば、まず、例外を投げる地点から例外を投げずに予測した例外ハンドラへ無条件分岐する。そして、当該例外ハンドラの先頭で、例外オブジェクトのクラスがその例外ハンドラで処理できるクラスかどうか調べる。その結果、当該例外ハンドラで処理できるクラスであれば処理の実行を継続し、そうでなければ本当に例外を投げる、といった処理を行う。
【０００６】
また、例外オブジェクトの生成と初期化における処理コストの削減を目的とした従来技術として、次の文献２に開示された技術がある。
文献２：M. Cierniak, G.-Y. Lueh, and J. M. Stichnoth. Practicing JUDO: Java under dynamic optimizations. In ACM SIGPLAN '00 Conference on Programming language design and implementation [2], pages 18？21
同文献に記載された技術によれば、発生した例外について解析を行い、コンパイラが例外オブジェクトの生成と初期化が副作用を持たないと判断した場合であって、かつ見つかった例外ハンドラに対してコンパイラが例外オブジェクトを使わないと判断した場合に、当該例外オブジェクトの生成と初期化の処理を省略する。
【０００７】
ところで、プログラムにおける例外処理に関する一般的な考え方として、例外はほとんど起こらないことを前提とし、また例外処理が必要であっても、当該例外処理に要する時間はプログラム実行中の極めて短い時間であり、例外が発生していない区間には例外処理のためのオーバーヘッドをかけないことにより、プログラムの実行速度の高速化を図ることができる、という考え方がある。
【０００８】
例外ハンドラを検索する代表的な手法として、スタック巻き戻し方式と構造化例外処理方式とがある。
スタック巻き戻し方式では、発生した例外をキャッチできる例外ハンドラを探して、最後のフレームから前のフレームへ順にスタックをたどる。上記の考え方に基づいて実行速度を高めるために最適化されたフレームには、例外が発生しない限り必要のない情報はなく、プログラムカウンタしか記述されていない場合もある。この場合、そのフレームに関する情報（例外ハンドラを持つか、解放するロックはあるか、復帰するcallee-savedレジスタはあるか等）は、プログラムカウンタに対応するコード情報構造体をコード情報構造体データベースから検索することにより取得する。さらに、スタック巻き戻しを進めるには、callee-savedレジスタを復帰したり、例外ハンドラを持つフレームなら現在起きている例外を捕る（ｃａｔｃｈする）ことができるかどうかを調べたりすることが必要である。したがって、例外が発生した場合に例外ハンドラを検索する処理コストが増大することとなる。
【０００９】
また、構造化例外処理方式は、例外が起きない場合でも例外ハンドラを持つフレームは常に実行コンテキストに登録する。例外ハンドラの検索時に、例外ハンドラを持たないフレームを飛ばして検索することによって例外ハンドラの検索コストを縮小することができる。
【００１０】
【発明が解決しようとする課題】
上記のように、Ｊａｖａに代表される例外処理をサポートした言語は、耐久性のあるプログラムを作成しやすい反面、例外処理に起因するオーバーヘッドを軽減することが大きな課題となる。一般に、例外は実行時ライブラリで処理され、その処理コストが大きいためである。
例外処理に関しては、上述したように、「例外はほとんど起こらない」ことを前提とし、例外が発生していない区間には例外処理のためのオーバーヘッドをかけないようにする考え方があるが、堅牢なプログラムを簡便に作成するためにプログラムにおいてコントロールフローを変更するタイプの例外の発生を多用する現状では、この例外はほとんど起こらないことを前提とした設計のシステムでは実行性能の低下を招来する。
【００１１】
実際のアプリケーションにおいても、システムの実行性能に影響するほどの大量の例外を発生させるものが数多く存在する。そして、発生する例外のかなりのものは、コントロールフローを変更することを目的とした例外であり、例外オブジェクト自身は使用されないことがほとんどである。
ここで、例外処理における処理コストのうち、例外オブジェクトの生成、初期化における処理コストに関しては、上述した文献２による技術を適用したり、アプリケーションによっては予め例外オブジェクトを生成しておいて再利用したりすることにより解決される。
一方、例外ハンドラの検索コストに関しては、上記文献１による試みがあるものの、この従来技術は、予測の正当性チェックが新たなオーバーヘッドとなる。また、この従来技術を用いた場合、予測による高速化の一方で予測が外れた場合の補償が必要となるために、例外オブジェクトの生成、初期化の処理コストを削減できない。したがって、例外処理におけるコスト削減の解決策としては適当とは言えない。
【００１２】
また、例外ハンドラの検索手法として構造化例外処理方式を採用すれば、上述したように、例外ハンドラの検索におけるオーバーヘッドを軽減することができる。しかし、例外ハンドラを持つフレームを実行コンテキストに登録するための別のオーバーヘッドを必要とし、さらに、頻繁に呼ばれるメソッドが例外ハンドラを持つ場合は、システムの実行性能が著しく低下してしまう。
【００１３】
さらに、例外ハンドラの検索コストを低減するために、コンパイル時に、例外が起こり得るメソッド呼び出しをインライン展開するという最適化を行うことが考えられる。
しかし、無分別なインライン展開は、コードを爆発的に増加させたり、より多くのコンパイル資源を要求してコードの質を低下させたりすることになる。さらに、Ｊａｖａで用いられる動的コンパイルでは、コンパイルに要するメモリ、コンパイル時間が激増し、プログラムのポーズ時間が大きくなるといった問題が生じるため、現実的でない。
すなわち、発生し得る例外ハンドラの検索処理の全てを対象として静的な最適化を行っても、この最適化コストに見合う実行時オーバーヘッド削減が得られない場合が多い。したがって、実行時に実際に発生する例外ハンドラ検索のうち、システムの実行性能に影響を与えるものだけを選択して削除する（インライン展開する）ことが望ましい。
【００１４】
そこで、本発明は、例外処理における例外ハンドラの検索コストを効果的に削減することにより、コンピュータシステムにおける実行性能の向上を図ることを目的とする。
【００１５】
また、本発明は、例外ハンドラの検索処理の実行頻度に基づいてシステムの実行性能に実際に影響を与える処理を対象として最適化を行うことにより、コンピュータシステムにおける実行性能の向上を図ることを他の目的とする。
【００１６】
【課題を解決するための手段】
上記の目的を達成するため、本発明は、例外処理の仕組みを持つプログラミング言語で記述された実行プログラムを実行するコンピュータ装置において、この実行プログラムの実行に伴う例外処理における例外ハンドラの検索に関する実行コンテキストである例外パスを取得する例外パス取得部と、この例外パスに例外の発生に関する情報（例外発生情報）を付加する例外発生情報付加部と、この例外パスに付加された例外発生情報に基づいて例外が発生する頻度を計算する例外発生頻度計算部と、この例外の発生頻度に基づいて、最適化を行うべき例外パスを決定する最適化対象決定部とを備えることを特徴とする。
【００１７】
ここで、この例外発生情報付加部は、この例外パスに、少なくともこの実行プログラムの実行に伴いこの例外パス上で発生した例外の発生回数を例外発生情報として付加する。例外発生情報としては、この他、例外プロファイル作成時間等を付加することもできる。
また、この例外発生頻度計算部は、例外パス取得部による例外パスの取得に要した時間あたりの例外の発生回数をこの例外が発生する頻度として計算する。例外の発生頻度としては、この他、単純に例外の発生回数をそのまま用いることもできる。
【００１８】
また、本発明は、例外処理の仕組みを持つプログラミング言語で記述された実行プログラムのソースコードを読み込み、機械語コードに変換するコンピュータ装置において、この実行プログラムを試行して発生する例外のタイプを解析する例外タイプ解析部と、この例外のこの実行プログラムにおける発生位置をカバーする例外ハンドラを検索する例外ハンドラ解析部と、この例外タイプ解析部にて求められた例外のタイプに含まれる各例外クラスとこの例外ハンドラ解析部にて検索された例外ハンドラとを対応づけた例外フローを作成する例外フロー解析部と、この例外フローに示された例外クラスと例外ハンドラとの対応関係に基づいて、例外を投げるコードと対応する例外ハンドラとをつなぐコード変形を行う分岐変換処理部とを備えたことを特徴とする。
【００１９】
より詳しくは、この分岐変換処理部は、この例外を投げるコードを削除し、この実行プログラムにおけるこの例外を投げるコードの位置から対応する例外ハンドラへの分岐コードを生成する。
【００２０】
さらに、本発明は、例外処理の仕組みを持つプログラミング言語で記述されたプログラムのソースコードをコンパイルして機械語コードに変換するコンパイラと、機械語コードに変換されたこのプログラムを実行するプログラム実行部とを備え、このプログラム実行部は、このプログラムの実行時に、例外処理における例外ハンドラを探した実行コンテキストの動的頻度を求める手段と、この動的頻度に基づいて、この実行コンテキストのうちで最適化の対象となる実行コンテキストを決定する手段とを備え、このコンパイラは、このプログラム実行部において決定された最適化の対象である実行コンテキストに対応する例外処理において発生した例外を処理する例外ハンドラを決定する手段と、この例外が投げられてから例外ハンドラに受け取られるまでの処理のパスをコード生成する手段とを備えることを特徴とする。
【００２１】
また、本発明は、コンピュータを制御して上述した各構成要件の機能を提供するプログラムとして実現することができる。
さらに本発明は、コンピュータを制御して、このコンピュータが例外処理の仕組みを持つオブジェクト指向プログラミング言語で記述された実行プログラムを実行する際に発生した例外に対する例外処理を実行させる例外処理プログラムであって、このコンピュータによる実行プログラムの実行に伴って発生した例外の発生頻度を計算し、記憶手段に格納する処理と、この記憶手段に格納された例外の発生頻度に基づいて、この例外に対する例外処理に関する実行コンテキストのうちで最適化の対象となる実行コンテキストを決定し、最適化の対象とされた実行コンテキストを、この実行コンテキストに対応する例外を捕るキャッチメソッドに登録する処理とを、このコンピュータに実行させることを特徴とする。
【００２２】
さらにまた、本発明は、コンピュータを制御して、このコンピュータが例外処理の仕組みを持つプログラミング言語で記述された実行プログラムを実行する際に発生した例外に対する例外処理を実行させる例外処理プログラムであって、このコンピュータによるこの実行プログラムの実行に伴って、例外処理における例外ハンドラを探した実行コンテキストの動的頻度を求めて記憶手段に格納する処理と、この記憶手段に格納された動的頻度に基づいて、予め定められた閾値を超える頻度で発生するこの実行コンテキストを最適化の対象として決定する処理とを、このコンピュータに実行させることを特徴とする。
この動的頻度は、例えば、実行プログラムを実行した時間あたりの例外の発生回数を求め、かつ求めた値をこの実行プログラムの実行状態に応じたコードの実行速度に基づいて正規化することにより求めることができる。
【００２３】
また、本発明は、コンピュータを制御して、例外処理の仕組みを持つプログラミング言語で記述された実行プログラムのソースコードを機械語コードに変換する変換プログラムにおいて、この実行プログラムを読み込んで解析し、この実行プログラム中の所定の例外処理を行う例外パスに関して、例外を投げる各地点における例外のタイプを決定し、この例外を投げる地点から投げられる例外を受け取る例外ハンドラを決定する処理と、この例外を投げる地点からこの例外を受け取る例外ハンドラまでのパスをコード生成する処理とを、このコンピュータに実行させることを特徴とする。
【００２４】
ここで、この例外のタイプ及び例外ハンドラを決定する処理は、この例外を投げる地点を含むメソッドから例外を受け取る例外ハンドラを含むキャッチメソッドまでを、このキャッチメソッドにインライン展開した例外パスを対象として処理を行うことができる。
【００２５】
また、本発明は、コンピュータを制御して、例外処理の仕組みを持つプログラミング言語で記述された実行プログラムのソースコードを機械語コードに変換する変換プログラムにおいて、この実行プログラムを読み込んで、この実行プログラムの実行時に行われる例外処理の手続きをシミュレーションする処理と、このシミュレーションの結果に基づいて発生した例外を処理する例外ハンドラを決定する処理と、この例外が投げられてからこの例外ハンドラに受け取られるまでの処理のパスをコード生成する処理とを、このコンピュータに実行させることを特徴とする。
【００２６】
さらにまた、本発明は、コンピュータ装置におけるプログラムの実行状況に応じて適当な最適化を含むコンパイル処理を動的に行うコンパイル方法において、このプログラムの実行に伴って発生した例外の発生頻度を計算し、記憶手段に格納するステップと、この記憶手段に格納された例外の発生頻度に基づいて、この例外に対する例外処理に関する実行コンテキストのうちで最適化の対象となる実行コンテキストを決定するステップと、このプログラムをこのコンピュータ装置に読み込んで最適化の対象として決定された実行コンテキストに対応する例外処理を試行し、この試行において発生した例外を処理する例外ハンドラを決定するステップと、この例外が投げられてからこの例外ハンドラに受け取られるまでの処理のパスをコード生成するステップとを含むことを特徴とする。
【００２７】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいて、この発明を詳細に説明する。
まず、本発明の概要を説明する。本発明は、例外処理の仕組みを持つプログラミング言語で記述されたプログラムに対し、例外処理における処理コスト、特に例外ハンドラの検索コストの効果的な削減を実現する。本発明では、これを実現するため、次の２種類の手法を提案する。
手法１：プログラムのコンパイル時におけるコード変形により例外ハンドラの検索コストを削減する手法。
手法２：プログラムの実行状態をフィードバックして適切な例外パスに対して最適化を行う手法。
【００２８】
これらの手法は、単独で用いることもできるし、組み合わせて用いることもできる。すなわち、手法１を単独で用いる場合は、プログラムの実行状態を関知することなくプログラム中に存在する例外ハンドラに対して処理を実行することができる。また、手法２を単独で用いる場合は、プログラムの実行状態のフィードバックにより得られた適切な例外パスに対して任意の最適化（例えば、インライン変換）を施すことができる。いずれの場合であっても、例外処理における処理コストの削減には大きな効果を期待することができるが、これらを組み合わせて用いれば、さらに大きな効果を奏し、当該プログラムを実装したコンピュータシステムにおける実行性能の向上に寄与する。
なお、本発明は、例外処理の仕組みを持つプログラミング言語で記述されたプログラムに対して汎用的に利用できるが、以下では、代表的な例として、Ｊａｖａで記述されたプログラムを対象とし、これを実装したコンピュータシステムについて説明する。
【００２９】
図１は、本実施の形態における例外処理のコスト削減方法を実現するコンピュータシステムのシステム構成を示す図である。
図１を参照すると、本実施の形態におけるコンピュータシステムは、入力コードをコンパイルするコンパイラ１００と、コンパイラ１００にてコンパイルされたオブジェクトプログラム（出力コード）を実行して種々の処理を行うプログラム実行部２００と、メモリ３００とを備える。コンパイラ１００及びプログラム実行部２００は、パーソナルコンピュータやワークステーションなどのコンピュータシステムにおけるプログラム制御されたＣＰＵにて実現される。メモリ３００は、コンピュータ装置の主メモリであり、ＲＡＭ等で実現される。メモリ３００には、プログラム実行部２００が使用する実行時ライブラリ３１０が格納されている。また、図示しないが、ＣＰＵを制御してコンパイラ１００として動作させるためのプログラムも格納される。なお、メモリ３００に格納される実行時ライブラリ３１０、プログラム及び後述する例外リポジトリ３２０は、必要に応じて、適宜磁気ディスクその他の記憶媒体に保存されることは言うまでもない。
図１において、コンパイラ１００は、バイトコード（byte code）で記述された入力コードを入力して処理し、機械語で記述された出力コードを生成して出力する。この入力コードの入力は、コード生成装置４００にて生成された入力コードを直接入力したり、コード生成装置４００にて生成された入力コードを記憶した記憶装置５００から入力したり、ネットワーク６００上に存在するコード生成装置４００や記憶装置５００からネットワーク６００を介して入力したりすることにより行われる。
なお、本実施の形態において、コンパイラ１００は、ＪａｖａにおけるＪＩＴ（Just In Time）コンパイラのような、実行プログラムを実行する際に動的に実行プログラムのコンパイル処理を行うコンパイラであっても良いし、ソースプログラムを予めコンパイルして生成されたオブジェクトプログラムを実行プログラムとする使用形態におけるコンパイラであっても良い。
【００３０】
コンパイラ１００により生成された出力コードは、プログラム実行部２００により実行される。この際、必要に応じてメモリ３００から実行時ライブラリ３１０が呼び出される。実行時ライブラリ３１０には、例外フィルタなど、実行時における例外処理を行うためのプログラムが含まれている。
上述した例外処理コスト削減のための２種類の手法において、手法１は、コンパイラ１００において実行される。また、手法２は、主として実行時ライブラリ３１０（またはその一部がコンパイルコードにインライン展開されたコード）による例外処理に基づきプログラム実行部２００において実行される。
【００３１】
図２は、本実施の形態におけるコンパイラ１００の構成を説明する図である。図２を参照すると、本実施の形態のコンパイラ１００は、メソッドのインライン展開を行うインライン展開処理部１１０と、発生する例外のタイプを解析する例外タイプ解析部１２０と、プログラムに存在する例外ハンドラを解析する例外ハンドラ解析部１３０と、例外クラスと例外ハンドラの対応関係を示す例外フローを作成する例外フロー解析部１４０と、例外フロー解析部１４０にて作成された例外フローに基づいてコード生成を行う分岐変換処理部１５０とを備える。
図２に示したコンパイラ１００の各構成要素は、コンピュータプログラムにより制御されたＣＰＵにて実現される仮想的なソフトウェアブロックである。ＣＰＵを制御する当該コンピュータプログラムは、ＣＤ−ＲＯＭやフロッピーディスクなどの記憶媒体に格納して配布したり、ネットワークを介して伝送したりすることにより提供される。
なお、図２に示したコンパイラ１００の構成要素は、本実施の形態における特徴的な機能に関して記述したものである。図示しないが、実際にはコンパイラ１００は、入力コードの字句解析や構文解析、機械語のコード生成といったコンパイル処理における一般的な機能を有することは言うまでもない。
【００３２】
インライン展開処理部１１０は、コンパイラ１００においてメソッドをコンパイルする際に、処理対象であるメソッドが例外を捕ることになるような例外パス（ホットな例外パス）を探し、そのようなパスをインライン展開する。なお、本実施の形態における例外処理のコスト削減方法を実現するためには、かかるインライン展開による最適化は必須ではないが、この最適化を経ることにより、本実施の形態の適用範囲が広がるため、処理コストの一層の削減を図ることができる。
【００３３】
次に、例外タイプ解析部１２０、例外ハンドラ解析部１３０、例外フロー解析部１４０及び分岐変換処理部１５０による各処理は、プログラムのコンパイル時に、当該プログラムにおける例外処理の手続きをシミュレーション（試行）し、コンパイル単位中の例外を明示的に投げる地点（例外の発生位置）を見つけ、見つかった例外を投げる各地点に関して実行される。ここで、コンパイル単位とは、プログラムのバイトコード列であって、典型的には１つのメソッドのバイトコード列である。
バイトコードにおいて例外を明示的に投げるのは、athrowバイトコードだけである。しかし、アプリケーションによっては、システム例外を数多く投げるものがあり、システム例外も最適化の対象にする必要がある。これに対応するため、システム例外を投げるバイトコードを、条件テスト＋システム例外を投げる特殊なathrowバイトコードのように読み替えて扱うこととする。
バイトコードに付与される例外表は、各ｔｒｙブロックがカバーするバイトコード範囲、そのｔｒｙブロックに対応する例外ハンドラが受け持つ例外クラス及びその例外ハンドラの入り口の位置を指定する。
【００３４】
例外タイプ解析部１２０は、コンパイル単位中の例外を明示的に投げる各地点（例外の発生位置）ｐにおいて、例外のタイプＴｐを解析する。ここで、例外のタイプとは、投げられる可能性のある全ての例外のクラスｃの集合であり、以下の説明ではＴｐ＝｛c1, c2, ...｝と記す。
【００３５】
例外ハンドラ解析部１３０は、コンパイル単位中の例外を明示的に投げる各地点ｐにおいて、その地点ｐをカバーしている例外ハンドラを検索し、そのリストを求める。この例外ハンドラリストを、以下の説明ではＨｐ＝｛h1, h2, ...｝と記す。
【００３６】
例外フロー解析部１４０は、コンパイル単位中の例外を明示的に投げる各地点ｐにおいて、例外タイプ解析部１２０にて求めた例外の各クラスに対し、例外ハンドラ解析部１３０にて求めた例外ハンドラリストから例外を受け取ることのできる例外ハンドラを探して対応づける。例外クラスと例外ハンドラのこのような対応を例外フローと呼ぶ。すなわち、例外フロー解析部１４０は、各クラスの例外がどの例外ハンドラによって捕られるかを調べる対応関係解析手段であり、この対応関係を示す例外フローを作成する手段である。以下の説明では、この例外フローをｆ＝（c,h）と記す。また、地点ｐにおける例外フローの集合は、Ｆｐ＝｛... ,（ci,hj）, ...｝と記す。
【００３７】
分岐変換処理部１５０は、コンパイル単位中の例外を明示的に投げる各地点ｐにおいて、例外を投げるコードを削除し、例外フロー解析部１４０にて求めた例外フロー（ci,hj）に基づき、例外クラス毎に対応した例外ハンドラへの分岐コードを生成するコード変形手段である。例外処理を分岐処理に変換するためのコードの削除及び生成を行う際、必要に応じて補償コードも生成する。
図３は、分岐変換処理部１５０によるコード生成の動作を説明するフローチャートである。
図３を参照すると、分岐変換処理部１５０は、まず例外フロー解析部１４０にて作成された例外フローが１つか複数かを調べる（ステップ３０１）。例外フローが複数ある場合は、次のコードを生成する。すなわち、投げられる例外クラスと例外フローに記述された例外クラスciとを比較するコード、これらの例外クラスが一致した場合に例外フローの例外ハンドラhjへ分岐するコードである。これらのコードは各例外フローに対して生成する（ステップ３０２）。
一方、例外フローが１つである場合は、投げられる例外クラスと例外フローの例外クラスciが一致するのは自明なので比較コードは不要である。したがって、例外フローの例外ハンドラhjへの分岐コードのみを生成する（ステップ３０３）。
【００３８】
次に、例外フローを持たない例外クラスが存在するかどうかを調べる（ステップ３０４）。すなわち、例外のタイプＴｐの要素である例外クラスのうち、例外フローの集合Ｆｐの要素である例外フローにおけるどの例外クラスにもならないものが存在するかどうかを調べる。そして、そのような例外クラスが存在するならば、例外を投げるコードを生成する（ステップ３０５）。
【００３９】
そして、例外を投げるコードの実行後で例外ハンドラの実行前に実行することが必要な作業がある場合、そのような必要な作業を行うための補償コードを、当該例外ハンドラへの分岐コードと当該例外ハンドラとの間に挿入する（ステップ３０６、３０７）。例えば、インライン展開最適化されたメソッド呼び出しであって、地点ｐと例外ハンドラhjとが元々は異なるメソッドに属し、それらのメソッド呼び出しの間にさらに同期メソッド呼び出しが含まれるとする。この場合、補償コードによって、そうした同期メソッドのロックの解放を行う。
【００４０】
以上のように、本実施の形態のコンパイラ１００によるコード変形を行うことにより、プログラム実行時の例外処理において、例外ハンドラの検索コストを完全に除去することができる。
また、コンパイル処理においては、本実施の形態による最適化の他にも、種々の最適化やそのための解析が行われる。このような解析及び最適化では、例外パスが存在することにより、それ以上深く解析することができず、最適化も当該例外パスの深さまでしか行えない場合が多い。しかし、本実施の形態によって例外パスを除去することにより、さらに深く解析を行うことができ、より一層の最適化を行うことが可能となる。
【００４１】
図４は、本実施の形態におけるプログラム実行部２００の構成を説明する図である。
図１に示したプログラム実行部２００は、メモリ３００の実行時ライブラリ３１０に含まれる例外処理のためのプログラム（またはその一部がコンパイルコードにインライン展開されたコード）に基づいて例外処理システムとして動作し、一連の動作による例外処理を実行する。
図４を参照すると、例外処理システムとして動作するプログラム実行部２００は、例外処理時に例外パスを作る例外パス取得部２１０と、例外プロファイルの作成及び更新を行う例外プロファイル編集部２２０と、例外の発生頻度を計算する例外発生頻度計算部２３０と、例外発生頻度に基づいて例外の重要度を判断し対応する処理を行う例外重要度計算部２４０及び例外重要度判定部２５０とを備える。
なお、図４に示したこれらの各構成要素は、上述のように、実行時ライブラリ３１０に含まれるプログラムにより制御されたＣＰＵ（プログラム実行部２００）にて実現される仮想的なソフトウェアブロックである。ＣＰＵを制御する当該プログラムは、ＣＤ−ＲＯＭやフロッピーディスクなどの記憶媒体に格納して配布したり、ネットワークを介して伝送したりすることにより提供される。
【００４２】
例外処理システムとして動作するプログラム実行部２００は、例外が発生すると、通常の処理として、スタックフレームを次々に遡って例外ハンドラを探す。例外パス取得部２１０は、例外ハンドラの探索が行われた際に、各フレームの実行コンテキストから、メソッド指定子と、そのフレームで最後に実行した命令（コード）のメソッド中における位置とのペア（メソッドコンテキスト）を取得する。フレームで実行されているコードがインライン展開されたコードである場合、そのフレームからは複数のメソッドコンテキスト列が得られる。この段階で、例外が投げられてから捕られるまでのメソッドコンテキスト列が得られることとなる。このメソッドコンテキスト列を例外パスと呼ぶ。なお、メソッドコンテキスト及びメソッドコンテキストの列である例外パスもまた、例外処理に関する情報を保存した実行コンテキストである。
【００４３】
例外プロファイル編集部２２０は、例外パス取得部２１０にて得られた例外パスに例外発生情報を付した例外プロファイルを生成し、メモリ３００に格納された例外リポジトリ３２０に保存する。例外リポジトリ３２０中に、同じ例外パスを持つ例外プロファイルが存在する場合は、当該例外プロファイル中の例外発生情報を更新する。ここで、例外発生情報としては、その例外パス上で発生した例外の回数、例外プロファイルの作成時間などを付加することができる。
【００４４】
例外発生頻度計算部２３０は、例外プロファイルに付された例外発生情報に基づいて、例外発生頻度（動的頻度）を計算する。例外発生頻度の計算法としては、例外処理コストを増やさないための単純な計算として、例えば、例外の発生回数をプロファイル収集時間で割ることが考えられる。しかし、プロファイル収集時間は、システム環境からの影響を受けやすいため、実用性（serviceability）の視点から問題とする場合には、例外発生頻度として単に例外の回数を使うこともできる。この場合、発生頻度の少ない例外が長い期間をかけて積算されることを避けるための操作が必要である。例として、定期的に一律に発生回数を半分にしたり、値を０にしたりすることが考えられる。
【００４５】
例外重要度計算部２４０は、例外パスと例外プロファイルにおいて当該例外パスに付加されている例外発生情報とに基づいて、当該例外の重要度を計算する。ここで、例外の重要度とは、例外処理における処理コスト削減のための処理を行うべきかどうかを判断する度合いであり、重要度が高い例外ほどシステムの実行性能に影響を及ぼし、処理コスト削減のための処理を行うべきとする。
Ｊａｖａと動的コンパイラ（ＪＩＴコンパイラ）のような環境では、メソッドは、当初はインタプリタによって低速で実行されている。そして、プログラムの実行が繰り返されると、当該プログラムがコンパイルされ最適化されて高速に実行されるようになる。このため、メソッドの実行速度は、同じメソッドであっても、インタプリタによる実行の場合、コンパイルされたコードを実行する場合、より最適化されてコンパイルされたコードを実行する場合などにより異なる。したがって、同じ例外発生頻度であっても、低速で実行されたコードで投げた例外における発生頻度と、高速で実行されたコードで投げた例外における発生頻度とでは意味が異なる。例えば、インタプリタによる実行のみで２０００サイクルに１回起きた例外は、コンパイルコードの実行ではその数十倍から数百倍の頻度になり得る。
そこで、より正確な情報に基づいて例外の重要度を求めるため、例外重要度計算部２４０は、例外発生頻度計算部２３０にて計算された例外発生頻度を、それぞれの実行状態に応じたコードの実行速度に基づいて正規化する。
【００４６】
例外重要度判定部２５０は、例外重要度計算部２４０により求められた例外プロファイルの例外重要度が一定の判断条件を満たすかどうかを調べる。ここで、判断条件は、例えば、例外重要度が予め設定された閾値を超えるかどうかとすることができる。
次に、例外重要度判定部２５０は、上記条件を満たす（例えば閾値を超える）例外プロファイルの例外パスに対して、次の処理を行う。すなわち、上述したように、例外パスはメソッドコンテキストの列であり、その端に位置するメソッドコンテキストは、常に、例外を捕るメソッド（キャッチメソッド）とその例外ハンドラである。そこで、当該メソッドをキャッチメソッドとする例外パスを当該メソッドに登録する。
【００４７】
これにより、例えば、コンパイルの際における例外処理コストの削減手法としてメソッドのインライン展開を行う場合、コンパイラ１００が所定のメソッドをコンパイルする際に、そのメソッドに登録されている例外パスを当該メソッドにインライン展開することができ、当該例外を投げる地点と捕る地点とが同じコードセグメント内に置かれることとなる。このようにすれば、コンパイラ１００は、同じコードセグメント内で例外を投げる場合にできる最適化を行うことにより、かかる例外処理に対する最適化を行うことができる。
なお、ＪＩＴコンパイラなどの動的コンパイラにおいて本実施の形態を実現する場合、プログラムの再コンパイルによるオーバーヘッドを少なくするため、重要度の高い（例えば、例外発生頻度が閾値を超えた）例外パスが得られた時点で直ちにキャッチメソッドをコンパイルするのではなく、同じキャッチメソッドを持つ例外パスが続けて得られる場合には当該キャッチメソッドのコンパイルを抑制するといった制御が可能である。
【００４８】
以上のように、本実施の形態では、例外処理における処理コストを削減する手法として、コンパイラ１００によるプログラムのコンパイル時に、一定の条件の下で、例外処理を行うパスを条件分岐パスに変形し、例外を投げるコードの位置から例外ハンドラの位置へ直接移行させるようにコード生成を行う手法（手法１）と、プログラム実行部２００によるプログラムの実行時に、例外の発生履歴を取り、この履歴に基づいて所定の例外パスを最適化の対象に決定し、コンパイル時に動的に最適化を行う手法（手法２）とを提供する。
これらの手法は単独で用いることができる。すなわち、手法１を単独で用いる場合、プログラムの実行状況（例外の発生履歴）に関わらず、例外が起こり得る全てのメソッドに対してコード変形の処理を行うことができる。ただし、この場合、例外ハンドラがメソッド内にない場合など、必ずしも全ての例外パスを最適化できるとは限らない。しかしながら、プログラム全般的には、例外ハンドラの検索コストを削減し、システムの実行性能の向上に寄与し得る。
【００４９】
一方、手法２を単独で用いる場合、最適化の手法として手法１に限らず、インライン変換などの最適化の対象となる例外パスを決定することができる。手法２により決定された例外パスは、プログラムの実行に際して頻繁に例外が発生し、実際に例外処理を行うパスである。したがって、システムの実行性能に対して影響を及ぼしており、これを最適化することによって当該システムの実行性能の向上に寄与し得る。すなわち、手法２は、プログラムを実際に実行しながら、システムの実行性能に影響するホットな例外パス（またはそのメソッド呼び出し）を検出する機構を提供する意義がある。
そして、手法１、２を組み合わせる場合、手法２によって最適化の対象とされた例外パスをインライン展開することにより、手法１の適用範囲が広がるというさらなる利点がある。
【００５０】
なお、ＪａｖａのＪＩＴコンパイラのように、プログラムの実行状況に応じてプログラムがコンパイルされたり、新たな最適化を含んで再コンパイルされたりする環境では、コンパイル時にそれまでのプログラムの実行状況に応じて適宜インライン展開や手法１による最適化を適用することが容易である。したがって、このような動的コンパイラを持つ環境は、手法２の導入に適していると言える。しかしながら、静的なコンパイラにて予めコンパイルしたオブジェクトプログラムをシステムに提供するような環境であっても、システムにおけるプログラム実行時の例外の発生履歴を取っておき、この履歴に基づいた最適化を含めて定期的にプログラムを再コンパイルし、アップグレードされたオブジェクトプログラムを再配布するなどの方法を採ることにより、手法２を効果的に利用することが可能である。
【００５１】
次に、本実施の形態における具体的な動作例について説明する。
次に示す４つの動作例のうち、動作例１、２は、プログラム実行部２００による例外処理時の動作であり、本実施の形態における例外処理コスト削減のための２種類の手法における手法２の具体例（そのフィードバック部分）に相当する。また、動作例３、４は、コンパイラ１００によるコンパイル時のコード変形の動作であり、手法１の具体例に相当する。
【００５２】
＜動作例１＞
図５は、スタックフレームの例を示す図である。
図５に示すスタックフレームは、４つのメソッドＡ、Ｂ、Ｃ、Ｄのフレームを示す。図示の状態は、これらのメソッドにおいて、メソッドＤがコード位置ｄ１でメソッドＣを呼び、メソッドＣがコード位置ｃ１でメソッドＢを呼び、メソッドＢがコード位置ｂ１でメソッドＡを呼び、そして、メソッドＡがコード位置ａ１で例外を投げたときの状態である。
【００５３】
例外が投げられると、一般に、例外処理システムであるプログラム実行部２００の例外パス取得部２１０は、スタックを逆向きに検索し、投げられた例外を処理できる例外ハンドラを持つフレームを探す。
例外パス取得部２１０は、例外ハンドラを検索しながら、検索順序を認識しつつメソッドコンテキストを保存する。メソッドＡとそのコード位置ａ１というメソッドコンテキストを（Ａ，ａ１）と表すとする。すると、例外ハンドラが見つかったときのメソッドコンテキスト列、すなわち例外パスは、｛（Ａ，ａ１），（Ｂ，ｂ１），（Ｃ，ｃ１），（Ｄ，ｄ１）｝である。この例外パスをｐとする。
次に、例外プロファイル編集部２２０が、メモリ３００の例外リポジトリ３２０を調べ、例外リポジトリ３２０に例外パスｐが例外プロファイルとして登録されていない場合、新たに例外プロファイルとして登録し、例外発生情報として、開始時刻（start_time=）１００と発生回数（count=）０とを与える。
【００５４】
プログラムの実行が進み、この例外が繰り返し起こったものとする。すると、この例外が発生するたびに、例外プロファイル編集部２２０は、例外リポジトリ３２０中に例外パスｐの例外プロファイルを見つけ、発生回数を更新する。今、時刻１００１００に発生回数が５００になったとする。このとき、例外頻度は１／２００である。今、例外頻度を例外重要度とし、閾値を１／２００とすると、この例外プロファイルの例外重要度は閾値に達した。したがって、例外発生頻度計算部２３０、例外重要度計算部２４０の処理を経て、例外重要度判定部２５０が、この例外パスを、後にプログラムをコンパイルする際における例外処理コストを削減する処理の対象として、この例外のキャッチメソッドであるメソッドＤに登録する。
【００５５】
したがって、コンパイル時における例外処理コストの削減手法としてインライン展開を用いる場合、コンパイラ１００は、メソッドＤをコンパイルする際に、例外パスｐ＝｛（Ａ，ａ１），（Ｂ，ｂ１），（Ｃ，ｃ１），（Ｄ，ｄ１）｝をメソッドＤにインライン展開し、例外を投げる点ａ１と例外を捕る点ｄ２を、同一コードセグメント内に配置する。そして、コンパイルスコープ内に例外を投げる点と捕る点が存在する場合の最適化を実行する。
【００５６】
＜動作例２＞
動作例１では、例外頻度を求める際に時間間隔を用いた。しかし、時間間隔は外部環境、特に、同時に動く別のプログラムの動作に影響されやすい。プログラムの実用性（serviceability）という視点では、プログラムの動作の再現性が重要である。そのため、外部環境からの影響を受ける要因を持つ最適化が困難である場合がある。
そこで、動作例１に示した状況（図５参照）を例として、例外プロファイルにおいて、例外発生情報として例外の発生回数（ｃｏｕｎｔ）のみを例外パスに付加することを考える。このようにすれば、単に例外の起きた回数だけが例外発生情報として扱われるので、外部環境からの影響を受けることはない。
ただし、時間の概念を取り去ったため、長い時間をかけることで閾値に達するような例外が現れてしまう。このような事態を避けるため、例外重要度の高い例外パスを例外処理コスト削減処理の対象として登録する際、その他の例外パスの例外発生情報である例外の発生回数を初期化する（値を０に戻す）。
【００５７】
＜動作例３＞
次に、コンパイル時におけるコード変形の動作により例外の検索コストを削減する手法の動作例を説明する。
図６は、例外表（exception table）、例外を投げるバイトコード列（プログラムカウンタpc_start1からpc_end1まで）、例外ハンドラのバイトコード列（プログラムカウンタpc_handler1から始まる）、コンパイラ１００の処理により変形された例外を投げるバイトコード列を示す図である。
例外を投げるバイトコード列において、new Excコードは、例外クラスＥｘｃのオブジェクトを生成、dupでそのオブジェクトへのポインタを複製、invokespecial Exc()Vで複製したポインタの１つを使ってオブジェクトを初期化、athrowでポインタのもう１つを使って例外を投げる。このコード列は非常によく見られる典型的なコード列である。
【００５８】
ここで、本実施の形態によるコード変形を、プログラムカウンタpc_throw1のathrowに適用する。
まず、new Excコードｎｅｗによって生成されたＥｘｃクラスのオブジェクトを投げることがデータフロー解析により分かる。ここでは、例外タイプ解析部１２０は、pc_throw1における例外タイプをＴ１＝｛"Exc"｝と認識する。
次に、例外ハンドラ解析部１３０が、例外表を調べ、pc_throw1をカバーするハンドラリストＨ１＝｛h1｝を得る。そして、ハンドラh1は、例外クラスＥｘｃを受け取る。
次に、例外フロー解析部１４０が例外フローにおける利害クラスと例外ハンドラとの関係を解析し、これにより、例外タイプＴ１の要素"Exc"を、ハンドラリストＨ１の要素h1が受け取ることが分かり、例外フロー集合Ｆ１＝｛("Exc",h1)｝が求まる。
次に、分岐変換処理部１５０は、例外フロー解析部１４０の解析結果に基づいてコード変形を行う。本動作例では例外フローが１つであるので、図３のステップ３０３に相当し、したがって分岐変換処理部１５０は、athrowを除去してgoto pc_handler1を挿入する。
以上により、コンパイルにおいてハンドラ検索コストを除去できた。
【００５９】
＜動作例４＞
次に、動作例３では例外フローが１つである場合の動作を説明したが、次に例外フローが複数存在する場合の動作を説明する。
図７は、例外表（exception table）、例外を投げるバイトコード列（プログラムカウンタpc_start1からpc_end1まで）、ハンドラのバイトコード列（プログラムカウンタpc_handler1から始まる）、コンパイラ１００の処理により変形された例外を投げるバイトコード列を示す図である。図６に示したバイトコード列等と比較すると、例外オブジェクトの生成、初期化が当該コンパイル単位内にないこと、及びpc_throw1に２種類のクラスの例外オブジェクトが到達し得ることが異なっている。
【００６０】
動作例３と同様に、本実施の形態によるコード変形を、プログラムカウンタpc_throw1のathrowに適用する。
まず、データフロー解析により、他のコンパイル単位において生成された２つのクラスExc1及びExc2のオブジェクトが到達し得ることが分かる。ここでは、例外タイプ解析部１２０は、pc_throw1における例外タイプをＴ１＝｛"Exc1", "Exc2"｝と認識する。
次に、例外ハンドラ解析部１３０が、例外表を調べ、pc_throw1をカバーするハンドラリストＨ１＝｛h1｝を得る。ここで、ハンドラh1は、例外クラスExc1を受け取るが、Exc2は受け取らない。
次に、例外フロー解析部１４０が例外フローにおける利害クラスと例外ハンドラとの関係を解析し、これにより、例外タイプＴ１の要素"Exc1"を、ハンドラリストＨ１の要素h1が受け取ることが分かり、例外フロー集合Ｆ１＝｛("Exc1",h1)｝が求まる。
次に、分岐変換処理部１５０は、例外フロー解析部１４０の解析結果に基づいてコード変形を行う。本動作例では例外フローが複数有るので図３のステップ３０２に相当し、かつ例外フローを持たない例外クラスExc2が存在するので同じく図３のステップ３０５に相当する。したがって、分岐変換処理部１５０は、athrowを除去して、投げる例外のクラスがExc1であるかどうかを調べ（instanceof Exc1）、Exc1であるならば、例外ハンドラh1に分岐するコード（ifneq pc_handler1）を挿入する。一方、投げる例外のクラスがExc1でない（すなわちExc2）ならば、例外を投げるコードを挿入する。
以上により、コンパイルにおいて、投げられる例外のクラスがExc1である場合のハンドラ検索コストを除去できた。
【００６１】
【発明の効果】
以上説明したように、本発明によれば、例外処理における例外ハンドラの検索コストを効果的に削減することができ、これにより、コンピュータシステムにおける実行性能の向上を図ることができる。
また、本発明によれば、例外ハンドラの検索処理の実行頻度に基づいてシステムの実行性能に実際に影響を与える処理を対象として動的に最適化を行うことができ、これにより、コンピュータシステムにおける実行性能の向上を図ることができる。
【図面の簡単な説明】
【図１】  本実施の形態における例外処理のコスト削減方法を実現するコンピュータシステムのシステム構成を示す図である。
【図２】  本実施の形態におけるコンパイラの構成を説明する図である。
【図３】  図２のコンパイラの分岐変換処理部によるコード生成の動作を説明するフローチャートである。
【図４】  本実施の形態におけるプログラム実行部の構成を説明する図である。
【図５】  本実施の形態の動作を説明する図であり、処理対象となるスタックフレームの例を示す図。
【図６】  本実施の形態の動作を説明する図であり、例外表、例外を投げるバイトコード列、例外ハンドラのバイトコード列及びコンパイラの処理により変形された例外を投げるバイトコード列の例を示す図である。
【図７】  本実施の形態の動作を説明する図であり、例外表、例外を投げるバイトコード列、例外ハンドラのバイトコード列及びコンパイラの処理により変形された例外を投げるバイトコード列の他の例を示す図である。
【符号の説明】
１００…コンパイラ、１１０…インライン展開処理部、１２０…例外タイプ解析部、１３０…例外ハンドラ解析部、１４０…例外フロー解析部、１５０…分岐変換処理部、２００…プログラム実行部、２１０…例外パス取得部、２２０…例外プロファイル編集部、２３０…例外発生頻度計算部、２４０…例外重要度計算部、２５０…例外重要度判定部、３００…メモリ、３１０…実行時ライブラリ、３２０…例外リポジトリ、４００…コード生成装置、５００…記憶装置、６００…ネットワーク
【図１】
0003790683.tif 000002
【図２】
0003790683.tif 000003
【図３】
0003790683.tif 000004
【図４】
0003790683.tif 000005
【図５】
0003790683.tif 000006
【図６】
0003790683.tif 000007
【図７】
0003790683.tif 000008