(57)【特許請求の範囲】
【請求項１】
記憶装置に格納されたソースプログラムからコンピュータが解釈実行できるコードの列であるオブジェクトプログラムを生成するコンパイラ最適化処理装置に於いて、
前記オブジェクトプログラムの実行時に使用する変数に予め特定の値を設定するために前記オブジェクトプログラムの実行時に呼び出される特定値設定ライブラリと、
前記オブジェクトプログラムの実行時点までに値が設定されていない変数である未定義変数を検出するために前記オブジェクトプログラムの実行時に呼び出される未定義変数検査ライブラリと、
前記特定値設定ライブラリを呼び出すＣＡＬＬ命令から成るコードを生成して前記オブジェクトプログラムに挿入する特定値設定手段と、
前記ソースプログラムからＤＯループを検出して、前記ＤＯループ内で定義される定義変数の配列と前記定義変数を引用する引用変数の添字検査を行い、前記定義変数の配列の全ての添字についての要素が定義された後に前記定義変数の配列が前記引用変数により引用されている場合、または、前記定義変数の配列の一部の添字についての要素が定義された後に前記定義された要素と同じ添字の前記定義変数の配列要素が前記引用変数により引用されている場合には、前記引用変数に対して未定義変数の検査不要を指示する処理形態情報を生成し、それ以外の場合は前記引用変数に対して未定義変数の検査要を指示する処理形態情報を生成して、前記定義変数の識別情報、前記引用変数の識別情報、および、前記生成された処理形態情報を変数管理テーブルに格納する変数解析手段と、
前記変数管理テーブルにおいて前記処理形態情報が未定義変数の検査要を指示している場合は前記引用変数を含む式の直前に前記未定義変数検査ライブラリを呼び出すＣＡＬＬ命令から成る未定義変数検出コードを挿入する最適化手段と、
前記特定値設定手段により挿入された特定値を設定するためのＣＡＬＬ命令から成るコードと、前記最適化手段により挿入された前記未定義変数検出コードとを含む前記オブジェクトプログラムを記憶装置へ出力するコード生成手段とを備える
ことを特徴とする最適化コンパイラ処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ＦＯＲＴＲＡＮプログラムなどのデバッグ時に於いて、未定義変数の引用を高速に検出するオブジェクトプログラムを作り出すコンパイラ処理装置に関する。
【０００２】
【従来の技術】
プログラムのデバッグ時に於いて、各種のプログラムミスを早期に発見出来るよう、指定によりデバッグ時のみ有効となるデバッグ・オプション機能を備えたコンパイラが既に各種存在する。このデバッグ・オプションを指定されたコンパイラは、プログラムの正当性を検査（チェック）する各種サブルーチン・ライブラリを呼び出す命令（ＣＡＬＬ命令）を、オブジェクトプログラムの必要な箇所に挿入するが、このオブジェクトプログラムの実行時には、前記検査ライブラリを呼び出したり、検査ライブラリ自体の走行時間が余分にかかるため、これを極力少なくすることが要請される。
【０００３】
検査する内容に応じて各種の検査ライブラリがあるが、本発明は、そのうちプログラムの実行時に未定義変数の引用を検出するものであり、例えばＦＯＲＴＲＡＮなどのプログラミング言語では、未定義な変数（実行時に値を設定されてない変数）を引用すると、アンディファイン（Undefine）エラーとなるよう設計されている。これは、未定義な変数を引用すると、システム又は動作環境により、得られる結果が変わってくるからである。即ち変数を引用（実行）する前に、その変数に所定の値を与えた後に変数を引用するのが原則であるが、未定義のまま変数を引用すると、その時点では、その変数の値が、どの様な値になっているか不明（動作環境などにより、一般的に不定）であるからである。
【０００４】
そこで、前述のデバッグ・オプションを指定してソースプログラムをコンパイルした場合に、未定義変数の引用を検出する検査ライブラリを呼び出す命令を、オブジェクトプログラムの必要な箇所に組み込んだオブジェクトプログラムを作り出すコンパイラが必要となる。
【０００５】
その検出の方法として、先ずコンパイラ側に於けるオブジェクトプログラムの生成・出力に当たり、当該プログラムの実行アドレスの先頭に、変数に特定の値（マジックナンバとも呼ぶ）を設定するライブラリを呼び出す命令を挿入し、更に各変数の引用の直前に、前述の検査ライブラリを呼び出す命令を挿入する。
【０００６】
そしてプログラムの実行時に、呼び出された検査ライブラリでは、指定された変数が未定義な値（前記特定の値）を持った変数であるか（未定義変数の引用であるか）を検査し、未定義変数であれば、診断メッセージを出力するように構成される。
【０００７】
これ等従来技術について説明したものが図９である。例えば同図（１）で示すＦＯＲＴＲＡＮのソースプログラム（例１）を、デバッグ・オプションを指定してコンパイルした場合、同図（２）に示すようなオブジェクトプログラムを生成する。尚、同図（２）は、本来オブジェクトプログラムとして、コンピュータで即、動作する機械語（厳密には違う）で出力されるが、ここでは説明の都合上、分かり易くするため、ソースイメージで表現しており、以降についても同様な表現を採ることとする。
【０００８】
この生成されたオブジェクトプログラムの内容は次の通りである。即ち、先ず最初にブロック＃００に示すような、未定義状態を検出するための特定の値を変数に設定するためのライブラリを呼び出すためのＣＡＬＬ命令が生成される。
【０００９】
次にブロック＃１０に示すように、ソースプログラム中の各関係式、即ち『ｃ＝ａ＋ｂ』、『ｘ（ｉ）＝ｓ＋ｙ（ｉ）』、『ｓ＝ｙ（ｉ）＋ｚ（ｉ）』の右辺の各変数に対して、各式の直前に未定義変数の検査ライブラリを呼び出すＣＡＬＬ命令が生成される。
【００１０】
このオブジェクトプログラムが実行されると、各関係式の実行前に、引用される各変数の定義状況が検査ライブラリによりチェックされるが、チェックの方法は、先に設定された特定の値と各変数の内容を比較することにより行われ、一致した場合には、これを未定義変数と判断するという仕組みである。
【００１１】
【発明が解決しようとする課題】
前述のように従来は、変数の引用の都度、検査ライブラリを呼び出し未定義変数チェックを行っており、ライブラリの呼び出し回数が多くライブラリの総実行時間が長いという問題がある。特に前述の例１に於ける『DO』処理( 配列変数を基にした繰返し処理を指し、DOループとも言う) の場合には、繰返し回数だけ検査事象が発生することになり、その処理時間の占める割合は極めて大きく課題となっていた。
【００１２】
本発明はこのような点にかんがみて、ＦＯＲＴＲＡＮプログラムなどの、特に『DO』処理のような繰返し処理に於ける未定義変数検査のライブラリの呼び出し回数を少なくし、ライブラリの総実行時間を短縮するコンパイラ手段を提供することを目的とする。
【００１３】
【課題を解決するための手段】
上記の課題は下記の如くに構成された未定義変数検出の最適化コンパイラ装置によって解決される。
【００１４】
図１は、本発明のシステム構成図である。即ち、
デバッグオプション機能を備えた未定義変数検出の最適化コンパイラ装置に於いて、
プログラム中の変数に特定の値を設定する特定値設定手段と、該プログラム中のDOループを検出し、該ループ処理で使用されている変数の内容を解析する変数解析手段と、前記変数解析手段の解析結果により、未定義変数の検出を最適化する最適化手段と、前記特定値設定手段と最適化手段の結果をもとに、未定義変数検出用のコードをプログラム中の所定の位置に生成し、出力するコード生成手段とを備えることにより、デバッグオプション指定時に於けるプログラム中の、特に『DO』処理のような繰返し処理に於ける未定義変数検査のライブラリの呼び出し回数を軽減することが可能となる。
【００１５】
【発明の実施の形態】
先ず、前述の図１により、関連する周辺要素を含め、本発明の位置づけを説明する。
【００１６】
図１に於いて、１０はＦＯＲＴＲＡＮなどのコンパイラを示し、１１は各種デバッグツールの中、前記コンパイラ機能の一つで本発明の対象となるデバッグオプションを示し、又１９は、プログラムの実行時にオブジェクトプログラムから呼び出され、プログラム中の変数に特定の値を設定したり、未定義変数を検査・検出する各種ライブラリを格納した記憶装置を示している。
【００１７】
更に、１２はＦＯＲＴＲＡＮなどのコンパイラの入力となるソースプログラムを格納した記憶装置を、１８は本発明の出力を含むコンパイラ全体の出力となるオブジェクトプログラムを格納した記憶装置を、又１３はコンパイラの本体とも言うべき、ソースプログラムを読込みプログラムの構造を解析した上、各ステートメントの意味合いを解析した結果を、コンピュータが実行出来るオブジェクトプログラム（厳密には中間コードであって、まだ直接コンピュータでは実行出来ない）に翻訳する構造／意味解析手段を、それぞれ示している。
【００１８】
次に、本発明の対象となるデバッグオプション１１の内容について、処理の流れに沿って説明する。
先ず、前述の構造／意味解析手段による解析結果として出力された中間コードをもとに、特定値設定手段１４により、メモリ上に記憶された変数に特定の値を設定するライブラリを呼び出すＣＡＬＬ命令が生成される。但し、特定値設定に際し、プログラム内で初期値が設定される変数、又はＲＥＡＤ命令などで外部から値が与えられる変数を除く。
【００１９】
続いて、変数解析手段１５により、プログラム中のDOループを検出し、当該ループ中のメモリ上に記憶され定義されている変数と、引用（参照）されている変数及び関係が解析され、その解析結果から最適化手段１６により、未定義変数の検出が最適化される。ここで最適化とは、未定義変数の検出に当たって検査ライブラリの呼び出し回数を最小限にする操作を言い、具体的には未定義変数検出用のコード（検査ライブラリのＣＡＬＬ命令）をDOループ外に生成すること、及び前記変数解析手段の解析結果により、未定義変数検出用のコードを削除（出力しない）することを指している。
【００２０】
この様にして前記特定値設定手段と最適化手段の結果をもとに、コード生成手段１７により、特定値設定用のコード並びに未定義変数検出用のコードがプログラム中の所定の位置に生成、出力され、処理を終了する。
【００２１】
以降、これ等について、具体的なプログラム例を挙げて詳細を説明することとする。
図２、図３は、変数の解析結果から最適化手段により、未定義変数検出用のコードをDOループ外に移動・生成するソースプログラム例であり、図２は変数が単純変数の場合の例でソースプログラム（例２）とし、図３は変数が配列変数の場合の例でソースプログラム（例３）とする。
【００２２】
図２のソースプログラム（例２）に於ける単純変数ｓは、当ループに入った時点では未定義変数であるか否か判断出来ないが、２回目以降は必ず定義される。従って変数ｓに関する未定義変数検出用のコードはDOループ外に移動可能で、図２（２）に示すようにブロック＃２０の先頭に変数ｓに関する未定義変数検出用のコードの入ったオブジェクトプログラムが生成される。
【００２３】
図３のソースプログラム（例３）に於ける配列変数ｓ（ｒｃ）については、単純変数と違い、定義の有無だけでは、未定義変数検出用のコードを移動したり、削除（不要）したり出来ないが、当例のように、配列がループ内で単純変数と同義に扱われている（配列ｓの添字ｒｃは、ループ内で不変）場合には、単純変数と同様に扱って良い。従って変数ｓ（ｒｃ）に関する未定義変数検出用のコードはDOループ外に移動可能で、図３（２）に示すようにブロック＃３０の先頭に変数ｓ（ｒｃ）に関する未定義変数検出用のコードの入ったオブジェクトプログラムが生成される。
【００２４】
これ等、最適化処理により、未定義変数検出用のコードをDOループ外に移動・生成する場合の処理手順（その１）についてフローチャート化したものが図４である。
【００２５】
先ず、同図のステップ４０に於いて、ソースプログラムから検出・記憶されているDOループの中から、ひと固まりのDOループを取り出し、ステップ４１でループ終了か判別され、終了でなければステップ４２に於いて、ループ内で使用されている変数を解析し、図８に例示したような定義変数／引用変数別の変数管理テーブルを記憶装置上に作成する。次にステップ４３で一つの引用変数を取り出し、ステップ４４で引用変数の有無が判別され、無しの場合には当ループ内の変数処理が全て終了したことになり、次のループ処理のためステップ４０へ戻る。有りの場合にはステップ４５で当変数が配列変数か判別され、配列の場合は更に当配列の添字が不変か判別され、不変の場合には単純変数と同一と見做され、ステップ４７に於いて、後続に当変数が定義されているか判別される。その結果、定義有りの場合にはステップ４８に於いて、当引用変数の検査処理形態はループ外で検査可能と判断し、図８変数管理テーブルに於ける当引用変数欄の処理形態にその旨（コード化されている）をセットした後、次の引用変数処理のためステップ４３へ戻る。尚、ステップ４６、ステップ４７で否の場合には、当引用変数が引用される式の直前で未定義検査する旨が変数管理テーブルの処理形態にセットされ、次の引用変数処理のためステップ４３へ戻る。
【００２６】
続いて図５、図６に、変数の解析結果から最適化手段により、未定義変数検出用のコードを削除（不要）する具体的ソースプログラム例を揚げて説明する。図５は配列変数が全要素に対して定義された後、引用される例でソースプログラム（例４）とし、図６は配列変数に於ける同一添字で定義後、引用される例でソースプログラム（例５）とする。
【００２７】
図５のソースプログラム（例４）に於ける配列変数ｘ（ｉ）は、配列の全要素が定義された後、引用されているため、以降の引用変数ｘ（ｉ）に対する未定義変数検査は削除（不要）とすることが出来る。従って引用変数ｘ（ｉ）に対する未定義変数検出用のコードは同図（２）に示すようにブロック＃５０から削除されたオブジェクトプログラムが生成される。
【００２８】
図６のソースプログラム（例５）に於ける配列変数ｘ（ｉ）は、同一添字ｉにより定義後、引用されており、引用変数ｘ（ｉ）に対する未定義変数検査は削除（不要）とすることが出来る。従って引用変数ｘ（ｉ）に対する未定義変数検出用のコードは同図（２）に示すようにブロック＃６０から削除されたオブジェクトプログラムが生成される。
【００２９】
これ等、最適化処理により、未定義変数検出用のコードを削除する（不要とする）場合の処理手順（その２）についてフローチャート化したものが図７である。
【００３０】
先ず、同図のステップ７０に於いて、ソースプログラムから検出・記憶されているDOループの中から、ひと固まりのDOループを取り出し、ステップ７１でループ終了か判別され、終了でなければステップ７２に於いて、ループ内で使用されている配列変数を解析し、図８に例示したような定義変数／引用変数別の変数管理テーブルを記憶装置上に作成する。次にステップ７３で一つの定義変数を取り出し、ステップ７４で定義変数の有無が判別され、無しの場合には当ループ内の変数処理が全て終了したことになり、次のループ処理のためステップ７０へ戻る。有りの場合にはステップ７５で当定義変数と引用変数の添字検査がなされ、ステップ７６で、定義変数配列の全要素について定義されているか、或いは定義変数と引用変数の添字が同一か判別され、YES の場合にはステップ７７に於いて当引用変数の未定義検査は不要と判断され、図８変数管理テーブルに於ける当引用変数欄の処理形態にその旨（検査不要）がセットされ、次の定義変数処理のためステップ７３へ戻る。尚、ステップ７６で否の場合には、ステップ７８に於いて当引用変数が引用される式の直前で未定義検査する旨が変数管理テーブルの処理形態にセットされ、次の定義変数処理のためステップ７３へ戻る。
【００３１】
以上説明してきた様に、前述の変数解析手段及び最適化手段により処理された結果（変数管理テーブルの処理形態）から、コード生成手段により、所定の位置に未定義変数検査のためのコードが生成又は削除されたオブジェクトプログラムが出力される。
【００３２】
この様にして生成されたオブジェクトプログラムは、従来に比べ、実行時に於けるプログラムのダイナミックステップ数が著しく減少し、デバッグオプション指定に於ける未定義変数検査のための処理時間を大幅に圧縮できる。
【００３３】
尚、本説明に於いては、プログラム言語としてＦＯＲＴＲＡＮを中心に述べてきたが、その他の言語、例えばＢＡＳＩＣの『Ｆｏｒ〜Ｎｅｘｔ』構文に於ける繰返し処理などでも、同等の効果が得られる。
【００３４】
【発明の効果】
以上の説明から明らかなように本発明によれば、ＦＯＲＴＲＡＮプログラムなどの、特に『DO』処理のような繰返し処理に於ける未定義変数検査に於いて、従来、変数の引用の都度、検査ライブラリを呼び出し実行し、処理時間のかかっていたものが、ライブラリの呼び出し回数の減少により大幅に時間短縮され、プログラム開発に於けるデバッグ作業が容易となり、労力の節減に寄与するという著しい工業的効果がある。
【図面の簡単な説明】
【図１】  本発明のシステム構成図
【図２】  変数検査をループ外に移動するプログラム例( その１）
【図３】  変数検査をループ外に移動するプログラム例( その２）
【図４】  最適化の処理手順（その１）
【図５】  変数検査を不要とするプログラム例( その１）
【図６】  変数検査を不要とするプログラム例( その２）
【図７】  最適化の処理手順（その２）
【図８】  DOループ内の変数管理テーブル例
【図９】  従来技術によるオブジェクトプログラムの生成説明図
【符号の説明】
10  コンパイラ
11  デバッグオプション
12  ソースプログラム
13  構造／意味解析手段
14  特定値設定手段
15  変数解析手段
16  最適化手段
17  コード生成手段
18  オブジェクトプログラム
19  各種ライブラリ
【図１】
0003903514.tif 000002
【図２】
0003903514.tif 000003
【図３】
0003903514.tif 000004
【図４】
0003903514.tif 000005
【図５】
0003903514.tif 000006
【図６】
0003903514.tif 000007
【図７】
0003903514.tif 000008
【図８】
0003903514.tif 000009
【図９】
0003903514.tif 000010