プログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラム

【課題】 相互関係を有しながら複数の関数やその下位のコードブロックに分散して記述されるようなコードであっても、判り易く強調表示、あるいは識別表示でき、プログラマのコーディング作業を支援できるようにする。
【解決手段】 入力プログラムソースファイル1に対して字句解析部2および構文解析部3により字句および構文解析を行ない、その結果に基づき、ユーザ設定手段31によりユーザが設定した識別表示モードに応じ、カラー画面表示装置7を用いて、入力プログラムソースファイル中の特定字句に関連するコードブロックを他の部分と識別できるよう、特定字句に関連するコードブロックのみを表示、特定字句に関連するコードブロックの表示色を変更、あるいはツリー表示、などの識別表示を行なう。
【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、C言語などのプログラムソースの表示処理を行なうプログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラムに関するものである。
【0002】
【従来の技術】従来より、コンピュータシステムにおいて、種々のプログラム言語が用いられており、中でもC言語は、近代的な高級言語の多くの特性を有しながら、言語仕様がシンプルで効率の良いコーディングが可能であることからOSのカーネルや種々のアプリケーションの記述に広く用いられている。
【0003】
【発明が解決しようとする課題】C言語は関数型の言語であるとともに、ループや分岐を記述する制御構造を有するが、その言語仕様には高級なメモリ管理の仕組が含まれておらず、スタック上に確保される自動変数で不十分な場合はメモリが必要になるごとにプログラマはmallocのようなライブラリ関数を用いてメモリを確保し、その確保した領域が不要となった場合はfreeのようなライブラリ関数でその領域を解放する必要がある。このような言語仕様により、ガーベージコレクションなどのメモリ管理機構を経由しないため、効率が良い反面、プログラミングのミスが発生しやすいという問題がある。
【0004】プログラムの作成途中や作成後には、そのプログラムの品質を検証するためにさまざまなテストが行われるが、C言語で記述されたプログラムのバグ、障害の中で原因個所の特定が困難なものとして、いわゆるメモリリークがある。このメモリリークは、処理過程で上記のような手続により確保したメモリを解放せずに実行が進行する現象をいい、メモリリークを持ったプログラムを何度も実行させることによって利用可能なメモリ領域が減少し、システムのパフォーマンスが低下し、また最悪の場合にはシステムの暴走を招くことがある。
【0005】したがって、プログラムでは、限られたメモリ領域を有効に使用するために必要なときに最適な量のメモリを確保し、処理が終わった時点でメモリの解放を行なう。本来、Cプログラマは、プログラムがどのようなケースで終了してもその時点で確保されているメモリが解放されるようにプログラムの設計・作成を行わなくてはいけない。
【0006】しかし、プログラムが複雑になるにつれ、プログラムの分岐も増加し、プログラムで実行されうる処理パターンが膨大な量となり、人間が検査できないほどになってしまう。
【0007】従来技術におけるメモリリークを検出するためのシステムとしては、一般的には、標準的なメモリ管理関数を(上記のmalloc、freeなど)を特別なデバッキングメモリ管理関数に置き換える構成のものがある。このシステムでは、ソースコード中のメモリ確保部分で確保されたメモリのアドレスを保持しているポインタを記録する。この時同時にこの命令が記述されているファイル名とライン番号も記録される。そして、メモリが確保される部分でこのポインタを除去する。プログラムが終了したときにこのリストを参照し、残っているポインタがあればそれが、メモリリークと識別される。
【0008】しかし、この解決法は、プログラムが複雑である場合には、さまざまな要因のために不完全なものである。たとえば、メモリの確保されたメモリのアドレスを保持しているポインタを記録した後にそのポインタを他のポインタにコピーして、そのポインタを使用してメモリの解放を行なう場合、上記の方法では正確なメモリ確保解放の対応を検査することができない。有効なメモリリーク検出法は、手作業でメモリの確保・解放を検査することであるが、事実上は困難である。
【0009】また、近代的なCコンパイラでは、かなり懇切丁寧なエラー/警告メッセージを生成できるものがあるが、malloc、freeのように、相互関係を有しながら、複数の関数やその下位のコードブロックに分散して記述されるような関数呼び出しを解釈し、エラー/警告を行なうことはできない。
【0010】一方で、C言語のようなコンパイラ型の言語に対応したプログラムエディタや、Cコンパイラの統合環境アプリケーションでは、予約語やキーワードを色分け表示したり、特定のプリプロセッサマクロの部分を除去して選択的な表示を行なうような表示技術が広く用いられているが、これら従来技術の多くは文字列のパターンマッチングにより表面的な字句解析を行なうものにすぎず、メモリリークのようなバグを回避すべくプログラマを支援できるような表示は行なえなかった。
【0011】本発明の課題は、C言語のようなプログラムの処理系において、相互関係を有しながら複数の関数やその下位のコードブロックに分散して記述されるようなコードであっても、判り易く強調表示、あるいは識別表示でき、プログラマのコーディング作業を支援し、メモリリークのようなバグを未然に回避し、また、容易に発見できるようにすることにある。
【0012】
【課題を解決するための手段】上記の課題を解決するため、本発明によれば、C言語などのプログラムソースの表示処理を行なうプログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラムにおいて、入力プログラムソースファイルの字句解析および構文解析に基づき、ユーザが設定した識別表示モードに応じて、入力プログラムソースファイル中の特定字句に関連するコードブロックを他の部分と識別できるよう識別表示する構成を採用した。
【0013】
【発明の実施の形態】以下、添付図面を参照して、本発明の実施形態を詳細に説明する。
【0014】図1は、本発明によるプログラム処理系のハードウェアおよびソフトウェアから成るシステムの全体構成を示している。このシステムは本発明のようなC開発環境の専用ハードウェアとして、あるいは、コンピュータシステム(ワークステーション、パーソナルコンピュータなど)のハードウェア上においてプログラムエディタや、Cコンパイラの統合環境アプリケーションのソフトウェアとして実装することができる。
【0015】図1において符号1は、C言語プログラムソースコードで、このC言語プログラムソースコード1はコンピュータシステムのハードディスクなどの外部記憶装置に格納される。
【0016】本発明の処理手段、すなわち、字句解析部2、構文解析部3、プログラム表示処理部6、関数参照関係テーブル生成手段12、出力ファイル生成手段13は全てコンピュータシステムのCPU101のプログラム処理により実現される。これらの手段は実際にはCPU101の処理プログラムとして記述され、メモリ(RAM、あるいはROM)102上に展開された状態で実行される。
【0017】図1では、本発明の処理プログラムを格納するメモリ102としては、RAM、あるいはROMを例示しているが、仮想記憶機構上に存在してもよく、また、実行の前段階ではハードディスク、フロッピー(登録商標)ディスク、あるいはMOやCD−ROMなどのような外部記憶装置、要するにコンピュータ読み取り可能な記憶媒体に格納しておくことができる。また、本発明の処理プログラムはネットワークを介してダウンロードされるものであってもよい。
【0018】本発明の処理過程では、符号4および5で示す中間出力ファイルが生成される。このうち、符号4は関数の参照関係をツリー状に表したファイル、5は必要な情報のみを含んだC言語プログラムソースである。なお、これらの中間出力ファイルは、物理的にOSのファイルシステム上でファイル名を有するファイルであることを要せず、たとえば(名前付き)パイプやソケットのような疑似的なファイルであってもかまわない。
【0019】本発明では、C言語プログラムソース1から字句解析部2および構文解析部3の処理を経て生成されたこれらのファイル4、5に基づき、プログラム表示処理部6が表示制御手段14を用いてCRT/LCDディスプレイなどから構成されたカラー画面表示装置7に表示を行なう。
【0020】本発明では、表面的な字句解析を行なうだけでなく、つまり、字句解析部2のみならず構文解析部3による構文解析を行ない、ファイル4、5を生成することにより、複数の関数やその下位のコードブロックに分散して記述されるようなコードであっても、判り易く識別表示(たとえば後述のような選択表示や色分け表示)でき、プログラマのコーディング作業を支援できるようにする。
【0021】また、表示の態様は、ユーザ設定手段31によりカスタマイズできるようにする。ユーザ設定手段31はキーボード、上記のカラー画面表示装置7、あるいはマウスなどのポインティングデバイスなどのハードウェアを用いて構成され、適当なメニュー選択を行なうことによりカラー画面表示装置7におけるプログラム表示の態様を制御する。
【0022】次に、図1の字句解析部2、構文解析部3、関数参照テーブル生成手段12、出力ファイル生成手段13の構成を説明する。
【0023】字句解析部2は、字句抽出手段8および字句テーブルリスト作成手段9から構成される。
【0024】本実施形態では、C言語プログラムの処理を実施形態としているが、ここでいう字句とはC言語でいうトークンで、プログラムの構成要素の最小単位を成す。
【0025】C言語のトークンとはCプログラムの解釈上の意味のある文字または、文字列のことで、図12に示すように演算子、分離子、識別子、予約語、定数などから構成される。なお、図12では最小限のトークンのみを示しており、「+」や「−」、「&」、「|」などのトークンについては「++」や「−−」、「&&」、「||」などのように重ねて用いられるものもあり(詳細については、公知のC言語仕様書などを参照)、これらの字句の図示は煩雑さを避けるため省略してある。
【0026】上記のようなトークンを用いて、C言語プログラムソース1は、たとえば、図10、図11の左側に示すように記述される。図1の字句解析部2はC言語プログラムソース1を入力し、字句抽出手段8により字句への分解を行ない、字句テーブルリスト生成手段9により字句テーブルリスト(図2:後述)を生成する。
【0027】ここで、「リスト」とは、コンピュータプログラム処理で用いられるデータ構造の一つで、任意のテーブルが次のテーブルヘのポインタを保持する形で構成される。これにより動的にメモリを確保しデータを保持することができる。
【0028】次に、構文解析部3により、このデータに対してC言語の文法に基づいてデータの解析を行い必要な情報のみを抽出し、関数の参照関係をツリー状に表わしたファイル4と必要な情報のみを含んだC言語プログラムソースコードファイル5を出力する。構文解析部3は関数定義部・実行部抽出手段10、表示字句抽出手段11、および出力ファイル生成手段13から構成される。
【0029】関数参照テーブル生成手段12は関数参照関係テーブル(図3:後述)および関数名テーブル(図4R>4:後述)を生成し、必要な情報のみを含んだC言語プログラムソースコードファイル5を出力する際に、これら関数参照関係テーブル、および関数名テーブルが用いられる。
【0030】上述の各テーブルは、もちろんメモリ102上の領域に必要に応じて生成される。
【0031】次に、図5により字句解析部2の字句抽出手段8の処理を説明する。字句抽出手段8は、入力されたC言語プログラムソース1を解析しC言語の字句(トークン)を1つづつ抽出し、抽出した各字句ごとに1つの字句テーブル(図2)を生成する。
【0032】この時、図2に示すように、字句テーブルには、トークン行番号81、行内オフセット82、トークン属性1コード83、トークン属性2コード84、文字列実体[トークン]85、表示スイッチ86、字句の階層の深さ87、次の字句テーブルへのポインタ88の各スロットが生成される。
【0033】トークン行番号81はその字句(たとえば図5の「if」)が現われたC言語プログラムソース1中の行番号、行内オフセット82は、その字句の行中のオフセット(カラム位置)である。
【0034】トークン属性1コード83は、メモリ102にあらかじめ用意した卜ークン属性1コードデータベース15を参照し、データベースに登録されている文字列と現在のトークンを比較し該当するトークンがデータベースに存在すればそのトークン属性コード1を字句テーブルのトークン属性コード1に設定する。卜ークン属性1コードデータベース15で識別すべき属性は、図12R>2の演算子、分離子、識別子、予約語、定数などの属性である。これらの属性に割り当てるべき実際のトークン属性コード1は任意に定めておけばよい。
【0035】一方、トークン属性2コード84は、後述のようにその字句が関数定義なのか、実行部(関数中のコード)なのかを識別するために用いられるもので、関数定義部・実行部抽出手段10により設定される。
【0036】文字列実体[トークン]85は、C言語プログラムソースから情報を決定し、設定することができる。図5の例では「if」の文字列そのものが字句テーブル80内に格納される。
【0037】表示スイッチ86は、この字句を表示するかどうかの制御に用いられる。字句の階層の深さ87は、C言語プログラムソース1中でこのテーブルに対応した字句が存在するネスト中の階層位置である。C言語の場合、関数定義の羅列としてコードが記述され、関数中には「{」、「}」(ブレース)でネストしたコード階層を定義することができる。関数定義の「{」、「}」(ブレース)を最上位階層とすると、テーブルに対応した字句が存在する階層レベルは、関数定義の「{」を読み取ってからその字句を読み取るまでに「{」をいくつ読んだかを計数するカウンタを用いる(ただし、「}」を読んだ場合は同カウンタの数をデクリメントする)ことにより決定することができる。ポインタ88については、以下の説明を参照されたい。
【0038】次に図6により、字句テーブルリスト作成手段9の処理を説明する。字句テーブルリスト作成手段9の処理は、図5の字句抽出処理と同期して順次実行することができる。たとえば、字句テーブル801を1つ既に生成しており、続いて字句テーブル802を生成した時に字句テーブル801のポインタ88として字句テーブル802の先頭アドレスを格納する。
【0039】字句抽出手段8、字句テーブルリスト作成手段9は、上記の一連の処理をC言語プログラムソースが終わるまで繰り返す。
【0040】字句抽出手段8、字句テーブルリスト作成手段9から成る字句解析部は、C言語プログラム1を字句ごとに、テーブルを作成しそれをリスト構造(図6、あるいは図9の字句テーブル800)にして保持する。
【0041】関数定義部・実行部抽出手段10、表示字句抽出手段11、出力ファイル生成手段13から成る構文解析部では、このリストを最初から読み込み、C言語の文法に基づいて解析を行なう。
【0042】このとき、関数定義部・実行部抽出手段10、表示字句抽出手段11は、リスト構造のC言語プログラムソースを読み込み、まず字句(卜ークン)テーブルの中のトークン属性1コード83を参照し、所定の処理を行い、次に字句テーブルの次のテーブルヘのポインタを参照して、次の字句テーブルに処理を移す。この一連の処理をリストの最後まで繰り返す。
【0043】ここで、構文解析の説明を深めるため、C言語プログラムの構成を説明することにする。
【0044】周知のように、C言語プログラムは関数単位で構成され、この「関数」とは、ある1つのまとまった仕事を実行する自己完結したコードブロックをいう(たとえば、図7のサンプルC言語プログラム16)。
【0045】一般には、main()という関数でプログラムの実行が開始され、このmain()から他の関数を呼び出すことにより処理が進められる(たとえば図1010の左側に示すC言語プログラムソース1)。もちろん、呼び出された関数が、他の関数を(あるいは自己を再帰的に)呼び出すネスト構造であってもよい。関数を使用するためには、関数の定義を行ない、定義した関数名をソース中に記載(これが後述の関数実行部である)することにより、その記載の位置で実際の呼び出しが起きる。
【0046】図7は、関数名funcAという関数の定義部分を示している。関数定義部では、任意の関数名(図7の17)を定義し、それに続く「{」、「}」の内側に実行したい処理をC言語の命令で記述する。
【0047】図7のサンプルC言語プログラム16では、関数funcAおよび関数funcBが定義され、関数funcBが関数funcAを呼び出している。図7R>7の符号18は関数funcBが関数funcAを呼び出すコードで、関数funcAをその関数名(これもトークンの1つである)で「参照」している。図示の処理は関数funcAを引数bで呼び出し、その返り値を自動変数(short整数)aに代入するものである。このとき、関数funcAは関数funcBに「呼び出されている」関係にあり、また、関数funcBは関数funcAを「呼び出している」関係にある。
【0048】図7のサンプルプログラム16では、関数定義部は符号17の「funcA」関数実行部は符号18の「funcA」であるが、この場合、関数定義部・実行部抽出手段10は、字句として「funcA」17を読み込むと、該当の字句テーブル80のトークン属性2コード84として、「関数定義部」である事を示す識別データを、また、字句として「funcA」18を読み込むと、該当の字句テーブル80のトークン属性2コード84として、「関数実行部」である事を示す識別データを、書き込む。
【0049】なお、表示字句抽出手段11により、表示スイッチ86もこの時決定できるが、表示制御には、前述のユーザ設定手段31の設定情報が用いられる。たとえば、ユーザ設定手段31で、図10のような関数の参照関係ツリー表示モードや、図11のようなメモリ確保・解放関係のツリー表示モードを指定することにより、どの字句の表示スイッチ86をオンにするかを決定する。
【0050】関数定義部・実行部抽出手段10は、ある字句が「関数定義部」、「関数実行部」のいずれであるかを決定する場合は、まず字句(トークン)テーブルの中のトークン属性1コード83を参照し、その属性が識別子であるかどうかを調べる。そして、所定の範囲のトークンのテーブルまで参照を行いC言語の文法から、その識別子が関数の実行部であるのか、関数の定義部であるのかの判定を行いその結果に応じて上記のトークン属性2コード84および表示スイッチ86の設定を行なう。
【0051】より具体的な処理としては、たとえば、ある識別子が「関数定義部」か否かを決定する条件としては字句の階層の深さ87を用いることができる。たとえば、図10に明らかなように、関数定義部(図10の場合、main、funcA、funcB、funcC)は{}のネストレベルの最上位に位置しており、このネストレベルの最上位に現われる識別子は関数定義部と検出することができる(実際には、ネストレベルの最上位に位置する字句は外部変数定義ないしプリプロセッサマクロの一部である場合があるが説明を簡単にするため、ここではこれら外部変数定義ないしプリプロセッサマクロは別に適当な方法で既に識別済みであるものとする)。
【0052】また、「関数実行部」か否かを決定する条件としても字句の階層の深さ87を用いることができる。この場合は、まず、該当の字句がネストレベルの最上位に位置「しない」ことが条件とされる。さらに、識別子には変数名が含まれているので(図12)、変数名を排除する必要があるが、関数名の場合はその字句に分離子「(」が後続するので、この「(」を検出すればよい(「(」に先行する字句には「if」、「for」などの予約語もあるが、これらの予約語は図12のトークン分類によれば既にトークン属性1コード83として分類済みであるので、この「識別子」のトークン属性2コード84を決定する段階では考慮する必要がない)。
【0053】ここで図8に表示字句抽出手段11の処理を示しておく。表示字句抽出手段11の実装例の1つでは、参照している字句テーブルが、図8のサンプルC言語プログラム19の一点鎖線の囲み内の破線部の関数定義部内部20にある場合のみ実行される。
【0054】関数定義部内部20では、参照している字句テーブル内スロット属性コード1が識別子である場合には、その字句テーブルのスロット文字列実体85を参照し、あらかじめ登録しておいた表示字句データベース21を参照し、ユーザーがあらかじめ設定した文字列と一致する場合には同字句テーブルのスロット表示スイッチの設定を行なう。
【0055】表示字句データベース21としては、たとえばユーザ設定手段31により選択可能な複数の表示字句データベースを用意しておけばよい。
【0056】たとえば本実施形態では、メモリの確保・解放関係を明確に表示するために、表示字句データベース21の1つとして(1)メモリの確保(malloc)、解放関数(free)
(2)return、goto、break、continue等のジャンプ命令、を表示字句データベースとしてあらかじめ用意しておく(後述の図11のメモリ確保・解放関係のツリー表示モードに対応)。
【0057】また、図10のような関数の参照関係ツリー表示モードに対応して、上記のような「関数定義部」、「関数実行部」を検出可能な表示字句データベース21を用意しておく。
【0058】構文解析部3では、関数定義部・実行部抽出手段10の処理、表示字句抽出手段11の処理、出力ファイル13の処理を経て、必要な情報のみを表示する設定が行われたC言語プログラムソースコードファイル5を出力することができる。
【0059】このファイル5は、図11のメモリ確保・解放関係のツリー表示モードに対応した出力ファイルで、たとえば、図11の右側に示すような内容となる(後述)。
【0060】次に、図9に関数参照テーブル生成手段12の処理を示す。関数参照テーブル生成手段12による解析は、主に図10のような関数の参照関係ツリー表示モードに用いられるもので、図9の関数参照関係テーブル120、および関数名テーブル1210を用いる。関数参照関係テーブル120、および関数名テーブル1210の構成はそれぞれ図3、図4に示してある。
【0061】関数参照関係テーブル生成手段12では、前述の字句解析部2、構文解析部3によって生成された、リストで保存されたC言語プログラムソース、および、その各字句テーブルの各スロットの内容を参照しながら関数参照関係テーブルの作成を行なう。
【0062】具体的には、図9に示すように各字句テーブルの属性コード1と属性コード2を参照しながら字句テーブルリスト800に変換されたC言語プログラムソースの字句テーブル80を1つずつ読み込み、それらのトークン属性1コード83、トークン属性2コード84が関数の定義部17を示すものであれば、新たな関数参照関係テーブル120を作成し、この時の字句テーブルの文字列実体[トークン]85の内容を関数参照関係テーブル120の文字列実体[関数名]123としてコピーするとともに、ハッシュテーブル127にそのアドレスを保存する。また、字句テーブルのポインタ125のフィールドも生成する。関数参照関係テーブル120は上記のようにして字句テーブル80の1つ毎に作成され、字句テーブル80の場合と同様にリンクトリストとしてメモリ102に格納される(関数参照関係テーブルへのポインタ126を用いてリンクを行なう)。
【0063】このとき、関数参照関係テーブル120のアドレスをハッシュテーブル127のどのスロットに保存するかは、その時の字句テーブルの文字列実体から特定演算により得られるキーによって決定される。ハッシュテーブル127は、たとえば128(あるいは256スロット)程度のサイズを有し、その各スロットは上記の特定演算により得られるキーの個々に対応する。
【0064】たとえば、ある字句テーブル80の文字列実体を構成する各キャラクタコード(通常0〜127の範囲のASCIIコード)を数値として加算し(「if」の場合は「i」と「f」の文字コード0x69と0x66を加算する)、それを127で除した余り(「if」の場合0x2B)をキーとすることができ、このキーに対応したスロットにこの字句テーブル80のアドレスを登録する。
【0065】このような構成により、字句の文字列からハッシュテーブル127を検索する場合は、字句の文字列のキーを求め、このキーに該当するハッシュテーブル127のスロットのみを検索すればよく、ある文字列(たとえば関数名)を文字列実体として有する字句テーブル80を高速に検索することができる。
【0066】次に関数定義部内部20のC言語プログラムソースの字句(卜ークン)を読み込んでいき、そのトークン属性1コード83、トークン属性2コード84が関数実行部18であれば、新たに呼び出す関数名テーブル1210aを作成し、字句テーブルの文字列実体[卜ークン]スロット85の内容を呼び出す関数名テーブル1210a(あるいは1210c)の文字列実体[関数名]1211にコピーする。そのアドレスを関数参照関係テーブル120の関数名テーブルヘのポインタ[呼び出す関数]121に保持する。
【0067】この処理をソースコード中のすべての関数定義部の数だけ行なうことにより、定義された関数が他のどの関数を呼んでいるのかという情報を全て保持する事ができる。このような処理を終了すると、対象となる関数の関数名の文字列をキーとしハッシュテーブル127につながれている関数参照関係テーブルにアクセスすれば、得られた関数参照関係テーブル120の各スロットの内容を参照することで、その関数がどの関数を呼び出しているのかの情報を得ることができる。
【0068】また、上記同様にして、関数参照関係テーブル120の関数名テーブルヘのポインタ[呼ばれる関数]122を生成する。これは、ある任意の関数がどの関数に呼び出されているのかの情報を得られるようにするためである。具体的には、ある任意の関数参照関係テーブル120に対して、その他すべての関数参照関係テーブル120の呼び出している関数を検索し、その両者が一致した場合には、新たに、呼ばれる関数名テーブル1210bを作成し、その時の文字列実体[関数名]1211をコピーする。この処理をハッシュテーブル127に登録されているすべての関数参照テーブルに関して行なう。
【0069】このような処理を行って作成されたハッシュテーブルを参照することにより、すべての関数の参照関係を参照することができ、関数参照関係テーブル生成手段12、出力ファイル生成手段13を経て関数の参照関係を記述したファイル4を出力することができる。
【0070】プログラム表示処理部6は、表示制御手段14の制御により、必要な情報のみを表示する設定が行われたC言語プログラムソースファイル5、関数の参照関係を記述したファイル4をカラー画面表示装置7に表示する。このとき、各字句テーブル80の表示スイッチ86が参照され、その字句を表示すべきか否かが決定される。
【0071】図10は、関数の参照関係を記述したファイル4の表示結果を示している。本実施形態によれば、ユーザ設定手段31により関数の参照関係ツリー表示モードを指定すると、図10のように、C言語プログラムソース中の関数の参照関係をツリー形態で明瞭に表示することができる(図10の70a)。
【0072】図11は、必要な情報のみを表示する設定が行われたC言語プログラムソースファイル5の表示結果を示している。本実施形態において、ユーザ設定手段31によりメモリ確保・解放関係のツリー表示モードを指定すると、メモリ確保・解放関数の実行部部分のみを表示することができる。この表示例では、関数実行部を含む「{」、および「}」で囲まれたコードブロックのみを表示している。このとき、関数実行部のコードの直上位のコードブロックのみを表示する方法も考えられるが、関数定義のコードブロックまでを表示している。
【0073】このように表示すべきメモリ確保・解放関数の実行部部分を含むコードブロックのみを抽出するには、たとえば図13のようなアルゴリズムを用いることができる。ここでは、字句テーブルの階層の深さ87(図2)の情報を用いる。たとえば、図11において、main関数の最初の変数定義を除くと、関数の直下位のコードブロックは3つのif文から構成され、メモリ確保・解放関数malloc、freeを含むのは最初のif文と最後のif文の2つのコードブロックのみである。そして、最初のif文はmallocを含んでいるが、最後のif文はfreeをさらにネストしたif文の中に含む。
【0074】malloc、freeのような字句に対応する字句テーブルでは前述のようにして既にこれらの字句を表示するように表示スイッチが決まっているので、図11のようにメモリ確保・解放関数を含む制御構造を表示するには、字句テーブルリスト800を先頭から走査し、malloc、freeのような字句の字句テーブル80を検出したら(図13:ステップS7、S1)、その位置から階層の深さ87(図2)の情報(ネストレベル)を参照しつつ字句テーブルリスト800(図6)を前方および後方に走査(S2、S6)し、if、for、while、「{」、「}」、「(」、「)」などの予約語、演算子、分離子から成る制御文の先頭と後端を検出し(S3、S8)、制御文の先頭と後端を構成する字句の表示スイッチ86をオンに変更する(S4、S9)。その過程で現れた同一ネストレベルのメモリ確保・解放の関数実行部ではない別の文(たとえば図11の最後のif文のa=a+1;)は無視し、表示しないようにする。そして、字句テーブルリスト800(図6)の走査は、関数定義のネストレベルまで行なう(S5、S10)。
【0075】このような処理を行なうことにより、図11R>1の符号70bのようにメモリ確保・解放の関数(malloc、およびfree)実行部部分のコードブロックのみを表示することができる。
【0076】図11のような表示(識別表示)を行なうことにより、ユーザであるプログラマは当該Cソース中のメモリ確保・解放の関数(malloc、およびfree)実行部部分がどのように記述されているかを容易に概観でき、mallocに対応するfreeが欠けているなどのコーディングの欠陥を容易に発見することができる。
【0077】なお、図13の処理では、同一ネストレベルの識別表示を目的とする文とは異なる文(図11においては、メモリ確保・解放の関数実行部ではない文:最後のif文のa=a+1;)は無視し、表示しないようにしているが、この文を表示するようにしてもよい。この場合は、図13のステップS2〜S5およびS6〜S10の2つのループ中を実行している間、適当なフラグを立て、このフラグがオンになっている間に遭遇した字句の表示スイッチ86をオンにすればよい。また、同一ネストレベルの識別表示を目的とする文とは異なる文を表示するか否かも、ユーザ設定手段31により設定できるようにしておくと便利である。
【0078】以上では、識別表示を目的とする文がメモリ確保・解放の関数実行部である場合を例示したが、表示字句抽出手段11の表示字句データベース21にはメモリの確保解放命令(malloc、free)以外にも、for、while、return、goto、break、continueなどの字句を登録することができ、この登録文字列を変更することで表示する内容の変更を容易に行なうことができる。
【0079】もちろん、本発明を実現するプログラム製品(あるいは専用ハードウェア)の表示字句データベース21には、デフォルトのモード(たとえば上記の関数の参照関係ツリー表示モード、メモリ確保・解放関係のツリー表示モード)に対応した字句を登録しておけばよく、また、ユーザ設定手段31により選択表示すべき字句を自由に登録できるようにし、ユーザが需要に応じてプログラムソース表示モードを定義できるようにしておくと非常に有用である。
【0080】たとえば、ユーザ設定手段31により上記の関数の参照関係ツリー表示モード、メモリ確保・解放関係のツリー表示モードに加えて、「ループ関係表示モード」のようなモードを設定し、return、goto、break、continueなどのような制御文に対応した字句を表示字句データベース21に登録し、forあるいはwhileループ中のreturn、goto、break、continueなどのような制御文の実行部の上位コードブロックのみを図11と同様に選択表示することが考えられる。
【0081】用途によっては、forあるいはwhileループは、表示装置の画面に表示しきれないような長大なものを書くことが避けられない場合が往々にしてあり、そのようなループを誤まりなく記述し、またデバッグするのは容易ではないが、上記のような「ループ関係表示モード」によれば、ループ中の分岐を制御するコードの検証、およびデバッグを極めて容易に行なうことができる。
【0082】以上では、該当の字句(メモリの確保解放命令など)のみを表示する選択表示により、特定のコードの識別表示を行なう例を示したが、出力ファイル生成手段13では該当字句の表示スイッチとして、非表示/表示の制御情報だけではなくその表示色や表示輝度の情報を付加することができる。これにより、該当のコードのみを特定の表示色(表示輝度)で表示する識別表示を行なうことができ、上記と同様の目的を達成することができる。この場合は、他のコードが表示上で消えないので、プログラムの検証上、該当のコード(メモリの確保解放命令など)以外のコードとの関係が重要である場合などに有用である。
【0083】もちろん、表示スイッチとして、非表示/表示の制御情報を用いるか、表示色(あるいは表示輝度)の情報を用いるかなどもユーザ設定手段31により設定できるようにしておくと、より柔軟な解析システムを構成することができる。
【0084】なお、字句テーブル80にはその字句のC言語プログラムソースでの位置情報(行番号や行オフセット)が含まれているので、これらの情報を出力ファイル5に付加し、表示させることができる。たとえば、行番号は画面の左端に表示できるし、ステータス表示部などを設ける構成においては、カーソル直近の該当字句の行番号や行オフセットをステータス表示部に表示させることができる。
【0085】以上では説明を容易にするために、解析対象のCプログラムが複数ファイルに渡る場合を省略したが、図3の関数参照関係テーブル120には文字列実体[ファイル名]124が含まれているので、複数のソースファイルについて字句テーブルリスト800および関数参照関係テーブル120のリストを生成するとともに、単一のハッシュテーブル127へ登録を行ない、その際、文字列実体[ファイル名]124に当該字句の含まれるファイル名を格納しておけば、関数参照関係テーブル120のリストを探索する時、たとえ別のファイルに含まれる関数であっても呼び出す/呼び出される関数を発見することができる。解析対象のCプログラムが複数ファイルに渡る場合には、図10のような関数名の表示のみではなく、関数名とともにその関数が定義されたファイル名を表示するとよい。たとえば図10の関数funcCが別ファイルで定義されている場合には「funcC(ファイル名)」のような表示を行なう。
【0086】本実施形態ではCプログラムを例示しているが、本発明は、C言語に限定して用いられるものではなく、本発明の字句解析、構文解析、および識別表示技術はpascalなど類似の言語の開発環境(ハードウェアおよびソフトウェア)に実施できるのはいうまでもない。
【0087】
【発明の効果】以上の説明から明らかなように、本発明によれば、C言語などのプログラムソースの表示処理を行なうプログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラムにおいて、入力プログラムソースファイルの字句解析および構文解析に基づき、ユーザが設定した識別表示モードに応じて、入力プログラムソースファイル中の特定字句に関連するコードブロックを他の部分と識別できるよう識別表示する構成を採用しているので、相互関係を有しながら複数の関数やその下位のコードブロックに分散して記述されるようなプログラムコードであっても、判り易く強調表示、あるいは識別表示でき、プログラマのコーディング作業を支援し、メモリリークのようなバグを未然に回避し、また、容易に発見できる、という優れた効果が得られる。
【図面の簡単な説明】
【図1】本発明のプログラムソース処理の全体の流れを示した説明図である。
【図2】本発明で用いられる字句テーブルの一例を示した説明図である。
【図3】本発明で用いられる関数参照関係テーブルの一例を示した説明図である。
【図4】本発明で用いられる関数名テーブルの一例を示した説明図である。
【図5】図1の字句抽出手段の処理を示した説明図である。
【図6】図1の字句テーブルリスト作成手段の処理を示した説明図である。
【図7】図1の関数定義部・実行部抽出手段の処理を示した説明図である。
【図8】図1の表示字句抽出手段の処理を示した説明図である。
【図9】図1の関数参照関係テーブル生成手段の処理を示した説明図である。
【図10】本発明による関数の参照関係の表示の例を示した説明図である。
【図11】本発明によるメモリ確保・解放関係のツリー表示の例を示した説明図である。
【図12】C言語の字句の分類を示した説明図である。
【図13】図11の識別表示において用いられるアルゴリズムの一例を示したフローチャート図である。
【符号の説明】
1 C言語プログラムソース
2 字句解析部
3 構文解析部
4 関数の参照関係をツリー状に表したファイル
5 必要な情報のみを含んだC言語プログラムソース
6 プログラム表示処理部
7 カラー画面表示装置
8 字句抽出手段
9 字句テーブルリスト生成手段
10 関数定義部・実行部抽出手段
11 表示字句抽出手段
12 関数参照テーブル生成手段
13 出力ファイル生成手段
14 表示制御手段
15 トークン属性1コードデータベース
16 サンプルC言語プログラム
17 関数定義部
18 関数実行部
19 サンプルC言語プログラム
20 関数定義部内部
21 表示字句データベース
31 ユーザ設定手段
80、800〜802 字句テーブル
81 トークン行番号
82 行内オフセット
84 トークン属性2コード
85 文字列実体[トークン]
86 表示スイッチ
87 字句の階層の深さ
88 次の字句テーブルへのポインタ
101 CPU
120 関数参照関係テーブル
121 関数名テーブルヘのポインタ[呼び出す関数]
122 関数名テーブルヘのポインタ[呼び出される関数]
123 文字列実体[関数名]
124 文字列実体[ファイル名]
125 字句テーブルのポインタ
127 ハッシュテーブル
1210 関数名テーブル
1210a〜1210c 関数名テーブル
1211 文字列実体[関数名]
【特許請求の範囲】
【請求項1】 プログラムソースファイルを入力する入力手段と、プログラムソースファイル中の字句解析を行なう字句解析手段と、前記字句が構成する構文の構文解析を行なう構文解析手段と、ユーザが特定字句の識別表示モードを設定するユーザ設定手段と、前記字句解析手段による字句解析および前記構文解析手段による構文解析に基づき、前記ユーザ設定手段によりユーザが設定した識別表示モードに応じて、前記入力手段から入力したプログラムソースファイル中の前記特定字句に関連するコードブロックを他の部分と識別できるよう識別表示する表示制御手段を有することを特徴とするプログラムソース処理装置。
【請求項2】 前記特定字句がC言語におけるメモリ確保および解放関数名であることを特徴とする請求項1に記載のプログラムソース処理装置。
【請求項3】 前記特定字句がC言語における関数定義を構成する字句であることを特徴とする請求項1に記載のプログラムソース処理装置。
【請求項4】 前記識別表示が、前記特定字句に関連するコードブロックのみを表示し、他の部分の表示を省略する処理であることを特徴とする請求項1に記載のプログラムソース処理装置。
【請求項5】 前記識別表示が、前記特定字句に関連するコードブロックの表示色または表示輝度を他の部分の表示色または表示輝度と異なるものとする処理であることを特徴とする請求項1に記載のプログラムソース処理装置。
【請求項6】 前記識別表示が、前記関数定義を構成する字句のみをツリー表示する処理であることを特徴とする請求項3に記載のプログラムソース処理装置。
【請求項7】 プログラムソースファイルを入力する入力工程と、プログラムソースファイル中の字句解析を行なう字句解析工程と、前記字句が構成する構文の構文解析を行なう構文解析工程と、ユーザが特定字句の識別表示モードを設定するユーザ設定工程と、前記字句解析工程による字句解析および前記構文解析工程による構文解析に基づき、前記ユーザ設定工程によりユーザが設定した識別表示モードに応じて、前記入力工程から入力したプログラムソースファイル中の前記特定字句に関連するコードブロックを他の部分と識別できるよう識別表示する表示制御工程を含むことを特徴とするプログラムソース処理方法。
【請求項8】 前記特定字句がC言語におけるメモリ確保および解放関数名であることを特徴とする請求項7に記載のプログラムソース処理方法。
【請求項9】 前記特定字句がC言語における関数定義を構成する字句であることを特徴とする請求項7に記載のプログラムソース処理方法。
【請求項10】 前記識別表示が、前記特定字句に関連するコードブロックのみを表示し、他の部分の表示を省略する処理であることを特徴とする請求項7に記載のプログラムソース処理方法。
【請求項11】 前記識別表示が、前記特定字句に関連するコードブロックの表示色または表示輝度を他の部分の表示色または表示輝度と異なるものとする処理であることを特徴とする請求項7に記載のプログラムソース処理方法。
【請求項12】 前記識別表示が、前記関数定義を構成する字句のみをツリー表示する処理であることを特徴とする請求項9に記載のプログラムソース処理方法。
【請求項13】 プログラムソースファイルを入力する入力工程と、プログラムソースファイル中の字句解析を行なう字句解析工程と、前記字句が構成する構文の構文解析を行なう構文解析工程と、ユーザが特定字句の識別表示モードを設定するユーザ設定工程と、前記字句解析工程による字句解析および前記構文解析工程による構文解析に基づき、前記ユーザ設定工程によりユーザが設定した識別表示モードに応じて、前記入力工程から入力したプログラムソースファイル中の前記特定字句に関連するコードブロックを他の部分と識別できるよう識別表示する表示制御工程を含むことを特徴とするプログラムソース処理プログラム。
【請求項14】 前記特定字句がC言語におけるメモリ確保および解放関数名であることを特徴とする請求項13に記載のプログラムソース処理プログラム。
【請求項15】 前記特定字句がC言語における関数定義を構成する字句であることを特徴とする請求項13に記載のプログラムソース処理プログラム。
【請求項16】 前記識別表示が、前記特定字句に関連するコードブロックのみを表示し、他の部分の表示を省略する処理であることを特徴とする請求項13に記載のプログラムソース処理プログラム。
【請求項17】 前記識別表示が、前記特定字句に関連するコードブロックの表示色または表示輝度を他の部分の表示色または表示輝度と異なるものとする処理であることを特徴とする請求項13に記載のプログラムソース処理プログラム。
【請求項18】 前記識別表示が、前記関数定義を構成する字句のみをツリー表示する処理であることを特徴とする請求項15に記載のプログラムソース処理プログラム。
【図2】
【図3】
【図4】
【図5】
【図12】
【図1】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図13】
【公開番号】特開2002−288004(P2002−288004A)
【公開日】平成14年10月4日(2002.10.4)
【国際特許分類】
物理学 | 計算;計数 | 電気的デジタルデータ処理 | エラー検出;エラー訂正;監視 | 処理順序の正しさを検査することによるもの
【出願番号】特願2001−89034(P2001−89034)
【出願日】平成13年3月27日(2001.3.27)
【出願人】(000001007)キヤノン株式会社
【Fターム(参考)】
デバッグ、監視 | 対象プログラム、装置 | 対象プログラム | 高級言語プログラム
デバッグ、監視 | プログラムデバッグ、プログラムテスト | デバッグ用装置、デバッグプログラム
デバッグ、監視 | プログラムデバッグ、プログラムテスト | プログラムの静的解析
デバッグ、監視 | 表示又は記録する内容 | 使用資源に関する情報、資源使用量
デバッグ、監視 | マンマシンインタフェース | 表示手段 | CRT、ビットマッブディスプレイ
デバッグ、監視 | マンマシンインタフェース | 表示の態様 | カラー表示、色別表示
デバッグ、監視 | マンマシンインタフェース | 表示の態様 | 強調表示、反転表示
[ Back to top ]
