(57)【要約】【課題】共通コードのサブルーチン化における共通コード部分にブレイクポイントを設定してソースコードレベルでのデバッグを実行可能にする。【解決手段】プログラムのソースコードに基づいて実行コードを形成する途中の中間コードに含まれる共通コードをサブルーチン化する（３４）。上記サブルーチン化に際し、上記ソースコード上の、サブルーチン化の対象となった部分に対応するデバッグ情報における行番号に対応する機械コードのアドレスを、上記サブルーチン化した機械コードのアドレスに変更する（３５）。そして上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報を設定する。上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、その共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報を参照して判定する（３５）。【選択図】図３
2014035737.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのソースコードに基づいて実行コードを形成する途中の中間コードに含まれる共通コードをサブルーチン化することで上記プログラムを集約するとともに、上記サブルーチン化に際し、上記ソースコード上の、サブルーチン化の対象となった部分に対応するデバッグ情報における行番号に対応する機械コードのアドレスを、上記サブルーチン化した機械コードのアドレスに変更し、且つ、上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報を設定する第１処理と、
上記プログラムのソースレベルでのデバッグにおけるブレイクポイントの設定箇所が上記サブルーチン化された共通コードであれば、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、この到達した共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報を参照して判定する第２処理と、をコンピュータで実行するデバッグ方法。
【請求項２】
上記呼び出し元情報は、上記サブルーチン化された共通コードからその共通コードの呼び出し元に戻る際の戻り番地である請求項１記載のデバッグ方法。
【請求項３】
上記第１処理は、コンパイラ、アセンブラ、又はリンカによって実行される請求項２記載のデバッグ方法。
【請求項４】
上記第２処理は、ソースコード上の行番号と、ソースレベルの行番号に対応する機械コードのアドレスの集合を行番号情報とするとき、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際のアドレスを取得し、設定済みのブレイクポイントに対応する行番号情報を巡回して、上記ブレイクポイントに対応する共通コードに到達した際のアドレスと一致するか否かを判別する第３処理と、
上記ブレイクポイントに対応する共通コードに到達した際のアドレスと一致する行番号情報に、上記戻り番地情報が追加されているか否かを判別する第４処理と、
上記行番号情報に上記戻り番地情報が追加されている場合に、その戻り番地が実際の戻り番地と一致するか否かを判別する第５処理と、を含む請求項３記載のデバッグ方法。
【請求項５】
上記行番号情報の戻り番地情報を追加する欄が、ブレイクポイントに対応する行を判断するに必要な段数分だけ拡張された場合、上記第３処理では、設定済みのブレイクポイントに対応する行番号情報を、追加された戻り番地の段数が多い順に巡回する請求項４記載のデバッグ方法。
【請求項６】
上記第５処理は、上記行番号に記載の戻り番地情報を、記載された段数分、実際の戻り番地と照合して、その全てが一致した場合に、上記行番号情報に記載の戻り番地に到達したと判断する請求項５記載のデバッグ方法。
【請求項７】
上記呼び出し元情報は、上記サブルーチン化されたコードの呼び出しアドレスとされ、上記第２処理では、共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記関数呼び出しアドレスの一つ前のアドレスに基づいて判定する請求項１記載のデバッグ方法。
【請求項８】
プログラムのソースコードに基づいて実行コードを形成する途中の中間コードに含まれる共通コードをサブルーチン化することで上記プログラムを集約するとともに、上記サブルーチン化に際し、上記ソースコード上の、サブルーチン化の対象となった部分に対応するデバッグ情報における行番号に対応する機械コードのアドレスを、上記サブルーチン化した機械コードのアドレスに変更し、且つ、上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報を設定する第１処理と、
上記プログラムのソースレベルでのデバッグにおけるブレイクポイントの設定箇所が上記サブルーチン化された共通コードであれば、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、この到達した共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報を参照して判定する第２処理と、をコンピュータに実行させるための言語処理系。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ対象プログラムをソースレベルでデバッグするためのデバッグ方法、及び所定の言語で記述されたプログラムをコンピュータで実行するためのソフトウエア（「言語処理系」という）に関する。
【背景技術】
【０００２】
特許文献１には、プログラムデバッグ装置及びプログラムデバッグ方法が記載されている。プログラムデバッグ装置は、プログラムをデバッグするための情報を格納するコンパイル部と、生成されたデバッグ情報を格納するデバッグ情報記憶部と、記憶されたデバッグ情報を用いてデバッグを行うデバッグ部とを有する。コンパイル部は、最適化部デバッグ情報生成部と、デバッグ情報生成部とを含む。
【０００３】
特許文献２には、きめ細かなブレイクポイント設定を可能にすることで、柔軟なデバッグ環境を得るためのデバッガのブレイク方法及びデバッガが記載されている。
【０００４】
特許文献３には、関数をまたいで共通コードを集約することによって、プログラムサイズを小さくするための技術が記載されている。それによれば、関数αを実現するコード列中のコード列Αと、関数βを実現するコード列中のコード列Βについて、コード列Αとコード列Βが等価か調べ、等価であるとき、シンボル表に登録されたコード列Β中のアドレスをコード列Α中の対応するアドレスに書換える。そして、プログラム中にあるコード列Β中のアドレスへのジャンプ命令をコード列Α中の対応するアドレスへのジャンプ命令に書換え、コード列Βを破棄することでプログラムを圧縮する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−２０４２０４号公報
【特許文献２】特開平５−２１６７１９号公報
【特許文献３】特開２００２−９９４２３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
プログラムサイズを小さくするため、例えば特許文献３に記載されているように、共通コードをサブルーチンとして切り出して集約する最適化（「共通コードのサブルーチン化」という）を行うと、集約された共通コードは、複数のソースコードに対応する。このため、このような最適化をおこなう際には、デバッグ情報（正確には、機械コードのいずれがソースコードのいずれに対応するのかを示す行番号情報）の出力方法に配慮する必要がある。さもないと、設定先のソースコードが、集約する最適化の適用対象になっていた場合、集約先のコードを共有している別のソースコードのところで、プログラムの実行が停止するといった問題が生じうる。その原因は、ソースコードと機械コードとの対応付けをするために使われる情報に、集約した箇所の実行が集約前のいずれに対応するかの判別に必要な情報が入っていないため、プログラム実行を停止すべきか否かデバッガが判断できないためである。つまり、従来の行番号情報は、基本的には二つ組み（ソースコード上の行番号と、ソースレベルの行番号に対応する機械コードのアドレスの集合）であり、同一の機械コードのアドレスに複数のソースコード上の行番号を対応づけると、当該機械コードの実行時に、対応するソースコードのいずれを実行しているのか判別できなくなる。
【０００７】
この問題を回避するため、上記のように共通コードのサブルーチン化が行われる場合には、その共通コード部分では、ブレイクポイントの設定ができないように制限する必要がある。このような制限については、特許文献１，２，３においても考慮されていない。
【０００８】
尚、従来の行番号情報の実装に、共通コードのサブルーチン化とは逆の操作を行う最適化であるインライン展開（関数の内容を呼出し元に展開する最適化）を考慮したものがある。例えばＪａｖａ（登録商標）仮想機械の実装の１つであるＨｏｔＳｐｏｔ仮想機械では、インライン展開した部分がどの呼出し元から呼び出した、どの関数のどこに相当するか求めることができるようになっている。しかしこれは従来の行番号情報のペアの「ソースコード上の行番号」の部分を拡張して呼び出しの経緯を定かにできるようにしたもので、一つの機械コードのアドレスを複数のソースコードに対応づけられるようにしたものではない。
【０００９】
その他の課題と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１０】
課題を解決するための手段のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１１】
言語処理系は、プログラムのソースコードに基づいて実行コードを形成する途中の中間コードに含まれる共通コードをサブルーチン化することで上記プログラムを集約する。そして上記サブルーチン化に際し、上記ソースコード上の、サブルーチン化の対象となった部分に対応するデバッグ情報における行番号に対応する機械コードのアドレスを、上記サブルーチン化した機械コードのアドレスに変更する。さらに上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報を設定する。そのような設定が行われた後のデバッグにおいて、デバッガは上記設定を行ったデバッグ情報を入力として受け取り、上記プログラムのソースレベルでのデバッグにおけるブレイクポイントの設定箇所が上記サブルーチン化された共通コードであれば、上記呼び出し元に対応するブレイクポイントであるか否かを上記呼び出し元情報を基に判定する。つまり、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、この到達した共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報を参照して判定する。
【発明の効果】
【００１２】
課題を解決するための手段のうち代表的なものによって得られる効果を簡単に説明すれば下記の通りである。
【００１３】
すなわち、共通コードのサブルーチン化における共通コード部分にブレイクポイントを設定してソースコードレベルでのデバッグを行うことができる。
【図面の簡単な説明】
【００１４】
【図１】言語処理系を実行するコンピュータシステムの構成例ブロック図である。
【図２】言語処理系の構成例ブロック図である。
【図３】コンパイラにおける共通コードのサブルーチン化処理の説明図である。
【図４】ソースコードとそれに対応する中間表現の説明図である。
【図５】共通コードのサブルーチン化（最適化）後の中間表現の説明図である。
【図６】ブレイクポイントに対応するソースコードの行番号を求める処理のフローチャートである。
【図７】ソースコードとそれに対応する中間表現の説明図である。
【図８】共通コードのサブルーチン化（最適化）後の中間表現の説明図である。
【図９】共通コードのサブルーチン化（最適化）後の中間表現の説明図である。
【図１０】ブレイクポイントに対応するソースコードの行番号を求める処理のフローチャートである。
【図１１】言語処理系の構成例ブロック図である。
【図１２】アセンブラにおける共通コードのサブルーチン化処理のフローチャートである。
【図１３】リンカにおける共通コードのサブルーチン化処理のフローチャートである。
【発明を実施するための形態】
【００１５】
１．実施の形態の概要
先ず、本願において開示される代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１６】
〔１〕代表的な実施の形態に係るデバッグ方法は、第１処理と第２処理とをコンピュータ（１）に実行させるものである。
【００１７】
上記第１処理では、先ず、プログラムのソースコードに基づいて実行コードを形成する途中の中間コードに含まれる共通コードをサブルーチン化することで上記プログラムを集約する（３４）。次に、上記サブルーチン化に際し、上記ソースコード上の、サブルーチン化の対象となった部分に対応するデバッグ情報における行番号に対応する機械コードのアドレスを、上記サブルーチン化した機械コードのアドレスに変更する（３５）。そして上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報を設定する（３５）。
【００１８】
上記第２処理では、上記プログラムのソースレベルでのデバッグにおけるブレイクポイントの設定箇所が上記サブルーチン化された共通コードであれば、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、この到達した共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報を参照して判定する（６１〜６５）。
【００１９】
上記のデバッグ方法によれば、上記デバッグ情報に、上記サブルーチン化されたコードの呼び出し元を特定可能な呼び出し元情報が設定されるので、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際に、この到達した共通コードが、上記呼び出し元に対応するブレイクポイントであるか否かを、上記呼び出し元情報に基づいて把握することができる。これにより、共通コードのサブルーチン化における共通コード部分にブレイクポイントを設定してソースコードレベルでのデバッグを行うことができる。
【００２０】
〔２〕上記呼び出し元情報は、例えば上記サブルーチン化された共通コードからその共通コードの呼び出し元に戻る際の戻り番地である。この場合、サブルーチン化された共通コードからの戻り番地情報に基づいて、ブレイクポイントに達したか否かが判別可能になる。
【００２１】
〔３〕上記第１処理は、コンパイラ（２１）、アセンブラ（１２１）、又はリンカ（２２）によって実行することができる。
【００２２】
〔４〕上記第２処理は、ソースコード上の行番号と、ソースレベルの行番号に対応する機械コードのアドレスの集合を行番号情報とするとき、以下の第３処理、第４処理、第５処理を含む。
【００２３】
上記第３処理では、上記プログラムの実行が上記ブレイクポイントに対応する共通コードに到達した際のアドレスが取得され、設定済みのブレイクポイントに対応する行番号情報と、上記ブレイクポイントに対応する共通コードに到達した際のアドレスとが一致するか否かが判別される。例えばソースレベルデバッガ（２３）は、デバッグに際して、ユーザによって設定されたブレイクポイント一式（「設定済みのブレイクポイント」という）を集合として保持しており、デバッグのためのプログラムの実行の過程で、設定済みのブレイクポイントに対応する命令に到達すると、到達したブレイクポイントのアドレスを取得する（６１）。そして、設定済みのブレイクポイントに対応する行番号情報の巡回を開始し（６２）、設定済みのブレイクポイントに対応する行番号情報と、上記ブレイクポイントに対応する共通コードに到達した際のアドレスとが一致するか否かを判別する（６３）。
【００２４】
上記第３処理で、設定済みのブレイクポイントに対応する行番号情報と、上記ブレイクポイントに対応する共通コードに到達した際のアドレスとが一致すると判断された場合、上記第４処理では、上記ブレイクポイントに対応する共通コードに到達した際のアドレスと一致する行番号情報に、上記戻り番地情報が追加されているか否かの判別が行われる（６４）。
【００２５】
上記第４処理で、上記ブレイクポイントに対応する共通コードに到達した際のアドレスと一致する行番号情報に、上記戻り番地情報が追加されていると判断された場合、上記第５処理では、戻り番地情報その戻り番地が実際の戻り番地と一致するか否かの判別が行われる（６５）。
【００２６】
上記第５処理で、上記行番号情報に追加されている戻り番地が実際の戻り番地と一致すると判断された場合、上記プログラムの実行が、上記行番号情報に記載の行に到達したと判断することができる。
【００２７】
上記第１処理、第２処理、第３処理、第４処理、第５処理によれば、サブルーチン化されたコードを対象に、ソースコードにブレイクポイントを設定してソースコードレベルでのデバッグを行う際に、上記呼び出し元情報（戻り番地情報）に基づいて、ブレイクポイントに達したか否かを容易に判別することができる。
【００２８】
〔５〕実施の形態２に詳述されているように、上記行番号情報の戻り番地情報を追加する欄を、ブレイクポイントに対応する行を判断するに必要な段数分だけ拡張することができる。上記行番号情報の戻り番地情報を追加する欄が拡張された場合、上記第３処理では、設定済みのブレイクポイントに対応する行番号情報を、追加された戻り番地の段数が多い順に巡回するようにする。このような処理は、実施の形態２に対応するもので、例えば同一の機械命令に対応する行番号情報が複数あり、その一方に戻り番地情報が付与されていて、他方に戻り番地情報が付与されていない状況下で、戻り番地が追加されていない行番号情報での誤判断を回避する上で有利とされる。
【００２９】
〔６〕上記〔５〕において、上記行番号に記載の戻り番地情報の一部が異なる場合の誤判断を回避するには、上記第５処理において、上記行番号に記載の戻り番地情報を、記載された段数分、実際の戻り番地と照合して、その全てが一致した場合に、上記行番号情報に記載の戻り番地に到達したと判断すると良い。
【００３０】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００３１】
《実施の形態１》
図１には、言語処理系を実行するコンピュータシステム（計算機システム）が示される。
【００３２】
図１に示されるコンピュータシステム１は、プロセッサ１０、主記憶装置１１、ハードディスク１３、ＤＶＤ−ＲＯＭ（Digital Versatile Disc Read Only Memory）読取り置１２と、これらを結ぶバス１４とを含む。
【００３３】
プロセッサ１０は、主記憶装置１１に読み込まれたプログラム（ソフトウェア）を実行する。ハードディスク１３には、所定の言語で記述されたプログラムをコンピュータで実行するためのソフトウエアとされる言語処理系１８がインストールされている。言語処理系１８のインストールは、記録媒体の一例とされるＤＶＤ−ＲＯＭから行われる。つまり、言語処理系が記録されたＤＶＤ−ＲＯＭが、ＤＶＤ−ＲＯＭ読取り装置１２に装着された状態で、ＤＶＤ−ＲＯＭ内の言語処理系が、バス１４を介してハードディスク１３にインストールされる。
【００３４】
尚、言語処理系１８のインストールは、コンピュータシステム１のネットワークインターフェースを介して行うことも可能である。
【００３５】
ハードディスク１３にインストールされた言語処理系１８は、バス１４を介して主記憶装置１１に読み込まれて、プロセッサ１０で実行される。言語処理系１８が実行されることにより、プログラミング言語で記述されたプログラムのソースコード１５に基づいてオブジェクトコード（中間コード）１６が生成され、さらに実行コード１７が生成される。
【００３６】
図２には、言語処理系１８の構成例が示される。
【００３７】
言語処理系１８は、特に制限されないが、コンパイラ２１、リンカ２２、ソースレベルデバッガ２３を含む。コンパイラ１８は、プロセッサ１０で実行されることにより、ソースコードを入力として受け取ってオブジェクトコード２８を出力する。リンカ２２は、プロセッサ１０で実行されることにより、オブジェクトコード２８に、必要なライブラリなどを付加することにより実行可能な実行コード３０を形成する。この実行コード３０にはデバッグ情報３１（デバッグ情報２９と等価）が含まれる。ソースレベルデバッガ２３は、プロセッサ１０で実行されることにより、ソースコード１５と実行コード３０に基づいて、ソースコード１５のデバッグを支援する。
【００３８】
先ず、コンパイラ２１での処理について説明する。
【００３９】
コンパイラ２１は、前処理部２４、最適化部２５、コード生成部２７を含む。前処理部２４は、コンパイル処理によってオブジェクトコードを生成する。最適化部２５は、前処理部２４での前処理結果を取り込んで、共通コードのサブルーチン化処理２６を行うことで最適化する。コード生成部２７は、上記最適化部２５での最適化処理結果に基づいてオブジェクトコード２８を生成する。このオブジェクトコード２８には、デバッグ情報２９が含まれる。
【００４０】
図３には、コンパイラ２１における共通コードのサブルーチン化処理２６の流れが示される。
【００４１】
共通コードのサブルーチン化処理２６では、最適化前の中間表現（前処理部２４での処理結果）３１を取り込んで、共通コードがサブルーチン化される（３４）。すなわち、前処理部２４から出力されたオブジェクトコードのファイル内の複数の関数間で共通コードが存在するか否かを判別し、共通コードが発見された場合に、その共通部分をサブルーチンとして切り出して集約する。つまり、共通部分をサブルーチン化することにより、関数の重複記述を排除することで、プログラムを圧縮する。そして、サブルーチン化された部分のデバッグ情報についてソースレベルの行番号に対応する機械コードのアドレスが更新され、このデバッグ情報に上記サブルーチン化に対応する戻り番地情報が追加される（３５）。ここで、戻り番地情報は、呼び出し元情報の一例とされ、それは「集約元に固有な情報」とされる。上記ステップ３５の処理では、上記ステップ３４のサブルーチン化処理を行う前のデバッグ情報３２が取り込まれ、変換前の行番号情報、つまり、行番号に対応する機械コードのアドレスを表わすラベルとが、機械コードのアドレスを表わすラベルを生成したサブルーチン内のものに更新される。そして、集約元に固有な情報として、「サブルーチンの呼出元への戻り番地を表わすラベル」が追加される。これにより、デバッグ情報３７は、「行番号」、「機械コード」、「サブルーチン呼出元への戻り番地」の３つ組にされる。そのようなデバッグ情報３７を含んで最適化後の中間表現３６が得られる。
【００４２】
図４には、ソースコードとそれに対応する中間表現の例が示され、図５には、共通コードのサブルーチン化（最適化）後の中間表現の例が示される。中間表現には、コード部分とデバッグ情報とが含まれる。主記憶装置１１又はハードディスク１３内には、このような中間表現が記憶されており、この記憶された中間表現は、プロセッサ１０によって参照したり、書き換えたりすることができる。
【００４３】
図４に示されるソースコードをみると、関数boo()、関数foo()の両者に共通して、関数呼出しb()とc()を続けて行う箇所があることが判る。共通コードのサブルーチン化処理２６では、このように共通コードが存在する箇所が検出されて、サブルーチン化により集約される。実際、最適化前（図４）と最適化後（図５）の中間表現を比較すると、最適化後の中間表現では関数呼出しb()とc()を続けて行う箇所が切り出されて、関数shared()に集約され、集約前にこれらのコードがあった箇所には、関数shared()の呼出し（call shared）が配置されている。そしてこのような最適化の適用に伴って、デバッグ情報が次のように更新される。
【００４４】
例えばソースコードの３行目にある関数呼出しb()に対応する行番号情報は、最適化前（図４参照）の時点で（3,L3）である。ここで、「3,L3」は、ソースコードの３行目のコードに中間表現のラベル「L3」の位置が対応していることを意味する。このような行番号情報は、最適化後（図５参照）には、（3,L3or7,L5）になっている。すなわち、ラベルが集約前の「L3」から「L3or7」に更新され、更に、戻り番地情報としてラベルL5が追加されている。「3,L3or7」は、ソースコードの３行目の中間表現のラベルが「L3or7」の位置に対応していることを示している。ただし、それが成立するのは、戻り番地情報として設定されているラベル「L5」のときだけである。換言すれば、戻り番地情報として、設定されているラベルが「L5」であることを条件に、ソースコードの３行目のコードに、中間表現のラベル「L3or7」の位置が対応する。尚、戻り番地情報は、ソースコードと中間表現のラベルとの対応関係の成立条件とされ、後に詳述するように、ブレイクポイントに到達したか否かの判別の際に参照される。
【００４５】
同様に、ソースコードの４行目にある関数呼出しc()に対応する行番号情報は、最適化前（図４参照）の時点で（4,L4）であったものが、最適化後（図５参照）には（4,L4or8,L5）になっている。すなわち、ラベルが集約前のL4からL4or8に更新され、更に、戻り番地情報としてラベルL5が追加されている。
【００４６】
また、ソースコードの７行目にある関数呼出しb()に対応する行番号情報は、最適化前（図４参照）の時点で（7,L7）であったものが、最適化後（図５参照）には（7,L3or7,L9）になっている。すなわち、ラベルが集約前のL7からL3or7に更新され、更に、戻り番地情報としてラベルL9が追加されている。
【００４７】
さらに、ソースコードの8行目にある関数呼出しc()に対応する行番号情報は、最適化前（図４参照）の時点で（8,L8）であったものが、最適化後（図５参照）には（8,L4or8,L9）になっている。すなわち、ラベルが集約前のL8からL4or8に更新され、更に、戻り番地情報としてラベル「L9」が追加されている。
【００４８】
上記のように最適化の適用に伴ってデバッグ情報が更新された後に、コード生成部２７によって、オブジェクトコード２８が形成され、リンカ２２により、実行コード３０が形成される。実行コード３０が形成されると、ソースレベルデバッガ２３によるデバッグ処理が行われる。
【００４９】
ソースレベルデバッガ２３でのデバッグ処理は次のように行われる。
【００５０】
共通コードをサブルーチン化したコードを対象にソースコードレベルでのデバッグを行う場合、ソースコードにおける着目箇所にブレイクポイントを任意に設定することができる。例えば図４のソースコードの３行目にある関数呼出しb()にブレイクポイントを設定すると、ソースレベルデバッガ２３は、図５のデバッグ情報から３行目に対応するコードがラベル「L3or7」の位置にあると判断してラベル「L3or7」の位置にブレイクポイントを設定する。しかし、プログラムの実行がラベル「L3or7」に到達したからといって必ずしもプログラムの実行がソースコードの３行目に到達したとはいえない。なぜなら、ラベル「L3or7」はソースコードの３行目と７行目の双方に対応しているからである。
【００５１】
そこで、ソースレベルデバッガ２３は、プログラム実行がブレイクポイントに到達した時点で、それがソースコードの何行目に当たるのかを、次のように判別する。
【００５２】
図６には、ブレイクポイントに対応するソースコードの行番号を求める処理の流れが示される。
【００５３】
ソースレベルデバッガ２３は、デバッグに際して、ユーザによって設定されたブレイクポイント一式（設定済みのブレイクポイント）を集合として、メモリなどの適宜の保持手段に保持しており、デバッグの開始時に、当該ブレイクポイントに対応する機械命令に実行が到達したら連絡するよう、プログラムに設定しておく。これにより、デバッグのためのプログラムの実行の過程で、設定済みのブレイクポイントに対応する命令に到達すると、そのことがソースレベルデバッガ２３に連絡される。ソースレベルデバッガ２３は、この連絡を受けて、到達したブレイクポイントのアドレスを取得し（６１）、設定済みのブレイクポイントに対応する行番号情報の巡回を開始する（６２）。もし、未巡回の行番号情報が無い場合には、デバッグ処理において、何らかのエラーが発生していることが考えられるので、所定のエラー処理が行われる（６７）。未巡回の行番号情報がある場合、行番号情報と到達したブレイクポイントのアドレスとが一致するか否かの判別が行われる（６３）。この判別において、行番号情報と到達したブレイクポイントのアドレスとが一致する（Ｙｅｓ）と判断された場合には、デバッグ情報における行番号情報に、戻り番地情報（戻り番地対応するラベル）が追加されているか否かの判別が行われる（６４）。この判別において、行番号情報に戻り番地情報が追加されている（Ｙｅｓ）と判断された場合には、行番号情報に記載の戻り番地が、実際の戻り番地と一致するか否かの判別が行われる（６５）。この判別において、行番号情報に記載の戻り番地が、共通コードのサブルーチンからの実際の戻り番地と一致する（Ｙｅｓ）と判断された場合には、当該行番号に記載の行に到達したと判断され（６６）、かかるブレイクポイントにおいてプログラム実行が停止される。そして、到達したブレイクポイントに対応するソースコードの行番号が求められる。
【００５４】
また、上記ステップ６４において、行番号情報に戻り番地情報が追加されていない（Ｎｏ）と判断された場合にも、当該行番号に記載の行に到達したと判断される。戻り番地情報が追加されていない場合、上記ステップ６５の判別は不要となるためである。
【００５５】
さらに、上記ステップ６３において、行番号情報と到達したブレイクポイントのアドレスとが一致しない（Ｎｏ）と判断された場合や、上記ステップ６５において、行番号情報に記載の戻り番地が、実際の戻り番地と一致しないと判断された場合には、上記ステップ６２の処理に戻る。
【００５６】
このように、到達したブレイクポイントのアドレスと、ブレイクポイントとを設定した箇所の行番号情報とが一致したなら、当該行番号情報に戻り番地情報が追加されているか否かを調べ、追加されているならば、実際の戻り番地と比較し、それらが一致していた場合に当該行番号情報に記述されている行に到達したと判断する。そしてその行番号情報により、それがソースコードの何行目かを知ることができる。つまり、デバッグ情報に、集約した箇所の実行が集約前のいずれに対応するかの判別に必要な情報が入っているため、プログラム実行を停止すべきか否かデバッガが判断できる。従って、この実施の形態１によれば、共通コードのサブルーチン化が行われるにもかかわらず、その共通コード部分でブレイクポイントが設定された場合のデバッグ処理を適切に行うことができる。
【００５７】
《実施の形態２》
既存の関数αの全体が他の関数βの一部である場合、関数β中の共通部を関数αの呼び出しに変更する方が、関数αとβの双方から共通部を切り出してそれぞれの切出し元に共通部の呼び出しに埋め込むより効果的だが、実施の形態１の構成では、これに対応できない（第１の制限事項）。
【００５８】
また、実施の形態１の構成では、共通コードのサブルーチン化を再帰的に適用する場合、つまりサブルーチン化したコードも含めて再度、共通コードのサブルーチン化を適用する場合に対応できない（第２の制限事項）。
【００５９】
まず、第１の制限事項について説明する。
【００６０】
図７のソースコードをみると、関数boo(),foo(),woo()のいずれもが関数呼出しb()に続いて関数呼出しc()を行っており、この部分を共通部分とみなせることと、関数woo()が共通部分のみから構成されていることが判る。このような場合には、図５に示されるように、共通部分を切り出した新たな関数shared()を作って全ての切出し元に関数shared()の呼出しを埋め込むよりも、図７に示されるように、関数boo(),foo()の共通部を関数woo()の呼び出しに置き換える方が効果的である。このような置き換えに際して、関数boo()、foo()内の置き換えた箇所に相当するデバッグ情報は、実施の形態１と同様に更新できるが、このとき、関数woo()内のコードに対応する行番号情報をデバッグ時にどう解釈するのかが重要になる。
【００６１】
図８には、共通コードのサブルーチン化後の中間表現が示される。
【００６２】
関数woo()自体には手を加えていないので、サブルーチン化後には、図８に示されるように、関数woo()内のコードに対応する行番号情報には修正が入っていないが、他の関数の行番号情報に修正が入った結果、関数woo()内のコードのラベル、例えば「L14」が複数の行番号情報から参照されるようになっている。このため、デバッグ時にラベル「L14」にブレイクポイントを設定して、そこで停止した場合、それがどの行番号に対応するのか判断する必要がある。この判断に実施の形態１の図６の処理を使うと結果を誤り得る。その原因は、図６に示される処理では、戻り番地が追加されていない行番号情報をみると即、その行番号情報に記載された行に到達したと判断してしまう（ステップ６４，６６）点にある。つまり、図８に示されるように同一のラベルに対応して戻り番地の追加された行番号情報と追加されていない行番号情報がある場合に、図６に示されるフローチャートの手順で処理を行うと、例えば実際に到達したのが３行目であっても、先にラベルが同一の「L14」で、なおかつ戻り番地が追加されていない１４行目の行番号情報が存在するため、「１４行目に到達した」と誤判断する。このような誤判断を防ぐには、ソースレベルデバッガ２３が何行目に到達したか判断する際に、例えば、戻り番地が追加された行番号情報を先にチェックすればよい。
【００６３】
次に、第２の制限事項について説明する。
【００６４】
図７のソースコードをみると、関数boo()と関数foo()内に共通して連続した関数呼出しb(),c(),d()があるので、これを切り出して関数shared()を作成する。その後、関数shared()と関数woo()に共通して連続した関数呼出しb(),c()があると判ったのでこれも切り出す（この場合、関数woo()の全体が共通部なので関数shared()内にある共通部を関数呼出しwoo()に置き換える）場合について考えてみる。
【００６５】
関数boo()からその８行目に相当するコード、つまり関数woo()内のラベル「L14」に到達するためには２段の関数呼出しを経由することになるが、このような場合、実施の形態１における図５のように、戻り番地を一つだけ追加できる形式の行番号情報では、ブレイクポイントに対応する行を判断する根拠になれない。このような場合にも対応可能にするためには、行番号情報の戻り番地を追加する欄を、図９に示されるように拡張し、判断に必要な段数分だけ戻り番地を記入できるようにする。例えば「[L6,L5orL10]」という記述は、２段の戻り番地を示している。
【００６６】
図１０には、上記第１の事情、第２の事情を考慮して、ブレイクポイントに対応するソースコードの行番号を求める処理の流れが示される。
【００６７】
図１０に示される処理が、図６に示される処理と大きく相違するのは、ステップ６２，６５の処理である。すなわち、図１０におけるステップ６２では、設定済みのブレイクポイントに対応する行番号情報を、追加された戻り番地の段数が多い順に巡回し、未巡回の行番号情報があるか否かの判別が行われる。また、図１０におけるステップ６５では、行番号情報に記述の戻り番地を、記載された段数分、実際の戻り番地と照合し、その全てが一致したか否かの判別が行われる。
【００６８】
このように、図１０に示される処理では、行番号情報を、追加された戻り番地の段数の多いものから順に、行番号情報をチェックすることになるため、戻り番地が追加されていない行番号情報での誤判断を回避することができる。また、図１０に示される処理は、行番号情報に記載された段数分だけ戻り番地を比較することで、サブルーチン化したコードも含めて再度、共通コードのサブルーチン化を適用する場合に対応させることができる。
【００６９】
尚、コンパイラ２１での共通コードのサブルーチン化処理では、第１の事情及び第２の事情への対応に際して大幅な変更は必要ない。例えば行番号情報の返戻値を記入する欄が配列に変更になることにともなう修正が必要になるのみである。
【００７０】
《実施の形態３》
実施の形態１，２では、集約元に固有な情報（読み出し元情報）として、集約元への戻り番地を行番号情報に追加しているが、集約元に固有な情報は戻り番地に限ったものではなく、例えば集約元に挿入した、集約先の関数を呼び出す関数呼出しのアドレスを利用することもできる。その場合、ソースレベルデバッガ２３は、ブレイクポイントに到達したか否かの判定を行う際に、呼出元の関数呼出しのアドレスから算出する必要が生じる。この算出処理は、戻り番地を元にその１つ前の命令のアドレスを求めることでも実現できるし、デバッガが関数呼出しの履歴をトレースしているのであれば、その履歴から求めることでも実現できる。
【００７１】
《実施の形態４》
図１１には、言語処理系１８の別の構成例が示される。
【００７２】
図１１に示される言語処理系１８が、図２に示されるのと大きく相違するのは、コンパイラ１８でのコンパイル処理によってアセンブリコード１２３が生成され、アセンブラ１２１によってオブジェクトコード２８が生成されている点である。上記アセンブリコード１２３には、デバッグ情報１２４が含まれる。このような構成において、アセンブラ１２１において、共通コードのサブルーチン化処理を行うことができる。
【００７３】
図１２には、アセンブラ１２１における共通コードのサブルーチン化処理の流れが示される。
【００７４】
アセンブラ１２１における共通コードのサブルーチン化処理１２１は、コンパイラ２１における共通コードのサブルーチン化処理２６（図３参照）と同様の処理とされる。
【００７５】
図１２に示されるサブルーチン化処理では、アセンブリコード１２３を取り込んで、共通コードがサブルーチン化され（１３２）、共通コードが発見された場合に、その共通部分がサブルーチンとして切出されて集約される。そして、サブルーチン化された部分のデバッグ情報についてソースレベルの行番号に対応する機械コードのアドレスが更新され、上記サブルーチン化に対応する戻り番地情報が追加される（１３３）。上記ステップ１３３の処理では、上記ステップ１３２のサブルーチン化処理を行う前のデバッグ情報１２４が取り込まれ、変換前の行番号情報、つまり、行番号と、それに対応する機械コードのアドレスを表わすラベルとが、機械コードのアドレスを表わすラベルを生成したサブルーチン内のものに更新される。そして、集約元に固有な情報として、「サブルーチンの呼出元への戻り番地を表わすラベル」が追加される。これにより、オブジェクトコード２８内のデバッグ情報２９は、「行番号」、「機械コード」、「サブルーチン呼出元への戻り番地」の３つ組にされる。
【００７６】
このように、アセンブラ１２１において共通コードのサブルーチン化処理を行うようにしても、得られる実行コードは、実施の形態１の場合と同様であり、実施の形態１の場合と同様の作用効果を得ることができる。
【００７７】
《実施の形態５》
リンカ２２は、本来、オブジェクトコード２８に、必要なライブラリなどを付加することにより実行可能な実行コード３０を形成するものであるが、このリンカ２２において共通コードのサブルーチン化処理を行うことができる。
【００７８】
図１３には、リンカ２２における共通コードのサブルーチン化処理の流れが示される。
【００７９】
リンカ２２における共通コードのサブルーチン化処理１２１は、コンパイラ２１における共通コードのサブルーチン化処理２６（図３参照）と同様の処理とされる。
【００８０】
図１３に示されるサブルーチン化処理では、複数のオブジェクトコード２８Ａ，２８Ｂを取り込んで、共通コードのサブルーチン化処理１４１が行われる。この共通コードのサブルーチン化処理１４１では、先ず、共通コードがサブルーチン化され（１４２）、共通コードが発見された場合に、その共通部分をサブルーチンとして切出されて集約される。そして、サブルーチン化された部分のデバッグ情報についてソースレベルの行番号に対応する機械コードのアドレスが更新され、上記サブルーチン化に対応する戻り番地情報が追加される（１４３）。上記ステップ１４３の処理では、上記ステップ１４２のサブルーチン化処理を行う前のデバッグ情報１２４Ａ，１２４Ｂが取り込まれ、変換前の行番号情報、つまり、行番号と、それに対応する機械コードのアドレスを表わすラベルとが、機械コードのアドレスを表わすラベルを生成したサブルーチン内のものに更新される。そして、集約元に固有な情報として、「サブルーチンの呼出元への戻り番地を表わすラベル」が追加される。これにより、実行コード３０内のデバッグ情報３１は、「行番号」、「機械コード」、「サブルーチン呼出元への戻り番地」の３つ組にされる。
【００８１】
このように、リンカ２２において共通コードのサブルーチン化処理を行うようにしても、得られる実行コードは、実施の形態１の場合と同様であり、実施の形態１の場合と同様の作用効果を得ることができる。
【００８２】
以上本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【符号の説明】
【００８３】
１  コンピュータシステム
１０  プロセッサ
１１  主記憶装置
１２  ＤＶＤ・ＲＯＭ読取り装置
１３  ハードディスク
１４  バス
１５  ソースコード
１６  オブジェクトコード
１７  実行コード
１８  言語処理系
２１  コンパイラ
２２  リンカ
２３  ソースレベルデバッガ
２４  前処理部
２５  最適化部
２６  共通コードのサブルーチン化処理
２７  コード生成部
２８  オブジェクトコード
３０  実行コード
【図１】
2014035737.tif 000003
【図２】
2014035737.tif 000004
【図３】
2014035737.tif 000005
【図４】
2014035737.tif 000006
【図５】
2014035737.tif 000007
【図６】
2014035737.tif 000008
【図７】
2014035737.tif 000009
【図８】
2014035737.tif 000010
【図９】
2014035737.tif 000011
【図１０】
2014035737.tif 000012
【図１１】
2014035737.tif 000013
【図１２】
2014035737.tif 000014
【図１３】
2014035737.tif 000015