(57)【特許請求の範囲】
【請求項１】
コンピュータによりプログラムに含まれる手続きの解析を行う、プログラムに含まれる手続きの解析装置であって、
特定のプログラミング言語で記述された、関数を含む仕様が明らかな所定の手続きについて、前記所定の手続きと前記所定の手続きの中で変数が定義されているか、変数が参照されているかを予め結びつけたテーブルを格納した定義／参照情報格納手段と、
前記特定のプログラミング言語で記述されたソースプログラムを元に生成された構文解析木上から一文を読み込んで、この文に前記所定の手続きが含まれているかを判断する手続き判断手段と、
前記手続き判断手段の判断結果に基づいて、前記所定の手続きについては前記定義／参照情報格納手段に格納された前記テーブルから前記所定の手続きが変数の定義であるか、変数の参照であるかに関する情報を読み出し、前記所定の手続き以外の手続きについては前記ソースプログラムの内容から変数が定義されているか、変数が参照されているか、あるいはどちらでもないかに関する情報を抽出処理する定義／参照情報抽出手段と、
前記定義／参照情報格納手段から前記定義／参照情報抽出手段が読み出した情報、或いは前記定義／参照情報抽出手段が抽出した情報に基づいてどの定義がどこで参照されるかを解析する手続きの解析処理を行い、その結果を出力する解析手段と、
を有することを特徴とするプログラムに含まれる手続きの解析装置。
【請求項２】
前記所定の手続きは、ソースプログラムの内容が存在せず、コンパイルされたあとの実行可能なプログラムとして提供されている場合を含むものである請求項１記載のプログラムに含まれる手続きの解析装置。
【請求項３】
特定のプログラミング言語で記述された、関数を含む仕様が明らかな所定の手続きについて、前記所定の手続きと前記所定の手続きの中で変数が定義されているか、変数が参照されているかを予め結びつけたテーブルを格納した定義／参照情報格納手段を備えるコンピュータを、
前記特定のプログラミング言語で記述されたソースプログラムを元に生成された構文解析木上から一文を読み込んで、この文に前記所定の手続きが含まれているかを判断する手続き判断手段と、
前記手続き判断手段の判断結果に基づいて、前記所定の手続きについては前記定義／参照情報格納手段に格納された前記テーブルから前記所定の手続きが変数の定義であるか、変数の参照であるかに関する情報を読み出し、前記所定の手続き以外の手続きについては前記ソースプログラムの内容から変数が定義されているか、変数が参照されているか、あるいはどちらでもないかに関する情報を抽出処理する定義／参照情報抽出手段と、
前記定義／参照情報格納手段から前記定義／参照情報抽出手段が読み出した情報、或いは前記定義／参照情報抽出手段が抽出した情報に基づいてどの定義がどこで参照されるかを解析する、プログラムに含まれる手続きの解析処理を行い、その結果を出力する解析手段として、
機能させるためのプログラムを記録したコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、一般的なプログラム言語で記述されたソースプログラムについてデバッグ、テスト、保守などを行う際に利用されるプログラムに含まれる手続きの解析装置に関する。
【０００２】
【従来の技術】
プログラムのデータフロー解析は、ソースプログラムを作成した後のデバッグやテストにおいて行われるだけでなく、既に作成されているプログラムを必要に応じて修正し又は改造するといった保守作業を行う際にも行われる。保守作業を行う場合にデータフロー解析を行うことによって、特に大規模なプログラムの修正等を行う際に、必要な情報を効率よく抽出することができる。かかるデータフロー解析を行う場合に、そのソースプログラムに含まれる各変数の参照について、その値の定義箇所を求め、また、変数の代入についてその値の参照箇所を求める定義／参照解析を行うことが必要である。
【０００３】
【発明が解決しようとする課題】
ところで、例えばＣ言語を始めとする多くの高級言語では、種々の手続きが標準ライブラリ内に用意され、プログラムの中からこの手続きを指定することによって、その手続きを呼び出すことができる。また、ある手続きの中で、また別の手続きを呼び出すことも可能である。しかし、手続きの中でまた別の手続きを呼び出すと、そこでもデータの受渡しが行われるので、データ依存関係を正確に調べようとすると、手続きとして呼び出された手続きの内部についてもデータ依存関係をすべて調べなければならない。このような作業は、特に規模の大きいプログラムの場合においては、実行に長時間を要する。
【０００４】
また、標準ライブラリに含まれる手続きが、コンパイルされたあとの実行可能プログラムとして提供されている場合には、そのソースプログラムの内容が存在せず、このような手続きを利用して作成したプログラムについてはデータ依存関係を調べることができなかった。したがって、従来のデータフロー解析装置では、このようなプログラムについてはデータフロー解析を行うことができなかった。
【０００５】
本発明は上記事情に基づいてなされたものであり、ソースプログラムの内容を見ることができない手続きを含むプログラムについてもデータフロー解析を可能とし、また、ソースプログラムを見ることができる手続きを含むプログラムであってもそのデータフロー解析に要する時間を短縮することができるプログラムに含まれる手続きの解析装置を提供することを目的とする。
【０００６】
【課題を解決するための手段】
上記の課題を解決するために、本発明は、コンピュータによりプログラムに含まれる手続きの解析を行う、プログラムに含まれる手続きの解析装置であって、特定のプログラミング言語で記述された、関数を含む仕様が明らかな所定の手続きについて、前記所定の手続きと前記所定の手続きの中で変数が定義されているか、変数が参照されているかを予め結びつけたテーブルを格納した定義／参照情報格納手段と、前記特定のプログラミング言語で記述されたソースプログラムを元に生成された構文解析木上から一文を読み込んで、この文に前記所定の手続きが含まれているかを判断する手続き判断手段と、前記手続き判断手段の判断結果に基づいて、前記所定の手続きについては前記定義／参照情報格納手段に格納された前記テーブルから前記所定の手続きが変数の定義であるか、変数の参照であるかに関する情報を読み出し、前記所定の手続き以外の手続きについては前記ソースプログラムの内容から変数が定義されているか、変数が参照されているか、あるいはどちらでもないかに関する情報を抽出処理する定義／参照情報抽出手段と、前記定義／参照情報格納手段から前記定義／参照情報抽出手段が読み出した情報、或いは前記定義／参照情報抽出手段が抽出した情報に基づいてどの定義がどこで参照されるかを解析する手続きの解析処理を行い、その結果を出力する解析手段と、を有することを特徴とする。
【０００７】
本発明は、上記より、定義／参照情報格納手段に、予め所定の手続きについて変数の定義／参照に関する情報を格納する。この場合、所定の手続きには、例えばコンパイルされた後の実行可能なプログラムも含まれる。そして、読み込まれたソースプログラムについて一行ずつ変数の定義／参照に関する情報の抽出を行っている際に、この所定の手続きに至ったら、定義／参照情報格納手段を参照して変数の定義／参照に関する情報を抽出する。このような作業を読み込んだソースプログラム全体について行う。従来は、ソースプログラムがなくて変数の定義／参照に関する情報を抽出することができなかった手続きについても、かかる情報の抽出が可能となり、その後のデータフロー解析を行うことが可能となる。尚、本明細書では、「手続き」といった場合に、Ｃ言語における関数なども含むものとする。
【０００８】
【発明の実施の形態】
以下に図面を参照して、本発明の一実施形態について説明する。図１は、Ｃ言語で記述されたあるソースプログラムの一例を示している。同図において、４行目に「ｒｅａｄ」という手続きが記述されている。この手続きは、これとは別の手続きである「ｓｃａｎｆ」を７行目において呼び出している。ここで、「ｓｃａｎｆ」はＣ言語の標準ライブラリに含まれる手続きであり、”％ｄ”は、定義する変数ｉを１０進数の整数型とする旨の指定である。
【０００９】
従来のデータフロー解析装置は、単一手続き内のデータフロー解析を行っているので、図１のプログラムのように、一つの手続きの中に別の手続きを呼び出す呼び出し文が含まれているソースプログラムについて、従来の装置でデータフロー解析を行わせようとしても、できない場合があった。このように単一手続きの内部に手続きの呼び出しがある場合には、「手続き間解析」を行うことが一般的であり、これを行うと、単一手続き内の解析に比べて実行速度が大幅に遅くなる。ここで、データフロー解析とは、どの定義がどこで参照されるかを解析することをいう。
【００１０】
通常の単一手続き内のデータフロー解析では、４行目の手続き「ｒｅａｄ」にはデータ依存関係が存在しないことになるが、実際には８行目の「ｉ」が、７行目に記述された手続き「ｓｃａｎｆ」を介してｉにデータ依存している。これは、Ｃ言語の標準ライブラリに含まれる「ｓｃａｎｆ」の仕様によって、第２引数ｉが定義されるからである。尚、「データ依存」とは、次のことをいう。文Ｓ１、文Ｓ２、変数ｖがあった場合に、
▲１▼文Ｓ１において変数ｖが定義されること
▲２▼文Ｓ２において変数ｖが参照されること
▲３▼文Ｓ１から文Ｓ２への実行可能なパスであって、変数ｖを再定義しないパスが存在すること
という３つの条件を満足している場合に、文Ｓ２は、変数ｖに関して文Ｓ１にデータ依存するという。
【００１１】
本実施形態にかかるプログラムに含まれる手続きの解析装置では、通常の単一手続き内のデータフロー解析と、特定の手続きに関する手続き情報を利用することにより、単一手続き内のデータフロー解析よりも適用可能な条件を広げ、しかも手続き間解析よりも実行速度が早く、かつ正確な解析を行うことを可能とする。
上述のように、図１に示すソースプログラムにおいて７行目の「ｓｃａｎｆ」は、標準ライブラリに含まれる手続きであるため、その仕様は予め明らかになっている。すなわち、図１の例では、ｉという変数が定義されていることが予め分かっている。そこで、この「ｓｃａｎｆ」のように、仕様が明らかになっている標準ライブラリに含まれる各手続きについて、その仕様から、データ依存関係を予め調べておいて、その結果だけを記述した定義／参照情報格納ファイルを用意する。例えば「ｓｃａｎｆ」の場合であれば、引数であるｉは、ここで定義される旨の情報を定義／参照情報格納ファイル内に格納しておく。
【００１２】
また、これとは異なる手続き、例えば後に続く引数を画面に表示する旨の手続きである「ｐｒｉｎｔｆ」という手続きであれば、この引数がこの手続きによって「参照」される。したがって、「ｐｒｉｎｔｆ」という手続きについては、引数がここで参照される旨の情報を定義／参照情報格納ファイル内に格納しておく。
このように、定義／参照情報格納ファイルには、多くの手続きについて、予めそれぞれの手続きと、それらが変数の「定義」なのか「参照」なのかを結び付けたテーブルを用意しておく。このなかで、ある手続きの呼び出しがあったならば、このテーブルにその手続きが含まれているかどうかを判断する。呼び出された手続きがこのテーブルにあり、かつ、それが変数の「定義」であるのか、「参照」であるのかという情報を抽出する。
【００１３】
定義／参照情報格納ファイルに格納する手続きは、Ｃ言語の標準ライブラリに含まれるものには限られない。例えば、ある工場で、よく利用される特殊な手続きを作り、その工場で一般的に使われているようなものとなっている場合でも、上記の標準ライブラリに含まれる手続きの場合と同じような定義／参照情報格納ファイルを作成しておけば、同じように正確で効率的な解析を行うことができる。
【００１４】
次に、図２及び図３を参照して、本実施形態のプログラムに含まれる手続きの解析装置の動作について説明する。図２は、本実施形態のプログラムに含まれる手続きの解析装置のブロック図、図３は、その動作を示すフローチャートである。尚、図２に示した構文解析手段２６、手続き判断手段２１、定義／参照情報抽出手段２３、データフロー解析手段２４は、これらの機能をプログラムとして記憶媒体３１に記録したものをコンピュータ３０が読み取ることによって、コンピュータ３０上で実現することができる。したがって、この記憶媒体３１を例えばフレキシブルディスクやＣＤ−ＲＯＭといった取り外し可能なものとすれば、この記憶媒体３１を配付することによって、この記憶媒体３１を読み取って実行できる任意のコンピュータ上で本実施形態のプログラムに含まれる手続きの解析装置を実現することができる。このとき、定義／参照情報格納ファイル２２の内容も、これらのプログラムと共に記憶媒体３１に記憶させておいてもよい。
【００１５】
図３のフローチャートにおいて、まずＳ１０で、構文解析手段２６が、入力されるソースプログラム２０を元に構文解析木を生成し、生成された構文解析木上から一文を読み込む。Ｓ１１で、手続き判断手段２１はこの文の中に定義／参照情報格納ファイル２２に格納された特定の手続きが含まれているか否かを判断し、含まれていれば、Ｓ１２において、定義／参照情報抽出手段２３が定義／参照情報格納ファイル２２を参照し、Ｓ１３において変数が「定義」であるか、「参照」であるかという情報を引き出す。一方、Ｓ１１において、この文に定義／参照情報格納ファイル２２に格納された手続きが含まれていないと判断したときは、Ｓ１４において、定義／参照情報抽出手段２３は変数が「定義」されているか「参照」されているか、あるいはどちらでもないかを判断する。Ｓ１５において、手続き判断手段２１は更にプログラムの文が続いているかどうかを判断し、更に続いていれば、Ｓ１０に戻り、次の文の情報を読み込んで上記と同様の動作を実行する。また、Ｓ１５において、最後の文に至ったと判断されると、Ｓ１６において、データフロー解析手段２４がデータフローの解析を実行する。その結果は解析結果２５として出力される。
【００１６】
上記のように、ソースプログラム内に、従来のデータフロー解析装置ではデータ依存を調べることができなかった手続きが含まれていても、予め定義／参照情報格納ファイル２２に必要な情報を記述しておき、必要に応じてこれを参照することによって、従来は調べることができなかった手続きや、実際に調べようとすると実行に長時間を要するような手続きについてもデータ依存関係を短時間で調べることが可能となる。
【００１７】
尚、本発明は上記実施形態には限定されず、その要旨の範囲内で種々の変更が可能である。例えば上記では、Ｃ言語の標準ライブラリに含まれる「ｓｃａｎｆ」や「ｐｒｉｎｔｆ」といった典型的な手続きについて説明したが、本発明は、Ｃ言語におけるこれ以外の手続きもしくは、ユーザーが作成したライブラリに含まれる手続きについても適用することができ、更に、Ｃ言語以外の多くの高級言語についても、同様に適用することができる。
【００１８】
【発明の効果】
以上説明したように、本発明によれば、ソースプログラムの内容を見ることができない手続きを含むプログラムについてもデータフロー解析を可能とし、また、ソースプログラムを見ることができる手続きを含むプログラムであってもそのデータフロー解析に要する時間を短縮することができるプログラムに含まれる手続きの解析装置を提供することができる。
【図面の簡単な説明】
【図１】Ｃ言語で記述されたあるソースプログラムの一例を示す図である。
【図２】  本発明の一実施形態のプログラムに含まれる手続きの解析装置のブロック図である。
【図３】  本発明の一実施形態のプログラムに含まれる手続きの解析装置の動作を示すフローチャートである。
【符号の説明】
２０    ソースプログラム
２１    手続き判断手段
２２    定義／参照情報格納ファイル
２３    定義／参照情報抽出手段
２４    データフロー解析手段
２５    解析結果
２６    構文解析手段
３０    コンピュータ
３１    記憶媒体
【図１】
0004055197.tif 000002
【図２】
0004055197.tif 000003
【図３】
0004055197.tif 000004