(57)【要約】【課題】複数プログラムの動作解析の不十分さを解消可能とする。【解決手段】実施形態の解析システムは、入力部がプログラムを受取り、解析用情報生成部がプログラムの実行に必要な情報を含むプログラム情報と、プログラム実行中の特定タイミングに実行した内容を示すトレース情報と、トレース情報とプログラム情報との対応関係を示すトレース対応情報とを生成する。トレース差分情報生成部が第１、第２のプログラム情報とトレース対応情報とに基づく第１、第２のトレース情報の差分からトレース差分情報を生成し、プログラム差分情報生成部が第１、第２のプログラム情報の差分からプログラム差分情報を生成する。解析部がトレース差分情報とプログラム差分情報との対応関係をトレース対応情報に基づき解析し、対応関係を第１、第２のプログラム情報のうち少なくとも一方に対応付けて表示するための表示情報を表示情報生成部が生成する。【選択図】図１
2015043198.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを受け取る入力部と、
前記プログラムの実行に必要な情報に基づきプログラム情報を生成し、前記プログラム情報に基づき、前記プログラムの実行中の特定のタイミングにおいて実行された内容を示すトレース情報を生成し、前記トレース情報と前記プログラム情報に基づき、前記トレース情報と前記プログラム情報との対応関係を示すトレース対応情報を生成する解析用情報生成部と、
前記解析用情報生成部に生成された第１のプログラム情報に基づき前記解析用情報生成部により生成された第１のトレース情報と、前記解析用情報生成部に生成された第２のプログラム情報に基づき前記解析用情報生成部により生成された第２のトレース情報との差分を抽出したトレース差分情報を生成するトレース差分情報生成部と、
前記第１のプログラム情報と前記第２のプログラム情報との差分を抽出したプログラム差分情報を生成するプログラム差分情報生成部と、
前記トレース差分情報と、前記プログラム差分情報と、前記第１のプログラム情報および前記第２のプログラム情報との対応関係を、前記トレース対応情報に基づいて解析する対応関係解析部と、
前記対応関係を、前記第１のプログラム情報および前記第２のプログラム情報のうち少なくとも一方に対応付けて表示するための表示情報を生成する表示情報生成部と
を有する
ことを特徴とする解析システム。
【請求項２】
前記解析用情報生成部は、
プログラムのソースコードを前記プログラム情報に含め、前記プログラムのソースコードと前記トレース情報との対応関係を前記トレース対応情報に含める、
ことを特徴とする請求項１に記載の解析システム。
【請求項３】
前記解析用情報生成部は、
前記トレース情報の順序関係を特定する順序関係情報を含めて前記トレース情報を生成し、
前記トレース差分情報生成部は、
前記順序関係情報に基づき前記第１のトレース情報と前記第２のトレース情報とを比較し、前記実行された内容が同一ではないと判定された部分について差分として抽出することを特徴とする請求項１に記載の解析システム。
【請求項４】
前記解析用情報生成部は、
前記プログラムの実行単位の親子関係を特定する親子関係情報を含めて前記トレース情報を生成し、
前記トレース差分情報生成部は、
前記親子関係情報に基づき前記第１のトレース情報と前記第２のトレース情報とを比較し、前記実行された内容が同一ではないと判定された部分を差分として抽出する
ことを特徴とする請求項１に記載の解析システム。  
【請求項５】
前記解析用情報生成部は、
前記実行された内容の種別を示す種別情報を含めて前記トレース情報を生成し、
前記トレース差分情報生成部は、
前記種別情報が示す前記種別毎に前記トレース差分情報を生成し、
前記対応関係解析部は、
前記種別毎に前記対応関係を解析し、
前記表示情報生成部は、
前記種別毎に前記表示情報を出力する
ことを特徴とする請求項１に記載の解析システム。
【請求項６】
プログラムを受け取る入力ステップと、
前記プログラムの実行に必要な情報に基づきプログラム情報を生成し、前記プログラム情報に基づき、前記プログラムの実行中の特定のタイミングにおいて実行された内容を示すトレース情報を生成し、前記トレース情報と前記プログラム情報に基づき、前記トレース情報と前記プログラム情報との対応関係を示すトレース対応情報を生成する解析用情報生成ステップと、
前記解析用情報生成ステップにより生成された第１のプログラム情報に基づき前記トレース情報生成ステップにより生成された第１のトレース情報と、前記解析用情報生成ステップにより生成された第２のプログラム情報に基づき前記トレース情報生成部により生成された第２のトレース情報との差分を抽出したトレース差分情報を生成するトレース差分情報生成ステップと、
前記第１のプログラム情報と前記第２のプログラム情報との差分を抽出したプログラム差分情報を生成するプログラム差分情報生成ステップと、
前記トレース差分情報と、前記プログラム差分情報と、前記第１のプログラム情報および前記第２のプログラム情報との対応関係を、前記トレース対応情報に基づいて解析する対応関係解析ステップと、
前記対応関係を、前記第１のプログラム情報および前記第２のプログラム情報のうち少なくとも一方に対応付けて表示するための表示情報を生成する表示情報生成ステップと
を有する
ことを特徴とする解析方法。
【請求項７】
プログラムを受け取る入力ステップと、
前記プログラムの実行に必要な情報に基づきプログラム情報を生成し、前記プログラム情報に基づき、前記プログラムの実行中の特定のタイミングにおいて実行された内容を示すトレース情報を生成し、前記トレース情報と前記プログラム情報に基づき、前記トレース情報と前記プログラム情報との対応関係を示すトレース対応情報を生成する解析用情報生成ステップと、
前記解析用情報生成ステップにより生成された第１のプログラム情報に基づき前記トレース情報生成ステップにより生成された第１のトレース情報と、前記解析用情報生成ステップにより生成された第２のプログラム情報に基づき前記トレース情報生成部により生成された第２のトレース情報との差分を抽出したトレース差分情報を生成するトレース差分情報生成ステップと、
前記第１のプログラム情報と前記第２のプログラム情報との差分を抽出したプログラム差分情報を生成するプログラム差分情報生成ステップと、
前記トレース差分情報と、前記プログラム差分情報と、前記第１のプログラム情報および前記第２のプログラム情報との対応関係を、前記トレース対応情報に基づいて解析する対応関係解析ステップと、
前記対応関係を、前記第１のプログラム情報および前記第２のプログラム情報のうち少なくとも一方に対応付けて表示するための表示情報を生成する表示情報生成ステップと
をコンピュータに実行させるための解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析システム、解析方法および解析プログラムに関する。
【背景技術】
【０００２】
従来から、プログラムの動作確認を行うための手法が提案されている。また、従来から、プログラムのバージョンアップなどによる修正プログラムにおいて、修正前と修正後とのプログラムの挙動の違いを検証するための手法も提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許出願公開第２００３／０１４５１２５号明細書
【０００４】
【非特許文献１】伊藤  芳朗、渡邊  結、石尾  隆、井上  克郎、「プログラムの変更前後での実行履歴の差分検出手法」、情報処理学会研究会報告、２０１０年０３月、Ｖｏｌ．２０１０−ＳＥ−１６７、Ｎｏ．５、ｐ．１−８
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来では、複数のプログラムの動作情報の差分から、プログラムの動作に影響を与えている複数のプログラムの動作に基づく変更部分をユーザ自身が推測していた。そのため、複数のプログラムの動作の変化が、プログラム上のどの部分で生じているのかを解析することが困難であった。このように、従来では、複数のプログラムの動作の解析を十分に実行することが困難であるという問題点があった。
【０００６】
本発明が解決しようとする課題は、複数のプログラムの動作の解析の不十分さを解消可能な解析システム、解析方法および解析プログラムを提供することにある。
【課題を解決するための手段】
【０００７】
実施形態の解析システムは、入力部がプログラムを受け取り、解析用情報生成部が、入力されたプログラム実行中の特定のタイミングにおいて実行された内容を示すトレース情報と、入力されたプログラムの実行に必要な情報を含むプログラム情報と、トレース情報とプログラム情報の対応関係を示すトレース対応情報とを生成する。トレース差分情報生成部が、第１および第２のプログラム情報に基づき生成された第１および第２のトレース情報の差分を抽出したトレース差分情報を生成し、プログラム差分情報生成部が、第１および第２のプログラム情報の差分を抽出したプログラム差分情報を生成する。対応関係解析部が、トレース差分情報とプログラム差分情報との対応関係を解析し、表示情報生成部が、対応関係を、第１および第２のプログラム情報のうち少なくとも一方に対応付けて表示するための表示情報を生成する。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態に係る解析装置の機能を示す一例の機能ブロック図。
【図２】第１の実施形態に係る解析装置での解析処理の例を示すフローチャート。
【図３】入力部に入力するプログラムの例を示す図。
【図４】第１の実施形態に係るトレース情報の例を示す図。
【図５】第１の実施形態に係るトレース対応情報の例を示す図。
【図６】第１の実施形態に係るトレース差分情報の例を示す図。
【図７】第１の実施形態に係るプログラム差分情報の例を示す図。
【図８】第１の実施形態に係る表示画面の例を示す図。
【図９】第２の場合を説明するためのプログラムの例を示す図。
【図１０】第１の実施形態に係る、第２の場合のトレース情報の例を示す図。
【図１１】第１の実施形態に係る、第２の場合のトレース対応情報の例を示す図。
【図１２】第１の実施形態に係る、第２の場合のトレース差分情報の例を示す図。
【図１３】第１の実施形態に係る、第２の場合のプログラム差分情報の例を示す図。
【図１４】第１の実施形態に係る、第２の場合の表示画面の例を示す図。
【図１５】第３の場合を説明するためのプログラムの例を示す図。
【図１６】第１の実施形態に係る、第３の場合のトレース情報の例を示す図。
【図１７】第１の実施形態に係る、第３の場合のトレース対応情報の例を示す図。
【図１８】第１の実施形態に係る、第３の場合のトレース差分情報の例を示す図。
【図１９】第１の実施形態に係る、第３の場合のプログラム差分情報の例を示す図。
【図２０】第１の実施形態に係る、第３の場合の表示画面の例を示す図。
【図２１】第１の実施形態に係る解析装置を実現可能な構成を示すブロック図。
【図２２】第１の実施形態に係る、木構造として表現されたトレース情報を概念的に示す図。
【図２３】第２の実施形態に適用可能な解析システムの構成例を示すブロック図。
【発明を実施するための形態】
【０００９】
（第１の実施形態）
以下、第１の実施形態に係る解析システム、解析方法および解析プログラムについて説明する。図１は、第１の実施形態に係る解析装置の機能を示す一例の機能ブロック図を示す。図１において、解析装置１００は、入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４を有する。これら入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４は、協働するハードウェアによって構成してもよいし、一部または全部をＣＰＵ(Central  Processing  Unit)上で動作するプログラムにより実現してもよい。
【００１０】
なお、第１の実施形態に係る解析装置１００の構成は、図１の構成に限定されない。すなわち、解析装置１００は、複数の機能ブロック（入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４）が協調しながら動作を行う構成でもよい。また、解析装置１００は、複数の機能ブロックのうち一部の機能ブロックの順番を入れ替える構成や、複数の機能ブロックのうちのある機能ブロックを他の機能ブロックに分割する構成でもよい。さらに、解析装置１００は、これら４の構成を組み合わせる構成としてもよいし、一部または全部の機能ブロックを複数のモジュールに分割して構成してもよい。
【００１１】
解析装置１００は、入力部１０１を介して受け取った複数のプログラムの実行に必要な情報の差分と、実行時の動作の差分とを取得する。受け取ったプログラムやその実行に必要な情報には、例えばソースコードが含まれる。そして、解析装置１００は、複数のプログラムについて取得されたこれら各差分の対応関係を、プログラムの実行に必要な情報と実行時の動作の差分とを対応付ける情報に基づいて解析し、解析結果を、当該２以上のプログラムの実行に必要な情報のうち少なくとも１のプログラムの実行に必要な情報に対応付けて表示させる。解析装置１００は、複数のプログラムの実行に必要な情報の差分と、動作の差分とがどのように関係しているかを可視化することができる。
【００１２】
解析装置１００の構成について、より詳細に説明する。また、解析装置１００において、解析部１０３は、差分情報生成部１０３０および対応関係解析部１０３１を有する。さらに、差分情報生成部１０３０は、プログラム差分情報生成部１０３００およびトレース差分情報生成部１０３０１を有する。
【００１３】
図２は、第１の実施形態に係る解析装置１００における解析処理の例を示すフローチャートである。この図２のフローチャートによる解析処理の実行に先立って、解析対象の複数のプログラムが入力部１０１に受け取られる。入力部１０１は、受け取った複数のプログラムを、メモリなどに保持する。
【００１４】
ここでは、説明のため、入力部１０１は、第１のプログラムおよび第２のプログラムの２のプログラムを受け取るものとする。一例として、第２のプログラムは、第１のプログラムの一部を変更した変更後のプログラムであるものとする。
【００１５】
ステップＳ２０１で、解析用情報生成部１０２は、入力部１０１から解析対象のプログラムを入力する。次のステップＳ２０２で、解析用情報生成部１０２は、入力されたプログラムに対して、トレース情報の出力端を設定する。トレース情報の出力端は、当該プログラムを実行させた場合の、プログラムの実行内容を出力するための出力口である。トレース情報は、プログラム実行中の特定のタイミングにおいて実行された内容を示す。
【００１６】
次のステップＳ２０３で、解析用情報生成部１０２は、トレース情報の出力端が設定されたプログラムを実行し、実行時の設定情報や入力されたプログラムなど、プログラムの実行に必要な情報を取得する。次のステップＳ２０４で、解析用情報生成部１０２は、実行中のプログラムに設定された出力端から出力されるトレース情報を収集する。次のステップＳ２０５で、解析用情報生成部１０２は、ステップＳ２０４にて収集されたトレース情報とプログラム情報との対応関係を示すトレース対応情報を生成する。
【００１７】
なお、上述のステップＳ２０１〜ステップＳ２０５の処理は、解析対象の各プログラムについて実行される。
【００１８】
解析装置１００は、解析用情報生成部１０２において解析対象の各プログラムについてステップＳ２０１〜ステップＳ２０５の処理が完了すると、処理をステップＳ２０６に移行する。ステップＳ２０６で、差分情報生成部１０３０は、解析用情報生成部１０２から複数のプログラム情報について収集されたトレース情報およびトレース対応情報をそれぞれ取得する。トレース差分情報生成部１０３０１は、取得した複数のトレース情報の差分を求め、トレース差分情報を生成する。
【００１９】
次のステップＳ２０７で、差分情報生成部１０３０は、解析用情報生成部１０２から複数のプログラムについてプログラム情報をそれぞれ取得する。プログラム差分情報生成部１０３００は、取得した複数のプログラム情報の差分を求め、プログラム差分情報を生成する。
【００２０】
次のステップＳ２０８で、対応関係解析部１０３１は、プログラム差分情報生成部１０３００で生成されたプログラム差分情報と、トレース差分情報生成部１０３０１で生成されたトレース差分情報と、トレース対応情報とを取得し、プログラム差分情報とトレース差分情報との対応関係をトレース対応情報に基づいて解析する。
【００２１】
次のステップＳ２０９で、表示情報生成部１０４は、対応解析部１０３１による解析結果と、上述のプログラム差分情報およびトレース差分情報、トレース対応情報とに基づき、トレース情報の差分と、プログラム情報の差分の対応関係を可視化すなわち表示するための表示情報を生成する。生成された表示情報は、例えばＬＣＤ(Liquid  Crystal  Display)といった表示デバイスを有する表示装置に供給され、表示される。
【００２２】
なお、上述では、ステップＳ２０１〜ステップＳ２０５の処理をプログラム毎に逐次実行するように説明したが、これはこの例に限定されない。例えば、ステップＳ２０１〜ステップＳ２０５の処理は、解析対象の複数のプログラムについて並列的に実行してもよい。また、ステップＳ２０６以降の処理もプログラム毎に逐次実行あるいは並列的に実行してもよいし、ステップＳ２０６とステップＳ２０７については、順番を入れ替えて実行してもよい。さらに、各ステップにおいて、プログラム情報やトレース情報の持つ各情報の種類に応じて並列的に実行してもよい。
【００２３】
次に、図１に示す解析装置１００の各部における処理をより詳細に説明する。解析用情報生成部１０２は、入力部１０１が受け取った解析対象のプログラムから、トレース情報、トレース対応情報およびプログラム情報を生成する。入力部１０１は、解析対象のプログラムを、例えばＣ言語やＪａｖａ（登録商標）言語といったプログラミング言語で記述されたソースコードの形式で受け取る。解析対象のプログラムの言語は、特に限定されない。
【００２４】
図３は、解析対象のプログラムの例を示す。図３（ａ）は、解析対象の第１のプログラムであるプログラム３０１のソースコードの例を示し、図３（ｂ）は、第１のプログラムと対で解析対象とされる第２のプログラムであるプログラム３０２のソースコードの例を示す。なお、この図３および以下の同様のプログラム例を示す図において、特に記載のない限り、各行の先頭の数字は説明のための行番号を示し、続くコロン（：）でソースコード本体と区別されている。また、本実施形態の中で例示される各プログラムおよびコードは、プログラミング言語として一般的に用いられるＣ言語の記法を模した疑似コードである。
【００２５】
図３（ａ）の例では、プログラム３０１は、１行目から６行目において関数ｍａｉｎが定義され、８行目から３００行目において関数ｆｕｎｃＡが定義される。また、プログラム３０１は、２行目に変数ｉが定義され、３行目から５行目までが、変数ｉをループ変数としたｆｏｒ文によるループが構成される。さらに、プログラム３０１は、３行目においてｆｏｒ文のループ回数が３に定義され、ループ中、４行目で関数ｆｕｎｃＡが呼び出され実行される。すなわち、プログラム３０１は、関数ｆｕｎｃＡが３回呼び出され実行される。
【００２６】
図３（ｂ）に例示されるプログラム３０２は、３行目におけるｆｏｒ文のループ回数が５とされている点がプログラム３０１と異なっている以外は、プログラム３０１と共通である。プログラム３０２は、関数ｆｕｎｃＡが５回呼び出され実行される。
【００２７】
これらプログラム３０１および３０２が入力部１０１を介して解析用情報生成部１０２に入力される（図２のステップＳ２０１）。解析用情報生成部１０２は、これらプログラム３０１および３０２に対して、トレース情報の出力端を設定する（図２のステップＳ２０２）。
【００２８】
トレース情報は、実行中のプログラムの、特定のタイミングで発生した挙動を示す情報である。換言すれば、トレース情報は、プログラム実行中の特定のタイミングにおいて観測可能な特徴量の情報である。ここでは、トレース情報は関数の実行開始および実行終了の情報であるとする。この場合、関数の実行開始および終了の回数と、それらが発生したサイクルの情報であるサイクル情報とが、特徴量として取得されると考えることができる。このサイクル情報は、トレース情報の順序関係を特定するための順序関係情報としても機能する。
【００２９】
出力端の設定は、例えば、プログラム３０１および３０２のコンパイル時などに、出力端をプログラム３０１および３０２に埋め込み、コンパイルされたプログラム３０１および３０２を実行した際に、トレース情報が出力されるようにする方法を用いることができる。
【００３０】
解析用情報生成部１０２は、これらプログラム３０１および３０２を実行し、プログラム情報を取得する（図２のステップＳ２０３）。プログラム情報とは、プログラムの実行に必要な情報を示す。ここでは、プログラム情報は、入力されたプログラム３０１および３０２を含むものとし、以下の説明ではプログラム情報としてプログラム３０１および３０２を解析対象とする。解析用情報生成部１０２は、実行されたプログラム３０１および３０２に設定された出力端から、プログラム３０１および３０２それぞれについてトレース情報を収集する（図２のステップＳ２０４）。
【００３１】
図４は、第１の実施形態に係るトレース情報の例を示す。図４（ａ）は、プログラム３０１から取得されたトレース情報４０１の例を示す。図４（ｂ）は、プログラム３０２から取得されたトレース情報４０２の例を示す。図４（ａ）を例に取ると、トレース情報４０１は、各行毎に、サイクル、対象、状態の順に、情報がスペースで区切られて配列されている。サイクルは、例えば、プログラム３０１の実行単位を示す。対象は、トレースを行う対象の動作を示す。状態は、トレース対象の動作の内容を示す。なお、各情報の区切りは、スペースに限られない。
【００３２】
例えば図４（ａ）のトレース情報４０１において、１行目は、「1  main  start」とされ、１サイクル目に関数ｍａｉｎが開始（ｓｔａｒｔ）されたことが示される。次の２行目は、「10  funcA  start」とされ、１０サイクル目に関数ｆｕｎｃＡが開始されたことが示され、さらに３行目が「110  funcA  end」とされ、１１０サイクル目に関数ｆｕｎｃＡが終了した（ｅｎｄ）ことが示されている。図４（ｂ）のトレース情報４０２においても、同様にして各実行内容が示される。
【００３３】
このトレース情報４０１は、図３（ａ）に示されるプログラム３０１に基づき取得される。プログラム３０１は、ｆｏｒ文において関数ｆｕｎｃＡを含むループが３回、実行される。図４（ａ）のトレース情報４０１によれば、関数ｆｕｎｃＡが１０サイクル目、１２０サイクル目および２３０サイクル目の３回、実行されていることが分かる。
【００３４】
一方、トレース情報４０２は、図３（ｂ）に示されるプログラム３０２に基づき取得される。プログラム３０２は、ｆｏｒ文において関数ｆｕｎｃＡを含むループが５回、実行される。図４（ｂ）のトレース情報４０２によれば、関数ｆｕｎｃＡが１０サイクル目、１２０サイクル目、２３０サイクル目、３４０サイクル目および４５０サイクル目の５回、実行されていることが分かる。このように、プログラムのソースコードの変更に伴い、トレース情報も変化する。
【００３５】
なお、解析用情報生成部１０２は、各トレース情報の取得時に、取得したトレース情報と、当該トレース情報を発生させた要因となっているプログラム情報（ここではソースコード上の位置）との対応関係を示すトレース対応情報を生成する（図２のステップＳ２０５）。
【００３６】
プログラム情報とトレース情報との対応関係を示すトレース対応情報を生成することで、例えばユーザは、プログラム３０１においてトレース情報を発生させる要因となり得るソースコードの情報を辿ることが可能となる。また、ユーザは、プログラム３０１のソースコードが発生させたトレース情報を辿ることが可能となる。
【００３７】
図５は、第１の実施形態に係るトレース対応情報の例を示す。図５（ａ）は、プログラム３０１から取得されたトレース対応情報５０１の例を示す。図５（ｂ）は、プログラム３０２から取得されたトレース対応情報５０２の例を示す。図５（ａ）を例に取ると、トレース対応情報５０１は、各行毎に、対象、状態、ファイル、ファイルの場所、ファイル内の行の順に、情報がスペースで区切られて配列されている。なお、各情報の区切りは、スペースに限られない。
【００３８】
トレース対応情報５０１における対象および状態については、図４に示したトレース情報４０１における対象および状態と同一のものを示す。ファイルは、トレース対応情報５０１に対応するプログラム３０１のソースコードが格納されるファイル名を示す。ファイルの場所は、当該ファイル名で示されるファイルの場所を示す。ファイルの場所は、例えばファイルパスなどを用いて、この例では、ファイル名を含んでいない状態で示されている。ファイル内の行は、トレース情報４０１における、トレース対応情報５０１と対応する対象および状態に示される動作を発生させた、プログラム３０１のソースコードの行を示す。
【００３９】
例えば図５（ａ）のトレース対応情報５０１において、１行目は、「main  start  main.c  /src/1/  1」とされ、関数ｍａｉｎが開始（ｓｔａｒｔ）されるというトレース情報が、場所「/src/1/」にあるファイル「main.c」内のソースコードの１行目で発生することを示す。これは、トレース情報４０１の１行目の実行内容（「関数ｍａｉｎが開始された」）が、場所「/src/1/」にあるファイル「main.c」に格納されるソースコードの１行目で発生していることを示している。また、２行目は、「main  end  main.c  /src/1/  6」とされ、関数ｍａｉｎが終了した（ｅｎｄ）というトレース情報が、場所「/src/1/」にあるファイル「main.c」内のソースコードの６行目で発生することを示す。これは、トレース情報４０１の８行目の実行内容（「関数ｍａｉｎが終了した」）が、場所「/src/1/」にあるファイル「main.c」に格納されるソースコードの６行目で発生していることを示している。
【００４０】
図３（ａ）において、トレース情報４０１およびトレース対応情報５０１と対応するプログラム３０１のソースコードは、１行目で関数ｍａｉｎが実行開始されており、６行目で関数ｍａｉｎが終了していることを示している。
【００４１】
同様に、図５（ｂ）のトレース対応情報５０２において、１行目は、「main  start  main.c  /src/2/  1」とされ、関数ｍａｉｎが開始（ｓｔａｒｔ）されるというトレース情報が、場所「/src/2/」にあるファイル「main.c」内のソースコードの１行目で発生することを示す。これは、トレース情報４０２の１行目の実行内容（「関数ｍａｉｎが開始された」）が、場所「/src/2/」にあるファイル「main.c」に格納されるソースコードの１行目で発生していることを示している。また、２行目は、「main  end  main.c  /src/2/  6」とされ、関数ｍａｉｎが終了した（ｅｎｄ）というトレース情報が、場所「/src/2/」にあるファイル「main.c」内のソースコードの６行目で発生することを示す。これは、トレース情報４０２の１２行目の実行内容（「関数ｍａｉｎが終了した」）が、場所「/src/2/」にあるファイル「main.c」に格納されるソースコードの６行目で発生していることを示している。
【００４２】
図３（ｂ）において、トレース情報４０２およびトレース対応情報５０２と対応するプログラム３０２のソースコードは、１行目で関数ｍａｉｎが実行開始されており、６行目で関数ｍａｉｎが終了していることを示している。
【００４３】
このように、プログラム情報と、トレース対応情報と、トレース情報とを組み合わせることで、トレース情報に示される情報が、どのプログラム情報のどの位置で発生したのかを取得することが可能となる。
【００４４】
解析用情報生成部１０２で各プログラム３０１および３０２について生成された各トレース情報４０１および４０２は、解析用情報生成部１０２から出力され、解析部１０３に入力される。解析部１０３に入力された各トレース情報４０１および４０２は、差分情報生成部１０３０に供給される。同様に、解析用情報生成部１０２で各プログラム３０１および３０２について生成された各トレース対応情報５０１および５０２は、解析用情報生成部１０２から出力され、解析部１０３に入力される。解析部１０３に入力された各トレース対応情報５０１および５０２は、差分情報生成部１０３０に供給される。さらに、プログラム情報の一部である各プログラム３０１および３０２についても、解析用情報生成部１０２から出力され、解析部１０３に入力される。解析部１０３に入力されたプログラム情報は、差分情報生成部１０３０に供給される。
【００４５】
解析部１０３は、それぞれ複数のトレース情報、トレース対応情報およびプログラム情報を纏めて解析することで、複数のトレース情報の差分と複数のプログラム情報の差分とを抽出し、これら差分の対応関係を求める（図２のステップＳ２０６〜ステップＳ２０８）。
【００４６】
例えば、あるプログラムの特定のバージョンと当該バージョン以前のバージョンとについて、それぞれトレース情報と、プログラム情報と、トレース対応情報とを解析用情報生成部１０２から出力し、その情報を解析部１０３で解析する場合がある。上述のプログラム３０１および３０２は、このバージョン違いのプログラムのケースに対応し、ｆｏｒ文のループ回数を変更することで、挙動が変化している。
【００４７】
解析部１０３において、トレース差分情報生成部１０３０１は、比較対象のプログラム３０１および３０２それぞれのトレース情報４０１および４０２の差分を抽出し、トレース差分情報として出力する（図２のステップＳ２０６）。
【００４８】
図６は、第１の実施形態に係る、プログラム３０１および３０２を対象とした場合のトレース差分情報の例を示す。図６において、トレース差分情報６０１は、トレース情報４０１とトレース情報４０２とで差分が抽出された対象および状態の組を含む。図６の例では、トレース差分情報６０１は、差分が抽出された対象（トレース対象）および状態（トレース対象の動作の内容）の組に、当該対象および状態においてトレース情報４０１および４０２間で差分が発生したそれぞれの値が関連付けられて構成されている。図６の例では、対象および状態の組に続く２の値は、左がトレース情報４０１における値を示し、右がトレース情報４０２における値を示している。
【００４９】
より具体的には、図６の例では、トレース差分情報６０１の１行目において、トレース対象である関数ｆｕｎｃＡの状態ｓｔａｒｔがトレース情報４０１および４０２においてそれぞれ３回および５回取得され、それぞれ対応するプログラム３０１および３０２間で関数ｆｕｎｃＡを開始する処理を実行した回数に差分が生じていることが示されている。同様に、トレース差分情報６０１の２行目において、関数ｆｕｎｃＡの状態ｅｎｄがトレース情報４０１および４０２においてそれぞれ３回および５回取得され、それぞれ対応するプログラム３０１および３０２間で関数ｆｕｎｃＡを終了する処理を実行した回数に差分が生じていることが示されている。
【００５０】
すなわち、関数ｆｕｎｃＡがプログラム３０１および３０２のｆｏｒ文中で呼び出される際のｆｏｒ文の実行回数が、プログラム３０１では３回、プログラム３０２では５回となっている。そのため、トレース差分情報生成部１０３１は、その差異をトレース差分情報６０１の情報として抽出している。
【００５１】
トレース差分情報生成部１０３０１は、例えば、トレース情報４０１および４０２それぞれにおいて、各関数ｍａｉｎおよびｆｕｎｃＡの各状態ｓｔａｒｔおよびｅｎｄ毎に回数を計数し、計数された各回数をトレース情報４０１および４０２間で比較する。比較の結果、トレース情報４０１および４０２で回数に差がある場合に、差分として抽出する。
【００５２】
さらに、解析部１０３において、プログラム差分情報生成部１０３００は、比較対象のプログラム情報（ここではプログラム３０１および３０２）の差分を抽出し、プログラム差分情報として出力する（図２のステップＳ２０７）。プログラム差分情報は、比較対象の各トレース情報を出力した元となる各プログラムの実行に必要な情報を持つ各プログラム情報を利用し、それら各プログラム情報に差異が存在するか否か、差異が存在する場合は、各プログラム情報のどの部分に差異が存在するのか、といった情報を持つ。
【００５３】
図７は、第１の実施形態に係る、プログラム３０１および３０２をプログラム情報とした場合のプログラム差分情報の例を示す。図７において、プログラム差分情報７０１は、差分を抽出したプログラム３０１および３０２のファイル名と、プログラム３０１および３０２間で差分が抽出された、各プログラム３０１および３０２のソースコードにおける行を示す情報とを含む。図７の例では、ファイル名に続けて、ソースコードにおける差分が「３  ３」として示されている。これは、左がプログラム３０１のソースコードにおける行を示し、右がプログラム３０２のソースコードにおける行を示している。
【００５４】
なお、プログラム差分情報７０１は、プログラム３０１および３０２で互いに異なるファイル名を使用する場合、ファイル名を併記してもよい。
【００５５】
より具体的には、図７の例では、プログラム差分情報７０１において、記述「３  ３」により、ファイル「main.c」のプログラム３０１におけるソースコードの３行目と、対応するプログラム３０２におけるソースコードの３行目との間に差分が存在することが示されている。図３（ａ）および図３（ｂ）を参照し、各プログラム３０１および３０２のソースコードを比較すると、プログラム３０１では、３行目の変数ｉの範囲指定部分の記述が「ｉ＜３」となっているのに対し、プログラム３０２では、３行目の変数ｉの範囲指定部分の記述が「ｉ＜５」となっており、異なっていることが分かる。
【００５６】
プログラム差分情報生成部１０３００は、例えばプログラム３０１および３０２のソースコードがテキストデータであれば、プログラム３０１および３０２を格納したファイルに対して、テキストファイルの差分情報を抽出する機能を適用することで、プログラム３０１および３０２の差分を抽出できる。なお、プログラム差分情報生成部１０３００は、プログラム３０１および３０２を格納するファイルのファイル名および当該ファイルの場所を、例えばトレース対応情報５０１および５０２から取得する。
【００５７】
解析部１０３において、対応関係解析部１０３１は、プログラム差分情報生成部１０３００で生成されたプログラム差分情報７０１と、トレース差分情報生成部１０３０１で生成されたトレース差分情報６０１との対応関係をトレース対応情報５０１および５０２に基づいて解析する（図２のステップＳ２０８）。対応関係解析部１０３１は、トレース差分情報６０１とプログラム情報（ここではプログラム３０１および３０２）における差分とが関係しているのか否かを解析する。また、対応関係解析部１０３１は、トレース差分情報６０１とプログラム３０１および３０２における差分とが関係していると判定した場合、トレース差分情報６０１がプログラム情報の差分のうちどの部分と関係しているかを解析する。
【００５８】
一例として、図３（ａ）および図３（ｂ）のプログラム３０１および３０２を解析対象のプログラム情報とした場合の、対応関係解析部１０３１における解析の例について説明する。対応関係解析部１０３１は、図６のトレース差分情報６０１で差分として示されているトレース部分を含むプログラム３０１および３０２のソースコードを、プログラム情報から取得する。
【００５９】
対応関係解析部１０３１は、取得したプログラム３０１および３０２それぞれのソースコードを、図７のプログラム差分情報７０１に基づき照合し、各ソースコードにおいて差分が存在する部分を抽出する。図７の例では、対応関係解析部１０３１は、プログラム３０１および３０２それぞれのソースコードの３行目を、差分が存在する部分として抽出する。
【００６０】
そして、対応関係解析部１０３１は、トレース差分情報６０１に含まれる差分情報を、トレース対応情報５０１および５０２に基づいてプログラム情報（ここではプログラム３０１および３０２）のうち少なくとも１に対応付ける。ここでは、対応関係解析部１０２１は、差分情報をプログラム３０１および３０２の両方に対応付ける。
【００６１】
より具体的な手順として、対応関係解析部１０３１は、まずはプログラム３０１とトレース情報とを対応付ける。トレース差分情報６０１の１行目を見ると、対象ｆｕｎｃＡ、状態ｓｔａｒｔのトレースは、プログラム３０１に対応するトレース対応情報５０１の３行目の対象および状態と一致する。トレース対応情報５０１を参照すると、トレース差分情報６０１の１行目がプログラム３０１の８行目と対応付けられることがわかるので、このプログラム３０１の８行目のラインをトレース情報の差分と対応付ける。次に、トレース差分情報６０１の２行目を見ると、対象ｆｕｎｃＡ、状態ｅｎｄのトレースは、プログラム３０１に対応するトレース対応情報５０１の４行目の対象および状態と一致する。トレース対応情報５０１を参照すると、トレース差分情報６０１の２行目がプログラム３０１の３００行目と対応付けられることがわかるので、このプログラム３０１の３００行目のラインをトレース情報の差分と対応付ける。
【００６２】
同様に、対応関係解析部１０３１は、プログラム３０２とトレース情報との対応付けを行う。トレース差分情報６０１の１行目を見ると、対象ｆｕｎｃＡ、状態ｓｔａｒｔのトレースは、プログラム３０２に対応するトレース対応情報５０２の３行目の対象および状態と一致する。トレース対応情報５０２を参照すると、トレース差分情報６０１の２行目がプログラム３０２の８行目と対応付けられることがわかるので、このプログラム３０２の８行目のラインをトレース情報の差分と対応付ける。次に、トレース差分情報６０１の２行目を見ると、対象ｆｕｎｃＡ、状態ｅｎｄのトレースは、プログラム３０２に対応するトレース対応情報５０２の４行目の対象および状態と一致する。トレース対応情報５０２を参照すると、トレース差分情報６０１の２行目がプログラム３０２の３００行目と対応付けられることがわかるので、このプログラム３０２の３００行目のラインをトレース情報の差分と対応付ける。
【００６３】
このような処理を行うことで、対象プログラムの実行時の挙動の差異およびプログラムを実行する際に用いた設定やプログラム本体の変更箇所を把握することが可能となる。
【００６４】
対応関係解析部１０３１は、プログラム情報（ここではプログラム３０１および３０２）の解析が完了すると、解析結果を表示情報生成部１０４に供給する。表示情報生成部１０４に供給される解析結果は、例えば、プログラム３０１および３０２の各ソースコード間の差分が存在する部分を示す情報と、トレース情報の差分が発生した各ソースコードの部分を示す情報とを含む。
【００６５】
また、対応関係解析部１０３１は、プログラム情報（ここではプログラム３０１および３０２の各ソースコード）を、上述の解析結果に付加して表示情報生成部１０４に供給する。対応関係解析部１０３１は、トレース差分情報６０１およびプログラム差分情報７０１を、さらに表示情報生成部１０４に供給してもよい。
【００６６】
表示情報生成部１０４は、対応関係解析部１０３１から供給された解析結果を可視化するための表示情報を生成する。より具体的には、表示情報生成部１０４は、対応関係解析部１０３１から供給された各種情報に基づき、トレース情報４０１および４０２の差分と、プログラム情報（ここではプログラム３０１および３０２）の差分を、ユーザが容易に認識可能な形式で表示するための表示情報を生成する。
【００６７】
例えば、解析装置１００において、あるプログラムの、特定のバージョンとそれ以前のバージョンとについて、解析用情報生成部１０２がトレース情報およびプログラム情報を収集する。解析部１０３が、トレース情報、プログラム情報およびトレース対応情報から、トレース差分情報とプログラム差分情報とを生成して、トレース差分情報とプログラム差分情報とプログラム情報との対応関係を解析する。表示情報生成部１０４は、解析部１０３の解析結果に基づき、トレース情報と対応するプログラム情報に対し、プログラム情報が変更された部分と、トレース差分情報が対応する部分とを、ユーザが認識容易なように、強調表示するような表示情報を生成する。このようにすることで、ソースコードの変更がプログラムの挙動にどのような影響を与えるかが可視化される。
【００６８】
なお、強調表示の方法は、特に限定されないが、太字にする、斜体文字にする、他の部分と異なる色で表示する、背景色と反転表示するなど、様々に考えられる。
【００６９】
図８は、第１の実施形態に係る表示情報生成部１０４が生成した表示情報に基づく表示画面の例を示す。ここでは、表示情報生成部１０４は、図３（ａ）および図３（ｂ）のプログラム３０１および３０２について解析を行った解析結果に従い、表示情報が生成されたものとする。
【００７０】
図８において、表示情報生成部１０４が生成した表示情報に基づく表示画面８０１は、表示領域８１０、８１１、８１２および８１３を有する。表示領域８１２および８１３は、解析対象プログラム情報に含まれる各ソースコードおよびそのソースコードのファイルのある場所が表示される。図８の例では、ソースコードのファイルのある場所は、表示領域８１２および８１３の最上段の枠内に表示されている。また、ソースコードは、ソースコードのファイルのある場所が表示される直下の枠内にそれぞれ表示されている。表示領域８１０および８１１は、表示領域８１２および８１３に表示される各ソースコードの各行に対応する行番号が表示される。
【００７１】
上述した、プログラム差分情報７０１によれば、プログラム３０１および３０２それぞれのソースコードの３行目が差分が存在する部分として抽出されている。そのため、表示情報生成部１０４は、当該３行目を強調表示する表示情報を生成する。図８の例では、表示情報生成部１０４は、矢印表示８２０を用いて当該３行目を示すことで、当該３行目の強調表示を行なっている。
【００７２】
また、表示情報生成部１０４は、プログラム３０１および３０２それぞれのソースコードにおいて、ｆｏｒ文から呼び出される関数ｆｕｎｃＡの開始行である８行目を強調表示する表示情報を生成する。図８の例では、当該８行目を点線枠８３０で囲うことで、当該８行目の強調表示を行なっている。
【００７３】
図８の例では、表示情報生成部１０４は、さらに、各プログラム３０１および３０２の関数ｆｕｎｃＡの終端の行である３００行目を強調表示する表示情報を生成する。この例では、当該３００行目を点線枠８３１で囲うことで、当該３００行目の強調表示を行なっている。
【００７４】
このように、第１の実施形態では、プログラム情報としてプログラムのソースコードを用い、トレース情報と対応するプログラム情報に対し、プログラム情報を実際に変更した部分と、トレース差分情報が対応する部分とをユーザが容易に認識可能に可視化している。そのため、例えばプログラムの複数のバージョン間でソースコードの変更がプログラムのどの部分に影響を与えているかが開発者に明示され、その影響が意図したものであるか否かを、開発者が容易に把握することが可能となる。
【００７５】
（第１の実施形態の別の例）
上述では、解析対象のプログラム３０１および３０２のソースコードの行数が等しく、行位置の対応するコードが対応する処理を実行するようになっている（第１の場合とする）。実際のプログラムにおいては、実質的な処理内容が同じ、且つ、処理結果が同じであっても、行位置の対応するコードが対応する処理を実行しない場合が有り得る。
【００７６】
例えば、解析対象の第１および第２のプログラムにおいて、第１のプログラムのコード（行）を削除して第２のプログラムが構成されている場合（第２の場合とする）や、第１のプログラムに対してコードを追加して第２のプログラムが構成されている場合（第３の場合とする）が、行の対応するコードが対応する処理を実行しない場合に相当する。これら第１、第２および第３の場合では、少なくとも、プログラム差分情報が異なり、それに伴い、対応関係の表示画面に差異が生じる。
【００７７】
先ず、図９〜図１４を用いて第２の場合について説明する。図９は、第２の場合を説明するためのプログラムの例を示す。図９（ａ）は、解析対象の一方のプログラムであるプログラム９０１のソースコードの例を示し、図９（ｂ）は、解析対象の他方のプログラムであるプログラム９０２のソースコードの例を示す。
【００７８】
図９（ａ）および図９（ｂ）に示されるプログラム９０１および９０２は、それぞれ図３（ａ）および図３（ｂ）に示したプログラム３０１および３０２と対応するもので、図３（ａ）および図３（ｂ）がｆｏｒ文のループ回数を数値で示しているのに対し、図９（ａ）および図９（ｂ）は、ループ回数を変数ｍａｘを用いて示している。プログラム９０１および９０２は、プログラム３０１および３０２と同様に、それぞれｆｏｒ文によるループから関数ｆｕｎｃＡを呼び出す処理を示す。
【００７９】
図９（ａ）の例では、プログラム９０１は、１行目から８行目において関数ｍａｉｎが定義され、９行目が空行とされ、１０行目から３００行目において関数ｆｕｎｃＡが定義される。また、プログラム９０１は、２行目に変数ｍａｘが定義され、３行目に変数ｉが定義され、４行目に「ｍａｘ＝ｍａｘ−２」の演算が記述される。さらに、プログラム９０１は、５行目から７行目により、変数ｉをループ変数とし、変数ｍａｘでループ回数が決められるｆｏｒ文によるループが構成される。４行目の演算により、このループは、ループ回数が３となる。さらに、プログラム９０１は、このループ中、６行目で関数ｆｕｎｃＡが呼び出され実行される。
【００８０】
図９（ｂ）に例示されるプログラム９０２は、プログラム９０１の４行目における変数ｍａｘの演算が削除され、プログラム９０１の５行目以降が、各行の内容を変えずに、４行目以降に繰り上げられている。プログラム９０２は、ｆｏｒ文によるループの回数が変数ｍａｘに従い５となる。また、プログラム９０２は、プログラム９０１から１行が削除されているので、２９９行目が最終行となっている。
【００８１】
図１０は、第１の実施形態に係る、図９のプログラム９０１および９０２に対応するトレース情報の例を示す。図１０（ａ）は、プログラム９０１から取得されたトレース情報１００１の例を示す。プログラム９０１は、上述したプログラム３０１と同様に、関数ｆｕｎｃＡを呼び出すループが３回繰り返されるため、トレース情報１００１は、図４（ａ）に示したプログラム３０１のトレース情報４０１と同一となっている。また、図１０（ｂ）は、プログラム９０２から取得されたトレース情報１００２の例を示す。このトレース情報１００２もトレース情報１００１と同様に、図４（ｂ）に示したプログラム３０２のトレース情報４０２と同一となっている。
【００８２】
図１１は、第１の実施形態に係る、図９のプログラム９０１および９０２に対応するトレース対応情報の例を示す。図１１（ａ）および図１１（ｂ）は、プログラム９０１および９０２から取得されたトレース対応情報１１０１および１１０２の例をそれぞれ示す。プログラム９０１は、上述したプログラム３０１と関数ｆｕｎｃＡの行位置と総行数とが異なる。そのため、トレース対応情報１１０１は、トレース情報１００１における関数ｆｕｎｃＡの開始が示される行位置と、関数ｍａｉｎ終了が示される行位置とのファイル内の行を示す値が、トレース対応情報５０１とは異なっている。プログラム９０２も同様に、上述したプログラム３０２と関数ｆｕｎｃＡの行位置と総行数とが異なるため、トレース対応情報１１０２は、トレース情報１００２における関数ｆｕｎｃＡの開始および終了が示される行位置と、関数ｍａｉｎ終了が示される行位置とのファイル内の行を示す値が、トレース対応情報５０２とは異なっている。
【００８３】
図１２は、第１の実施形態に係る、プログラム９０１および９０２を対象とした場合のトレース差分情報の例を示す。上述のように、プログラム９０１および９０２に対応するトレース情報１００１および１００２が、プログラム３０１および３０２に対応するトレース情報４０１および４０２と同一である。そのため、図１２に示されるトレース差分情報１２０１も、プログラム３０１および３０２に基づくトレース差分情報６０１と同一である。
【００８４】
図１３は、第１の実施形態に係る、プログラム９０１および９０２を対象プログラム情報とした場合のプログラム差分情報の例を示す。この場合、図９（ａ）および図９（ｂ）を比較して分かるように、プログラム９０１および９０２は、プログラム９０１のソースコードにおける４行目の「ｍａｘ＝ｍａｘ−２」がプログラム９０２のソースコードには存在しない点が異なっている。
【００８５】
この点を反映して、図１３に示されるプログラム差分情報１３０１は、ソースコードの差分を示す部分の記述が「４  −」とされている。この記述は、プログラム９０１のソースコードの４行目がプログラム９０２のソースコードと異なり、且つ、プログラム９０１のソースコードの４行目に対応するコードがプログラム９０２のソースコード中に存在しないことを示している。
【００８６】
図１４は、第１の実施形態に係る、プログラム９０１および９０２に対応して表示情報生成部１０４が生成した表示情報に基づく表示画面の例を示す。図１４において、表示画面１４０１は、上述の図８の各表示領域８１０、８１１、８１２および８１３にそれぞれ対応する表示領域１４１０、１４１１、１４１２および１４１３を有する。また、図１４における矢印表示１４２０と、点線枠１４３０および１４３１とが意味するところは、上述の図８における矢印表示８２０と、点線枠８３０および８３１と共通なので、ここでの詳細な説明を省略する。
【００８７】
この例では、プログラム差分情報１３０１に従い、プログラム９０１の４行目がプログラム９０２と異なり、且つ、プログラム９０２において当該プログラム９０１の４行目に対応するコードが存在しない。そのため、表示画面１４０１において、プログラム９０２のソースコードを表示する表示領域１４１３では、４行目の位置が空行とされて当該ソースコードにプログラム９０１の４行目に対応するコードが存在しないことが示される。また、空行を挿入することで、表示領域１４１２および１４１３で、互いに対応するコードが同一の行に表示されるようになる。さらに、表示画面１４０１において、プログラム９０１の４行目に相当する位置に矢印表示１４２０が表示されて、プログラム９０２の４行目に対応する行がプログラム９０１に存在しないことが強調される。
【００８８】
次に、図１５〜図２０を用いて第３の場合について説明する。図１５は、第３の場合を説明するためのプログラムの例を示す。図１５（ａ）は、解析対象の一方のプログラムであるプログラム１５０１のソースコードの例を示し、図１５（ｂ）は、解析対象の他方のプログラムであるプログラム１５０２のソースコードの例を示す。
【００８９】
図１５（ａ）および図１５（ｂ）に示されるプログラム１５０１および１５０２は、それぞれ図３（ａ）および図３（ｂ）に示したプログラム３０１および３０２と対応するもので、図３（ａ）および図３（ｂ）がｆｏｒ文のループ回数を数値で示しているのに対し、図１５（ａ）および図１５（ｂ）は、ループ回数を変数ｍａｘを用いて示している。プログラム１５０１および１５０２は、プログラム３０１および３０２と同様に、それぞれｆｏｒ文によるループから関数ｆｕｎｃＡを呼び出す処理を示す。
【００９０】
なお、図１５（ａ）に示すプログラム１５０１は、図９（ｂ）に示したプログラム９０２と同一である。すなわち、プログラム１５０１は、総行数が２９９行であり、ｆｏｒ文による、ループ回数が５回とされたループ内から関数ｆｕｎｃＡが呼び出される。また、図１５（ｂ）に示すプログラム１５０２のソースコードは、プログラム１５０１のソースコードにおける３行目と４行目との間に、「ｍａｘ＝ｍａｘ−２」の演算行が追加されたものとなっている。これは、実際には、図９（ａ）のプログラム９０１と同一である。すなわち、プログラム１５０２は、総行数が３００行であり、ｆｏｒ文による、ループ回数が３回とされたループ内から関数ｆｕｎｃＡが呼び出される。
【００９１】
図１６は、第１の実施形態に係る、図１５のプログラム１５０１および１５０２に対応するトレース情報の例を示す。図１６（ａ）は、プログラム１５０１から取得されたトレース情報１６０１の例を示す。プログラム１５０１は、プログラム９０２と同一なので、トレース情報１６０１も、プログラム９０２のトレース情報１００２と同一となっている。同様に、図１６（ｂ）に例示するプログラム１５０２から取得されたトレース情報１６０２についても、プログラム１５０２がプログラム９０１と同一なので、プログラム９０１のトレース情報１００１と同一となっている。
【００９２】
図１７は、第１の実施形態に係る、図１５のプログラム１５０１および１５０２に対応するトレース対応情報の例を示す。図１７（ａ）は、プログラム１５０１から取得されたトレース対応情報１７０１の例を示す。プログラム１５０１は、プログラム９０２と同一なので、トレース対応情報１７０１も、プログラム９０２のトレース対応情報１１０２と同一となっている（ファイルの場所を除く）。同様に、図１７（ｂ）に例示するプログラム１５０２から取得されたトレース対応情報１７０２についても、プログラム１５０２がプログラム９０１と同一なので、プログラム９０１のトレース対応情報１１０１と同一となっている。
【００９３】
図１８は、第１の実施形態に係る、プログラム１５０１および１５０２を対象とした場合のトレース差分情報の例を示す。この場合、プログラム１５０１は、ｆｏｒ文によるループ回数が５とされて関数ｆｕｎｃＡが５回呼び出され、プログラム１５０２は、ｆｏｒ文によるループ回数が３とされて関数ｆｕｎｃＡが３回呼び出されている。そのため、図１８に示されるトレース差分情報１８０１は、対象および状態の組に続く２の値のうち、左のトレース情報１６０１における値が５とされ、右のトレース情報１６０２における値が３とされている。
【００９４】
図１９は、プログラム１５０１および１５０２を対象とした場合のプログラム差分情報の例を示す。この場合、図１５（ａ）および図１５（ｂ）を比較して分かるように、プログラム１５０１および１５０２は、プログラム１５０２がプログラム１５０１の３行目および４行目の間にソースコード「ｍａｘ＝ｍａｘ−２」が追加されている点が異なっている。換言すれば、プログラム１５０１は、プログラム１５０２のソースコードにおける４行目が存在しない。
【００９５】
この点を反映して、図１９に示されるプログラム差分情報１９０１は、ソースコードの差分を示す部分の記述が「−  ４」とされている。この記述は、プログラム１５０２のソースコードの４行目がプログラム１５０１のソースコードと異なり、且つ、プログラム１５０２のソースコードの４行目に対応するコードがプログラム１５０１のソースコード中に存在しないことを示している。
【００９６】
図２０は、プログラム１５０１および１５０２に対応して表示情報生成部１０４が生成した表示情報に基づく表示画面の例を示す。図２０において、表示画面２００１は、上述の図８の各表示領域８１０、８１１、８１２および８１３にそれぞれ対応する表示領域２０１０、２０１１、２０１２および２０１３を有する。また、図２０における矢印表示２０２０と、点線枠２０３０および２０３１とが意味するところは、上述の図８における矢印表示８２０と、点線枠８３０および８３１と共通なので、ここでの詳細な説明を省略する。
【００９７】
この例では、プログラム差分情報１９０１に従い、プログラム１５０２の４行目がプログラム１５０１と異なり、且つ、プログラム１５０１において当該プログラム１５０２の４行目に対応するコードが存在しない。そのため、表示画面２００１において、プログラム１５０１のソースコードを表示する表示領域２０１２では、４行目の位置が空行とされて当該ソースコードにプログラム１５０２の４行目に対応するコードが存在しないことが示される。また、空行を挿入することで、表示領域２０１２および２０１３で、互いに対応するコードが同一の行に表示されるようになる。さらに、表示画面２００１において、プログラム１５０２の４行目に相当する位置に矢印表示２０２０が表示されて、プログラム１５０２の４行目に対応する行がプログラム１５０１に存在しないことが強調される。
【００９８】
（第１の実施形態に適用可能なハードウェア構成）
次に、第１の実施形態に係る解析装置１００を実現可能な構成について、図２１を用いて説明する。図２１に例示されるように、解析装置１００は、例えば一般的なコンピュータ装置２１００により実現可能である。
【００９９】
図２１において、バス２１２０に対してＣＰＵ２１０１、ＲＡＭ(Random  Access  Memory)２１０２、ＲＯＭ(Read  Only  Memory)２１０３、表示制御部２１０４および通信Ｉ／Ｆ（インターフェイス）２１０５が接続される。また、バス２１２０に対して、ストレージ２１０６、ドライブ装置２１０７および入力Ｉ／Ｆ２１０８が接続される。
【０１００】
ＣＰＵ２１０１は、ＲＯＭ２１０３やストレージ２１０６に記憶されるプログラムに従い、ＲＡＭ２１０２をワークメモリとして用いて、このコンピュータ装置２１００の全体を制御する。表示制御部２１０４は、ＣＰＵ２１０１により生成された表示制御信号を、表示装置２１１０が表示可能な信号に変換して出力する。
【０１０１】
ストレージ２１０６は、例えば不揮発性の半導体メモリやハードディスクドライブであり、上述のＣＰＵ２１０１が実行するためのプログラムや、プログラムによって用いられるデータなどが格納される。ドライブ装置２１０７は、脱着可能な記録媒体２１１１が装填可能とされ、少なくとも当該記録媒体２１１１からのデータの読み出しを行うことができる。ドライブ装置２１０７が対応可能な記録媒体２１１１としては、ＣＤ(Compact  Disk)、ＤＶＤ(Digital  Versatile  Disk)、フレキシブルディスクといったディスク記録媒体や、読み書き可能で不揮発性の半導体メモリが考えられる。
【０１０２】
入力Ｉ／Ｆ２１０８は、外部からのデータの入力を行う。入力Ｉ／Ｆ２１０８は、例えば、ＵＳＢ(Universal  Serial  Bus)やＩＥＥＥ１３９４(Institute  of  Electrical  and  Electronics  Engineers  1394)といった所定のインターフェイスを有し、このインターフェイスにより外部の機器からのデータ入力を行う。また、入力Ｉ／Ｆ２１０８に対して、キーボード２１１２やマウス２１１３といった入力デバイスが接続される。ユーザは、例えば表示装置２１１０に対する表示に応じてこれら入力デバイスを操作することで、このコンピュータ装置２１００に対して指示を出すことができる。
【０１０３】
通信Ｉ／Ｆ２１０５は、所定のプロトコルを用いて外部の通信ネットワークと通信を行う。
【０１０４】
上述した解析装置１００における入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４は、ＣＰＵ２１０１上で動作するプログラム（以下、解析プログラムと呼ぶ）によって実現される。解析対象のプログラムは、例えば他のコンピュータで作成されファイルに格納され、記録媒体２１１１に記録されてこのコンピュータ装置２１００に供給される。これに限らず、プログラムは、外部からネットワークを介してこのコンピュータ装置２１００に供給するようにしてもよい。コンピュータ装置２１００に供給されたプログラムは、入力部１０１に受け取られ、例えばストレージ２１０６やＲＡＭ２１０２に記憶される。
【０１０５】
第１の実施形態に係る解析装置１００の動作を実行するための解析プログラムは、インストール可能な形式または実行可能な形式のファイルでＣＤ、フレキシブルディスク、ＤＶＤなどのコンピュータで読み取り可能な記録媒体２１１１に記録して提供される。これに限らず、第１の実施形態に係る解析プログラムを、ＲＯＭ２１０３に予め記憶させて、コンピュータ装置２１００に提供してもよい。
【０１０６】
さらに、第１の実施形態に係る解析プログラムを、インターネットやＬＡＮ(Local  Area  Network)などのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより、コンピュータ装置２１００に提供するように構成してもよい。また、第１の実施形態に係る解析プログラムを、インターネットなどのネットワーク経由で提供または配布するように構成してもよい。
【０１０７】
第１の実施形態に係る解析プログラムは、上述した各部（入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４）を含むモジュール構成となっており、実際のハードウェアとしては、ＣＰＵ２１０１が例えばストレージ２１０６から当該解析プログラムを読み出して実行することにより上述の各部がＲＡＭ２１０３上にロードされ、各部がＲＡＭ２１０３上に生成されるようになっている。
【０１０８】
一例として、ＣＰＵ２１０１は、入力部１０１が受け取った解析対象のプログラムに基づき、解析用情報生成部１０２によりトレース情報、トレース対応情報およびプログラム情報を生成し、生成したトレース情報、トレース対応情報およびプログラム情報とを、例えばストレージ２１０６に記憶する。ＣＰＵ２１０１は、解析部１０３により、ストレージ２１０６に記憶されたトレース情報、トレース対応情報およびプログラム情報に基づきトレース差分情報およびプログラム差分情報を生成する。ＣＰＵ２１０１は、解析部１０３により、生成したトレース差分情報およびプログラム差分情報の対応関係を解析する。そして、ＣＰＵ２１０１は、表示情報生成部１０４により、解析結果と、ストレージ２１０６に記憶されたプログラム情報（例えばソースコード）とに基づき解析対象のプログラムの差分を可視化するための表示情報を生成する。生成された表示情報は、表示制御部２１０４に渡されて表示装置２１１０が表示可能な表示信号に変換されて、表示装置２１１０に供給され、表示情報に応じた表示がなされる。
【０１０９】
なお、上述では、入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４が１つのコンピュータ装置２１００上で動作するように説明したが、これはこの例に限られない。例えば、入力部１０１、解析用情報生成部１０２、解析部１０３および表示情報生成部１０４のうち１または複数がそれぞれ異なるコンピュータ装置上で動作するようにしてもよい。
【０１１０】
（第１の実施形態の各変形例）
次に、上述した第１の実施形態の変形例について説明する。なお、以下では、上述したプログラム３０１および３０２、９０１および９０２、ならびに、１５０１および１５０２のうち、プログラム３０１および３０２を例にとって説明する。
【０１１１】
先ず、入力部１０１を通じて解析装置１００に入力されるプログラムに関する変形例について説明する。上述したプログラム３０１および３０２の例では、プログラム３０１および３０２がＣ言語やＪａｖａ（登録商標）言語を用いてテキストデータにより記述され、１のプログラムが１のファイルに格納されているが、これはこの例に限定されない。例えば、解析装置１００の解析対象となるプログラムは、特定の処理装置に独自のプログラミング言語を用いて記述されたものでもよいし、複数のプログラミング言語を組み合わせたものであってもよい。また、プログラムのデータ形式は、テキストデータに限らず、何らかのコンパイラでコンパイルされ、特定のコンピュータ装置上で実行可能なバイナリ形式であってもよい。さらに、プログラムのデータ形式は、コンパイラなどの中で用いられる中間表現の形式であってもよいし、アセンブリ言語のような形に変換された結果であってもよい。
【０１１２】
このように、解析装置１００が解析対象とするプログラムは、何らかの方法でトレース情報を出力可能な形態に変換できる形式であれば、どのような形態をとるかは限定されない。また、解析対象のプログラムは、１つのファイルに全ての情報が入っている必要はなく、情報が分割されて複数のファイルになっているものであってもよい。
【０１１３】
次に、プログラム実行時に解析用情報生成部１０２において取得するプログラム情報に関する変形例について説明する。上述の例では、解析用情報生成部１０２は、プログラム３０１および３０２をプログラム情報として取得しているが、これはこの例に限定されない。
【０１１４】
例えば、解析用情報生成部１０２は、プログラムそのものではなく、プログラムが格納されている場所や、プログラムファイルが格納されるサーバなどを識別する情報をプログラム情報に含み、そこから参照されるソースコードに対して差分解析を行ってもよい。また、解析用情報生成部１０２は、プログラムが実行されたハードウェアの情報や、オペレーティングシステムの情報、時刻の情報、プログラムに与えた入力の情報を、プログラム情報として追加してもよい。
【０１１５】
また、解析用情報生成部１０２は、あるプログラムの複数のバージョン間で解析装置１００を利用するような場合においては、プログラム管理システムなどで発行される、ＩＤ番号といったバージョン特定情報を付加して、プログラム情報を生成してもよい。また、プログラム情報のデータ形式は、テキストデータに限らず、既存のデータベースにおける保存形式で保持してもよいし、その他の形式で保持してもよい。このように、プログラム情報は、何らかの形でトレース情報の変化とつながっていることが検出できる可能性のあるような情報が取得可能であれば、形式は限定されない。
【０１１６】
次に、解析用情報生成部１０２が解析対象のプログラムから取得するトレース情報に関する変形例について説明する。上述の例では、解析用情報生成部１０２は、特定のタイミングで実行された内容をトレース情報４０１および４０２として収集しているが、これはこの例に限定されない。例えば、解析用情報生成部１０２は、プログラムの中の関数やブロックなどの特定の部分が、どのタイミングでどの程度の時間実行されたのかという情報を、トレース情報として収集してもよい。また、解析用情報生成部１０２は、オペレーティングシステムに対してそうした情報を収集しても良い。
【０１１７】
また、解析用情報生成部１０２は、メモリの利用状況に関する情報を、トレース情報として収集してもよい。メモリの利用状況に関する情報の例としては、プログラム中のどの部分で、どのメモリへアクセスされているのか、どのタイミングでどの程度メモリが利用されているのか、メモリが確保されたタイミング、メモリが解放されたタイミングといった情報が考えられる。
【０１１８】
さらに、解析用情報生成部１０２は、解析対象のプログラムを実行中の特定のタイミングに各変数などに格納されている実際の値をトレース情報として収集してもよい。さらにまた、解析用情報生成部１０２は、解析対象のプログラムを実行中に、当該プログラムを動作させている他のプログラムのどれが動作していたのかを示す情報や、当該プログラムが動作しているハードウェアから得られる動作情報をトレース情報として収集してもよい。このように、解析用情報生成部１０２が収集するトレース情報は、解析対象のプログラムを実行中に、当該プログラム情報に関連して収集可能な情報であれば、形式は限定されない。
【０１１９】
また、上述の例で、トレース情報に含まれているサイクル情報を順序関係を示す情報として利用してもよい。例えば図４（ａ）に例示したトレース情報４０１のサイクルの情報を参照すると、プログラム３０１において、各実行単位（例えば各関数）は、サイクルの値が小さいものから大きいものへと順に実行されているということが分かる。また、この例では順序関係情報としてサイクルを利用したが、各実行単位に対して単純に順番に番号を振り、この番号を順序関係情報として利用してもよい。このように、順序関係情報は、トレース情報における各実行単位の順序関係が特定できるような情報であれば、形式は限定されない。
【０１２０】
また、トレース情報は、木構造として表現してもよい。図２２は、木構造として表現されたトレース情報を概念的に示す。図２２（ａ）は、図４（ａ）のトレース情報４０１に対応した木構造の例である。図４（ａ）のトレース情報４０１に対応する図３（ａ）のプログラム３０１を参照すると、関数ｆｕｎｃＡは、関数ｍａｉｎから呼び出されており、関数ｆｕｎｃＡおよび関数ｍａｉｎは、関数ｍａｉｎを親、関数ｆｕｎｃＡを子とした親子関係にあることが分かる。
【０１２１】
この関数の親子関係の情報を利用して、図４（ａ）のトレース情報４０１を、図２２（ａ）に例示される木構造として表現できる。図２２（ａ）において、ノード２２０１は、親である関数ｍａｉｎを示し、各ノード２２０２10、２２０２11および２２０２12は、それぞれ子である関数ｆｕｎｃＡを示す。図２２（ａ）において、１つの関数ｍａｉｎに対して子である関数ｆｕｎｃＡが３つ表示されているのは、関数ｍａｉｎから関数ｆｕｎｃＡが３回呼び出されることを示している。
【０１２２】
図２２（ｂ）は、図４（ｂ）のトレース情報４０２に対応した木構造の例である。図４（ｂ）のトレース情報４０２に対応する図３（ｂ）のプログラム３０２を参照すると、図３（ａ）のプログラム３０１と同様に、関数ｆｕｎｃＡは、関数ｍａｉｎから呼び出されており、関数ｆｕｎｃＡおよび関数ｍａｉｎは、関数ｍａｉｎを親、関数ｆｕｎｃＡを子とした親子関係にあることが分かる。そのため、図２２（ａ）の例と同様に、トレース情報４０２を図２２（ｂ）に示す木構造として表現できる。
【０１２３】
図２２（ｂ）の例では、親である関数ｍａｉｎに対応するノード２２０１に対して、子である関数ｆｕｎｃＡに対応するノードがノード２２０２20、２２０２21、２２０２22、２２０２23および２２０２24の５つが表示されている。これは、関数ｍａｉｎから関数ｆｕｎｃＡが５回呼び出されることを示している。
【０１２４】
上述の、トレース情報を木構造として表現する方法では、木の各ノードに、関数の開始サイクル、終了サイクルなどの各種情報を格納することも可能である。ノードに格納する情報は、トレース情報として収集可能なものであれば、この例に限定されない。また、上述の例では、子のノードを親のノードから呼び出された回数分作成しているが、例えば同じ関数は１つのノードにし、各ノードに呼び出し回数の情報を持たせてもよい。このように、トレース情報を木構造として表現する場合の各ノードの構築方法は、親子関係が分かり、且つ親子関係を壊さない範囲であれば特に限定されない。
【０１２５】
また、上述の例では、解析用情報生成部１０２は、トレース情報を出力するためにプログラムに対して出力端を付与しているが、これはこの例に限定されない。すなわち、解析用情報生成部１０２は、プログラム本体に出力端を付与する以外の方法でトレース情報を取得してもよい。このような方法としては、例えば、ハードウェアに予め備わっている出力機構を利用する方法、オペレーティングシステムが持っている出力機構を利用する方法、プログラムへの入力に対して何らかの情報を出力する機能を利用する方法、第１の実施形態に係る解析装置１００に特化したトレース情報収集機能を利用する方法など、様々に考えられる。このように、トレース情報として利用できる情報が取得できれば、その取得方法の形式は限定されない。
【０１２６】
また、上述の図４（ａ）および図４（ｂ）では、トレース情報４０１および４０２がテキストデータとして保持されるように説明したが、これはこの例に限定されない。例えば、解析用情報生成部１０２は、既存のデータベースにおける保存形式でトレース情報を保持してもよいし、その他の形式でトレース情報を保持してもよい。
【０１２７】
次に、解析対象のプログラムから取得するトレース対応情報に関する変形例について説明する。上述の例では、解析用情報生成部１０２は、各トレース情報４０１および４０２の各トレースに対応する、トレースの対象および状態、プログラム３０１および３０２の各ファイル名、ならびに、ファイルの場所およびファイルに格納されるソースコード内の位置を、トレース対応情報５０１および５０２として取得しているが、これはこの例に限定されない。
【０１２８】
例えば、解析用情報生成部１０２は、プログラムが格納されるファイルの場所として、当該ファイルが格納されるサーバなどを識別する情報をトレース対応情報に追加してもよい。また、解析用情報生成部１０２は、プログラムが格納されるファイルに含まれる関数の情報をトレース対応情報として追加してもよい。さらに、解析用情報生成部１０２は、与えられたプログラム情報に応じて、プログラムが実行されたハードウェアの情報や、オペレーティングシステムの情報、プログラムに与えた入力の情報を、トレース対応情報として追加してもよい。
【０１２９】
また、上述では、解析用情報生成部１０２は、トレース情報を発生させたソースコード中の箇所を、ファイル名およびファイルの場所を用いて表現しているが、これはこの例に限定されない。例えば、解析用情報生成部１０２は、トレース情報を発生させたソースコード中の箇所を、ファイルの場所を用いずファイル名で表現してもよいし、関数名、クラス名、メソッド名など、ソースコード中の特定の区間を示すような表現形式を用いて表現しても良い。
【０１３０】
さらに、解析用情報生成部１０２は、あるプログラムの複数のバージョン間で解析装置１００を利用するような場合においては、ファイル名などの情報に対して、さらに、プログラム管理システムなどで発行される、ＩＤ番号といったバージョン特定情報をトレース対応情報に付加してもよい。このように、トレース対応情報は、何らかの形でトレース情報とプログラム情報の対応関係に繋がるような情報であれば、形式は限定されない。
【０１３１】
また、上述の図５（ａ）および図５（ｂ）では、トレース対応情報５０１および５０２がテキストデータとして保持されるように説明したが、これはこの例に限定されない。例えば、解析用情報生成部１０２は、既存のデータベースにおける保存形式でプログラム情報を保持してもよいし、その他の形式でトレース対応情報を保持してもよい。
【０１３２】
次に、プログラム情報、トレース情報およびトレース対応情報の出力方法および出力の付加方法の変形例について説明する。上述では、解析用情報生成部１０２においてプログラムを実行させ、解析用情報生成部１０２がプログラム情報、トレース対応情報およびトレース情報を収集したが、これはこの例に限定されない。すなわち、上述したプログラム情報、トレース対応情報およびトレース情報と同様の内容の情報が取得可能であれば、他の方法で取得してもよい。
【０１３３】
例えば、解析装置１００は、プログラムを開発するための開発関連ツールから出力される情報をプログラム情報に含めてもよいし、当該情報をトレース対応情報およびトレース情報を取得するために利用してもよい。また、解析装置１００は、当該ツールを利用してプログラム情報、トレース対応情報およびトレース情報を出力してもよい。さらに、解析装置１００がコンピュータ装置上で実行されるプログラムで実現される場合、他のコンピュータ装置上でプログラム情報、トレース対応情報およびトレース情報を取得して、解析装置１００に入力してもよい。
【０１３４】
さらに、解析装置１００は、プログラム情報、トレース対応情報およびトレース情報として取得可能な情報を全て取得してもよいし、取得可能な情報に対して制限を与え、プログラム情報、トレース対応情報およびトレース情報として一部の情報を選択的に取得してもよい。さらにまた、解析装置１００は、解析対象のプログラムを実行中の全期間でプログラム情報、トレース対応情報およびトレース情報を取得してもよいし、プログラムを実行した際の全期間のうち所定期間について、プログラム情報、トレース対応情報およびトレース情報を取得してもよい。
【０１３５】
また、上述では、解析用情報生成部１０２は、プログラム情報、トレース対応情報およびトレース情報を個別のファイルに格納するように説明したが、これはこの例に限定されない。すなわち、解析用情報生成部１０２は、プログラム情報、トレース対応情報およびトレース情報を１のファイルに纏めて格納してもよいし、プログラム情報、トレース対応情報およびトレース情報をより細かい単位に分割して、分割されたそれぞれを別個のファイルに格納してもよい。
【０１３６】
次に、入力部１０１を通じて解析装置１００に入力されるプログラムに関する変形例について説明する。上述では、解析装置１００は、プログラムの異なるバージョンを入力するように説明したが、これはこの例に限定されない。例えば、解析装置１００は、あるプログラムと、当該プログラムに対して派生開発を行ったプログラムとを入力してもよい。また、解析装置１００は、互いに類似したプログラムを入力してもよいし、互いに全く異なるプログラムを入力してもよい。また、解析装置１００は、解析対象のプログラムのソースコードそのものではなく、例えばＡＳＴ(Abstract  Syntax  Tree)のような中間コード形式や、実行可能なバイナリコードの形式で入力してもよい。
【０１３７】
また、上述では、解析装置１００が２のプログラムを解析対象としているが、これはこの例に限定されず、３以上のプログラムを解析対象とすることも可能である。例えば３のプログラムが解析対象の場合、解析装置１００は、先ず第１、第２および第３のプログラムのうち第１のプログラムと第２のプログラムとを選択して、上述したようにして対応関係を解析する。次に、第１のプログラムと第３のプログラムとを選択して、上述したようにして対応関係を解析する。これに限らず、解析装置１００は、複数のプログラムから２のプログラムを、全ての組み合わせについて選択してそれぞれ対応関係を解析し、解析した全ての解析結果を利用するようにしてもよい。また、解析装置１００は、複数のプログラムのうちユーザの選択した組み合わせ等、何らかの形で選択された一部のプログラムのみを解析対象としてもよい。また、解析装置１００は、プログラムのソースコード以外のプログラム情報においても、同様に複数のプログラム情報を解析対象としても良い。
【０１３８】
さらに、上述では、解析装置１００は、解析対象のプログラムと、当該プログラムから抽出したプログラム情報、トレース情報およびトレース対応情報とを用いて対応関係の解析を行うように説明したが、これはこの例に限定されず、解析装置１００は、その他の情報を含めて解析を行うこともできる。例えば、解析装置１００は、各情報に加えて、ソースコード管理ツールの情報、プロジェクト管理ツールの情報、デバッガの情報、テスト管理ツールの情報、バグ管理ツールの情報、コードレビューツールの情報、コード解析ツールの情報など、解析対象のプログラムに係る他の情報を含めて解析を行うことが考えられる。これらの情報以外にも、解析装置１００は、トレース情報、プログラム情報に関連付けが可能な情報であれば、情報の種類に限定されず、他の情報を用いて解析を行なってもよい。
【０１３９】
上述の図６では、トレース差分情報６０１がテキストデータとして保持されるように説明したが、これはこの例に限定されない。例えば、トレース差分情報生成部１０３０１は、既存のデータベースにおける保存形式でトレース差分情報を保持してもよいし、その他の形式でトレース差分情報を保持してもよい。
【０１４０】
次に、トレース差分情報生成部１０３０１によるトレース差分情報の生成方法の変形例について説明する。上述では、トレース差分情報生成部１０３０１は、トレース情報４０１および４０２をそれぞれ全体で比較して、トレース対象の動作が発生した回数を計数して、その差分をトレース差分情報として生成しているが、これはこの例に限定されない。
【０１４１】
例えば、トレース差分情報生成部１０３０１は、解析対象のプログラムにおいて、選択した関数の実行中などある特定の範囲内で、予め指定された実行情報をそれぞれ集計し、集計結果の差分をトレース差分情報として取得してもよい。また、トレース差分情報生成部１０３０１は、当該実行情報の発生順を示す順序情報を当該実行情報に付加するようにしてもよい。トレース差分情報生成部１０３０１は、解析対象のプログラム間で実行情報の発生順に差分がある場合に、この差分をトレース差分情報として取得することができる。
【０１４２】
さらに、トレース差分情報生成部１０３０１は、メモリアクセスや関数の実行タイミング、ハードウェアで発生したイベントなど、予め決められた種別を示す種別情報を実行情報に付加するようにしてもよい。こうすることで、トレース差分情報生成部１０３０１は、同一のタイミングで発生した実行情報について、種別情報が異なっている場合、これを差分として抽出して、トレース差分情報として取得することができる。また、この場合、表示情報生成部１０４は、表示情報を種別毎に生成することができる。また、トレース差分情報生成部１０３０１は、このように、厳密に差分を抽出する方法に限らず、差分に対して閾値判定を行なってトレース差分情報を取得してもよいし、指定された一部のトレース情報に対してのみ差分情報を取得しても良い。
【０１４３】
さらにまた、トレース差分情報生成部１０３０１は、順序関係情報を利用する場合、図４（ａ）のトレース情報４０１における順序関係情報であるサイクル情報と、図４（ｂ）のトレース情報４０２における順序関係情報であるサイクル情報とを比較することでトレース差分情報を取得してもよい。図４（ａ）および図４（ｂ）の例では、トレース情報４０１とトレース情報４０２とを比較すると、「funcA  start」および「funcA  end」の数が異なり、順序関係情報であるサイクル情報も、それぞれ７行目までは同一であるが、それ以降の値が異なっている。トレース差分情報生成部１０３０１は、このトレース情報の差分に基づき、トレース差分情報を抽出することができる。
【０１４４】
また、トレース差分情報生成部１０３０１は、図２２（ａ）および図２２（ｂ）の例のようにトレース情報を木構造として扱っている場合であっても、トレース差分情報を取得することができる。この場合、トレース差分情報生成部１０３０１は、トレース情報を示す木構造について、ノードの数やパスが示す親子関係情報、各ノードが持っている情報を比較することでトレース差分情報を取得することが考えられる。
【０１４５】
例えば、図２２（ａ）および図２２（ｂ）の例において、関数ｍａｉｎのノード２２０１に対応する関数ｆｕｎｃＡのノードの数は、図２２（ａ）の例ではノード２２０２10〜２２０２12の３個であり、図２２（ｂ）の例ではノード２２０２20〜２２０２24の５個であり、異なっている。トレース差分情報生成部１０３０１は、このノード個数の差分に基づき、図６に示されるようなトレース差分情報６０１を抽出することができる。
【０１４６】
このように、解析対象のトレース情報から機械的に差分を検知でき、それを特定のトレース情報と関連付けられれば、差分の検出方法は限定されない。
【０１４７】
次に、プログラム差分情報生成部１０３００によるプログラム差分情報の生成方法の変形例について説明する。上述では、プログラム差分情報生成部１０３００は、プログラム３０１および３０２のソースコードを直接的に比較して、プログラム差分情報を生成しているが、これはこの例に限定されない。例えば、解析装置１００は、テキストデータやプログラムのソースコードの差分を検出するために作られた既存のツールを用いて得られた情報を、プログラム差分情報として利用してもよい。
【０１４８】
また、プログラム差分情報生成部１０３００は、プログラム情報に含まれる情報のうち、トレース情報の差異に関連性が無いことが予め分かっている情報が差分として取得された場合に、この関連性の無い情報をプログラム差分情報から除去してもよい。このような、トレース情報の差異に関連性の無いことが予め分かっている情報としては、ソースコード中のコメントやスペース、空行などが考えられる。プログラム情報に含まれるソースコード以外の情報を、統一されたフォーマットで予めテキスト化しておくことも考えられる。プログラム差分情報生成部１０３００は、プログラム３０１および３０２それぞれについてテキスト化された情報の差分を、プログラム差分情報として取得することができる。
【０１４９】
また、プログラム差分情報生成部１０３００は、解析対象のプログラムのソースコードそのものではなく、例えばＡＳＴ(Abstract  Syntax  Tree)のような中間コード形式や、バイナリコード中で対応する関数のバイナリコード長に基づいて、プログラム差分情報を取得してもよい。この場合、プログラム差分情報生成部１０３００は、例えば第１のプログラムが第１のオペレーティングシステム上で実行されており、第２のプログラムが第２のオペレーティングシステム上で実行されているような場合であっても、プログラム差分情報を生成することができる。この場合は、解析用情報生成部１０２がプログラム情報にオペレーティングシステムの情報を、例えばテキスト情報として含めておき、プログラム差分情報生成部１０３００がオペレーティングシステムの情報が含まれたプログラム情報を比較することで、プログラム差分情報を生成することができる。
【０１５０】
また、プログラム差分情報生成部１０３００が中間コードやバイナリコードに基づきプログラム差分情報を生成する場合、プログラム差分情報生成部１０３００は、各プログラムが複数のスレッドやハードウェアとしての複数のコアの何れで実行されており、複数のスレッドや複数のコア間でどのように異なっているかといった差分を取得することが可能である。この場合も、解析用情報生成部１０２は、プログラム情報にそうした情報を含めておき、それを直接比較しても良い。
【０１５１】
このように、解析対象のプログラム情報から差分を取得でき、取得した差分をプログラム情報として格納されている特定の要素と関連付けられれば差分の検出方法は問わない。
【０１５２】
上述の図７では、プログラム差分情報７０１がテキストデータとして保持されるように説明したが、これはこの例に限定されない。例えば、プログラム差分情報生成部１０３００は、既存のデータベースにおける保存形式でプログラム差分情報を保持してもよいし、その他の形式でプログラム差分情報を保持してもよい。
【０１５３】
次に、対応関係解析部１０３１によるプログラム情報と、プログラム差分情報と、トレース差分情報との対応関係の解析方法の変形例について説明する。上述では、対応関係解析部１０３１は、関数レベルで生成されたトレース差分情報およびトレース対応情報を用いて対応関係を解析しているが、これはこの例に限定されない。例えば、対応関係解析部１０３１は、プログラムをブロックや他の特定の区間分けを行った区間レベルで生成されたトレース差分情報およびトレース対応情報を用いて対応関係の有無を判定してもよい。また、対応関係解析部１０３１は、プログラム差分情報とトレース差分情報とをより細かく解析し、各プログラム情報のどの差分がトレースの差分につながっているのかという解析を行ってもよい。さらにこの場合、対応関係解析部１０３１は、複数の異なる情報に関して関係性がある場合に、それら全てを解析結果として出力してもよいし、より因果関係が強いと考えられる情報を所定数選択して解析結果として出力してもよい。さらに、対応関係解析部１０３１は、例えば変数の実際の値を実行情報として取得しておくことで、プログラム情報の変更が変数を通じて当該関係無いと見做される部分に影響を与えているということを解析し、対応関係があると判定してもよい。
【０１５４】
上述では、対応関係解析部１０３１は、プログラムのソースコードの行単位でプログラム情報と、プログラム差分情報と、トレース差分情報との対応関係を判定しているが、これはこの例に限定されない。例えば、対応関係解析部１０３１は、プログラムのソースコードに加え、解析対象のプログラムが動作するオペレーティングシステムやスレッド、コアの情報など、所定の範囲または全体に影響するような情報をプログラム情報に含め、これらに対して関係性を解析してもよい。
【０１５５】
このように、対応関係解析部１０３１は、プログラム情報とプログラム差分情報およびトレース差分情報とを関連付けられれば、関連付けを行う方法については限定されない。
【０１５６】
また、上述では対応関係解析部１０３１は、プログラム差分情報およびトレース差分情報を、プログラム情報として扱っていたプログラム３０１およびプログラム３０２の両方にプログラム差分情報およびトレース差分情報を対応付けていたが、これらをプログラム３０１およびプログラム３０２のうち一方に対応付けてもよい。この場合、プログラム３０１あるいはプログラム３０２のいずれかにのみ対応付けを行い、表示情報生成部１０４においても選択したいずれかのプログラムのみ表示すればよい。
【０１５７】
次に、表示情報生成部１０４による表示情報の生成処理に関する変形例について説明する。上述では、表示情報生成部１０４は、図８に例示されるような、プログラムのソースコードに対して直接的に差分箇所を示す表示画面８０１を表示するための表示情報を生成しているが、これはこの例に限定されない。例えば、表示情報生成部１０４は、ソースコード以外のプログラム情報をテキスト情報として表示しても良いし、プログラム情報を抽象化して図形（アイコンなど）として表示させる表示情報を生成してもよい。
【０１５８】
また、図８の例では、表示情報生成部１０４は、関数の実行回数に基づき表示情報を生成しているが、これはこの例に限定されない。例えば、表示情報生成部１０４は、メモリアクセスや特定のポイントの通過など、数を計数可能なイベント情報とプログラム情報の差分との関連を表示するための表示情報を生成してもよい。
【０１５９】
さらに、表示情報生成部１０４は、関数レベルに限らず、ブロックや、その他特定の区間分けを行った区間レベルでの差分を表示するための表示情報を生成してもよい。さらにまた、表示情報生成部１０４は、メモリの使用量のような、時間経過に伴い変化する情報を対象プログラム単位で表示し、異なる部分を強調表示し、さらにその要因となっているプログラム情報へのリンクを付加することで、特定のタイミングにおける実行情報の差分を表示する表示情報を生成してもよい。
【０１６０】
また、図８の例では、表示情報生成部１０４は、強調表示の方法として、対象箇所を指し示す図形の追加や、対象箇所を枠で囲う方法を用いているが、これは一例であって、この例に限定されない。例えば、表示情報生成部１０４は、対象箇所の可視化を、対象箇所を他と異なる色で表示する色分け、対象箇所を指し示す図形の拡大表示、対象箇所の文字フォントの大きさや太さを他の箇所と異ならせるなどの方法を用いて行なってもよい。また、表示情報生成部１０４は、対象箇所を示す情報を、ユーザの目に付き易い位置に表示させるような表示情報を生成してもよい。このように、表示情報生成部１０４は、対象箇所が他の部分に対して強調されているとユーザに感じさせられる表示であれば、表示の方法は限定されない。
【０１６１】
（効果）
上述したように、第１の実施形態に係る解析装置１００は、複数のプログラムを対象とした場合における、プログラム情報の差異に伴うプログラムの挙動変化の把握を容易とすることができる。第１の実施形態は、これに限らず、下記に説明する様々な効果を奏することが可能である。
【０１６２】
第１の実施形態に係る解析装置１００は、複数のプログラムを対象とした場合における、処理時間の把握を容易とすることができる。あるプログラムを実行した際に、その処理時間がどの程度なのかを把握するための手段は、既に多数存在している。一方、膨大なテストケースがあるようなプログラムを実行し、ある特定のケースにのみ実行時間の増大や実行時間が安定しないなどの、実行時間に関する事象が発生した場合、対象となるプログラム情報のどの部分に原因があるのかを容易に把握できると、プログラムの開発効率が向上する。
【０１６３】
第１の実施形態による解析方法をテストケース毎に適応することで、どのテストケースで実行時間に関する事象が発生しているのか、また、その事象は、プログラム情報のどの部分で発生しているのかを把握することができる。
【０１６４】
第１の実施形態に係る解析装置１００は、トレース情報として、関数やループなどのある特定の区間内の処理時間情報、あるいは、特定のポイントを通過する際の時間情報を持ち、プログラム情報にどのテストケースを対象にプログラムを実行したのかという情報を含めることができる。こうすることで、解析装置１００は、どのテストケースで実行時間に変化が表れているのか、それはどの部分で実行時間が変化していることが要因となっているのかを解析し、可視化することが可能となり、処理時間に関係する事象の把握を行うことが可能となる。
【０１６５】
第１の実施形態に係る解析装置１００は、複数のプログラムを対象とした場合における、エラー部分の把握を容易とすることができる。例えば、解析装置１００は、正常に動作しているバージョンのプログラムとエラーが発生しているバージョンのプログラムをそれぞれ入力してトレース情報を取得し、トレース差分情報とプログラム差分情報とを生成する。解析装置１００は、生成したトレース差分情報とプログラム差分情報とプログラム情報との対応関係を解析し、表示させる。これにより、プログラム間でエラーの要因となる差異の有無を確認することが可能となり、プログラム全体を人手で検査するよりも効率的にエラー要因部分の絞り込み、把握を行うことができる。
【０１６６】
このように、解析装置１００は、エラーが発生しているプログラムのプログラム情報と、エラーが発生していないプログラムのプログラム情報とを比較することで、プログラムに含まれるエラー部分の把握を容易に行うことができる。
【０１６７】
第１の実施形態に係る解析装置１００は、複数のプログラムを対象とした場合における、メモリなどのハードウェア資源の利用状況を容易に把握することができる。
【０１６８】
第１の実施形態に係る解析装置１００は、メモリなどのハードウェア資源の情報をプログラム情報やトレース情報に含め、そうしたハードウェア資源の情報の差分を含めたプログラム差分情報やトレース差分情報を生成する。解析装置１００は、このプログラム差分情報やトレース差分情報と、プログラム情報との対応関係を解析する。これにより、解析装置１００は、プログラム情報の中で、例えばソースコードを変更した際のメモリなどハードウェア資源の利用状況の変化を補足することができ、プログラム変更によるハードウェア資源への影響についても可視化することが可能となる。そのため、解析装置１００は、対象プログラム間でメモリなどのハードウェア資源の利用状況の差異の有無や、この差異が対象プログラム間のどのような差分によって引き起こされたものなのかを把握することができる。
【０１６９】
第１の実施形態に係る解析装置１００は、複数のプログラムを対象とした場合における、消費電力の差異を容易に把握することができる。
【０１７０】
第１の実施形態に係る解析装置１００は、トレース情報に、実行中の消費電力の情報や、利用された命令やメモリアクセスの情報を含めて、これらの情報を含んだトレース情報に基づき消費電力を計算するような方法を利用できる。解析装置１００は、複数のプログラム間の消費電力の差分を含むトレース差分情報と、ソースコードの差分を含むプログラム差分情報との対応関係を解析する。これにより、解析装置１００は、ソースコードを変更した際の消費電力の変化を補足することができ、プログラム変更による消費電力への影響についても可視化することが可能となる。そのため、解析装置１００は、対象プログラム間での消費電力の差異の有無や、この差異が対象プログラム間のどのような差分によって引き起こされたものなのかを把握することができる。
【０１７１】
第１の実施形態に係る解析装置１００は、上述してきた効果によって把握された問題の解決策の把握にも効果がある。
【０１７２】
第１の実施形態に係る解析装置１００の解析により得られたプログラム差分情報とトレース差分情報とプログラム情報との対応関係は、プログラムの挙動が変化した、プログラム上の要因となっている可能性の有無の情報に関連する。解析装置１００は、上述してきたような効果を示すトレース情報と関係のあるプログラム情報を表示することで、問題の修正に必要なプログラム情報の修正箇所を明示することが可能となる。
【０１７３】
（第２の実施形態）
次に、第２の実施形態について説明する。第２の実施形態は、第１の実施形態による解析装置１００をネットワーク・クラウド上に構成した解析システムの例である。図２３は、第２の実施形態に適用可能な解析システムの一例の構成を示す。なお、図２３において、上述の図１と共通する部分には同一の符号を付して、詳細な説明を省略する。
【０１７４】
図２３において、解析システムは、解析装置１００がネットワーク・クラウド２３００上に構成される。ネットワーク・クラウド２３００は、互いにネットワークで接続される複数のコンピュータを含み、外部からは、その内部が隠蔽されたブラックボックスとして入出力のみが示されるネットワーク・グループである。ネットワーク・クラウド２３００は、例えば通信プロトコルとしてＴＣＰ／ＩＰ(Transmission  Control  Protocol/Internet  Protocol)を用いるものとする。
【０１７５】
端末装置２３０１は、ネットワーク・クラウド２３００と通信するための通信Ｉ／Ｆを備え、入力部１０１および出力部２３０２を含む。すなわち、この図２３の例は、解析装置１００の各機能のうち入力部１０１の機能が端末装置２３０１上で実現されている例である。端末装置２３０１は、例えば一般的なコンピュータ装置を適用してもよいし、解析装置１００に専用の装置としてもよい。入力部１０１は、上述したように、解析対象のプログラムを受け取る。出力部２３０２は、ネットワーク・クラウド２３００から送信された表示情報に基づく表示を行う。
【０１７６】
端末装置２３０１において、入力部１０１は、解析対象の各プログラムを受け取る。端末装置２３０１は、入力部１０１が受け取った各プログラムを、ネットワーク・クラウド２３００に送信する。この各プログラムは、ネットワーク・クラウド２３００において、解析装置１００に渡される。
【０１７７】
ネットワーク・クラウド２３００上の解析装置１００は、上述した解析用情報生成部１０２、解析部１０３および表示情報生成部１０４を含む。解析装置１００は、渡された各プログラムから解析用情報生成部１０２でトレース情報、トレース対応情報およびプログラム情報を生成し、解析部１０３でトレース情報、トレース対応情報およびプログラム情報に基づきトレース差分情報およびプログラム差分情報を生成する。そして、解析装置１００は、解析部１０３でトレース差分情報およびプログラム差分情報などに基づき、トレース差分情報およびプログラム差分情報と、プログラム情報との対応関係を解析し、表示情報生成部１０４で、解析結果を表示するための表示情報を生成する。生成された表示情報は、ネットワーク・クラウド２３００から端末装置２３０１に送信される。端末装置２３０１は、表示装置に対して表示情報に応じた表示を行う。
【０１７８】
端末装置２３０１が一般的なコンピュータ装置により構成されている場合、入力部１０１および出力部２３０２は、例えばブラウザアプリケーション（以下、ブラウザと略称する）を用いることができる。これに限らず、入力部１０１および出力部２３０２を、第２の実施形態による解析システム専用のアプリケーションソフトウェアとしてもよい。
【０１７９】
例えば、解析装置１００は、予め作成された、ブラウザが解釈可能なプログラミング言語を用いてプログラムを入力するための入力フォームを、所定のＵＲＬ(Uniform  Resource  Locator)にて端末装置２３０１に対して入力部１０１として提示する。端末装置２３０１において、ブラウザは、この入力フォームを端末装置２３０１の表示装置に表示させ、解析対象のプログラムの入力を促す。
【０１８０】
また、解析装置１００は、解析結果を表示させるための表示情報を、ブラウザが解釈可能なプログラミング言語にて生成し、所定のＵＲＬにて端末装置２３０１に提示する。端末装置２３０１において、ブラウザは、表示情報に従い解析結果を端末装置２３０１の表示装置に表示させる。
【０１８１】
なお、本実施形態は、上述したそのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上述の実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【０１８２】
１００  解析装置
１０１  入力部
１０２  解析用情報生成部
１０３  解析部
１０４  表示情報生成部
３０１，３０２，９０１，９０２，１５０１，１５０２  プログラム
４０１，４０２，１００１，１００２，１６０１，１６０２  トレース情報
５０１，５０２，１１０１，１１０２，１７０１，１７０２  トレース対応情報
６０１，１２０１，１８０１  トレース差分情報
７０１，１３０１，１９０１  プログラム差分情報
８０１，１４０１，２００１  表示画面
８２０，１４２０，２０２０  矢印表示
８３０，８３１，１４３０，１４３１，２０３０，２０３１  点線枠
１０３０  差分情報生成部
１０３００  プログラム差分情報生成部
１０３０１  トレース差分情報生成部
１０３１  対応関係解析部
２１００  コンピュータ装置
２３００  ネットワーク・クラウド
２３０１  端末装置
【図１】
2015043198.tif 000003
【図２】
2015043198.tif 000004
【図３】
2015043198.tif 000005
【図４】
2015043198.tif 000006
【図５】
2015043198.tif 000007
【図６】
2015043198.tif 000008
【図７】
2015043198.tif 000009
【図８】
2015043198.tif 000010
【図９】
2015043198.tif 000011
【図１０】
2015043198.tif 000012
【図１１】
2015043198.tif 000013
【図１２】
2015043198.tif 000014
【図１３】
2015043198.tif 000015
【図１４】
2015043198.tif 000016
【図１５】
2015043198.tif 000017
【図１６】
2015043198.tif 000018
【図１７】
2015043198.tif 000019
【図１８】
2015043198.tif 000020
【図１９】
2015043198.tif 000021
【図２０】
2015043198.tif 000022
【図２１】
2015043198.tif 000023
【図２２】
2015043198.tif 000024
【図２３】
2015043198.tif 000025