(57)【特許請求の範囲】
【請求項１】
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示であって、前記ソースプログラムにおいて、前記出力指示の種類ごとにデバッグ対象を指定する位置であって前記デバッグ対象に対して予め定められた関係にある位置にある出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる出力命令であって、前記出力指示の種類と位置とに対応して、指定されたデバッグ対象において使用されている変数、関数、仮引数、外部変数又は静的変数を前記ソースプログラムから抽出し、抽出した前記変数、関数、仮引数、外部変数又は静的変数についての情報を収集して出力させる命令を含む実行プログラムを生成する第１の生成部と、
前記実行プログラムを実行することにより、前記実行プログラムの実行結果と、前記出力命令を実行することにより得られる前記実行プログラムのデバッグ情報とを生成する第２の生成部とを含む
ことを特徴とする情報処理システム。
【請求項２】
前記第１の生成部は、前記実行プログラムの生成に先立って、前記ソースプログラムを解析することにより、前記構造化データを生成する
ことを特徴とする請求項１に記載の情報処理システム。
【請求項３】
前記出力指示は、予め定められたコンパイル装置において実行される命令であって、前記予め定められたコンパイル装置以外のコンパイル装置においてはエラーを発生せずかつ実行されない命令である
ことを特徴とする請求項１に記載の情報処理システム。
【請求項４】
前記出力指示は、前記ソースプログラムにおいて、デバッグ対象である文又は式を指定する位置であって前記文又は式に対して予め定められた関係にある位置、デバッグ対象である関数を指定する位置であって前記関数に対して予め定められた関係にある位置、又は、デバッグ対象である外部変数又は静的変数を指定する位置であって前記外部変数又は静的変数に対して予め定められた関係にある位置に含まれる
ことを特徴とする請求項１に記載の情報処理システム。
【請求項５】
コンピュータが、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示であって、前記ソースプログラムにおいて、前記出力指示の種類ごとにデバッグ対象を指定する位置であって前記デバッグ対象に対して予め定められた関係にある位置にある出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる出力命令であって、前記出力指示の種類と位置とに対応して、指定されたデバッグ対象において使用されている変数、関数、仮引数、外部変数又は静的変数を前記ソースプログラムから抽出し、抽出した前記変数、関数、仮引数、外部変数又は静的変数についての情報を収集して出力させる命令を含む実行プログラムを生成し、
前記実行プログラムを実行することにより、前記実行プログラムの実行結果と、前記出力命令を実行することにより得られる前記実行プログラムのデバッグ情報とを生成する
ことを特徴とする情報処理方法。
【請求項６】
ソースプログラムをコンパイル処理することにより実行プログラムを生成する情報処理プログラムであって、
前記情報処理プログラムは、コンピュータに、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示であって、前記ソースプログラムにおいて、前記出力指示の種類ごとにデバッグ対象を指定する位置であって前記デバッグ対象に対して予め定められた関係にある位置にある出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる出力命令であって、前記出力指示の種類と位置とに対応して、指定されたデバッグ対象において使用されている変数、関数、仮引数、外部変数又は静的変数を前記ソースプログラムから抽出し、抽出した前記変数、関数、仮引数、外部変数又は静的変数についての情報を収集して出力させる命令を含む実行プログラムを生成する第１の生成処理と、
前記実行プログラムを実行することにより、前記実行プログラムの実行結果と、前記出力命令を実行することにより得られる前記実行プログラムのデバッグ情報とを生成する第２の生成処理とを実行させる
ことを特徴とする情報処理プログラム。
【請求項７】
ソースプログラムをコンパイル処理することにより実行プログラムを生成する情報処理プログラムを記録する記録媒体であって、
前記情報処理プログラムは、コンピュータに、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示であって、前記ソースプログラムにおいて、前記出力指示の種類ごとにデバッグ対象を指定する位置であって前記デバッグ対象に対して予め定められた関係にある位置にある出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる出力命令であって、前記出力指示の種類と位置とに対応して、指定されたデバッグ対象において使用されている変数、関数、仮引数、外部変数又は静的変数を前記ソースプログラムから抽出し、抽出した前記変数、関数、仮引数、外部変数又は静的変数についての情報を収集して出力させる命令を含む実行プログラムを生成する第１の生成処理と、
前記実行プログラムを実行することにより、前記実行プログラムの実行結果と、前記出力命令を実行することにより得られる前記実行プログラムのデバッグ情報とを生成する第２の生成処理とを実行させる
ことを特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム、情報処理方法、情報処理プログラム、記録媒体に関する。
【背景技術】
【０００２】
コンパイラによって生成された実行プログラムをデバッグする場合、大別して、３つの方法がある。デバッガによるデバッグ、メモリリークやメモリアクセスエラー検出ツール等によるデバッグ、デバッグ用コードによるデバッグの３つである。
【０００３】
デバッガによるデバッグの場合、実行プログラムのコンパイル時における翻訳オプションにより、デバッグ情報の生成を指示するオプションが指定された実行プログラムが生成される。デバッグ情報は、ユーザが実行プログラムをデバッグするための情報である。生成された実行プログラムは、ＧＤＢ等のデバッガを用いて、対話型で、換言すれば、ユーザがデバッグ用コマンドを入力して実行プログラムを動作させることにより、デバッグされる。
【０００４】
また、メモリリークやメモリアクセスエラー検出ツール等によるデバッグの場合、実行プログラムの生成時に、検出に必要なツールのライブラリが結合された実行プログラムが生成される。生成された実行プログラムが実行されると、メモリリークやメモリアクセスエラー等があった場合に、メモリリークやメモリアクセスエラー等の検出メッセージが出力される。ユーザは、検出メッセージを利用して、実行プログラムをデバッグする。
【０００５】
また、デバッグ用コードによるデバッグの場合、ユーザ自身が、ソースプログラムのデバッグしたい箇所に、デバッグ用コードを記述する。例えば、ユーザが、自分で、デバッグ対象のソースプログラムを詳細に検討して、デバッグに必要な変数や通過メッセージ等を抽出し、抽出した変数や通過メッセージ等を出力関数において具体的に記述する。これにより、実行プログラムの実行により、デバッグに必要な変数や通過メッセージ等が出力される。
【０００６】
なお、コンパイル装置において、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳するコード最適化部と、前記指示を、ソースプログラム中より検出する最適化ヒント情報記述検出部と、検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出するエラーチェックポイント検出部と、前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含む最適化ヒント情報記述デバッグ情報を生成する最適化ヒント記述デバッグ情報生成部とを備えることが提案されている。
【０００７】
また、デバッグ方法において、コンパイラは、通常の比較命令に検査項目特定用の識別子を付加したかたちの比較割り込み命令を出力し、デバッグ処理のときには、この比較割り込み命令を実行することによって識別子に対応の検査を行ない、例えば、配列の添字アクセス検査の場合、ソースプログラム（中間テキスト）の検査対象部分に、添字と配列宣言の上限値との比較条件からなる比較割り込み命令が埋め込まれ、デバッグ処理でこの比較条件が成立したときは添字のアクセス侵害が存在すると判断してエラー処理用ライブラリへの割り込みを発生し、また、この比較割り込み命令を用いた高速デバッグ方式と、詳細エラー情報を出力する詳細デバッグ方式とを併用することが提案されている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００６−１５５３８６号公報
【特許文献２】特開平１１−２５９３３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
デバッガによるデバッグは、関数での中断、ステップ実行、変数の値の表示や値の変更等を実行する、フルセットのデバッグである。このため、デバッグに不要な箇所のデバッグ情報も含んだ実行プログラムが必要であり、また、ＧＤＢ等の外部ツールが必要不可欠である。また、デバッグ対象プログラムが大規模プログラム、長時間プログラム又は高並列プログラムである場合、ユーザの負担が大き過ぎて、対話型でのデバッグには限界がある。
【００１０】
また、メモリリークやメモリアクセスエラー等の検出ツール等によるデバッグは、メモリに関するエラー検出を主たる目的とする。このため、エラー検出ツールのライブラリを実行プログラムに結合する必要がある。また、実行性能の問題から、デバッグに使用した実行プログラムを、そのまま実行装置であるコンピュータにおいて実際に運用することはできない。このため、デバッグに使用した実行プログラムとは別に、実際に運用する実行プログラムを生成する必要がある。
【００１１】
また、デバッグ用コードによるデバッグにおいては、ユーザ自身が、実行プログラムのデバッグしたい箇所にデバッグ用コードを組込む。このため、デバッグ用コードをコーディングするユーザの負担が極めて大きい。例えば、ユーザが出力したい変数の値、ファイル名、関数名、行番号等を、ユーザ自身が、デバッグ対象のソースプログラムを分析して抽出し、変数の値等をコーディングの際に具体的に記述する必要がある。また、デバッグ用コードを含んだ実行プログラムを、そのまま実際に実行装置であるコンピュータにおいて運用することはできない。このため、デバッグに使用した実行プログラムとは別に、実際に運用する実行プログラムを生成する必要がある。又は、デバッグ用コードを含んだ実際に運用する実行プログラムにおいて、ユーザが、実行時オプションや環境変数等により、デバッグ用コードの実行を制御する必要がある。
【００１２】
本発明の一側面として、デバッグ用コードの付加による負荷の増大を抑制することを目的とする。
【課題を解決するための手段】
【００１３】
開示される情報処理システムは、一側面によれば、第１の生成部と、第２の生成部とを含む。第１の生成部は、コンパイル処理対象のソースプログラムにデバッグ情報の出力指示であって、ソースプログラムにおいて、出力指示の種類ごとにデバッグ対象を指定する位置であってデバッグ対象に対して予め定められた関係にある位置にある出力指示が含まれる場合に、ソースプログラムの構造を表す構造化データに基づいて、出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる出力命令であって、出力指示の種類と位置とに対応して、指定されたデバッグ対象において使用されている変数、関数、仮引数、外部変数又は静的変数をソースプログラムから抽出し、抽出した変数、関数、仮引数、外部変数又は静的変数についての情報を収集して出力させる命令を含む実行プログラムを生成する。第２の生成部は、実行プログラムを実行することにより、実行プログラムの実行結果と、出力命令を実行することにより得られる実行プログラムのデバッグ情報とを生成する。
【発明の効果】
【００１４】
開示される情報処理システムの一側面によれば、デバッグコードの付加による負荷の増大を抑制することができる。
【図面の簡単な説明】
【００１５】
【図１】コンパイル装置を含む情報処理システムの一例を示す図である。
【図２】組込みデバッグ指示行の一例を示す図である。
【図３】ソースプログラムの一例を示す図である。
【図４】構造化データの一例を示す図である。
【図５】デバッグ情報出力の一例を示す図である。
【図６】コンパイル装置のハードウェアの構成の一例を示す図である。
【図７】コンパイル処理フローである。
【発明を実施するための形態】
【００１６】
図１は、コンパイル装置を含む情報処理システムの一例を示す図である。
【００１７】
情報処理システムは、生成装置１と、コンパイル装置３と、実行装置５とを含む。生成装置１は、ユーザがコンパイル処理対象のソースプログラム２を生成するコンピュータである。コンパイル装置３は、ソースプログラム２をコンパイル処理することにより、実行プログラム４を生成するコンピュータである。実行プログラム４は、ソースプログラム２の実行形式のプログラムである。実行装置５は、実行プログラム４を実行することにより、プログラム実行結果出力６を得るコンピュータである。プログラム実行結果出力６は、実行プログラム４を実行した結果である。
【００１８】
生成装置１は、例えばネットワークを介して、生成したソースプログラム２をコンパイル装置３に送信する。コンパイル装置３は、受信したソースプログラム２を記憶装置に格納し、格納したソースプログラム２を読み出してコンパイル処理して、実行プログラム４を生成する。
【００１９】
コンパイル装置３は、生成した実行プログラム４を記憶装置に格納し、格納した実行プログラム４を読み出して、例えばネットワークを介して、読み出した実行プログラム４を実行装置５に送信する。実行装置５は、受信した実行プログラム４を記憶装置に格納し、格納した実行プログラム４を読み出して実行する。
【００２０】
コンパイル装置３は、コンパイラ３１と、リンカ３８と、ライブラリ３９とを含む。コンパイラ３１は、構文意味解析部３２と、最適化部３５と、コード生成部３６とを含む。コンパイラ３１は、ソースプログラム２に基づいて、構造化データ３３と、中間プログラム３４と、オブジェクトプログラム３７とを生成する。
【００２１】
コンパイル装置３のコンパイラ３１において、構文意味解析部３２は、ソースプログラム２を記憶装置から読み出し、中間プログラム３４の生成に先立って、ソースプログラム２を解析することにより、構造化データ３３を生成する。具体的には、構文意味解析部３２は、ソースプログラム２についての構文解析処理及び意味解析処理を実行することにより、構造化データ３３を生成する。構造化データ３３は、コンパイル装置３以外のコンピュータにより生成されて、コンパイル装置３に入力されるようにしても良い。構造化データ３３は、記憶装置に格納される。
【００２２】
ユーザにより作成されたソースプログラム２は、例えば、コーディング入力された複数のソースコードと、１又は複数の組込みデバッグ指示行２１とを含む。組込みデバッグ指示行２１は、デバッグ情報の出力指示である。具体的には、組込みデバッグ指示行２１は、ユーザによって記述されることでソースプログラム２に組込まれたコードであって、デバッグ情報の収集及び出力を指示するコードである。組込みデバッグ指示行２１は、ソースコードとは異なるコードであり、ソースコードとしては通常用いられないコードであって、予め定められる。デバッグ情報の収集及び出力は、実際には、実行プログラム４を実行する実行装置５に対して指示される。換言すれば、実際のデバッグ情報の収集及び出力は、実行装置５が実行プログラム４を実行することにより実行される。
【００２３】
構文意味解析部３２は、ソースプログラム２を解析することにより、中間プログラム３４を生成する第１の生成部である。具体的には、構文意味解析部３２は、ソースプログラム２についての構文解析処理及び意味解析処理を実行することにより、中間プログラム３４を生成する。中間プログラム３４は中間コードで記述される。従って、構文意味解析部３２は、中間コードを生成するコード生成処理を実行するコード生成部を含む。中間プログラム３４は、記憶装置に格納される。中間プログラム３４は、ソースプログラム２から生成されるプログラムであると言う観点からは、実行プログラムの一形態であると考えることもできる。
【００２４】
なお、実際には、１回の構文解析処理及び意味解析処理により、構造化データ３３及び中間プログラム３４が生成される。換言すれば、構造化データ３３が構文解析処理に基づいて生成されるようにしても良い。
【００２５】
中間プログラム３４の生成において、構文意味解析部３２は、ソースプログラム２に組込みデバッグ指示行２１が含まれる場合に、組込みデバッグ指示行２１に対応するデバッグ情報出力命令３４１を含む中間プログラム３４を生成する。デバッグ情報出力命令３４１は、ソースプログラム２の構造を表す構造化データ３３に基づいて、組込みデバッグ指示行２１が指示する出力対象であるプログラム要素、換言すれば、組込みデバッグ指示行２１が指示するプログラム要素を解析することにより生成される。デバッグ情報出力命令３４１は、デバッグ情報を出力させる命令であり、中間コードで記述される。プログラム要素は、例えば、後述するように、デバッグ対象である文又は式、デバッグ対象である文又は式において使用されている変数又は関数、デバッグ対象である関数、デバッグ対象である関数における仮引数、デバッグ対象である外部変数又は静的変数等である。
【００２６】
最適化部３５は、中間プログラム３４を最適化処理して、最適化処理により得られた最適化された中間プログラム３４を、コード生成部３６に渡す。中間プログラム３４がデバッグ情報出力命令３４１を含む場合、デバッグ情報出力命令３４１も最適化される。
【００２７】
コード生成部３６は、最適化された中間プログラム３４に基づいてオブジェクトコードを生成することにより、オブジェクトプログラム３７を生成する。オブジェクトプログラム３７はオブジェクトコードで記述される。中間プログラム３４がデバッグ情報出力命令３４１を含む場合、オブジェクトプログラム３７は、デバッグ情報出力命令３７１を含む。デバッグ情報出力命令３７１は、デバッグ情報を出力させる命令であり、最適化されたデバッグ情報出力命令３４１に基づいて生成される。
【００２８】
リンカ３８は、オブジェクトプログラム３７と、オブジェクトプログラム３７において指定されたライブラリ３９とをリンクすることにより、実行プログラム４を生成する。実行プログラム４は、実行可能なコードで記述された実行形式のプログラムである。オブジェクトプログラム３７がデバッグ情報出力命令３７１を含む場合、実行プログラム４は、デバッグ情報出力命令４１を含む。デバッグ情報出力命令４１は、デバッグ情報出力命令３７１に基づいて生成される。換言すれば、ソースプログラム２が組込みデバッグ指示行２１を含む場合、実行プログラム４は、組込みデバッグ指示行２１に基づいて生成されたデバッグ情報出力命令４１を含む。
【００２９】
デバッグ情報出力命令４１は、デバッグ情報の収集及び出力を指示する命令であるが、デバッガで実行されることはなく、実行装置５において実行される。換言すれば、デバッグ情報出力命令４１は、実行装置５に対して、デバッグ情報の収集及び出力を指示する命令である。組込みデバッグ指示行２１は、デバッグ情報出力命令４１、換言すれば、実行装置５に対するデバッグ情報の収集及び出力を指示する命令を生成する命令である。また、デバッグ情報出力命令４１の実行により、デバッグ情報が出力される。
【００３０】
以上のように、デバッグ情報出力命令４１を含む実行プログラム４が、中間プログラム３４から生成される。換言すれば、最適化部３５、コード生成部３６、リンカ３８が、中間プログラム３４に基づいて、実行プログラム４を生成する第２の生成部である。
【００３１】
実行装置５は、実行プログラム４を実行することにより、実行プログラム４のプログラム実行結果出力６を得る。実行装置５は、実行プログラム４の実行において、デバッグ情報出力命令４１を、デバッグ情報の収集及び出力であることを意識することなく、他の命令と同様に実行する。
【００３２】
実行プログラム４がデバッグ情報出力命令４１を含む場合、プログラム実行結果出力６は、デバッグ情報出力６１を含む。デバッグ情報出力６１を除くプログラム実行結果出力６は、実行プログラム４のデバッグ情報出力命令４１を除く部分を実行した結果である。デバッグ情報出力６１は、実行プログラム４における予め定められた１又は複数の部分をデバッグした結果である。
【００３３】
以上のように、実行装置５は、実行プログラム４を実行することにより、実行プログラム４のプログラム実行結果出力６と、デバッグ情報出力命令４１を実行することにより得られる実行プログラム４のデバッグ情報出力６１とを生成する。
【００３４】
プログラム実行結果出力６は、例えば１個のファイルとして出力される。デバッグ情報出力６１を、プログラム実行結果出力６のファイルとは独立の別のファイルに出力するようにしても良い。
【００３５】
図２は、組込みデバッグ指示行の一例を示す図である。
【００３６】
組込みデバッグ指示行２１としては、図２（Ａ）に示すように、プラグマ指令「#pragma」が用いられる。プラグマ指令は、Ｃ＋＋言語の規格及びＣ言語の規格において、各々、規定されている指令であり、コンパイラに渡される指令である。従って、プラグマ指令を用いることにより、ソースプログラム２に影響を与えることなく、コンパイラ３１の動作を制御することができる。
【００３７】
組込みデバッグ指示行２１には、図２（Ａ）に示すように、「ｓｔａｔｅｍｅｎｔ」「ｐａｒａｍｅｔｅｒ」「ｇｌｏｂａｌ」の３種類がある。これにより、ソースプログラム２の殆ど全てのプログラム要素についてのデバッグ情報の収集及び出力を指示することができる。
【００３８】
種類が「ｓｔａｔｅｍｅｎｔ」である組込みデバッグ指示行２１は、ユーザが文や式で使われている変数や関数についてのデバッグ情報を出力したい場合に用いられる。換言すれば、種類が「ｓｔａｔｅｍｅｎｔ」である組込みデバッグ指示行２１は、デバッグしたい、換言すれば、デバッグ対象である文又は式を指定し、指定された文又は式において使用されている変数又は関数についてのデバッグを指示する命令である。
【００３９】
組込みデバッグ指示行２１の種類が「ｓｔａｔｅｍｅｎｔ」である場合、構文意味解析部３２は、組込みデバッグ指示行２１に対応するデバッグ情報出力命令３４１として、指定された文又は式において使用されている変数又は関数をソースプログラム２から抽出し、抽出した変数又は関数についての情報を収集する命令を生成する。
【００４０】
デバッグ情報出力命令３４１に基づいて生成されるデバッグ情報出力命令３７１及びデバッグ情報出力命令４１も、デバッグ情報出力命令３４１と同様の命令である。組込みデバッグ指示行２１の種類が「ｐａｒａｍｅｔｅｒ」又は「ｇｌｏｂａｌ」である場合も同様である。
【００４１】
種類が「ｓｔａｔｅｍｅｎｔ」である組込みデバッグ指示行２１は、図２（Ａ）に示すように、例えば、「#pragma builtin_debug statement [変数並び]」のような形式で記述される。組込みデバッグ指示行「#pragma builtin_debug statement [変数並び]」は、例えば、デバッグ対象である文又は式の直前に組み込まれる。これにより、デバッグ対象である文又は式、更には、デバッグ対象である文又は式に記述されている変数や関数が指定される。組込みデバッグ指示行「#pragma builtin_debug statement [変数並び]」から生成されたデバッグ情報出力命令４１により、指定した文又は式に記述されている変数や関数の情報が、ソースプログラム２から収集され、デバッグ情報として出力される。
【００４２】
例えば、ソースプログラム２がＣ＋＋言語で記述されている場合、メンバ関数、コンストラクタ、オペレータ関数、テンプレート関数の情報が、収集されデバッグ情報として出力される。組込みデバッグ指示行「#pragma builtin_debug statement [変数並び]」がブロック文を指定する場合には、指定されたブロック文内に含まれる１又は複数の文又は１又は複数の式で使用されている全ての変数及び関数等のデバッグ情報が出力される。
【００４３】
種類が「ｐａｒａｍｅｔｅｒ」である組込みデバッグ指示行２１は、ユーザが関数の仮引数についてのデバッグ情報を出力したい場合に用いられる。換言すれば、種類が「ｐａｒａｍｅｔｅｒ」である組込みデバッグ指示行２１は、デバッグ対象である関数を指定し、指定された関数における仮引数についてのデバッグを指示する命令である。
【００４４】
組込みデバッグ指示行２１の種類が「ｐａｒａｍｅｔｅｒ」である場合、構文意味解析部３２は、組込みデバッグ指示行２１に対応するデバッグ情報出力命令３４１として、指定された関数における仮引数をソースプログラム２から抽出し、抽出した仮引数についての情報を収集する命令を生成する。
【００４５】
種類が「ｐａｒａｍｅｔｅｒ」である組込みデバッグ指示行２１は、図２（Ａ）に示すように、例えば、「#pragma builtin_debug parameter [変数並び]」のような形式で記述される。組込みデバッグ指示行「#pragma builtin_debug parameter [変数並び]」は、例えば、デバッグ対象である関数の先頭に組み込まれる。これにより、デバッグ対象である関数、更には、デバッグ対象である関数における仮引数が指定される。組込みデバッグ指示行「#pragma builtin_debug parameter [変数並び]」から生成されたデバッグ情報出力命令４１により、仮引数の情報が収集され、デバッグ情報として出力される。
【００４６】
種類が「ｇｌｏｂａｌ」である組込みデバッグ指示行２１は、ユーザが外部変数又は静的変数についてのデバッグ情報を出力したい場合に用いられる。換言すれば、種類が「ｇｌｏｂａｌ」である組込みデバッグ指示行２１は、デバッグ対象である外部変数又は静的変数を指定し、指定された外部変数又は静的変数についてのデバッグを指示する命令である。
【００４７】
組込みデバッグ指示行２１の種類が「ｇｌｏｂａｌ」である場合、構文意味解析部３２は、組込みデバッグ指示行２１に対応するデバッグ情報出力命令３４１として、指定された外部変数又は静的変数をソースプログラム２から抽出し、抽出した外部変数又は静的変数についての情報を収集する命令を生成する。
【００４８】
種類が「ｇｌｏｂａｌ」である組込みデバッグ指示行２１は、図２（Ａ）に示すように、例えば、「#pragma builtin_debug global [変数並び]」のような形式で記述される。組込みデバッグ指示行「#pragma builtin_debug global [変数並び]」は、例えば、組み込まれた位置から可視の外部変数又は静的変数を指定する。組込みデバッグ指示行「#pragma builtin_debug global [変数並び]」よりも前の行で宣言されている変数は、コンパイラ３１に対して可視になっている。これにより、デバッグ対象である可視の外部変数又は静的変数が指定される。組込みデバッグ指示行「#pragma builtin_debug global [変数並び]」から生成されたデバッグ情報出力命令４１により、組み込まれた位置から可視の外部変数又は静的変数が収集され、デバッグ情報として出力される。
【００４９】
組込みデバッグ指示行２１においては、図２（Ｂ）に示すように、「変数並び」を指定することができる。「変数並び」においては、１個の識別子により、変数が指定される。又は、「変数並び」においては、変数を指定する１個の識別子に続けて、更に、「変数並び」を記述することができる。これにより、複数の変数を指定することができる。
【００５０】
「変数並び」が指定されている場合には、実行装置５による組込みデバッグ指示行２１から生成されたデバッグ情報出力命令４１の実行により、「変数並び」により指定された変数のデバッグ情報のみが生成される。「変数並び」の指定は、省略することができる。「変数並び」が指定されていない場合には、実行装置５による組込みデバッグ指示行２１から生成されたデバッグ情報出力命令４１の実行により、組込みデバッグ指示行２１の組み込まれた位置により定まる変数や関数等のデバッグ情報が生成される。
【００５１】
例えば、種類が「ｓｔａｔｅｍｅｎｔ」である組込みデバッグ指示行２１において「変数並び」が指定されている場合には、「変数並び」において指定された変数又は関数のデバッグ情報のみが出力される。種類が「ｐａｒａｍｅｔｅｒ」である組込みデバッグ指示行２１において「変数並び」が指定されている場合には、「変数並び」において指定された仮引数のデバッグ情報のみが出力される。種類が「ｇｌｏｂａｌ」である組込みデバッグ指示行２１において「変数並び」が指定されている場合には、「変数並び」において指定された外部変数又は静的変数のデバッグ情報のみが出力される。
【００５２】
なお、実際には、いずれの種類の組込みデバッグ指示行２１においても、以上に述べたデバッグ情報に加えて、ファイル名、カレントの関数名、行番号が、共に出力される。ファイル名、カレントの関数名、行番号は、出力しないようにしても良い。
【００５３】
図３は、ソースプログラムの一例を示す図である。
【００５４】
例えば、ソースプログラム２は、高級プログラム言語、例えばオブジェクト指向言語であるＣ＋＋言語又はＣ言語により記述される。また、例えば、ソースプログラム２は、３種類の組込みデバッグ指示行２１を含む。具体的には、１９行目、２４行目、２７行目に、各々、組込みデバッグ指示行２１を含む。このように、組込みデバッグ指示行２１をソースプログラム２に埋め込むことができるので、ソースプログラム２を把握している開発者が容易に使用することができ、また、組込みデバッグ指示行２１をルートテスト用としても使用することができる。
【００５５】
図３に示すように、１個のソースプログラム２に含まれる組込みデバッグ指示行２１の数は、１個であっても良く、複数個であっても良い。組込みデバッグ指示行２１の数は、デバッグ対象の数に応じて定まる。
【００５６】
なお、図３のソースプログラム２において、左端の数字は、ソースプログラム２における行数を表す。また、ソースプログラム２の名前は、例えば「sample.cc」である。
【００５７】
組込みデバッグ指示行２１は、予め定められたコンパイル装置３において実行される命令であって、予め定められたコンパイル装置３以外のコンパイル装置においてはエラーを発生せずかつ実行されない命令である。具体的には、組込みデバッグ指示行２１としてプラグマ指令「#pragma」を使用することにより、ソースプログラム２の可搬性を保障することができる。換言すれば、ソースプログラム２は、コンパイラ３１以外のコンパイラでコンパイルされても、エラーを発生しない。
【００５８】
組込みデバッグ指示行２１は、ソースプログラム２において、デバッグ対象である文又は式を指定する位置であって文又は式に対して予め定められた関係にある位置、デバッグ対象である関数を指定する位置であって関数に対して予め定められた関係にある位置、又は、デバッグ対象である外部変数又は静的変数を指定する位置であって外部変数又は静的変数に対して予め定められた関係にある位置に含まれる。組込みデバッグ指示行２１の位置については後述する。
【００５９】
従って、ソースプログラム２において、組込みデバッグ指示行２１の記述される位置、換言すれば、組込みデバッグ指示行２１が組込まれる位置は、ソースプログラム２のコーディングの際に、ユーザにより定められる。換言すれば、組込みデバッグ指示行２１が組込まれる位置は、ユーザによりデバッグ対象の部分の位置に応じて定められる。これにより、ユーザは、ソースプログラム２において、自分がデバッグ対象とした箇所のみを、デバッグすることができる。
【００６０】
１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」は、種類が「ｐａｒａｍｅｔｅｒ」の組込みデバッグ指示行２１である。種類が「ｐａｒａｍｅｔｅｒ」の組込みデバッグ指示行２１は、前述したように、デバッグ対象である関数を指定し、指定された関数における仮引数についてのデバッグを指示する。一方、１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」は、１７行目から始まる関数funcにおいて、先頭の位置に指定されている。従って、１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」は、１７行目の関数funcを指定し、関数funcの仮引数paramのデバッグを指示するデバッグ情報出力命令であると言うことができる。
【００６１】
２４行目の組込みデバッグ指示行「#pragma builtin_debug global」は、種類が「ｇｌｏｂａｌ」の組込みデバッグ指示行２１である。種類が「ｇｌｏｂａｌ」の組込みデバッグ指示行２１は、前述したように、デバッグ対象である外部変数又は静的変数を指定し、指定された外部変数又は静的変数についてのデバッグを指示する。一方、２４行目の組込みデバッグ指示行「#pragma builtin_debug global」からは、２行目の「int data=10」及び５行目の「int data=20」が可視である。従って、２４行目の組込みデバッグ指示行「#pragma builtin_debug global」は、ソースプログラム２に含まれる可視の外部変数又は静的変数である２行目の「data=10」及び５行目の「data=20」のデバッグを指示するデバッグ情報出力命令であると言うことができる。
【００６２】
２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」は、種類が「ｓｔａｔｅｍｅｎｔ」の組込みデバッグ指示行２１である。種類が「ｓｔａｔｅｍｅｎｔ」の組込みデバッグ指示行２１は、前述したように、デバッグ対象である文又は式を指定し、指定された文又は式において使用されている変数又は関数についてのデバッグを指示する。一方、２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」は、２８行目の「ret = clsobj+data;」の直前に組み込まれている。従って、２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」は、２８行目の「ret = clsobj+data;」のデバッグを指示するデバッグ情報出力命令であると言うことができる。
【００６３】
以上のように、コンパイラ３１の構文意味解析部３２がデバッグ情報を出力するためのコードを生成するため、ユーザは、デバッグ用のソースプログラム２をコーディングしたりコンパイルする必要がない。また、ソースプログラム２が変更された結果、デバッグ対象の変数等が増加した場合に、ユーザは、ソースプログラム２を再度コーディングする必要がなく、ソースプログラム２をリコンパイルするだけで、デバッグ対象の増加に対応したデバッグ情報を出力することができる。更に、コンパイル可能なソースプログラム２であれば、どのようなソースプログラム２でも、どのような文又は式でも、デバッグ情報を出力することができる。
【００６４】
図４は、構造化データの一例を示す図である。
【００６５】
コンパイラ３１の構文意味解析部３２は、構文解析処理に基づいて、図３に示すソースプログラム２から、図４に示す構造化データ３３を生成する。
【００６６】
具体的には、構文意味解析部３２は、ソースプログラム２の名前「sample.cc」に基づいて、「sample.cc」というコンパイルの単位「CompileUnit」を抽出する。「CompileUnit」は、ソースプログラム２のデータ構造における最上位の階層である。
【００６７】
更に、構文意味解析部３２は、「CompileUnit」の１つ下位の階層として、名前空間、クラス等のタイプ、using文、関数等を抽出する。
【００６８】
具体的には、「CompileUnit」の１つ下位の階層として、最初に、１行目の「namespace NS1 {」と３行目の「};」とに基づいて、「NS1」という「Namespace」が抽出される。
【００６９】
更に、構文意味解析部３２は、「Namespace」の１つ下位の階層として、変数等を抽出する。具体的には、２行目の「int data=10;」は、「NS1」という「Namespace」内に「｛｝」で囲まれている。従って、「int data=10;」に基づいて、「NS1」という「Namespace」の１つ下位の階層として、「data=10」という「Variable」が抽出される。
【００７０】
同様に、「CompileUnit」の１つ下位の階層として、４行目の「namespace NS2 {」と６行目の「};」とに基づいて、「NS2」という「Namespace」が抽出される。また、５行目の「int data=20;」に基づいて、「NS2」という「Namespace」の１つ下位の階層として、「data=20」という「Variable」が抽出される。
【００７１】
次に、「CompileUnit」の１つ下位の階層として、８行目の「class CLS {」と１３行目の「};」とに基づいて、「CLS」という「Type」が抽出される。
【００７２】
更に、構文意味解析部３２は、クラス等の「Type」の１つ下位の階層として、変数等を抽出する。具体的には、１０行目の「int mem;」、及び、１１行目の「int operator + (int i) ....;」は、「CLS」という「Type」内に「｛｝」で囲まれている。従って、１０行目の「int mem;」に基づいて、「CLS」という「Type」の１つ下位の階層として、「mem」という「Member」が抽出される。また、１１行目の「int operator + (int i) ....;」に基づいて、「CLS」という「Type」の１つ下位の階層として、「operator + (int)」という「Member」が抽出される。なお、１０行目と１１行目は、クラスにおけるデータメンバ又はメンバ関数であり、階層構造として抽出される。また、９行目と１２行目は、クラスにおけるキーワード等であり、階層構造として抽出されず、無視される。
【００７３】
次に、「CompileUnit」の１つ下位の階層として、１５行目の「using namespace NS1;」に基づいて、「NS1」という「using namespace」が抽出される。
【００７４】
次に、「CompileUnit」の１つ下位の階層として、１７行目の「int func(int param)」、１８行目の「{」及び３１行目の「}」に基づいて、「func(int)」という「Function」が抽出される。１９行目〜３１行目は、「func(int)」という「Function」内に「｛｝」で囲まれている。従って、１９行目〜３１行目は、「func(int)」という「Function」の下位の階層として抽出される。
【００７５】
更に、構文意味解析部３２は、関数の１つ下位の階層として、パラメータ、プラグマ指令、変数、文又は式等を抽出する。
【００７６】
具体的には、「func(int)」という「Function」内において、１７行目の「int func(int param)」に基づいて、「func(int)」という「Function」の１つ下位の階層として、「param」という「Parameter」が抽出される。また、１９行目の「#pragma builtin_debug parameter」に基づいて、「func(int)」という「Function」の１つ下位の階層として、「builtin_debug parameter」という「Pragma」が抽出される。従って、プラグマ指令は、関数Function内において、データ構造という観点からはパラメータや変数と同列である。
【００７７】
また、２１行目の「CLS clsobj;」に基づいて、「func(int)」という「Function」の１つ下位の階層として、「clsobj」という「Variable」が抽出される。また、２２行目の「int ret=0;」に基づいて、「func(int)」という「Function」の１つ下位の階層として、「ret」という「Variable」が抽出される。また、２４行目の「#pragma builtin_debug global」に基づいて、「func(int)」という「Function」の１つ下位の階層として、「builtin_debug global」という「Pragma」が抽出される。
【００７８】
また、２６行目の「if (param && data) {」と２９行目の「}」とに基づいて、「func(int)」という「Function」の１つ下位の階層として、「if (param && data)」という「Statement」が抽出される。２７行目〜２８行目は、「if (param && data)」という「Statement」内に「｛｝」で囲まれている。従って、２７行目〜２８行目は、「if (param && data)」という「Statement」の下位の階層として抽出される。
【００７９】
更に、「if (param && data)」という「Statement」内において、２８行目の「ret=clsobj+data;」に基づいて、「if (param && data)」という「Statement」の１つ下位の階層として、「ret=clsobj+data」という「Statement」が抽出される。
【００８０】
また、２７行目の「#pragma builtin_debug statement」に基づいて、「builtin_debug statement」という「Pragma」が抽出される。２７行目の「#pragma builtin_debug statement」は、２８行目の「ret=clsobj+data;」についてのデバッグ指示行であるので、２８行目の１つ下位の階層とされる。従って、２７行目と２８行目とでは、行の位置の上下と階層の上下とが逆転している。
【００８１】
更に、構文意味解析部３２は、ソースプログラム２がオブジェクト指向言語であるので、各階層の間における関連を抽出し、抽出した階層の間を関連付ける。
【００８２】
具体的には、２８行目から生成された階層「ret=clsobj+data;」に含まれる「ret」は、同一の名前を持つので、２２行目から生成された「ret」である。そこで、２８行目から生成された階層に含まれる「ret」が２２行目から生成された「ret」であることを構造的に表現するために、図４に点線で示すように、２８行目から生成された階層に含まれる「ret」と２２行目から生成された「ret」とが関連付けられる。同様に、２８行目から生成された階層に含まれる「clsobj」と２１行目から生成された「clsobj」とが、図４に点線で示すように、関連付けられる。
【００８３】
また、２８行目から生成された階層に含まれる「+」は、加算を定義する演算子である。クラスにおいて加算に関連するデータメンバ又はメンバ関数は、１１行目から生成された「operator + (int)」である。そこで、２８行目から生成された階層に含まれる「+」と１１行目から生成された「operator + (int)」とが、図４に点線で示すように、関連付けられる。
【００８４】
また、１５行目のusing文において「NS1」という「Namespace」を使用することを宣言しているので、２８行目から生成された階層に含まれる「data」は、「NS1」という「Namespace」における「data=10」という「Variable」、換言すれば、２行目から生成された「data=10」である。そこで、２８行目から生成された階層に含まれる「data」と２行目から生成された「data=10」とが、図４に点線で示すように、関連付けられる。
【００８５】
以上のような構文意味解析部３２による構文解析処理により、図３に示すソースプログラム２から、図４に示す構造化データ３３が得られる。
【００８６】
図５は、デバッグ情報出力の一例を示す図である。
【００８７】
実行装置５は、図３に示すソースプログラム２から生成された実行プログラム４を実行して、図５に示すプログラム実行結果出力６を得る。プログラム実行結果出力６は、デバッグ情報出力６１を含む。
【００８８】
プログラム実行結果出力６において、１行目〜２行目は、実行プログラム４のデバッグ情報出力命令４１を除く部分を実行した結果である。３行目〜１２行目は、デバッグ情報出力６１であり、デバッグ情報出力命令４１を実行した結果である。
【００８９】
プログラム実行結果出力６において、実行プログラム４の実行時におけるデバッグ情報出力６１の出力の有無は、環境変数、換言すれば、フラグにより制御される。フラグの値は、例えば、ソースプログラム２の生成時に、ユーザにより例えばソースプログラム２において指定される。なお、ソースプログラム２のコンパイル処理に先立って、フラグの値を指定するようにしても良い。
【００９０】
構文意味解析部３２は、フラグの値が「０」である場合には、ソースプログラム２に含まれた組込みデバッグ指示行２１をコンパイルしない。従って、中間プログラム３４にはデバッグ情報出力命令３４１が含まれず、実行プログラム４にはデバッグ情報出力命令４１が含まれず、実行装置５によりデバッグ情報出力６１が出力されない。構文意味解析部３２は、フラグの値が「１」である場合には、ソースプログラム２に含まれた組込みデバッグ指示行２１をコンパイルする。従って、中間プログラム３４にはデバッグ情報出力命令３４１が含まれ、実行プログラム４にはデバッグ情報出力命令４１が含まれ、実行装置５によりデバッグ情報出力６１が出力される。
【００９１】
これにより、実行プログラム４の実行時に、デバッグ情報の出力の有無を制御することができる。従って、デバッグ用のコードである組込みデバッグ指示行２１を含んだままのソースプログラム２を、フラグの値を「１」から「０」に変更するのみで実際の運用において使用することができ、また、運用時における実行速度への影響も少なくすることができる。
【００９２】
フラグの値は、例えば、プログラム実行結果出力６において、１行目の最後尾に出力される。図５においては、フラグの値が「１」であるので、プログラム実行結果出力６がデバッグ情報出力６１を含む状態で出力される。これにより、ユーザは、プログラム実行結果出力６に含まれるプログラム実行結果出力６以外の部分がデバッグ情報出力６１であるか否かを知り、また、デバッグの結果を知ることができる。
【００９３】
プログラム実行結果出力６の２行目には、プログラム実行結果出力６の出力先のファイルの名前が出力される。換言すれば、実行プログラム４のデバッグ情報出力命令４１を除く部分を実行した結果は、「a.out」というファイルに出力される。
【００９４】
構文意味解析部３２は、組込みデバッグ指示行２１を解析する第１の解析処理を実行し、組込みデバッグ指示行２１の指示対象を解析する第２の解析処理を実行し、第１及び第２の解析処理に基づいてデバッグ情報出力命令３４１を生成する。
【００９５】
例えば、デバッグ情報出力６１において、３行目〜４行目は、ソースプログラム２における１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」から生成されたデバッグ情報出力命令４１を実行した結果である。具体的には、ソースプログラム２の１７行目の関数funcの仮引数paramのデバッグ情報が出力される。
【００９６】
構文意味解析部３２は、組込みデバッグ指示行「#pragma builtin_debug parameter」が、１９行目に記述されていることを解析し、更に、この解析に基づいて、図３を参照して前述したように、１７行目の関数funcを指定し、関数funcの仮引数paramのデバッグを指示することを解析する。
【００９７】
そこで、以上の解析に基づいて、構文意味解析部３２は、１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」から、１７行目の関数funcの仮引数paramについての全ての情報をソースプログラム２の内部から収集して出力するデバッグ情報出力命令３４１を生成する。これにより、実行プログラム４には、１７行目の関数funcの仮引数paramについての情報を収集して出力するデバッグ情報出力命令４１が含まれる。
【００９８】
実行装置５は、１９行目の組込みデバッグ指示行「#pragma builtin_debug parameter」から生成されたデバッグ情報出力命令４１を実行することにより、１７行目の関数funcの仮引数paramについての情報を収集して、デバッグ情報として出力する。
【００９９】
次に、デバッグ情報出力６１において、５行目〜７行目は、ソースプログラム２における２４行目の組込みデバッグ指示行「#pragma builtin_debug global」から生成されたデバッグ情報出力命令４１を実行した結果である。具体的には、ソースプログラム２の２行目及び５行目の可視の外部変数又は静的変数「data=10」及び「data=10」のデバッグ情報が出力される。
【０１００】
構文意味解析部３２は、組込みデバッグ指示行「#pragma builtin_debug global」が、２４行目に記述されていることを解析し、更に、この解析に基づいて、図３を参照して前述したように、可視の外部変数又は静的変数である２行目の「data=10」及び５行目の「data=10」のデバッグを指示する命令であることを解析する。
【０１０１】
そこで、以上の解析に基づいて、構文意味解析部３２は、２４行目の組込みデバッグ指示行「#pragma builtin_debug global」から、２行目及び５行目の可視の外部変数又は静的変数「data=10」及び「data=10」についての全ての情報をソースプログラム２の内部から収集して出力するデバッグ情報出力命令３４１を生成する。これにより、実行プログラム４には、２行目及び５行目の可視の外部変数又は静的変数「data=10」及び「data=10」についての情報を収集して出力するデバッグ情報出力命令４１が含まれる。
【０１０２】
実行装置５は、２４行目の組込みデバッグ指示行「#pragma builtin_debug global」から生成されたデバッグ情報出力命令４１を実行することにより、２行目及び５行目の可視の外部変数又は静的変数「data=10」及び「data=10」についての情報を収集して、デバッグ情報として出力する。
【０１０３】
次に、デバッグ情報出力６１において、８行目〜１２行目は、ソースプログラム２における２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」から生成されたデバッグ情報出力命令４１を実行した結果である。具体的には、ソースプログラム２の２８行目の「ret = clsobj+data;」のデバッグ情報が出力される。
【０１０４】
構文意味解析部３２は、組込みデバッグ指示行「#pragma builtin_debug statement」が、２７行目に記述されていることを解析し、更に、この解析に基づいて、図３を参照して前述したように、２８行目の「ret = clsobj+data;」のデバッグを指示する命令であることを解析する。
【０１０５】
そこで、以上の解析に基づいて、構文意味解析部３２は、２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」から、２８行目の「ret = clsobj+data;」についての全ての情報をソースプログラム２の内部から収集して出力するデバッグ情報出力命令３４１を生成する。これにより、実行プログラム４には、２８行目の「ret = clsobj+data;」についての情報を収集して出力するデバッグ情報出力命令４１が含まれる。
【０１０６】
デバッグ情報出力命令３４１の生成において、構文意味解析部３２は、更に、構造化データ３３を参照する。これにより、構文意味解析部３２は、デバッグ対象である「ret = clsobj+data;」が、２行目の変数「data」、１１行目のオペレータ関数「CLS::operator +(int)」、２１行目の変数「clsobj」、２２行目の変数「ret」に、各々、関連付けられていることを知る。そこで、構文意味解析部３２は、デバッグ情報出力命令３４１として、単に２８行目の「ret = clsobj+data;」の情報を収集して出力するのみでなく、これに加えて、変数「ret」、変数「clsobj」、変数「data」、オペレータ関数「CLS::operator +(int)」についての情報を収集して出力する命令を生成する。
【０１０７】
実行装置５は、２７行目の組込みデバッグ指示行「#pragma builtin_debug statement」から生成されたデバッグ情報出力命令４１を実行することにより、２８行目の「ret = clsobj+data;」についての情報を収集して、デバッグ情報として出力する。
【０１０８】
この時、ソースプログラム２の２８行目の「ret = clsobj+data;」において使用されている、変数「clsobj」、変数「ret」、変数「data」のデバッグ情報が出力される。ここで、変数「clsobj」は、クラス型のためクラス名を表示している。また、変数「data」は、「NS1」という「Namespace」と「NS2」という「Namespace」の双方で定義されているが、１５行目のusing文により 「NS1」という「Namespace」で定義されているdataが参照されていることを表している。１２行目の「CLS::operator +(int)」は、ＣＬＳクラスで宣言されたオペレータ関数が使用されたことを表している。これは、「clsobj+data」の加算演算が、実際には、オペレータ関数「CLS::operator +(int)」が使用されている、換言すれば、呼び出されているためである。
【０１０９】
なお、ソースプログラム２に含まれる複数の組込みデバッグ指示行２１の中で、特定の組込みデバッグ指示行２１に基づくデバッグ情報のみを出力するようにしても良い。この場合、例えば、制御用関数インタフェースが設けられ、その関数内において、例えば、「char builtin_debug_table[]={“test.c:17”, “test.c:26”};のように、ファイル名と行番号が規定の配列の初期値として指定される。これにより、特定の組込みデバッグ指示行２１についてのデバッグ情報のみを出力することができる。
【０１１０】
以上のように、実行装置５がデバッグ情報出力命令４１を実行することによりデバッグ情報を出力するので、デバッグ用の外部ツールやデバッグ用のライブラリ等を何ら用いることなく、デバッグ情報を収集し出力することができる。また、コンパイル装置３がデバッグ情報出力命令４１を生成するので、ユーザは、デバッグ情報出力命令４１をコーディングする必要がない。
【０１１１】
また、例えば、ソースプログラム２がＣ＋＋言語で記述されたプログラムである場合、ユーザは、識別子解決結果、関数のオーバーロード／オーバーライドの解決結果、ソースプログラム２において記述された式のコンパイラ３１における解析結果や解決結果を、デバッグ情報として知ることができる。例えば、識別子解決結果は、どのネームスペースの識別子を参照したのかを示す。関数のオーバーロード／オーバーライドの解決結果は、例えばオペレータ演算子を含む。ソースプログラム２において記述された式は、例えばテンプレート関数等を含む。
【０１１２】
図６は、コンパイル装置のハードウェアの構成の一例を示す図である。
【０１１３】
ＣＰＵ１０１は、ＲＯＭ１０２に格納された制御プログラムに従って、コンパイル装置３を制御する。ＣＰＵ１０１は、例えば主メモリであるＲＡＭ１０３上のコンパイルプログラムを実行する。これにより、コンパイラ３１及びリンカ３８が実現される。コンパイルプログラムは、例えば、ＣＤ−ＲＯＭやＤＶＤ等の記録媒体１０９に格納され、記録媒体１０９からハードディスク１０６に入力され、ハードディスク１０６からＣＤ−ＲＯＭドライブやＤＶＤドライブ等を介してＲＡＭ１０３にロードされる。
【０１１４】
プログラム及びデータ格納部は、例えばハードディスク１０６に設けられ、ソースプログラム２、構造化データ３３、中間プログラム３４、オブジェクトプログラム３７、ライブラリ３９、実行プログラム４を格納する。換言すれば、プログラム及びデータは、例えばハードディスク１０６に格納される。ライブラリ３９は、例えば、ＣＤ−ＲＯＭやＤＶＤ等の記録媒体１０９に格納され、記録媒体１０９からＣＤ−ＲＯＭドライブやＤＶＤドライブ等を介してハードディスク１０６に入力され、必要に応じてハードディスク１０６からＲＡＭ１０３にロードされ、リンカ３８により処理される。構造化データ３３、中間プログラム３４、オブジェクトプログラム３７、実行プログラム４は、コンパイラ３１又はリンカ３８により生成される。
【０１１５】
入力装置１０４は、例えばキーボードであり、マウス等を含んでも良い。出力装置１０５は、例えばディスプレイであり、プリンタ等の出力装置を含んでも良い。ＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３、入力装置１０４、出力装置１０５、及び、ハードディスク１０６、ネットワーク接続部１０７は、バス１０８を介して、相互に接続される。
【０１１６】
ネットワーク接続部１０７は、例えば、送受信装置であり、ネットワークに接続され、ネットワークを介して他のコンピュータ、例えば生成装置１及び実行装置５に接続される。これにより、コンパイル装置３は、生成装置１及び実行装置５との間で通信を行う。ソースプログラム２は、例えば、生成装置１からネットワークを介してハードディスク１０６に入力され、必要に応じてハードディスク１０６からＲＡＭ１０３にロードされ、コンパイラ３１及びリンカ３８により処理される。実行プログラム４は、コンパイル装置３からネットワークを介して実行装置５に送信され実行される。
【０１１７】
図７は、コンパイラ３１が実行するコンパイル処理フローであって、特に、ソースプログラムからデバッグ情報出力命令を含む中間プログラムを生成する処理フローを示す。
【０１１８】
コンパイル装置３において、コンパイラ３１がソースプログラム２を読込むと（ステップＳ１）、構文意味解析部３２が、読み込まれたソースプログラム２の字句解析処理を実行し（ステップＳ２）、字句解析処理の結果に基づいて、読み込まれたソースプログラム２の構文解析処理及び意味解析処理を実行する（ステップＳ３）。構文解析処理及び意味解析処理により、ソースプログラム２の構造化データ３３が生成される。
【０１１９】
構文意味解析部３２は、ソースプログラム２の先頭から順に１行ずつコードを抽出し、抽出した行において組込みデバッグ指示行２１が指定されているか否かを判断する（ステップＳ４）。組込みデバッグ指示行２１が指定されていない場合には（ステップＳ４  Ｎｏ）、構文意味解析部３２は、ステップＳ３を繰り返す。
【０１２０】
組込みデバッグ指示行２１が指定されている場合には（ステップＳ４  Ｙｅｓ）、構文意味解析部３２は、組込みデバッグ指示行２１の種類が「ｓｔａｔｅｍｅｎｔ」であるか、「ｐａｒａｍｅｔｅｒ」 であるか、「ｇｌｏｂａｌ」であるかを判断する（ステップＳ５）。
【０１２１】
次に、構文意味解析部３２は、組込みデバッグ指示行２１において「変数並び」が指定されているか否かを判断し、更に、指定されている場合には、その変数が宣言されているか否かを検査する（ステップＳ６）。
【０１２２】
一方、ステップＳ６において、組込みデバッグ指示行２１において「変数並び」が指定されていない場合は、構文意味解析部３２は、組込みデバッグ指示行２１が指定された位置に基づいて、ソースプログラム２において指定されている変数や関数を調べる（ステップＳ７）。
【０１２３】
次に、構文意味解析部３２は、変数や関数のデバッグ情報を収集し出力するための命令を生成し、併せてファイル名、関数名、行番号の情報出力命令も生成する（ステップＳ８）。
【０１２４】
次に、構文意味解析部３２は、図５に示す環境変数、換言すれば、フラグを判定条件として用いて、組込みデバッグ指示行２１の中間コードであるデバッグ情報出力命令３４１を生成する（ステップＳ９）。
【０１２５】
次に、構文意味解析部３２は、ソースプログラム２における全ての行の処理を終了したか否かを判断する（ステップＳ１０）。全ての行の処理を終了していない場合には（ステップＳ１０  Ｎｏ）、構文意味解析部３２は、ステップＳ３を繰り返す。全ての行の処理を終了した場合には（ステップＳ１０  Ｙｅｓ）、構文意味解析部３２は、処理を終了する。
【０１２６】
以上の説明から理解されるように、以下のような実施の態様が把握される。
【０１２７】
（付記１）  コンパイル処理対象のソースプログラムにデバッグ情報の出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる命令を含む実行プログラムを生成する第１の生成部と、
前記ソースプログラムのコンパイル処理結果として、前記実行プログラムの実行可否を判定する命令を含む実行プログラムを生成する第２の生成部とを含む
ことを特徴とするコンパイル装置。
【０１２８】
（付記２）  前記第１の生成部は、前記出力指示を解析する第１の解析処理を実行し、前記出力指示の指示対象を解析する第２の解析処理を実行し、前記第１及び第２の解析処理に基づいて前記デバッグ情報出力命令を生成する
ことを特徴とする付記１に記載のコンパイル装置。
【０１２９】
（付記３）  前記第１の生成部は、前記実行プログラムの生成に先立って、前記ソースプログラムを解析することにより、前記構造化データを生成する
ことを特徴とする付記１に記載のコンパイル装置。
【０１３０】
（付記４）  前記出力指示は、予め定められたコンパイル装置において実行される命令であって、前記予め定められたコンパイル装置以外のコンパイル装置においてはエラーを発生せずかつ実行されない命令である
ことを特徴とする付記１に記載のコンパイル装置。
【０１３１】
（付記５）  前記出力指示は、前記ソースプログラムにおいて、デバッグ対象である文又は式を指定する位置であって前記文又は式に対して予め定められた関係にある位置、デバッグ対象である関数を指定する位置であって前記関数に対して予め定められた関係にある位置、又は、デバッグ対象である外部変数又は静的変数を指定する位置であって前記外部変数又は静的変数に対して予め定められた関係にある位置に含まれる
ことを特徴とする付記１に記載のコンパイル装置。
【０１３２】
（付記６）  前記出力指示は、デバッグ対象である文又は式を指定し、指定された前記文又は式において使用されている変数又は関数についてのデバッグを指示する命令である
ことを特徴とする付記５に記載のコンパイル装置。
【０１３３】
（付記７）  前記第１の生成部は、前記出力指示に対応する前記デバッグ情報出力命令として、前記ソースプログラムから指定された前記文又は式において使用されている変数又は関数を抽出し、抽出した前記変数又は関数についての情報を収集する命令を生成する
ことを特徴とする付記６に記載のコンパイル装置。
【０１３４】
（付記８）  前記出力指示は、デバッグ対象である関数を指定し、指定された前記関数における仮引数についてのデバッグを指示する命令である
ことを特徴とする付記５に記載のコンパイル装置。
【０１３５】
（付記９）  前記第１の生成部は、前記出力指示に対応する前記デバッグ情報出力命令として、前記ソースプログラムから指定された前記関数における仮引数を抽出し、抽出した前記仮引数についての情報を収集する命令を生成する
ことを特徴とする付記８に記載のコンパイル装置。
【０１３６】
（付記１０）  前記出力指示は、デバッグ対象である外部変数又は静的変数を指定し、指定された前記外部変数又は静的変数についてのデバッグを指示する命令である
ことを特徴とする付記５に記載のコンパイル装置。
【０１３７】
（付記１１）  前記第１の生成部は、前記出力指示に対応する前記デバッグ情報出力命令として、前記ソースプログラムから指定された前記外部変数又は静的変数を抽出し、抽出した前記外部変数又は静的変数についての情報を収集する命令を生成する
ことを特徴とする付記１０に記載のコンパイル装置。
【０１３８】
（付記１２）  前記ソースプログラムは、オブジェクト指向言語であるＣ＋＋言語又はＣ言語により記述され、前記出力指示は、前記Ｃ＋＋言語の規格及びＣ言語においてコンパイラに渡される指令として規定されているプラグマ指令である
ことを特徴とする付記１に記載のコンパイル装置。
【０１３９】
（付記１３）  ソースプログラムをコンパイル処理することにより実行プログラムを生成するコンパイル装置と、
前記実行プログラムを実行する実行装置とを含む情報処理システムであって、
前記コンパイル装置は、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる命令を含む実行プログラムを生成する第１の生成部と、
前記ソースプログラムのコンパイル処理結果として、前記実行プログラムの実行可否を判定する命令を含む実行プログラムを生成する第２の生成部とを含み
前記実行装置は、前記実行プログラムを実行することにより、前記実行プログラムの実行結果と、前記デバッグ情報出力命令を実行することにより得られる前記実行プログラムのデバッグ情報とを生成する
ことを特徴とする情報処理システム。
【０１４０】
（付記１４）  コンパイル処理対象のソースプログラムにデバッグ情報の出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる命令を含む実行プログラムを生成し、
前記ソースプログラムのコンパイル処理結果として、前記実行プログラムの実行可否を判定する命令を含む実行プログラムを生成する
ことを特徴とするコンパイル方法。
【０１４１】
（付記１５）  ソースプログラムをコンパイル処理することにより実行プログラムを生成するコンパイルプログラムであって、
前記コンパイルプログラムは、コンピュータに、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる命令を含む実行プログラムを生成する第１の生成処理と、
前記ソースプログラムのコンパイル処理結果として、前記実行プログラムの実行可否を判定する命令を含む実行プログラムを生成する第２の生成処理とを実行させる
ことを特徴とするコンパイルプログラム。
【０１４２】
（付記１６）  ソースプログラムをコンパイル処理することにより実行プログラムを生成するコンパイルプログラムを記録する記録媒体であって、
前記コンパイルプログラムは、コンピュータに、
コンパイル処理対象のソースプログラムにデバッグ情報の出力指示が含まれる場合に、前記ソースプログラムの構造を表す構造化データに基づいて、前記出力指示の出力対象であるプログラム要素を解析することにより生成したデバッグ情報を出力させる命令を含む実行プログラムを生成する第１の生成処理と、
前記ソースプログラムのコンパイル処理結果として、前記実行プログラムの実行可否を判定する命令を含む実行プログラムを生成する第２の生成処理とを実行させる
ことを特徴とする記録媒体。
【符号の説明】
【０１４３】
１    生成装置
２    ソースプログラム
３    コンパイル装置
４    実行プログラム
５    実行装置
６    プログラム実行結果出力
３１    コンパイラ
３２    構文意味解析部
３３    構造化データ
３４    中間プログラム
３５    最適化部
３６    コード生成部
３７    オブジェクトプログラム
３８    リンカ
３９    ライブラリ
６１    デバッグ情報出力
【図１】
0005974444.tif 000002
【図２】
0005974444.tif 000003
【図３】
0005974444.tif 000004
【図４】
0005974444.tif 000005
【図５】
0005974444.tif 000006
【図６】
0005974444.tif 000007
【図７】
0005974444.tif 000008