(57)【特許請求の範囲】
【請求項１】
第１の計算機言語で記述されているソースコードを、第２の計算機言語で記述されたソースコードに変換する変換方法であって、
前記第１の計算機言語で記述されているソースコードにおいては、複数の処理文の記述から成る１つの第１のブロックに対応付けて例外処理部が記述されており、
前記第１のブロックに属する第１の処理文を実行した際に例外が発生すると、前記対応付けられている例外処理部が実行され、該例外処理部の実行が終了すると、明示的な指定が無い場合には前記第１のブロック内で前記第１の処理文の次に記述されている第２の処理文の実行から再開し、明示的な復帰先の指定が前記例外処理部の中で行われている場合には該指定された復帰先から実行を再開するように取り決められており、
前記第２の計算機言語で記述されたソースコードにおいては、複数の処理文の記述からなる通常処理ブロックと、該通常処理ブロックにおいて例外が発生した際に実行される例外処理が記述された例外処理ブロックが対応付けられて記述されており、
第１の通常処理ブロックを実行中に例外が発生すると、前記第１の通常処理ブロックに対応付けられた前記例外処理ブロックが実行され、該例外処理ブロックの実行が終了すると、前記第１の通常処理ブロックの次に記述されている第２の通常処理ブロックの実行から再開するように取り決められており、
記憶装置から前記第１の計算機言語で記述されているソースコードを読み出し手段が読み出し、
該読み出されたソースコードに含まれる個々の前記処理文の各々に対応して前記第２の計算機言語で記述されたソースコードにおける前記通常処理ブロックを生成手段が生成して記憶装置に書き込み、
前記処理文に対応する前記例外処理部において
前記明示的な指定が無い場合には前記処理文に対応して生成された通常処理ブロックに対応する例外処理ブロックを個別に生成手段が生成して記憶装置に書き込み、
前記明示的な指定が有る場合には前記処理文に対応して生成された通常処理ブロックに個別に対応する例外処理ブロックは生成せずに、前記処理文が属する前記第１のブロックに含まれるすべての処理文に共通する例外処理ブロックを生成手段が生成して記憶装置に書き込む
ことを特徴とする変換方法。
【請求項２】
請求項１に記載の変換方法において、
前記明示的な指示が無い場合であっても、前記例外処理部において処理するように記述されている例外の種類がすべて、通常処理の再開が不可能な致命的な例外である場合には、前記通常処理ブロックの各々に個別に対応する前記例外処理ブロックは作成せずに、前記例外処理部に対応する前記第１のブロックに属するすべての処理文の各々に対応して作成された通常処理ブロック群に共通の例外処理ブロックを生成手段が生成して記憶装置に書き込むことを特徴とする変換方法。
【請求項３】
請求項１または請求項２に記載の変換方法において、
前記処理文の各々に対応して作成された前記通常処理ブロックの各々に個別に対応する前記例外処理ブロックを作成する際に、前記処理文が例外を発生させる可能性を有する処理文であるか否かを判定手段が判定し、該判定の結果、該処理文が例外を発生させる可能性の無い処理文であることが判明すると、該処理文に対応して生成された通常処理ブロックに対しては、該通常処理ブロックに個別に対応する例外処理ブロックの前記生成手段による生成を抑止手段が抑止することを特徴とする変換方法。
【請求項４】
請求項１または請求項２または請求項３の変換方法を計算機に実行させる変換プログラム。
【請求項５】
請求項４の変換プログラムを格納した計算機読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラミング言語の処理系に関する。特に、例外からの復帰場所が次の文であるプログラム言語を、例外からの復帰場所が次の文ではないプログラム実行環境に翻訳する場合に関する。
【０００２】
【従来の技術】
あるプログラミング言語Aで記述されたプログラムを、多言語をサポートするプログラム実行環境Bで実行したい場合には、プログラミング言語Aのプログラムをプログラム実行環境Bの実行コードに変換する必要がある。このような変換を行う場合には、プログラム言語Aの例外処理をプログラム実行環境Bにおいて行える必要がある。この場合、従来は例外を自前の低レベル処理で実装していた。しかし、プログラム実行環境Bが備える例外処理機構を利用することによって、プログラム実行環境Bで利用できるプログラム言語間において、例外を言語によらず統一して扱えるという利点がある。したがって、プログラム言語Aの例外処理をプログラム実行環境Bの例外処理に翻訳する必要がある。
【０００３】
プログラム言語Aは、通常処理部とそれに対応する例外処理部を持ち、例外が発生した場合に、通常処理を中断し例外処理に移行し、例外処理の実行が完了したら、例外が発生した次の文から実行を再開する。このようなプログラム言語Aの例としてCOBOLなどがあげられる。例外処理を行うCOBOLプログラムを図５の５０１のプログラムに示す。プログラム５０１は例外処理部５０２と、通常処理部５０３をもつ。通常処理部５０３の処理中に例外が発生した場合には、例外処理部５０２を実行し、例外処理部５０２の実行が終了したら、通常処理部５０３の実行を例外が発生した次の文から再開する。
【０００４】
プログラム実行環境Bは、通常処理部と例外処理部を持ち、例外が発生した場合には通常処理を中断し例外処理に移行し、例外処理が終了したら次の通常処理部から実行を再開する。プログラム実行環境Bの例外処理の例を図６の実行コード６０１に示す。実行コード６０１は、tryによって始まる通常処理部６０２と、catchによってはじまる例外処理部６０３からなるブロック６０４が複数組み合わさったものからなる。ブロック６０４において例外処理を行わない場合は、通常処理部６０２だけを持つブロックとなる。通常処理部６０２において例外が発生すると、例外処理部６０３の実行に移行する。例外処理が終了すると次のブロックの通常処理部から実行を再開する。
【０００５】
プログラミング言語Aからプログラム実行環境Bに翻訳する場合に、例外からの復帰場所が次の文になるようにするために、プログラム実行環境Bではプログラム言語Aの一文ごとに例外からの復帰場所を設ける。つまり、このような例外の翻訳を行う場合には、プログラム実行環境Bにおいては、例外からの復帰場所が次の文となるようにするために、一文ごとに例外処理部を設ける必要がある。
【０００６】
【発明が解決しようとする課題】
このような翻訳方法は、例外処理のコードが多くなるという欠点があり、また例外処理を行うための処理時間が大きくなりプログラムの実行速度に悪影響を及ぼしうる。
【０００７】
【課題を解決するための手段】
例外処理部を翻訳する際に、例外処理部が明示的な例外からの復帰場所を持つかを調べる。そして、復帰場所の指示がある場合には、例外処理部を生成せず、復帰場所の指示がない場合には、例外処理部を生成する。
【０００８】
さらに、例外処理部を翻訳する際に、処理しえる例外の種類を解析して調べる。処理しえる例外が、例外の発生後通常処理の再開が不可能である致命的な例外しかない場合には、例外処理部を生成せず、致命的でない例外も処理しえる場合には、例外処理部を生成する。さらに、通常処理部の各文を解析して調べ、その文が例外を発生し得るなら例外処理部を生成し、発生し得ないなら例外処理部を生成しない。
【０００９】
【発明の実施の形態】
以下、本発明の実施例を，図面を参照しつつ説明する。なお，これにより本発明が限定されるものではない。
【００１０】
本発明を利用する言語処理系のプログラムは図１に示すような計算機上で動作する。図１の計算機はプロセッサ１０１と主記憶１０２，バス１０３，ディスク装置１０４，ＣＤ−ＲＯＭドライブ１０５を有する。そして、請求項５の記録媒体に相当するＣＤ−ＲＯＭ１０６からＣＤ−ＲＯＭドライブ１０５を介して請求項４の言語処理系のプログラムをディスク装置１０４にとりこむ。そして、ディスク装置１０４から言語処理系のプログラムなどを、バス１０３を介して主記憶１０２にとりこみ，プロセッサ１０１で実行する。
【００１１】
本発明を利用する言語処理系の構成を図２に示す。言語処理系は本発明のプログラミング言語Ａのコンパイラ２０１とプログラム実行環境Ｂの仮想機械２０５から構成されている。本発明の例外処理翻訳部２０２は本発明のプログラミング言語Ａのコンパイラ２０１がソースプログラム２０４をプログラム実行環境Ｂの実行コード２０３に変換する過程において例外の情報を検出し、その情報に従って例外処理の方法を決定する。
【００１２】
本発明のプログラミング言語Ａのコンパイラ２０１が例外処理の方法を決定する過程について，図３を用いて説明する。コンパイラ２０１は処理３０１でソースプログラム２０４を入力として受け取り，中間表現に変換する。続く処理２０２で中間表現を解析して例外処理の方法を決定する。処理２０２は具体的にはコンパイル対象の例外処理部に図４に示す処理を適用することで例外の処理方法を決定する。
【００１３】
図４の処理は、例外処理の翻訳法を決定する過程について説明した図である。図４の処理において、図５の５０１のような例外処理法を行うプログラムを図６の６０１のような例外処理法を行う実行コードに翻訳する。
【００１４】
図４の処理ではまず、処理４０１で処理対象プログラム５０１の例外処理部５０２を検査し、例えばCOBOLのRESUME文などのような例外処理からの復帰文が存在するかを求める。判断４０２で例外処理からの復帰文が存在するかを確認する。例外からの復帰文が存在しない場合には処理４０６に進み、例外からの復帰文が存在する場合には処理４０３に進む。処理４０３では例外処理部５０２内の例外からの復帰文の復帰先をすべて調べる。この処理は例えば、COBOLをコンパイル対象としている場合、RESUMU文の復帰先が次の文になっているか、プロシジャ名が指定されているかを確認することによって行う。判断４０４において例外からの復帰文の復帰先が次の文の場合があるならば処理４０５に進み，ないならば処理４０８に進む。処理４０５では、通常処理部503の各文に対して例外が発生するかを調べる。この処理は図９に示す処理をそれぞれの文に対して適用することによって行う。処理９０１において処理対象の文が関数の呼び出しを行うかどうかを求める。判断９０２において関数呼び出しを行う場合は処理９０３に進み、そうでない場合は処理９０４に進む。処理９０４では、表１００１を参照して文中に含まれる命令が例外を発生するかの論理和を求める。図１０の表１００１はプログラミング言語Aの定義から作成された表で命令が例外を発生するかを示す表である。フィールド１００２は各命令名を保持し、フィールド１００３は対応するフィールドの命令が例外を発生するかの真偽値を保持する。例外を発生する場合は真の値を保持し、例外を発生しない場合は偽の値を保持する。図９に戻って、判断９０５では、求めた論理和から例外が発生する場合は処理９０３に進み、そうでない場合は処理９０６に進む。処理９０３では、例外が発生すると決定する。処理９０６では例外が発生しないと決定する。
【００１５】
図４に戻って判断４０９は処理４０５で求めた各文が例外を発生するかの情報を用い、例外を発生する場合は処理４１０に進み、そうでない場合は処理４１１に進む。処理４１０では、図６の実行コードにあるように、通常処理部５０３の文それぞれに対してtry/catchからなる例外処理部を生成する。処理４１１では、例外処理を起こす文だけに対して例外処理部を生成し、例外処理を起こさない場合には例外処理部の生成を行わない。例えば、プログラム５０１の文１は例外発生を行わず、その他の文が例外発生を起こす場合には図８の実行コード８０１のように、文１に対しては例外処理部のないブロック８０２を生成し、その他の部分に対してはtry/catchからなる例外処理部の生成を行う。処理４０８では図７のプログラム７０１にあるように通常処理部５０３の文すべてに対して一つの例外処理部を生成する。処理４０６では、例外処理部５０２が処理可能な例外の種類の集合を作成する。集合の作成は、たとえばCOBOLでは例外処理部５０２のUSE文を調べ、USE文で処理すると宣言されている例外の集合を求める。判断４０７では、作成した集合がすべて致命的な例外かを調べる。致命的な例外だけの場合は、処理４０８に進み致命的な例外以外を含む場合は処理４０５に進む。
【００１６】
図３に戻り、処理２０２で例外処理の方法が決定したら処理３０２に進んで中間表現を実行コードに変換する。変換が終了したらコンパイル作業は終了である。
【００１７】
以上の処理により、例外からの復帰先が次の文でない例外処理部と、致命的な例外だけを処理する例外処理部を翻訳する場合、例外処理部の生成を抑制し、さらに、例外を発生しない文に対して例外処理部を生成しないようにする。このようにしてプログラムサイズを小さくし、プログラムの実行速度を改善する。
【００１８】
【発明の効果】
例外処理部の生成を減少し、プログラムサイズを小さくし、プログラムの実行速度を改善する。
【図面の簡単な説明】
【図１】実行機械の例。
【図２】言語処理系の構成例。
【図３】例外処理文の生成の例。
【図４】例外処理の翻訳方法の例。
【図５】プログラム言語Ａのソースコード例。
【図６】プログラム実行環境Ｂの実行コード例。
【図７】複数の文で一つの例外処理部が生成された実行コード例。
【図８】例外処理部の生成が行われなかった実行コード例。
【図９】ある文が例外を発生するかを求める処理の例。
【図１０】命令が例外を発生するかを保持する真偽値表の例。
【符号の説明】
401…例外処理部内に例外処理からの復帰文が存在するかを調べる処理、402…例外処理部内に復帰文が存在するかを判定する処理、403…例外処理部内の例外からの復帰文の復帰先を調べる処理、404…例外処理部内に次の文への復帰文があるかを判定する処理、405…各文に対して例外が発生するかを求める処理、406…例外処理部が処理しえる例外をすべて探す処理、407…例外処理部が処理しえる例外が致命的なものだけであるかを判定する処理、408…複数の文で一つのtry/catch文を生成する処理、409…その文が例外を発生するかを判定する処理、410…一文ごとにtry/catchを生成する処理、411…その文に対しtry/catchを生成しない処理。
【図１】
0003906669.tif 000002
【図２】
0003906669.tif 000003
【図３】
0003906669.tif 000004
【図４】
0003906669.tif 000005
【図５】
0003906669.tif 000006
【図６】
0003906669.tif 000007
【図７】
0003906669.tif 000008
【図８】
0003906669.tif 000009
【図９】
0003906669.tif 000010
【図１０】
0003906669.tif 000011