(57)【要約】【課題】例外処理を最適化する。【解決手段】プログラムの例外処理を最適化するコンパイラ装置は、プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、検出された複数捕捉例外ハンドラが捕捉する複数の例外のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、例外選択部により選択された例外の組を複数捕捉例外ハンドラに代わって捕捉し、共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部とを備える。【選択図】  図１
2004287844.tif 000002
【特許請求の範囲】
【請求項１】
コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置であって、
前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、
検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、
前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ装置。
【請求項２】
前記例外ハンドラ生成部は、前記代替例外ハンドラにおいて、前記共通の処理に移行させる分岐命令を生成し、生成した前記分岐命令によって前記共通の処理に移行させる請求項１記載のコンパイラ装置。
【請求項３】
前記例外選択部は、前記複数捕捉例外ハンドラにおいて発生する頻度が予め定められた基準頻度以上であり、かつ前記共通の処理に移行する例外の組を選択する請求項１記載のコンパイラ装置。
【請求項４】
前記例外選択部は、前記複数捕捉例外ハンドラにおいて例外が発生する頻度として、前記複数捕捉例外ハンドラが実行される回数当たりの、前記複数捕捉例外ハンドラにおいて前記例外の組の何れかが発生する回数を検出する請求項３記載のコンパイラ装置。
【請求項５】
前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、
前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、
前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さが、予め定められた数より大きいことを更に条件として、前記例外の組を選択する請求項１記載のコンパイラ装置。
【請求項６】
前記例外選択部は、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数が、予め定められた数より大きいことを更に条件として、前記例外の組を選択する請求項１記載のコンパイラ装置。
【請求項７】
前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、
前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、
前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さと、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数とに更に基づき、前記例外の組を選択する請求項１記載のコンパイラ装置。
【請求項８】
前記例外ハンドラ検出部は、一の前記複数捕捉例外ハンドラと、前記一の複数捕捉例外ハンドラにおいて発生した少なくとも一の例外を捕捉する他の前記複数捕捉例外ハンドラとの２つの前記複数捕捉例外ハンドラを検出し、
前記例外選択部は、前記一の複数捕捉例外ハンドラが捕捉する複数の例外のうち、前記他の複数捕捉例外ハンドラにおいて捕捉した例外を再び発生させることにより前記共通の処理に移行する例外の組を選択し、
前記例外ハンドラ生成部は、前記２つの複数捕捉例外ハンドラのそれぞれに対応付けて、２つの前記代替例外ハンドラのそれぞれを生成し、前記２つの複数捕捉例外ハンドラのそれぞれに代えて、対応する前記２つの代替例外ハンドラのそれぞれにおいて、前記例外選択部により選択された例外の組を捕捉させる請求項１記載のコンパイラ装置。
【請求項９】
コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、
検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、
前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部として機能させるコンパイラプログラム。
【請求項１０】
前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、
前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、
前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さと、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数とに更に基づき、前記例外の組を選択する請求項９記載のコンパイラプログラム。
【請求項１１】
前記例外ハンドラ検出部は、一の前記複数捕捉例外ハンドラと、前記一の複数捕捉例外ハンドラにおいて発生した少なくとも一の例外を捕捉する他の前記複数捕捉例外ハンドラとの２つの前記複数捕捉例外ハンドラを検出し、
前記例外選択部は、前記一の複数捕捉例外ハンドラが捕捉する複数の例外のうち、前記他の複数捕捉例外ハンドラにおいて捕捉した例外を再び発生させることにより前記共通の処理に移行する例外の組を選択し、
前記例外ハンドラ生成部は、前記２つの複数捕捉例外ハンドラのそれぞれに対応付けて、２つの前記代替例外ハンドラのそれぞれを生成し、前記２つの複数捕捉例外ハンドラのそれぞれに代えて、対応する前記２つの代替例外ハンドラのそれぞれにおいて、前記例外選択部により選択された例外の組を捕捉させる請求項９記載のコンパイラプログラム。
【請求項１２】
請求項９から請求項１１の何れかに記載のコンパイラプログラムを記録した記録媒体。
【請求項１３】
コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置としてコンピュータを動作させるコンパイル方法であって、
前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出段階と、
検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択段階と、
前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成段階とを備えるコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法に関する。特に本発明は、例外処理を最適化するコンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法に関する。
【０００２】
【従来の技術】
近年、プログラムの保守性及び堅牢性を高める目的で、例外処理を記述することのできるプログラム言語が普及してきている。このようなプログラム言語で記述されたプログラムは、プログラムにおいて例外が発生した場合に、プログラム中の例外が発生した箇所から、当該例外に対応する例外ハンドラに処理を移す。
従来、例外ハンドラに処理を移すこの処理を最適化する技術として、頻繁に発生する例外の種類を検出し、検出した種類の例外を発生する命令を、例外ハンドラへの分岐命令に書き換える技術が用いられている（非特許文献１参照。）。
【０００３】
【非特許文献１】
小笠原  武史、小松  秀昭、及び中谷  登志男著”Ａ  Ｓｔｕｄｙ  ｏｆ  Ｅｘｃｅｐｔｉｏｎ  Ｈａｎｄｌｉｎｇ  ａｎｄ  Ｉｔｓ  Ｄｙｎａｍｉｃ  Ｏｐｔｉｍｉｚａｔｉｏｎ  ｉｎ  Ｊａｖａ（登録商標）”Ｏｂｊｅｃｔ−Ｏｒｉｅｎｔｅｄ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｓｙｓｔｅｍｓ，Ｌａｎｇｕａｇｅｓ，ａｎｄ  Ａｐｐｌｉｃａｔｉｏｎｓ（ＯＯＰＳＬＡ２００１）会議録  ２００１年、邦題「Ｊａｖａ（登録商標）における、例外処理及び例外処理の動的最適化の研究」
【０００４】
【発明が解決しようとする課題】
しかしながら、上記技術は、発生させる例外の種類を特定できない場合に、例外ハンドラに処理を移す処理を最適化することができない。例えば、複数の種類の例外を捕捉する例外ハンドラが、捕捉した例外を再び発生させる場合には、コンパイラ装置は、何れの種類の例外を捕捉するかを予め定めることができないので、例外を再び発生させる命令をどのように最適化するべきかを決定することができない。
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法を提供することを目的とする。
この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【０００５】
【課題を解決するための手段】
即ち、本発明の第１の形態によると、コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置であって、対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、検出された複数捕捉例外ハンドラが捕捉する複数の例外のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、例外選択部により選択された例外の組を複数捕捉例外ハンドラに代わって捕捉し、共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法を提供する。
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【０００６】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図１は、コンパイラ装置１０の機能ブロック図を示す。コンパイラ装置１０は、コンパイル対象のプログラムである対象プログラムのコンパイル時において、例外処理を最適化する装置であり、例外ハンドラ検出部１００と、例外選択部１１０と、例外ハンドラ生成部１２０とを備える。例外ハンドラ検出部１００は、対象プログラムを取得すると、当該対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出し、検出結果を例外選択部１１０に送る。
【０００７】
そして、例外選択部１１０は、例外ハンドラ検出部１００により検出された複数捕捉例外ハンドラが捕捉する複数の例外のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択し、選択結果を例外ハンドラ生成部１２０に送る。そして、例外ハンドラ生成部１２０は、例外選択部１１０により選択された例外の組を複数捕捉例外ハンドラに代わって捕捉して共通の処理に移行する代替例外ハンドラを生成する。更に、例外ハンドラ生成部１２０は、生成した当該代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を生成し、生成した分岐命令によって、共通の処理に移行させる。
続いて、例外ハンドラ生成部１２０は、代替例外ハンドラ及び分岐命令を生成したプログラムを、コンパイル結果として出力する。
【０００８】
ここで、例外は、例えば、対象プログラムの実行中に、プログラム言語に予め定められた規格に反する処理が行われた場合に発生する処理である。具体的には、例外とは、対象プログラム中の命令が、配列変数を、当該配列変数に定義された範囲外の添え字を用いてアクセスを試みた場合に発生する。これに代えて、プログラム言語に予め定められた規格に反するか否かに関わらず、例外を自律的に発生させる命令によって発生してもよい。一例としては、例外は、Ｊａｖａ（登録商標）言語におけるエクセプション（Ｅｘｃｅｐｔｉｏｎ）である。
【０００９】
なお、コンパイル対象の対象プログラムは、最適化を効率良く行うべくソースプログラムから生成された中間表現であり、例えば、Ｊａｖａ（登録商標）言語のバイトコードである。これに代えて、対象プログラムは、ＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）であってもよいし、四つ組表現であってもよい。また、対象プログラムとは、利用者により実行されるプログラム全体であってもよいし、対象プログラムのうちの一つの機能を示すモジュールであってもよい。モジュールとは、例えば、メソッド（ｍｅｔｈｏｄ）、関数（ｆｕｎｃｔｉｏｎ）、又は手続（ｐｒｏｃｅｄｕｒｅ）である。
【００１０】
図２は、コンパイラ装置１０のフローチャートを示す。例外ハンドラ検出部１００は、コンパイル対象の対象プログラムを取得すると、当該対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する（Ｓ２００）。
【００１１】
そして、例外選択部１１０は、例外ハンドラ検出部１００により検出された複数捕捉例外ハンドラが捕捉する複数の例外のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する（Ｓ２１０）。好ましくは、例外選択部１１０は、複数捕捉例外ハンドラにおいて発生する頻度が予め定められた基準頻度以上であることを更に条件として、例外の組を選択する。例えば、例外選択部１１０は、複数捕捉例外ハンドラにおいて例外が発生する頻度として、複数捕捉例外ハンドラが実行される回数当たりの、複数捕捉例外ハンドラにおいて例外の組の何れかが発生する回数を検出し、検出した当該回数に基づいて、例外の組を検出してもよい。
【００１２】
例外が発生する頻度を検出する方法の一例としては、コンパイラ装置１０は、他の方法により一旦コンパイルされた対象プログラムが実際に実行された場合の情報に基づいて検出してもよいし、対象プログラムの制御フロー及びデータフローの情報に基づいて、例外が発生する頻度の見積もり値を算出してもよい。
【００１３】
例外ハンドラ生成部１２０は、例外選択部１１０により選択された例外の組を複数捕捉例外ハンドラに代わって捕捉して共通の処理に移行する代替例外ハンドラを生成する（Ｓ２２０）。更に、例外ハンドラ生成部１２０は、生成した当該代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を生成し、生成した分岐命令によって、共通の処理に移行させる（Ｓ２３０）。また、例外ハンドラ生成部１２０は、対象プログラムの実行結果を保持するべく、複数捕捉例外ハンドラにおいて実行される処理と略同一の処理を、代替例外ハンドラに複写する。
【００１４】
このように、コンパイラ装置１０は、複数捕捉例外ハンドラに代わって例外を捕捉し、共通の処理に移行させる代替例外ハンドラを生成し、当該代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を生成する。これにより、コンパイラ装置１０は、捕捉した例外を再び発生させる処理を省略し、単なる分岐命令により共通の処理に移行させることができる。
【００１５】
また、本図で示した一連の処理が行われるタイミングは、コンパイル対象の対象プログラムの実行が開始される前に限定されない。例えば、コンパイラ装置１０は、一旦コンパイルされた対象プログラムの実行中に、代替例外ハンドラを生成してもよい。より具体的には、例外選択部１１０は、対象プログラムの実行中に、複数捕捉例外ハンドラにおいて発生する頻度が予め定められた基準頻度以上である例外の組を選択する。そして、例外選択部１１０は、選択した当該例外の組のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する。これにより、例外ハンドラ生成部１２０は、対象プログラムの実行中に必要に応じて代替例外ハンドラを生成することができる。即ち、コンパイラ装置１０とは、コンパイル対象の対象プログラムの実行が開始される前に当該対象プログラムを最適化する機能のみならず、当該対象プログラムの実行中に必要に応じて対象プログラムを最適化する機能、例えば、ランタイムライブラリとして実現される機能をも含む。
【００１６】
図３は、コンパイル対象の対象プログラムの一例を示す。１行目から１３行目に示した括弧は、１３行目に示した例外ハンドラにより例外が捕捉される例外捕捉範囲を示している。２行目から９行目に示した括弧は、９行目から１２行目に示した例外ハンドラによる例外捕捉範囲を示している。即ち、本図の対象プログラムにおいて、２行目から９行目の例外捕捉範囲において発生した例外は、９行目から１２行目に示した例外ハンドラにより捕捉される。更に、９行目から１２行目に示した例外ハンドラにおいて発生した例外は、１３行目の例外ハンドラにより捕捉される。ただし、１３行目の例外ハンドラは、９行目から１２行目に示した例外ハンドラにおいて発生した例外のうち、例外１及び例外２を捕捉する。
【００１７】
また、３行目及び４行目の命令は、例外１を発生させる命令である。５行目及び６行目の命令は、例外２を発生させる命令である。７行目及び８行目の命令は、例外３を発生させる命令である。また、１０行目及び１１行目の命令は、９行目から１２行目に示した例外ハンドラにより捕捉された例外を、再び発生させる命令である。本図で示すように、例外を自律的に発生させる命令は、例外の種類を指定する。例えば、３行目及び４行目の命令は、例外１という種類の例外を発生させる。そして、例外ハンドラは、指定した例外の種類に該当する例外が発生した場合に、処理を開始する。例えば、１３行目の例外ハンドラは、例外検出範囲において発生した例外のうち、指定した例外に該当する例外１及び例外２を捕捉し、１３行目の処理を開始する。
【００１８】
例外ハンドラ検出部１００は、本図に示した対象プログラムを取得すると、複数捕捉例外ハンドラとして、９行目から１２行目に示した例外ハンドラを検出する。そして、例外選択部１１０は、複数捕捉例外ハンドラが捕捉する複数の例外、即ち、例外１、例外２、及び例外３のうち、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する。例えば、複数捕捉例外ハンドラが、例外１及び例外２の何れを発生させた場合であっても、１３行目に示した共通の処理に移行するので、例外選択部１１０は、共通の処理に移行する例外の組として、例外１及び例外２を選択する。
【００１９】
なお、本図の例において、複数捕捉例外ハンドラとは、Ｊａｖａ（登録商標）言語等において、例外検出範囲において発生した何れの例外をも捕捉するｆｉｎａｌｌｙ節である。これに代えて、複数捕捉例外ハンドラは、Ｊａｖａ（登録商標）言語において、複数の例外を捕捉するｃａｔｃｈ節であってもよい。例えば、Ｊａｖａ（登録商標）言語において、例外の種類は、例外の種類を識別するオブジェクトにより表される。また、ｃａｔｃｈ節は、指定された例外のオブジェクトの子クラスとなる全てのオブジェクトを捕捉する。即ち、複数捕捉例外ハンドラは、複数のオブジェクトの親クラスであるオブジェクトとして表される例外を捕捉するｃａｔｃｈ節であってもよい。
【００２０】
また、例外ハンドラが例外を捕捉するとは、当該例外が発生したことを条件に、当該例外ハンドラの処理が開始される旨を示す。即ち、９行目から１２行目の例外ハンドラが例外１を捕捉するとは、例外１が発生したことを条件に９行目から１２行目の例外ハンドラの処理が開始される旨を示す。
【００２１】
図４は、コンパイラ装置１０による最適化後の対象プログラムの一例を示す。
例外ハンドラ生成部１２０は、例外選択部１１０により選択された組である例外１及び例外２を捕捉して共通の処理に移行する代替例外ハンドラ、例えば、９行目及び１０行目の命令を生成する。そして、例外ハンドラ生成部１２０は、複数捕捉例外ハンドラに代えて、代替例外ハンドラにおいて、例外選択部１１０により選択された組の例外である例外１及び例外２を捕捉させるべく、図３の９行目から１２行目に示した複数捕捉例外ハンドラに代えて、例外３のみを捕捉する例外ハンドラを１１行目から１２行目に生成する。そして、例外ハンドラ生成部１２０は、代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を１０行目に生成し、生成した分岐命令によって、共通の処理に移行させる。
【００２２】
このように、コンパイラ装置１０は、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択し、選択した例外の組を複数捕捉例外ハンドラに代わって捕捉し、共通の処理に移行させる代替例外ハンドラを生成する。更に、コンパイラ装置１０は、代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を生成する。これにより、コンパイラ装置１０は、例外の発生により必要となる処理を省略し、単なる分岐命令により処理を移行させることができる。
【００２３】
図５（ａ）は、コンパイル対象の対象プログラムの他の例である。コンパイラ装置１０は、関数５００−１〜Ｎを対象プログラムとして取得する。関数５００−１は、例外ハンドラ５１０−１と、例外ハンドラ５１０−１の例外検出範囲において関数５００−２を呼び出すコール（ｃａｌｌ）命令とを含む。関数５００−２は、例外ハンドラ５１０−２と、例外ハンドラ５１０−２の例外検出範囲において関数５００−３を呼び出すコール（ｃａｌｌ）命令を含む。関数５００−３からＮ−１も関数５００−１と同様であり、関数５００−３からＮ−１は、この順に順次呼び出されることにより実行を開始する。また、関数５００−Ｎは、関数５００−（Ｎ−１）から呼び出されて実行を開始し、例外ハンドラ５１０−Ｎと、例外ハンドラ５１０−Ｎの例外検出範囲において例外を発生させる例外発生命令５２０を含む。なお、関数とは、対象プログラムの作成者により予め定められた対象プログラムの部分であり、メソッド（ｍｅｔｈｏｄ）又は手続（ｐｒｏｃｅｄｕｒｅ）であってもよい。
【００２４】
例外ハンドラ検出部１００は、この対象プログラムを取得すると、一の複数捕捉例外ハンドラである例外ハンドラ５１０−Ｎと、例外ハンドラ５１０−Ｎにおいて発生した少なくとも一の例外を捕捉する他の複数捕捉例外ハンドラである例外ハンドラ５１０−２との２つの複数捕捉例外ハンドラを検出する。そして、例外選択部１１０は、例外ハンドラ５１０−Ｎが捕捉する複数の例外のうち、例外ハンドラ５１０−Ｎが再び例外を発生させることにより例外ハンドラ５１０−２の処理に移行し、かつ例外ハンドラ５１０−２において捕捉した例外を再び発生させることにより共通の処理に移行する例外の組を選択する。例えば、本図に例において、例外１が発生した場合には、例外ハンドラ５１０−２により捕捉され、かつ例外ハンドラ５１０−２から例外ハンドラ５１０−１に処理が移行するので、例外選択部１１０は、例外１を選択する。
【００２５】
これを受けて、例外ハンドラ生成部１２０は、この２つの複数捕捉例外ハンドラのそれぞれに対応付けて、２つの代替例外ハンドラのそれぞれを生成し、この２つの複数捕捉例外ハンドラのそれぞれに代えて、対応する２つの代替例外ハンドラのそれぞれにおいて、例外選択部１１０により選択された例外１を捕捉させる。
【００２６】
図５（ｂ）は、コンパイル対象の対象プログラムにおける各命令が、発生又は捕捉する例外の種類を、関数呼び出しおよび例外捕捉範囲の入れ子の深さに対応付けて示す。例えば、例外発生命令５２０は、例外１を発生させる命令であり、例外ハンドラ５１０−２及び例外ハンドラ５１０−Ｎのそれぞれは、例外１、例外２、及び例外３を捕捉する命令である。また、例外ハンドラ５１０−１は、例外１を捕捉する命令である。
【００２７】
また、例外ハンドラ５１０−１は、関数呼び出しにより呼び出された関数５００−２の処理中に発生した例外１を、関数呼び出しの外で捕捉する。また、例外ハンドラ５１０−２は、例外ハンドラ５１０−１を含む関数から呼び出された関数の内部で発生した例外を捕捉する。即ち、例外ハンドラ５１０−２は、関数５００−２から関数５００−Ｎで発生した例外を捕捉する。また、例外ハンドラ５１０−Ｎは、例外発生命令５２０が発生させる例外を捕捉する。
即ち、例外ハンドラ５１０−２は、関数呼び出しの入れ子が例外ハンドラ５１０−１より深い。更に、例外ハンドラ５１０−２は、例外検出範囲の入れ子が例外ハンドラ５１０−１より深い。同様に、例外ハンドラ５１０−３からＮは、この順に、関数呼び出し及び例外検出範囲の入れ子が深くなる。
【００２８】
このように、複数捕捉例外ハンドラの一例である例外ハンドラ５１０−Ｎは、共通の処理の一例である例外ハンドラ５１０−１に処理を移す過程で、他の例外ハンドラを経由する。従って、例外ハンドラ５１０−Ｎから例外ハンドラ５１０−１に移行する間に処理が経由する他の例外ハンドラの数がより多い場合に、例外が発生してから共通の処理に処理が移るまでにより多くの時間が必要となる。
また、例外ハンドラ５１０−Ｎは、例外ハンドラ５１０−１に処理を移す過程で、関数５００−Ｎから関数５００−２の関数呼び出しから復帰する処理を経る。従って、例外ハンドラ５１０−１から例外ハンドラ５１０−Ｎに至る関数呼び出しの入れ子の深さがより深い場合に、例外が発生してから共通の処理に処理が移るまでにより多くの時間が必要となる。
【００２９】
上記の処理に要する時間を減少させるべく、好ましくは、例外選択部１１０は、例外ハンドラ５１０−Ｎから例外ハンドラ５１０−１に移行する間に処理が経由する他の例外ハンドラの数が、予め定められた数より大きいことと、例外ハンドラ５１０−１から例外ハンドラ５１０−Ｎに至る関数呼び出しの入れ子の深さが予め定められた数より大きいことを更に条件として、例外の組を選択する。
即ち、例外選択部１１０は、例外ハンドラ５１０−Ｎが捕捉する複数の例外のうち、例外ハンドラ５１０−Ｎが再び例外を発生させることにより例外ハンドラ５１０−１に移行し、例外ハンドラ５１０−Ｎから例外ハンドラ５１０−１に移行する間に処理が経由する他の例外ハンドラの数が、予め定められた数より大きく、かつ例外ハンドラ５１０−１から例外ハンドラ５１０−Ｎに至る関数呼び出しの入れ子の深さが予め定められた数より大きい、例外の組合せを選択する。
なお、複数捕捉例外ハンドラが３つ以上検出された場合も同様であり、例えば、例外選択部１１０は、第１の複数捕捉例外ハンドラから、第２の複数捕捉例外ハンドラを経由して、第３の複数捕捉例外ハンドラに移行する間に処理が経由する他の例外ハンドラの数が、予め定められた数より大きいことと、第１の複数捕捉例外ハンドラから、第２の複数捕捉例外ハンドラを経由して、第３の複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さが予め定められた数より大きいことを更に条件として、例外の組を選択する。
【００３０】
図６は、コンパイラ装置１０のハードウェア構成の一例を示す。実施形態に係るコンパイラ装置１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、グラフィックコントローラ１０７５、及び表示装置１０８０を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００３１】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたコンパイラプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００３２】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ１０４０は、コンパイラ装置１０が使用するコンパイラプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。
【００３３】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンパイラ装置１０の起動時にＣＰＵ１０００が実行するブートプログラムや、コンパイラ装置１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からコンパイラプログラム又はデータを読み取り、ＲＡＭ１０２０を介して入出力チップ１０７０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００３４】
コンパイラ装置１０に提供されるコンパイラプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。コンパイラプログラムは、記録媒体から読み出され、入出力チップ１０７０を介してコンパイラ装置１０にインストールされ、コンパイラ装置１０において実行される。
【００３５】
コンパイラ装置１０にインストールされて実行されるコンパイラプログラムは、例外ハンドラ検出モジュールと、例外選択モジュールと、例外ハンドラ生成モジュールとを含む。各モジュールがコンパイラ装置１０に働きかけて行わせる動作は、図１から図５において説明したコンパイラ装置１０における、対応する部材の動作と同一であるから、説明を省略する。
【００３６】
以上に示したプログラム又はモジュールは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してコンパイラプログラムをコンパイラ装置１０に提供してもよい。
【００３７】
このように、コンパイラ装置１０は、複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択し、選択した例外の組を複数捕捉例外ハンドラに代わって捕捉し、共通の処理に移行させる代替例外ハンドラを生成する。更に、コンパイラ装置１０は、代替例外ハンドラにおいて、共通の処理に移行させる分岐命令を生成する。これにより、コンパイラ装置１０は、例外の発生により必要となる処理を省略し、単なる分岐命令により処理を移行させることができる。更に、コンパイラ装置１０は、部分冗長性除去等の他の最適化処理が最適化の対象とする対象プログラム中の領域であるコンパイルスコープを広げることができるので、最適化の効率を高めることができる。
【００３８】
以上、本発明を実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に、多様な変更または改良を加えることができる。そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【００３９】
以上に示した実施形態によると、以下の各項目に示すコンパイラ装置、コンパイラプログラム、記録媒体、及びコンパイル方法を実現できる。
【００４０】
（項目１）  コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置であって、前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ装置。
（項目２）  前記例外ハンドラ生成部は、前記代替例外ハンドラにおいて、前記共通の処理に移行させる分岐命令を生成し、生成した前記分岐命令によって前記共通の処理に移行させる項目１記載のコンパイラ装置。
【００４１】
（項目３）  前記例外選択部は、前記複数捕捉例外ハンドラにおいて発生する頻度が予め定められた基準頻度以上であり、かつ前記共通の処理に移行する例外の組を選択する項目１記載のコンパイラ装置。
（項目４）  前記例外選択部は、前記複数捕捉例外ハンドラにおいて例外が発生する頻度として、前記複数捕捉例外ハンドラが実行される回数当たりの、前記複数捕捉例外ハンドラにおいて前記例外の組の何れかが発生する回数を検出する項目３記載のコンパイラ装置。
（項目５）  前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さが、予め定められた数より大きいことを更に条件として、前記例外の組を選択する項目１記載のコンパイラ装置。
【００４２】
（項目６）  前記例外選択部は、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数が、予め定められた数より大きいことを更に条件として、前記例外の組を選択する項目１記載のコンパイラ装置。
（項目７）  前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さと、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数とに更に基づき、前記例外の組を選択する項目１記載のコンパイラ装置。
（項目８）  前記例外ハンドラ検出部は、一の前記複数捕捉例外ハンドラと、前記一の複数捕捉例外ハンドラにおいて発生した少なくとも一の例外を捕捉する他の前記複数捕捉例外ハンドラとの２つの前記複数捕捉例外ハンドラを検出し、前記例外選択部は、前記一の複数捕捉例外ハンドラが捕捉する複数の例外のうち、前記他の複数捕捉例外ハンドラにおいて捕捉した例外を再び発生させることにより前記共通の処理に移行する例外の組を選択し、前記例外ハンドラ生成部は、前記２つの複数捕捉例外ハンドラのそれぞれに対応付けて、２つの前記代替例外ハンドラのそれぞれを生成し、前記２つの複数捕捉例外ハンドラのそれぞれに代えて、対応する前記２つの代替例外ハンドラのそれぞれにおいて、前記例外選択部により選択された例外の組を捕捉させる項目１記載のコンパイラ装置。
【００４３】
（項目９）  コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出部と、検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択部と、前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成部として機能させるコンパイラプログラム。
（項目１０）  前記共通の処理は、関数呼び出しにより呼び出された関数の処理中に発生した例外を前記関数呼び出しの外で捕捉する処理を含み、前記複数例外捕捉ハンドラは、前記関数呼び出しの内部で例外を捕捉し、前記例外選択部は、前記共通の処理から前記複数捕捉例外ハンドラに至る関数呼び出しの入れ子の深さと、前記複数捕捉例外ハンドラから前記共通の処理に移行する間に処理が経由する他の例外ハンドラの数とに更に基づき、前記例外の組を選択する項目９記載のコンパイラプログラム。
【００４４】
（項目１１）  前記例外ハンドラ検出部は、一の前記複数捕捉例外ハンドラと、前記一の複数捕捉例外ハンドラにおいて発生した少なくとも一の例外を捕捉する他の前記複数捕捉例外ハンドラとの２つの前記複数捕捉例外ハンドラを検出し、前記例外選択部は、前記一の複数捕捉例外ハンドラが捕捉する複数の例外のうち、前記他の複数捕捉例外ハンドラにおいて捕捉した例外を再び発生させることにより前記共通の処理に移行する例外の組を選択し、前記例外ハンドラ生成部は、前記２つの複数捕捉例外ハンドラのそれぞれに対応付けて、２つの前記代替例外ハンドラのそれぞれを生成し、前記２つの複数捕捉例外ハンドラのそれぞれに代えて、対応する前記２つの代替例外ハンドラのそれぞれにおいて、前記例外選択部により選択された例外の組を捕捉させる項目９記載のコンパイラプログラム。（項目１２）  項目９から項目１１の何れかに記載のコンパイラプログラムを記録した記録媒体。
【００４５】
（項目１３）  コンパイル対象のプログラムである対象プログラムの例外処理を最適化するコンパイラ装置としてコンピュータを動作させるコンパイル方法であって、前記対象プログラムで発生した例外を捕捉する例外ハンドラのうち、互いに異なる複数の例外を捕捉し、かつ捕捉した例外を再び発生させる複数捕捉例外ハンドラを検出する例外ハンドラ検出段階と、検出された前記複数捕捉例外ハンドラが捕捉する前記複数の例外のうち、前記複数捕捉例外ハンドラが再び例外を発生させることにより共通の処理に移行する例外の組を選択する例外選択段階と、前記例外選択部により選択された例外の組を前記複数捕捉例外ハンドラに代わって捕捉し、前記共通の処理に移行させる代替例外ハンドラを生成する例外ハンドラ生成段階とを備えるコンパイル方法。
【００４６】
【発明の効果】
上記説明から明らかなように、本発明によれば例外処理を最適化することができる。
【図面の簡単な説明】
【図１】図１は、コンパイラ装置１０の機能ブロック図を示す。
【図２】図２は、コンパイラ装置１０のフローチャートを示す。
【図３】図３は、コンパイル対象の対象プログラムの一例を示す。
【図４】図４は、コンパイラ装置１０による最適化後の対象プログラムの一例を示す。
【図５】図５（ａ）は、コンパイル対象の対象プログラムの他の例である。
図５（ｂ）は、コンパイル対象の対象プログラムにおける各命令が、発生又は捕捉する例外の種類を、関数呼び出しおよび例外捕捉範囲の入れ子の深さに対応付けて示す。
【図６】図６は、コンパイラ装置１０のハードウェア構成の一例を示す。
【符号の説明】
１０  コンパイラ装置
１００  例外ハンドラ検出部
１１０  例外選択部
１２０  例外ハンドラ生成部
５００  関数
５１０  例外ハンドラ
５２０  例外発生命令
【図１】
2004287844.tif 000003
【図２】
2004287844.tif 000004
【図３】
2004287844.tif 000005
【図４】
2004287844.tif 000006
【図５】
2004287844.tif 000007
【図６】
2004287844.tif 000008