JP3903514B2 - 未定義変数検出の最適化コンパイラ装置 - Google Patents
未定義変数検出の最適化コンパイラ装置 Download PDFInfo
- Publication number
- JP3903514B2 JP3903514B2 JP04371297A JP4371297A JP3903514B2 JP 3903514 B2 JP3903514 B2 JP 3903514B2 JP 04371297 A JP04371297 A JP 04371297A JP 4371297 A JP4371297 A JP 4371297A JP 3903514 B2 JP3903514 B2 JP 3903514B2
- Authority
- JP
- Japan
- Prior art keywords
- variable
- undefined
- quoted
- definition
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Description
【発明の属する技術分野】
本発明は、FORTRANプログラムなどのデバッグ時に於いて、未定義変数の引用を高速に検出するオブジェクトプログラムを作り出すコンパイラ処理装置に関する。
【0002】
【従来の技術】
プログラムのデバッグ時に於いて、各種のプログラムミスを早期に発見出来るよう、指定によりデバッグ時のみ有効となるデバッグ・オプション機能を備えたコンパイラが既に各種存在する。このデバッグ・オプションを指定されたコンパイラは、プログラムの正当性を検査(チェック)する各種サブルーチン・ライブラリを呼び出す命令(CALL命令)を、オブジェクトプログラムの必要な箇所に挿入するが、このオブジェクトプログラムの実行時には、前記検査ライブラリを呼び出したり、検査ライブラリ自体の走行時間が余分にかかるため、これを極力少なくすることが要請される。
【0003】
検査する内容に応じて各種の検査ライブラリがあるが、本発明は、そのうちプログラムの実行時に未定義変数の引用を検出するものであり、例えばFORTRANなどのプログラミング言語では、未定義な変数(実行時に値を設定されてない変数)を引用すると、アンディファイン(Undefine)エラーとなるよう設計されている。これは、未定義な変数を引用すると、システム又は動作環境により、得られる結果が変わってくるからである。即ち変数を引用(実行)する前に、その変数に所定の値を与えた後に変数を引用するのが原則であるが、未定義のまま変数を引用すると、その時点では、その変数の値が、どの様な値になっているか不明(動作環境などにより、一般的に不定)であるからである。
【0004】
そこで、前述のデバッグ・オプションを指定してソースプログラムをコンパイルした場合に、未定義変数の引用を検出する検査ライブラリを呼び出す命令を、オブジェクトプログラムの必要な箇所に組み込んだオブジェクトプログラムを作り出すコンパイラが必要となる。
【0005】
その検出の方法として、先ずコンパイラ側に於けるオブジェクトプログラムの生成・出力に当たり、当該プログラムの実行アドレスの先頭に、変数に特定の値(マジックナンバとも呼ぶ)を設定するライブラリを呼び出す命令を挿入し、更に各変数の引用の直前に、前述の検査ライブラリを呼び出す命令を挿入する。
【0006】
そしてプログラムの実行時に、呼び出された検査ライブラリでは、指定された変数が未定義な値(前記特定の値)を持った変数であるか(未定義変数の引用であるか)を検査し、未定義変数であれば、診断メッセージを出力するように構成される。
【0007】
これ等従来技術について説明したものが図9である。例えば同図(1)で示すFORTRANのソースプログラム(例1)を、デバッグ・オプションを指定してコンパイルした場合、同図(2)に示すようなオブジェクトプログラムを生成する。尚、同図(2)は、本来オブジェクトプログラムとして、コンピュータで即、動作する機械語(厳密には違う)で出力されるが、ここでは説明の都合上、分かり易くするため、ソースイメージで表現しており、以降についても同様な表現を採ることとする。
【0008】
この生成されたオブジェクトプログラムの内容は次の通りである。即ち、先ず最初にブロック#00に示すような、未定義状態を検出するための特定の値を変数に設定するためのライブラリを呼び出すためのCALL命令が生成される。
【0009】
次にブロック#10に示すように、ソースプログラム中の各関係式、即ち『c=a+b』、『x(i)=s+y(i)』、『s=y(i)+z(i)』の右辺の各変数に対して、各式の直前に未定義変数の検査ライブラリを呼び出すCALL命令が生成される。
【0010】
このオブジェクトプログラムが実行されると、各関係式の実行前に、引用される各変数の定義状況が検査ライブラリによりチェックされるが、チェックの方法は、先に設定された特定の値と各変数の内容を比較することにより行われ、一致した場合には、これを未定義変数と判断するという仕組みである。
【0011】
【発明が解決しようとする課題】
前述のように従来は、変数の引用の都度、検査ライブラリを呼び出し未定義変数チェックを行っており、ライブラリの呼び出し回数が多くライブラリの総実行時間が長いという問題がある。特に前述の例1に於ける『DO』処理( 配列変数を基にした繰返し処理を指し、DOループとも言う) の場合には、繰返し回数だけ検査事象が発生することになり、その処理時間の占める割合は極めて大きく課題となっていた。
【0012】
本発明はこのような点にかんがみて、FORTRANプログラムなどの、特に『DO』処理のような繰返し処理に於ける未定義変数検査のライブラリの呼び出し回数を少なくし、ライブラリの総実行時間を短縮するコンパイラ手段を提供することを目的とする。
【0013】
【課題を解決するための手段】
上記の課題は下記の如くに構成された未定義変数検出の最適化コンパイラ装置によって解決される。
【0014】
図1は、本発明のシステム構成図である。即ち、
デバッグオプション機能を備えた未定義変数検出の最適化コンパイラ装置に於いて、
プログラム中の変数に特定の値を設定する特定値設定手段と、該プログラム中のDOループを検出し、該ループ処理で使用されている変数の内容を解析する変数解析手段と、前記変数解析手段の解析結果により、未定義変数の検出を最適化する最適化手段と、前記特定値設定手段と最適化手段の結果をもとに、未定義変数検出用のコードをプログラム中の所定の位置に生成し、出力するコード生成手段とを備えることにより、デバッグオプション指定時に於けるプログラム中の、特に『DO』処理のような繰返し処理に於ける未定義変数検査のライブラリの呼び出し回数を軽減することが可能となる。
【0015】
【発明の実施の形態】
先ず、前述の図1により、関連する周辺要素を含め、本発明の位置づけを説明する。
【0016】
図1に於いて、10はFORTRANなどのコンパイラを示し、11は各種デバッグツールの中、前記コンパイラ機能の一つで本発明の対象となるデバッグオプションを示し、又19は、プログラムの実行時にオブジェクトプログラムから呼び出され、プログラム中の変数に特定の値を設定したり、未定義変数を検査・検出する各種ライブラリを格納した記憶装置を示している。
【0017】
更に、12はFORTRANなどのコンパイラの入力となるソースプログラムを格納した記憶装置を、18は本発明の出力を含むコンパイラ全体の出力となるオブジェクトプログラムを格納した記憶装置を、又13はコンパイラの本体とも言うべき、ソースプログラムを読込みプログラムの構造を解析した上、各ステートメントの意味合いを解析した結果を、コンピュータが実行出来るオブジェクトプログラム(厳密には中間コードであって、まだ直接コンピュータでは実行出来ない)に翻訳する構造/意味解析手段を、それぞれ示している。
【0018】
次に、本発明の対象となるデバッグオプション11の内容について、処理の流れに沿って説明する。
先ず、前述の構造/意味解析手段による解析結果として出力された中間コードをもとに、特定値設定手段14により、メモリ上に記憶された変数に特定の値を設定するライブラリを呼び出すCALL命令が生成される。但し、特定値設定に際し、プログラム内で初期値が設定される変数、又はREAD命令などで外部から値が与えられる変数を除く。
【0019】
続いて、変数解析手段15により、プログラム中のDOループを検出し、当該ループ中のメモリ上に記憶され定義されている変数と、引用(参照)されている変数及び関係が解析され、その解析結果から最適化手段16により、未定義変数の検出が最適化される。ここで最適化とは、未定義変数の検出に当たって検査ライブラリの呼び出し回数を最小限にする操作を言い、具体的には未定義変数検出用のコード(検査ライブラリのCALL命令)をDOループ外に生成すること、及び前記変数解析手段の解析結果により、未定義変数検出用のコードを削除(出力しない)することを指している。
【0020】
この様にして前記特定値設定手段と最適化手段の結果をもとに、コード生成手段17により、特定値設定用のコード並びに未定義変数検出用のコードがプログラム中の所定の位置に生成、出力され、処理を終了する。
【0021】
以降、これ等について、具体的なプログラム例を挙げて詳細を説明することとする。
図2、図3は、変数の解析結果から最適化手段により、未定義変数検出用のコードをDOループ外に移動・生成するソースプログラム例であり、図2は変数が単純変数の場合の例でソースプログラム(例2)とし、図3は変数が配列変数の場合の例でソースプログラム(例3)とする。
【0022】
図2のソースプログラム(例2)に於ける単純変数sは、当ループに入った時点では未定義変数であるか否か判断出来ないが、2回目以降は必ず定義される。従って変数sに関する未定義変数検出用のコードはDOループ外に移動可能で、図2(2)に示すようにブロック#20の先頭に変数sに関する未定義変数検出用のコードの入ったオブジェクトプログラムが生成される。
【0023】
図3のソースプログラム(例3)に於ける配列変数s(rc)については、単純変数と違い、定義の有無だけでは、未定義変数検出用のコードを移動したり、削除(不要)したり出来ないが、当例のように、配列がループ内で単純変数と同義に扱われている(配列sの添字rcは、ループ内で不変)場合には、単純変数と同様に扱って良い。従って変数s(rc)に関する未定義変数検出用のコードはDOループ外に移動可能で、図3(2)に示すようにブロック#30の先頭に変数s(rc)に関する未定義変数検出用のコードの入ったオブジェクトプログラムが生成される。
【0024】
これ等、最適化処理により、未定義変数検出用のコードをDOループ外に移動・生成する場合の処理手順(その1)についてフローチャート化したものが図4である。
【0025】
先ず、同図のステップ40に於いて、ソースプログラムから検出・記憶されているDOループの中から、ひと固まりのDOループを取り出し、ステップ41でループ終了か判別され、終了でなければステップ42に於いて、ループ内で使用されている変数を解析し、図8に例示したような定義変数/引用変数別の変数管理テーブルを記憶装置上に作成する。次にステップ43で一つの引用変数を取り出し、ステップ44で引用変数の有無が判別され、無しの場合には当ループ内の変数処理が全て終了したことになり、次のループ処理のためステップ40へ戻る。有りの場合にはステップ45で当変数が配列変数か判別され、配列の場合は更に当配列の添字が不変か判別され、不変の場合には単純変数と同一と見做され、ステップ47に於いて、後続に当変数が定義されているか判別される。その結果、定義有りの場合にはステップ48に於いて、当引用変数の検査処理形態はループ外で検査可能と判断し、図8変数管理テーブルに於ける当引用変数欄の処理形態にその旨(コード化されている)をセットした後、次の引用変数処理のためステップ43へ戻る。尚、ステップ46、ステップ47で否の場合には、当引用変数が引用される式の直前で未定義検査する旨が変数管理テーブルの処理形態にセットされ、次の引用変数処理のためステップ43へ戻る。
【0026】
続いて図5、図6に、変数の解析結果から最適化手段により、未定義変数検出用のコードを削除(不要)する具体的ソースプログラム例を揚げて説明する。図5は配列変数が全要素に対して定義された後、引用される例でソースプログラム(例4)とし、図6は配列変数に於ける同一添字で定義後、引用される例でソースプログラム(例5)とする。
【0027】
図5のソースプログラム(例4)に於ける配列変数x(i)は、配列の全要素が定義された後、引用されているため、以降の引用変数x(i)に対する未定義変数検査は削除(不要)とすることが出来る。従って引用変数x(i)に対する未定義変数検出用のコードは同図(2)に示すようにブロック#50から削除されたオブジェクトプログラムが生成される。
【0028】
図6のソースプログラム(例5)に於ける配列変数x(i)は、同一添字iにより定義後、引用されており、引用変数x(i)に対する未定義変数検査は削除(不要)とすることが出来る。従って引用変数x(i)に対する未定義変数検出用のコードは同図(2)に示すようにブロック#60から削除されたオブジェクトプログラムが生成される。
【0029】
これ等、最適化処理により、未定義変数検出用のコードを削除する(不要とする)場合の処理手順(その2)についてフローチャート化したものが図7である。
【0030】
先ず、同図のステップ70に於いて、ソースプログラムから検出・記憶されているDOループの中から、ひと固まりのDOループを取り出し、ステップ71でループ終了か判別され、終了でなければステップ72に於いて、ループ内で使用されている配列変数を解析し、図8に例示したような定義変数/引用変数別の変数管理テーブルを記憶装置上に作成する。次にステップ73で一つの定義変数を取り出し、ステップ74で定義変数の有無が判別され、無しの場合には当ループ内の変数処理が全て終了したことになり、次のループ処理のためステップ70へ戻る。有りの場合にはステップ75で当定義変数と引用変数の添字検査がなされ、ステップ76で、定義変数配列の全要素について定義されているか、或いは定義変数と引用変数の添字が同一か判別され、YES の場合にはステップ77に於いて当引用変数の未定義検査は不要と判断され、図8変数管理テーブルに於ける当引用変数欄の処理形態にその旨(検査不要)がセットされ、次の定義変数処理のためステップ73へ戻る。尚、ステップ76で否の場合には、ステップ78に於いて当引用変数が引用される式の直前で未定義検査する旨が変数管理テーブルの処理形態にセットされ、次の定義変数処理のためステップ73へ戻る。
【0031】
以上説明してきた様に、前述の変数解析手段及び最適化手段により処理された結果(変数管理テーブルの処理形態)から、コード生成手段により、所定の位置に未定義変数検査のためのコードが生成又は削除されたオブジェクトプログラムが出力される。
【0032】
この様にして生成されたオブジェクトプログラムは、従来に比べ、実行時に於けるプログラムのダイナミックステップ数が著しく減少し、デバッグオプション指定に於ける未定義変数検査のための処理時間を大幅に圧縮できる。
【0033】
尚、本説明に於いては、プログラム言語としてFORTRANを中心に述べてきたが、その他の言語、例えばBASICの『For〜Next』構文に於ける繰返し処理などでも、同等の効果が得られる。
【0034】
【発明の効果】
以上の説明から明らかなように本発明によれば、FORTRANプログラムなどの、特に『DO』処理のような繰返し処理に於ける未定義変数検査に於いて、従来、変数の引用の都度、検査ライブラリを呼び出し実行し、処理時間のかかっていたものが、ライブラリの呼び出し回数の減少により大幅に時間短縮され、プログラム開発に於けるデバッグ作業が容易となり、労力の節減に寄与するという著しい工業的効果がある。
【図面の簡単な説明】
【図1】 本発明のシステム構成図
【図2】 変数検査をループ外に移動するプログラム例( その1)
【図3】 変数検査をループ外に移動するプログラム例( その2)
【図4】 最適化の処理手順(その1)
【図5】 変数検査を不要とするプログラム例( その1)
【図6】 変数検査を不要とするプログラム例( その2)
【図7】 最適化の処理手順(その2)
【図8】 DOループ内の変数管理テーブル例
【図9】 従来技術によるオブジェクトプログラムの生成説明図
【符号の説明】
10 コンパイラ
11 デバッグオプション
12 ソースプログラム
13 構造/意味解析手段
14 特定値設定手段
15 変数解析手段
16 最適化手段
17 コード生成手段
18 オブジェクトプログラム
19 各種ライブラリ
Claims (1)
- 記憶装置に格納されたソースプログラムからコンピュータが解釈実行できるコードの列であるオブジェクトプログラムを生成するコンパイラ最適化処理装置に於いて、
前記オブジェクトプログラムの実行時に使用する変数に予め特定の値を設定するために前記オブジェクトプログラムの実行時に呼び出される特定値設定ライブラリと、
前記オブジェクトプログラムの実行時点までに値が設定されていない変数である未定義変数を検出するために前記オブジェクトプログラムの実行時に呼び出される未定義変数検査ライブラリと、
前記特定値設定ライブラリを呼び出すCALL命令から成るコードを生成して前記オブジェクトプログラムに挿入する特定値設定手段と、
前記ソースプログラムからDOループを検出して、前記DOループ内で定義される定義変数の配列と前記定義変数を引用する引用変数の添字検査を行い、前記定義変数の配列の全ての添字についての要素が定義された後に前記定義変数の配列が前記引用変数により引用されている場合、または、前記定義変数の配列の一部の添字についての要素が定義された後に前記定義された要素と同じ添字の前記定義変数の配列要素が前記引用変数により引用されている場合には、前記引用変数に対して未定義変数の検査不要を指示する処理形態情報を生成し、それ以外の場合は前記引用変数に対して未定義変数の検査要を指示する処理形態情報を生成して、前記定義変数の識別情報、前記引用変数の識別情報、および、前記生成された処理形態情報を変数管理テーブルに格納する変数解析手段と、
前記変数管理テーブルにおいて前記処理形態情報が未定義変数の検査要を指示している場合は前記引用変数を含む式の直前に前記未定義変数検査ライブラリを呼び出すCALL命令から成る未定義変数検出コードを挿入する最適化手段と、
前記特定値設定手段により挿入された特定値を設定するためのCALL命令から成るコードと、前記最適化手段により挿入された前記未定義変数検出コードとを含む前記オブジェクトプログラムを記憶装置へ出力するコード生成手段とを備える
ことを特徴とする最適化コンパイラ処理装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP04371297A JP3903514B2 (ja) | 1997-02-27 | 1997-02-27 | 未定義変数検出の最適化コンパイラ装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP04371297A JP3903514B2 (ja) | 1997-02-27 | 1997-02-27 | 未定義変数検出の最適化コンパイラ装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH10240545A JPH10240545A (ja) | 1998-09-11 |
JP3903514B2 true JP3903514B2 (ja) | 2007-04-11 |
Family
ID=12671424
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP04371297A Expired - Fee Related JP3903514B2 (ja) | 1997-02-27 | 1997-02-27 | 未定義変数検出の最適化コンパイラ装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3903514B2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101751321B (zh) * | 2008-12-18 | 2012-07-18 | 中兴通讯股份有限公司 | 一种动态可视化查看变量的实现方法及系统 |
-
1997
- 1997-02-27 JP JP04371297A patent/JP3903514B2/ja not_active Expired - Fee Related
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101751321B (zh) * | 2008-12-18 | 2012-07-18 | 中兴通讯股份有限公司 | 一种动态可视化查看变量的实现方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
JPH10240545A (ja) | 1998-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8091075B2 (en) | Method and apparatus for breakpoint analysis of computer programming code using unexpected code path conditions | |
US5606697A (en) | Compiler system for language processing program | |
US7673295B1 (en) | System and method for compile-time non-concurrency analysis | |
US7016807B2 (en) | Device and method for monitoring a program execution | |
JPH05257709A (ja) | 並列化判別方法およびそれを用いた並列化支援方法 | |
KR20020070809A (ko) | 포스트-링크 코드 최적화 | |
JPH0748182B2 (ja) | プログラム・エラー検出方法 | |
JP2002532804A (ja) | ハイブリッドコンピュータプログラミング環境 | |
CN110554861A (zh) | 具有编译和读取-评估-打印-循环操作的软件开发环境 | |
JP2009104252A (ja) | デバッグ支援装置およびデバッグ支援方法 | |
JP3903514B2 (ja) | 未定義変数検出の最適化コンパイラ装置 | |
EP1202171A2 (en) | Compile method and program recording medium | |
JP2005174045A (ja) | ソースプログラム変換装置、ソースプログラム変換方法、ソースプログラム変換プログラム、および、プログラム記録媒体 | |
CN117785160B (zh) | 一种低代码应用的行为逻辑开发调试方法、系统及装置 | |
CN113326048B (zh) | 浮点数计算精度处理方法、系统、介质及设备 | |
JP2820184B2 (ja) | ロードモジュール単体テスト支援装置 | |
KR100216533B1 (ko) | 병행 chill 프로그램의 결정적 재실행을 위한 사건 이력 기록 방법 | |
JPH01177165A (ja) | 配列の定義/引用関係検査方式 | |
JP2002073370A (ja) | デバッグ支援装置およびその装置によるデバッグ方法 | |
Savitskii et al. | Fast analysis of source code in C and C++ | |
JP2000242504A (ja) | コンパイラ装置 | |
JPH05204705A (ja) | 未定義変数検出処理方法 | |
JP4092750B2 (ja) | 冗長コード検査装置 | |
JPH05197561A (ja) | コンパイル方式 | |
JPH01205348A (ja) | プログラムデバッグ方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20060605 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060613 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060810 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060905 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20061102 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20061219 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20070101 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110119 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110119 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120119 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130119 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130119 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140119 Year of fee payment: 7 |
|
LAPS | Cancellation because of no payment of annual fees |