(57)【要約】  【課題】  アスペクト織り込みによって元のプログラムの何処に影響があるかを解析し解析結果を提示する方法およびシステムを提供する。  【解決手段】  アスペクト指向プログラミングによるプログラムを入力し、入力したプログラムにおけるデータ依存関係および制御依存関係の情報を取得する解析処理部２０と、このプログラムに対するアスペクトの織り込み箇所から解析処理部２０により取得されたデータ依存関係および制御依存関係をたどってアスペクトの織り込みによる影響の波及経路を探索する影響追跡部３０と、解析処理部２０による構文解析の結果と影響追跡部３０により得られたアスペクトの織り込みによる影響の波及経路の情報とに基づいて、このプログラムにおけるアスペクトの織り込みの影響を受ける箇所を検出し表示出力する表示制御部４０とを備える。  【選択図】  図２
2005258944.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムを解析するプログラム解析装置において、
アスペクト指向プログラミングによるプログラムが入力され、入力されたプログラムを解析しそのプログラムにおけるデータ依存関係および制御依存関係の情報を取得する解析処理部と、
前記プログラムに対するアスペクトの織り込み箇所から前記解析処理部により取得されたデータ依存関係および制御依存関係をたどって当該アスペクトの織り込みによる影響の波及経路を探索する影響追跡部と
を備えることを特徴とするプログラム解析装置。
【請求項２】
前記解析処理部は、前記プログラムに対し構文解析を行って当該プログラムのコントロールフローグラフを生成し、当該プログラムにおけるメソッド呼び出しの親子関係を前記アスペクトにおけるアドバイスとの関係を含めて解析し、当該コントロールフローグラフおよび当該メソッド呼び出しの親子関係の解析結果に基づいてメソッドごとのプログラム依存グラフを生成することを特徴とする請求項１に記載のプログラム解析装置。
【請求項３】
前記影響追跡部は、前記プログラムに含まれる各アスペクトの各織り込み箇所に存在する各基点から、前記プログラム依存グラフにおけるデータ依存関係を表すアークおよび制御依存関係を表すアークをたどり、通ったノードおよびアークに対して、前記波及経路であることを示す情報を付加することを特徴とする請求項２に記載のプログラム解析装置。
【請求項４】
前記影響追跡部は、前記アスペクトのアドバイスがbeforeアドバイスまたはafterアドバイスである場合には、当該アドバイスのソースコード中で、パラメータ中のオブジェクトおよびターゲット・オブジェクトのフィールドへの値の更新が行われる場合に、その更新対象データを前記基点とすることを特徴とする請求項３に記載のプログラム解析装置。
【請求項５】
前記影響追跡部は、前記アスペクトのアドバイスがaroundアドバイスである場合には、当該アドバイスのソースコード中で、下記の基準に合致する更新が行われる場合に、その更新対象データを前記基点とすることを特徴とする請求項３に記載のプログラム解析装置。
基点基準−１：パラメータ中のオブジェクトおよびターゲット・オブジェクトのフィールドへの値の更新が行われる場合。
基点基準−２：proceed()（織り込み対象の本来の呼び出し）へのパラメータに渡る値の更新が行われる場合。
基点基準−３：proceed()からの戻り値を更新して返す場合。
【請求項６】
コンピュータプログラムを解析するプログラム解析装置において、
アスペクト指向プログラミングによるプログラムが入力され、入力されたプログラムを解析しそのプログラムに対して構文解析を行い、当該プログラムのプログラム依存グラフを生成する解析処理部と、
前記解析処理部により生成されたプログラム依存グラフに基づき、前記プログラムに対するアスペクトの織り込み箇所からデータ依存関係および制御依存関係をたどって当該アスペクトの織り込みによる影響の波及経路を探索する影響追跡部と、
前記解析処理部による構文解析の結果と前記影響追跡部により得られたアスペクトの織り込みによる影響の波及経路の情報とに基づいて、前記プログラムにおける前記アスペクトの織り込みの影響を受ける箇所を検出し表示出力する表示制御部と
を備えることを特徴とするプログラム解析装置。
【請求項７】
前記表示制御部は、前記プログラムのソースコードを表示装置に表示させると共に、当該プログラムにおける前記アスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて当該表示装置に表示させることを特徴とする請求項６に記載のプログラム解析装置。
【請求項８】
前記表示制御部は、前記プログラムのソースコードを表示装置に表示させると共に、当該プログラムにおける前記アスペクトの織り込みによる影響の波及経路に対応するデータ依存関係および制御依存関係を示す表示を行うことを特徴とする請求項６に記載のプログラム解析装置。
【請求項９】
前記表示制御部は、前記プログラムを構成するモジュールの一覧を表示装置に表示させると共に、当該プログラムにおける前記アスペクトの織り込みによる影響を受けるモジュールと他のモジュールとの表示形式を変えて当該表示装置に表示させることを特徴とする請求項６に記載のプログラム解析装置。
【請求項１０】
前記表示制御部は、前記プログラムを構成するモジュールの一覧を表示する第１のウィンドウと、当該第１のウィンドウにおいて指定されたモジュールのソースコードを表示する第２のウィンドウとを表示装置に表示させると共に、当該第１のウィンドウにおいて、当該プログラムにおける前記アスペクトの織り込みによる影響を受けるモジュールと他のモジュールとの表示形式を変え、かつ当該第２のウィンドウにおいて、当該モジュールにおける前記アスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて当該表示装置に表示させることを特徴とする請求項６に記載のプログラム解析装置。
【請求項１１】
前記影響追跡部は、前記プログラムに含まれる各アスペクトの各織り込み箇所に存在する各基点から、前記プログラム依存グラフにおけるデータ依存関係を表すアークおよび制御依存関係を表すアークをたどり、通ったノードおよびアークに対して、前記波及経路であることを示す情報を付加し、
前記表示制御部は、前記プログラム依存グラフのノードおよびアークに付加された前記情報に基づいて、前記表示形式の制御を行うことを特徴とする請求項７、請求項９または請求項１０に記載のプログラム解析装置。
【請求項１２】
コンピュータによりコンピュータプログラムの解析を行うプログラム解析方法であって、
アスペクト指向プログラミングによる処理対象プログラムが入力され、入力された当該処理対象プログラムに対して構文解析を行い、当該処理対象プログラムのプログラム依存グラフを生成し、構文解析の結果と当該プログラム依存グラフとを記憶装置に格納する第１のステップと、
前記プログラム依存グラフに基づき、前記処理対象プログラムに対するアスペクトの織り込み箇所からデータ依存関係および制御依存関係をたどって当該アスペクトの織り込みによる影響の波及経路を探索し、探索結果を記憶装置に格納する第２のステップと
を含むことを特徴とするプログラム解析方法。
【請求項１３】
前記第１のステップは、
前記処理対象プログラムに対し構文解析を行って当該処理対象プログラムのコントロールフローグラフを生成するステップと、
前記処理対象プログラムにおけるメソッド呼び出しの親子関係を前記アスペクトにおけるアドバイスとの関係を含めて解析するステップと、
前記コントロールフローグラフおよび前記メソッド呼び出しの親子関係の解析結果に基づいてメソッドごとのプログラム依存グラフを生成するステップと
を含むことを特徴とする請求項１２に記載のプログラム解析方法。
【請求項１４】
前記第１のステップで得られた前記構文解析の結果と前記第２のステップで得られた前記アスペクトの織り込みによる影響の波及経路の探索結果とに基づいて、前記処理対象プログラムにおける前記アスペクトの織り込みの影響を受ける箇所を検出し表示出力する第３のステップをさらに含むことを特徴とする請求項１２に記載のプログラム解析方法。
【請求項１５】
前記第２のステップでは、前記処理対象プログラムに含まれる各アスペクトの各織り込み箇所に存在する各基点から、前記プログラム依存グラフにおけるデータ依存関係を表すアークおよび制御依存関係を表すアークをたどり、通ったノードおよびアークに対して、前記波及経路であることを示す情報を付加し、
前記第３のステップでは、前記プログラム依存グラフのノードおよびアークに付加された前記情報に基づいて、前記プログラムにおける前記アスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて表示装置に表示させることを特徴とする請求項１４に記載のプログラム解析方法。
【請求項１６】
前記第３のステップでは、前記プログラムのソースコードを表示装置に表示させると共に、当該プログラムにおける前記アスペクトの織り込みによる影響の波及経路に対応するデータ依存関係および制御依存関係を示す表示を行うことを特徴とする請求項１４に記載のプログラム解析方法。
【請求項１７】
コンピュータに、
アスペクト指向プログラミングによる処理対象プログラムが入力され、入力された当該処理対象プログラムに対して構文解析を行い、当該処理対象プログラムのプログラム依存グラフを生成し、構文解析の結果と当該プログラム依存グラフとを記憶装置に格納する第１の処理と、
前記プログラム依存グラフに基づき、前記処理対象プログラムに対するアスペクトの織り込み箇所からデータ依存関係および制御依存関係をたどって当該アスペクトの織り込みによる影響の波及経路を探索し、探索結果を記憶装置に格納する第２の処理と
を実行させることを特徴とするプログラム。
【請求項１８】
前記第１の処理で得られた前記構文解析の結果と前記第２の処理で得られた前記アスペクトの織り込みによる影響の波及経路の探索結果とに基づいて、前記処理対象プログラムにおける前記アスペクトの織り込みの影響を受ける箇所を検出し表示出力する第３の処理を、前記コンピュータにさらに実行させることを特徴とする請求項１７に記載のプログラム。
【請求項１９】
前記第２の処理では、前記処理対象プログラムに含まれる各アスペクトの各織り込み箇所に存在する各基点から、前記プログラム依存グラフにおけるデータ依存関係を表すアークおよび制御依存関係を表すアークをたどり、通ったノードおよびアークに対して、前記波及経路であることを示す情報を付加する処理を前記コンピュータに実行させ、
前記第３の処理では、前記プログラム依存グラフのノードおよびアークに付加された前記情報に基づいて、前記処理対象プログラムにおける前記アスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて表示装置に表示させる表示制御を前記コンピュータに実行させることを特徴とする請求項１７に記載のプログラム。
【請求項２０】
前記第３の処理では、前記処理対象プログラムのソースコードを表示装置に表示させると共に、当該処理対象プログラムにおける前記アスペクトの織り込みによる影響の波及経路に対応するデータ依存関係および制御依存関係を示す表示を行う表示制御を前記コンピュータに実行させることを特徴とする請求項１７に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アスペクト指向プログラミング（ＡＯＰ：Aspect-Oriented Programming）に関し、特にプログラムを解析し、その解析結果を出力するシステムおよびその方法に関する。
【背景技術】
【０００２】
近年、アスペクト指向プログラミングが大変注目されつつある。アスペクト指向プログラミングとは、関心事の分離（Separation of Concerns）という概念を実現するプログラミング方式である（例えば、特許文献１参照）。
例えば、オブジェクト指向は、データと手続きとをひとかたまりとしたクラスという単位のモジュラリティを導入し、それまでの手続き型言語とは異なるオブジェクトという設計実装を実現している。しかし、クラスという単位をまたがった関心事が存在し、それをオブジェクト指向ではモジュールとして設計実装することはできない。クラスをまたがる関心事は、横断的関心事（Crosscutting Concerns）と呼ばれ、よく挙げられる例としてはロギングやセキュリティがある。
【０００３】
ロギングを例として、横断的関心事について説明する。
ソフトウェアの仕様書にロギングをファイルに出力する機能を付けるという記述があったとする。これがロギングに関する関心事である。Ｊａｖａ（米国サン・マイクロシステムズ社の商標）を例に取るならば、この機能を付加するためには、ログを出力したい全てのメソッド呼び出しの前もしくは後ろに、ログを出力する出力文を付加する必要がある。すなわち、ログを出力するという関心事が実装時点では、プログラム内全体に分散されて実装されることになる。これは、ログを出力したいという関心事は、オブジェクト指向分析により導かれるクラス設計とは別の次元であり、クラス／メソッドに横断的であることを意味している。そこで、このログを出力したいという機能（横断的関心事）を、プログラム中に分散して記述するのではなく、ひとかたまりのモジュール（アスペクト）として一箇所に書くことを可能にするのがアスペクト指向プログラミングである。
このように、アスペクト指向プログラミングでは、横断的関心事相当のモジュールをアスペクトとして、クラスとは別に記述し、各クラスに織り込み（Weaving）をすることによりプログラムを生成する。
【０００４】
別の例として、点（Point）と線（Line）を操作する簡単な図形エディタのプログラムについて考える（例えば、非特許文献１、２参照）。
図２７は、非特許文献１、２に記載された、この図形エディタのＵＭＬ（Unified Modeling Language）図である。
図２７に示すPointクラスおよびLineクラスにおいて、その位置を返すのみのgetX、getY、getP1、getP2メソッドは、その呼び出しの後に処理は要らない。しかし、setX、setY、moveBy、setP1、setP2、moveByに関しては、図形がその位置を変えるため、エディタの動作としては画面を更新することが必要となる。
この場合、これまで通常のＪａｖａのプログラムでは、setX、setY、moveBy、setP1、setP2、moveByに関わる箇所に全て、画面を更新する文を書く必要があった。アスペクト指向プログラミングでは、ここでの「画面の更新」を横断的関心事ととらえ、アスペクトというモジュールとして一箇所に書くことができる。
【０００５】
図２８は、非特許文献１、２に記載された、図２７の図形エディタにおける画面更新機能を実現するアスペクトの記述の例を示す図である。図２８には、Ｊａｖａの多目的アスペクト指向的な拡張であるAspectJを用いて、画面更新機能を実現するDisplayUpdatingアスペクトが記述されている。
アスペクト指向プログラミングでは、織り込み（Weaving）する箇所の記述をポイントカット（pointcut）として記述する。ここでは、織り込み対象のメソッドをポイントカットとして記述し、それにmoveという名前をつけている。
ポイントカットで指定された箇所で実行されるコードを記述するために、アスペクト指向プログラミングでは、アドバイス（Advice）宣言を使う。この例では、プログラムのコンパイル時に、afterアドバイスが利用され、先にmoveとして定義されたポイントカットに相当するメソッド呼び出しの直後（after）に、 画面更新（Display.update）の文が実行されるように織り込み（Weaving）が行われたプログラムが生成されて、最終的にＪａｖａバイトコードにコンパイルされる。
【０００６】
このように、従来のＪａｖａではプログラム中に分散して記述する必要があった画面更新という横断的関心事が、アスペクト指向プログラミングではアスペクトとして一箇所に記述できることになり、プログラムの保守性も高まることになる。
なお上記ではAspectJを例として、オブジェクト指向設計／言語に対するアスペクト指向プログラミングの適用について説明したが、アスペクト指向プログラミング自体は構造化設計／手続き型言語に対しても適用可能であり、対オブジェクト指向プログラミングだけでなく、幅広い適用可能性がある。
【０００７】
【特許文献１】特開２００３−２３３４９９号公報
【非特許文献１】G. Kiczales、“Aspect-Oriented Programming with AspectJ”、オブジェクト指向２００２シンポジウム資料集  第２分冊、２００２年
【非特許文献２】大森 敏行  他、「Ｊａｖａの知られざる欠陥（下）」日経バイト２００２年１０月号、日系ＢＰ社、２００２年
【発明の開示】
【発明が解決しようとする課題】
【０００８】
上述したように、アスペクト指向プログラミングにおけるアスペクトのクラスへの織り込み（Weaving）は大変強力な機能であるが、コンパイル時にシステムが自動的にアスペクトの織り込みを行うために、次のような課題が生ずる。
１．バグの追跡支援の必要性
アスペクトの織り込み（Weaving）前のプログラムには無かったバグが、織り込み後に入ってしまった場合、プログラムの値が想定していたものと異なっていることが発見された場所から実行の流れを逆にたどり、どのアスペクトの織り込みによりバグが導入されたかを知る必要がある。
一方、プログラマが保守するのは、織り込み前のプログラムと、それとは別に記述されたアスペクトであり、織り込み前のプログラム中のある箇所で値が想定と異なることが発見されても、そこから実行順序をさかのぼってバグを含むアスペクトにたどり着くためには、プログラマが織り込み後のプログラムを意識しながら、追跡しなければならない。
【０００９】
２．元のプログラム中の文の実行順序や文からの出力結果に対する影響の検証
アスペクトによっては、織り込みにより、元のプログラム中の文に関して実行順序や出力結果に影響を与えず、純粋に機能を付加するのみの場合がある。例えば、ログ出力などがそのケースである。
しかしながら、プログラマがそのような「元のプログラム中の文の実行に影響を与えない」織り込みがなされることを想定してアスペクトを書いたつもりでありながら、記述ミス（バグ）により、「元のプログラム中の文の実行に影響を与える」アスペクトを書いてしまう可能性がある。ここで、「元のプログラム中の文の実行に影響を与える」とは、「元のプログラム中に存在する文の実行順序や各文による計算結果が織り込みにより変化する」ことを意味し、「元のプログラム中の文の実行に影響を与えない」とは、「織り込みにより、元のプログラム中のあらゆる文の実行順序も、各文による計算結果も変わらず、そのアスペクトの織り込みが純粋に機能を付加するのみである」ことを意味するものとする（本明細書の以下の説明においても同様）。
【００１０】
３．織り込み後のテストの効率化
アスペクトの織り込みによる影響の生ずる範囲が正確に分からないため、プログラムに対してテストを行う場合、元のプログラムに対して既にテストが行われていて、テストケースがそろっている場合であっても、どのテストケースについてアスペクトの織り込み後に再テストすべきかを特定することができない。そのため、全てのテストケースで再テストを行う必要があり、再テスト不要なテストケースについても重複してテストを行うこととなって、テスト工程の効率が悪くなる。
【００１１】
ところで、アスペクト指向プログラミングにおけるアスペクトの織り込み箇所を視覚化するツールとして、eclipseベースのAspectJ開発環境であるＡＪＤＴ（AspectJ Development Tools）の中のAspect Visualizerがある。
図２９は、Aspect Visualizerの出力画面の例を示す図である。
しかしながら、Aspect Visualizerの機能は、Ｊａｖａファイル中のアスペクトの織り込みが行われた箇所を示すだけである。結合点におけるメソッド呼び出しのパラメータ中のオブジェクトやターゲット・オブジェクトのデータ・フィールドに対する代入の変更、戻り値に対する代入の変更がアスペクト中で行われた場合（ある種の副作用と言える）、フィールド、戻り値などを経由して、元のプログラムに対するアスペクトの織り込みの影響は波及していくが、Aspect Visualizerでこの織り込みの影響を解析することはできない。
したがって、Aspect Visualizerでは、上述した課題を解決することはできない。
【００１２】
そこで本発明は、アスペクト織り込みによって元のプログラムの何処に影響があるかを解析する方法を提供することを目的とする。
本発明は、上記の目的に加え、解析結果を提示することにより、アスペクトの織り込み後に生じたバグの原因となったアスペクトの追跡を支援するシステムを実現することを他の目的とする。
また本発明は、上記の目的に加え、解析結果を提示することにより、アスペクトの織り込み後のプログラムを実行することなく、「元のプログラム中の文の実行に影響を与えない」アスペクトであるか否かを検証するシステムを実現することを他の目的とする。
さらに本発明は、上記の目的に加え、解析結果に基づいて、アスペクトの織り込み後に再テストすべきテストケースを特定し、テスト工程の効率化を図ることをさらに他の目的とする。
【課題を解決するための手段】
【００１３】
上記の目的を達成する本発明は、コンピュータプログラムを解析する、次のように構成されたプログラム解析装置として実現される。この装置は、アスペクト指向プログラミングによるプログラムが入力され、入力されたプログラムを解析しそのプログラムにおけるデータ依存関係および制御依存関係の情報を取得する解析処理部と、このプログラムに対するアスペクトの織り込み箇所から解析処理部により取得されたデータ依存関係および制御依存関係をたどってアスペクトの織り込みによる影響の波及経路を探索する影響追跡部と、解析処理部による構文解析の結果と影響追跡部により得られたアスペクトの織り込みによる影響の波及経路の情報とに基づいて、このプログラムにおけるアスペクトの織り込みの影響を受ける箇所を検出し表示出力する表示制御部とを備えることを特徴とする。
【００１４】
ここで、より詳細には、解析処理部は、プログラムに対し構文解析を行ってプログラムのコントロールフローグラフを生成し、プログラムにおけるメソッド呼び出しの親子関係をアスペクトにおけるアドバイスとの関係を含めて解析し、コントロールフローグラフおよびメソッド呼び出しの親子関係の解析結果に基づいてメソッドごとのプログラム依存グラフを生成する。そして、影響追跡部は、プログラムに含まれる各アスペクトの各織り込み箇所に存在する各基点から、プログラム依存グラフにおけるデータ依存関係を表すアークおよび制御依存関係を表すアークをたどり、通ったノードおよびアークに対して、波及経路であることを示す情報を付加する。表示制御部は、プログラム依存グラフのノードおよびアークに付加された情報に基づいて、プログラムにおけるアスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて表示装置に表示させる。
【００１５】
さらに好ましくは、表示制御部は、プログラムを構成するモジュールの一覧を表示する第１のウィンドウと、第１のウィンドウにおいて指定されたモジュールのソースコードを表示する第２のウィンドウとを表示装置に表示させる。そして、第１のウィンドウにおいて、プログラムにおけるアスペクトの織り込みによる影響を受けるモジュールと他のモジュールとの表示形式を変え、かつ第２のウィンドウにおいて、モジュールにおけるアスペクトの織り込みによる影響を受ける箇所と他の箇所との表示形式を変えて表示装置に表示させる。また、表示制御部は、プログラムにおけるアスペクトの織り込みによる影響の波及経路に対応するデータ依存関係および制御依存関係を示す表示を行う。
ユーザ（プログラマ）は、このように表示制御された出力画面を参照することにより、任意のアスペクトの織り込みにより、プログラムのどの部分が影響を受けるかを、アスペクトの織り込み箇所からの影響の波及の様子も含めて、視覚的に認識することができる。
【００１６】
また、上記の目的を達成する他の本発明は、コンピュータによりコンピュータプログラムの解析を行う、次のようなプログラム解析方法としても実現される。このプログラム解析方法は、アスペクト指向プログラミングによる処理対象プログラムが入力され、入力された処理対象プログラムに対して構文解析を行い、処理対象プログラムのプログラム依存グラフを生成し、構文解析の結果とプログラム依存グラフとを記憶装置に格納する第１のステップと、このプログラム依存グラフに基づき、処理対象プログラムに対するアスペクトの織り込み箇所からデータ依存関係および制御依存関係をたどってアスペクトの織り込みによる影響の波及経路を探索し、探索結果を記憶装置に格納する第２のステップと、第１のステップで得られた構文解析の結果と第２のステップで得られたアスペクトの織り込みによる影響の波及経路の探索結果とに基づいて、処理対象プログラムにおけるアスペクトの織り込みの影響を受ける箇所を検出し表示出力する第３のステップとを含む。
【００１７】
さらに本発明は、コンピュータを制御して上述したプログラム解析方法における各ステップに対応する処理を実行させるプログラム、あるいは、コンピュータに上記プログラム解析装置の各機能を実現させるプログラムとしても実現される。このプログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記憶装置に格納して配布したり、ネットワークを介して配信したりすることにより提供することができる。
【発明の効果】
【００１８】
以上のように構成された本発明によれば、アスペクト指向プログラミングにおいて、アスペクト織り込みによって元のプログラムの何処に影響があるかを解析し、その結果を表示出力することができる。
ユーザ（プログラマ）は、表示出力された画面を参照することにより、アスペクトの織り込み後に生じたバグの原因となったアスペクトの追跡を容易に行うことができる。また、アスペクトの織り込み後のプログラムを実行することなく、「元のプログラム中の文の実行に影響を与えない」アスペクトであるか否かを検証することができる。さらに、解析結果に基づいて、アスペクトの織り込み後に再テストすべきテストケースを特定できるため、テスト工程の効率化を図ることができる。
【発明を実施するための最良の形態】
【００１９】
以下、添付図面を参照して、本発明を実施するための最良の形態（以下、実施形態）について詳細に説明する。
図１は、本実施形態によるプログラム解析及び解析結果の出力を行うのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。
図１に示すコンピュータ装置は、演算手段であるＣＰＵ（Central Processing Unit：中央処理装置）１０１と、Ｍ／Ｂ（マザーボード）チップセット１０２およびＣＰＵバスを介してＣＰＵ１０１に接続されたメインメモリ１０３と、同じくＭ／Ｂチップセット１０２およびＡＧＰ（Accelerated Graphics Port）を介してＣＰＵ１０１に接続されたビデオカード１０４及びディスプレイ１１０と、ＰＣＩ（Peripheral Component Interconnect）バスを介してＭ／Ｂチップセット１０２に接続された磁気ディスク装置（ＨＤＤ）１０５、ネットワークインターフェイス１０６と、さらにこのＰＣＩバスからブリッジ回路１０７およびＩＳＡ（Industry Standard Architecture）バスなどの低速なバスを介してＭ／Ｂチップセット１０２に接続されたフレキシブルディスクドライブ１０８およびキーボード／マウス１０９とを備える。
【００２０】
なお、図１は本実施形態を実現するコンピュータ装置のハードウェア構成を例示するに過ぎず、本実施形態を適用可能であれば、他の種々の構成を取ることができる。例えば、ビデオカード１０４を設ける代わりに、ビデオメモリのみを搭載し、ＣＰＵ１０１にてイメージデータを処理する構成としても良いし、外部記憶装置として、ＡＴＡ（AT Attachment）やＳＣＳＩ（Small Computer System Interface）などのインターフェイスを介してＣＤ−Ｒ（Compact Disc Recordable）やＤＶＤ−ＲＡＭ（Digital Versatile Disc Random Access Memory）のドライブを設けても良い。
【００２１】
図２は、本実施形態のプログラム解析システムの機能構成を示す図である。
図２を参照すると、本実施形態のプログラム解析システムは、アスペクト指向プログラミング言語で記述されたプログラムを格納したプログラム格納部１０と、プログラム格納部１０から処理対象のプログラムを読み出して構文解析および依存関係の解析を行う解析処理部２０と、解析処理部２０の解析結果に基づいてプログラム中のクラスへのアスペクトの織り込みを行った場合の影響の追跡を行う影響追跡部３０と、解析処理部２０および影響追跡部３０の処理結果に基づいてプログラムに対する処理結果をユーザ（プログラマ）に提示するための出力画面を作成し表示出力する表示制御部４０とを備える。
プログラム格納部１０は、例えば図１に示したメインメモリ１０３や磁気ディスク装置１０５にて実現され、処理対象であるアスペクト指向プログラミング言語で記述されたプログラムを格納している。
【００２２】
解析処理部２０は、例えば図１のプログラム制御されたＣＰＵ１０１にて実現され、プログラム格納部１０から処理対象のプログラムを読み出して、構文解析を行ってプログラムの構造を反映した構文木と関数名や変数名を管理するための記号表とを生成し、この構文木から制御の流れを表すコントロールフローグラフ（Control Flow Gragh：ＣＦＧ）を生成する。また、各メソッド呼び出しの関係（親子関係）を解析する。そして、生成したコントロールグラフおよびメソッド呼び出しの関係の解析結果に基づいて、メソッドごとにプログラムにおけるデータ依存関係（Data Dependence）および制御依存関係（Control Dependence）の解析を行い、これらデータ依存関係および制御依存関係の情報を持つプログラム依存グラフ（Program Dependence Graph：ＰＤＧ）を生成する。生成された構文木、記号表、コントロールフローグラフ、プログラム依存グラフおよびメソッド呼び出し間の関係の解析結果は、例えば図１のメインメモリ１０３やＣＰＵ１０１のキャッシュメモリ、磁気ディスク装置１０５等に保持されて、次の処理において利用される。
ここで、本実施形態では、メソッド呼び出しの親子関係を解析する場合に、アスペクトで記述された部分（アドバイス）をメソッド呼び出しと同様に解釈して解析を行う。
【００２３】
なお、本実施形態における構文解析とは、通常のコンパイラの処理における構文解析と同様である。また、データ依存関係および制御依存関係の語は、プログラムスライシングにおけるこれらの語と同じ概念で用いている。プログラムスライシングは、プログラム内の任意の文が着目する変数に影響を与えるコードを元のプログラムから抽出する既存の技術であり、デバッグ、テスト、再利用などのソフトウェア開発や保守に有用な手法である。すなわち、データ依存関係とは、ある変数を定義した文とその変数の値が代入された文との間の関係の関係であり、制御依存関係とは、ある文が実行されるか否かを左右する条件部への依存関係である。
【００２４】
図３は、プログラムのソースコードにおけるデータ依存関係および制御依存関係の例を示す図、図４は、図３におけるデータ依存関係および制御依存関係をコントロールフローグラフ上で示した図である。
図３において、１行目のget(n1,n2)で代入された変数ｎ１、ｎ２の値が３行目のif (n1 < n2)で参照されており、ここにデータ依存関係が存在する。また、２行目のmax = n1および４行目のmax = n2で代入された変数ｍａｘの値が６行目のput(max)で参照されているので、この２行目および４行目と６行目との間にデータ依存関係が存在する。一方、３行目のif (n1 < n2)を条件として４行目のmax = n2が実行されるので、この３行目と４行目との間に制御依存関係が存在する。
図４には、以上の依存関係が、コントロールフローグラフのノード間の依存関係として表記されている。なお、図３、４において、データ依存関係は実線で、制御依存関係は一点鎖線で記載されている。また、図４では、各ノード間のコントロールフローの制御の流れを示す矢印が太実線で記載されている。
【００２５】
図５は、解析処理部２０により生成されるプログラム依存グラフの構成を説明する図である。
図５において、左側に記載された７行のプログラムにおける各文の間の依存関係が、右側に記載されたプログラム依存グラフに表現されている。すなわち、プログラムの１、２行目で代入された変数ｘ、ｙの値がそれぞれ３行目、４行目および６行目で参照されており、このデータ依存関係が実線で記載されている。また、プログラムの３行目のｉｆ文が４行目および６行目の実行条件となっており、この制御依存関係が一点鎖線で記載されている。
【００２６】
影響追跡部３０は、例えば図１のプログラム制御されたＣＰＵ１０１にて実現され、解析処理部２０により生成されたプログラム依存グラフに基づいて、アスペクトが元のプログラムに与える影響の波及経路の探索を実行する。
具体的には、影響追跡部３０は、まず、各アスペクトから元のプログラムに与える影響の基点を発見し、リストアップする。ここで、基点とは次のような点である。すなわち、アスペクト中に、メソッド呼出のパラメータやターゲットのオブジェクトのフィールドに対する更新（代入）や、戻り値に対する値の更新がある場合、その織り込み箇所からその更新により元のプログラムに影響が与えられる。この更新時点での更新対象データを基点と呼ぶ。織り込み箇所が基点を含むか否かは、次の基準によることとする。
１．Beforeアドバイスまたはafterアドバイス（メソッド呼び出しの前または後への挿入）のソースコード中で、パラメータ中のオブジェクトおよびターゲット・オブジェクトのフィールドへの値の更新が行われる場合。
２．aroundアドバイス（メソッド自体の置き換え）のソースコード中で、次の基準に合致する更新が行われる場合。
［基点基準１］パラメータ中のオブジェクトおよびターゲット・オブジェクトのフィールドへの値の更新が行われる。
［基点基準２］proceed()（織り込み対象の本来の呼び出し）へのパラメータに渡る値の更新が行われる。
［基点基準３］proceed()からの戻り値を更新して返す。
【００２７】
次に、影響追跡部３０は、リストアップされた各基点からプログラム依存グラフをたどって、制御依存関係およびデータ依存関係によってアスペクトの影響が波及する経路をマーキングする。すなわち、所定のアスペクトに関して、基点から順にプログラム依存グラフのデータ依存と制御依存のアークを矢印方向にたどり、訪問したノード全てにそのアスペクトから影響があるという印（情報）を付加していく。また、この工程でたどったデータ依存関係および制御依存関係のアークにも同様の印（情報）を付加していく。このノードおよびアークに付加された印（情報）は、プログラム依存グラフと共に例えば図１のメインメモリ１０３や磁気ディスク装置１０５に格納され、表示制御部４０の処理で用いられる。なお、アスペクトの影響があるという印（情報）を付加されたプログラム依存グラフのデータ構造については、段落［００５５］において述べる。
【００２８】
表示制御部４０は、例えば図１のプログラム制御されたＣＰＵ１０１とビデオカード１０４とで実現され、解析処理部２０により生成された構文木および記号表と影響追跡部３０によりアスペクトの影響があるという印（情報）を付加されたプログラム依存グラフとに基づいて、処理結果をユーザ（プログラマ）に提示するための出力画面を生成し、ディスプレイ１１０に表示させる。
図６は、表示制御部４０により表示出力される出力画面の構成例を示す図である。
図６に示す出力画面は、織り込み影響表示ウィンドウ６１０と、詳細表示ウィンドウ６２０の２つのウィンドウにて構成されている。
【００２９】
織り込み影響表示ウィンドウ６１０は、元のプログラムを構成するモジュール（クラス）およびアスペクトを表示しており、着目中のアスペクトとそのアスペクトの織り込みによって影響を受けるクラスを識別できるように表示を切り替えている。図示の例では、処理対象であるプログラムが、「Account.java」、「BalanceFormat.java」、「ExchangeRate.java」および「SampleMain.java」という４つのクラスと、「ForeignCurrency」と「Logging」という２つのアスペクトとからなる。そして、着目中のアスペクトの名前「ForeignCurrency」が白抜きの矢印６１１で示され、このForeignCurrencyアスペクトの織り込みによって影響を受けるAccount.java、BalanceFormat.javaおよびSampleMain.javaの各クラス名が太字で表示されている。また、詳細表示ウィンドウ６２０にソースコードが表示されているSampleMain.javaの各クラス名には、さらに下線が付されている。
なお、図６に示す表示の切り替えは例示に過ぎず、図示の手法の他、文字や矢印の表示色や文字フォントを変えるなど、影響を受けるクラスと受けないクラスとを識別するために、任意の方法をとることができる。
【００３０】
図７は、図６に示した表示画面の織り込み影響表示ウィンドウ６１０の他の表示例を示す図である。
図７の例では、着目中のアスペクトをForeignCurrencyからLoggingに切り替えているため、アスペクト名「Logging」を記述した矢印６１２が白抜きで手前に表示されている。また、Loggingアスペクトの織り込みによって影響を受けるクラスは存在しないので、４つのクラスはいずれも太字表記されていない。
【００３１】
図８は、図６に示した表示画面の詳細表示ウィンドウ６２０の表示内容を説明する図である。
図８に示す例では、SampleMainクラスのソースコードと、アスペクトの織り込みがSampleMainクラスに与える影響の様子が示されている。同図において、アスペクト名「ForeignCurrency」が表記された矢印６２１は、織り込み影響表示ウィンドウ６１０において指定された着目中のForeignCurrencyアスペクトがSampleMainクラス中に織り込まれる位置を示している。また、SampleMainクラスのソースコードに付加された実線の矢印はデータ依存関係を、一点鎖線の矢印は制御依存関係を示す。そして、SampleMainクラスのソースコードにおいて、ForeignCurrencyアスペクトの織り込みによって影響を受ける文が太字で表記されている。図８によれば、ForeignCurrencyアスペクトがSampleMainクラスに織り込まれることによって、直接変更される文の他、この文に対してデータ依存関係または制御依存関係を有する文にも影響を与えることが分かる。なお、データ依存関係を示す実線の矢印には、矢印の指示先で参照される変数の表記が付加されている。
【００３２】
図９は、詳細表示ウィンドウ６２０の他の表示内容を説明する図である。
図９に示す例では、図６のようにForeignCurrencyアスペクトに着目した状態で、BalanceFormatクラスのソースコードが表示されている。詳細表示ウィンドウ６２０に表示されるソースコードの切り替えは、例えば、織り込み影響表示ウィンドウ６１０上で、マウスクリック等の手段により所望のクラスを指定することによって行うことができるものとする。
【００３３】
図示の例では、BalanceFormatクラスには、ForeignCurrencyアスペクトは織り込まれず、アスペクト名「ForeignCurrency」が表記された矢印６２１は表示されていない。しかし、図８に示したように、SampleMainクラスへのForeignCurrencyアスペクトの織り込みにより変数ｂが影響を受けており、BalanceFormatクラス内の文中でこの変数ｂを代入しているので、結果として、このBalanceFormatクラスもForeignCurrencyアスペクトの織り込みによる影響を受けることとなる。そして、実線の矢印で表記されたデータ依存関係と一点鎖線の矢印で表記された制御依存関係とを介して、他の文にもForeignCurrencyアスペクトの織り込みによる影響が波及していることがわかる。
【００３４】
ユーザ（プログラマ）は、表示制御部４０により表示出力された織り込み影響表示ウィンドウ６１０を、着目するアスペクトを切り替えながら参照することにより、プログラムに織り込まれるどのアスペクトがどのクラスの実行に影響を与えるかを知ることができる。そして、所望のクラスのソースコードを詳細表示ウィンドウ６２０に表示させて参照することにより、個々のソースコードにおけるどの文がアスペクトの織り込みによる影響を受けるのかを具体的に知ることができる。
【００３５】
次に、具体的なプログラムの例を挙げて、本実施形態の動作について詳細に説明する。
以下に示す動作例では、処理対象のプログラムとして、下記の４つのＪａｖａプログラム（クラス）および２つのアスペクトを想定する。
SampleMain.java：
Ｊａｖａによるメインプログラム。CustomerIDが１の顧客に対して銀行口座オブジェクトを生成し、預金（１０００円）している。最後に確認した預金残高と、引き出し額（９５０円）を比較し、残高の方が大きければ預金の引き出しを行う。その後、その日の口座レポートを出力する。残高は、BalanceFormat.printメソッドで出力する。このプログラム自体は、日本円による預金を想定している。このクラスのソースコードを図１０に示す。
Account.java：
Ｊａｖａによる口座クラス。顧客番号（customerID）に基づき口座オブジェクトを作るコンストラクタ、預金メソッドdepositMoney、引出しメソッドwithdrawMoney、残高をチェックするメソッドcheckBalanceが含まれる。このクラスのソースコードを図１１に示す。
BalanceFormat.java：
Ｊａｖａによる残高フォーマット用のクラス。フォーマットされた残高を表示するprintメソッドが含まれる。残高がマイナスならばエラーと出力する。このクラスのソースコードを図１２に示す。
ExchangeRate.java：
Ｊａｖａによるその時の円／ドルの換算レートを返すメソッドupdateYenDollarを持つクラス。
【００３６】
ForeignCurrencyAspect.java：
AspectJによる外貨預金に変えるためのアスペクト。このアスペクトでは、２種類のアドバイスが定義されている。
１つ目は、Accountクラス中のdepositMoneyメソッドとwithdrawMoneyメソッドの呼び出しを、aroundアドバイスを用いて置き換えている。aroundアドバイス中のproceed()は、本来のdepositMoneyメソッドもしくはwithdrawMoneyメソッドの呼び出しである。ここでは、depositMoneyメソッドもしくはwithdrawMoneyメソッドのパラメータに来た数値を円／ドル換算レートで除算して、本来のメソッド呼び出しに渡す。depositMoneyメソッドとwithdrawMoneyメソッドは残高を返すので、このアドバイス中では、その残高を、換算レートを乗算して円に直してから返すこととなる。
２つ目は、Accountクラス中のcheckBalanceメソッドをaroundアドバイスにより置き換えている。すなわち、本来のcheckBalanceメソッドに相当するproceedが返す残高に、換算レートを乗算して円に直してから返す。このアスペクトのソースコードを図１３に示す。
LoggingAspect.java：
AspectJによるロギングを入れるためのアスペクト。beforeアドバイスを利用して、depositMoneyメソッドとwithdrawMoneyメソッドの呼び出しの直前にログを出力する文を織り込む。このアスペクトのソースコードを図１４に示す。
なお、図１０〜１２のソースコードには、データ依存関係を示す矢印（実線）と制御依存関係を示す矢印（一点鎖線）が記述されており、またアスペクトの織り込みによる影響の生じる箇所が太字で記述されている。これら本実施形態によって解析されるアスペクトの織り込みによる影響の波及の内容については、段落［００６２］以降で述べる。４つのＪａｖａプログラムのうち、ExchangeRate.javaについては、アスペクトの織り込みによる影響がない（他の織り込み箇所からの波及もない）ので、ソースコードの記載を省略した。
【００３７】
本動作例では、日本円による銀行預金口座の処理をするプログラム（上述したSampleMain.java、Account.java、BalanceFormat.java、ExchangeRate.javaの４つのクラスからなるプログラム）にForeignCurrencyアスペクトを織り込んで、入金出金は円でも、ドル立てで預金される外貨預金口座を生成するプログラムを生成する。なお、問題を単純化するために、利息は無し、織り込みにより外貨（ドル）預金化に変更した際の為替手数料は無しとする。
【００３８】
図１５は、上述したプログラムに対する適用を例とした本実施形態の動作を説明するフローチャートである。
図１５を参照すると、まず解析処理部２０が、プログラム格納部１０から処理対象のプログラム（上述した４つのＪａｖａプログラムと２つのアスペクト）のソースコードを入力し（ステップ１５０１）、構文解析を行う（ステップ１５０２）。この構文解析により、構文木と記号表が生成される。
【００３９】
次に、解析処理部２０は、生成した構文木に基づいて、各Ｊａｖａプログラムにおける文の間の制御の流れを示すコントロールフローグラフを生成する（ステップ１５０３）。また、各Ｊａｖａプログラムにおけるメソッド呼び出しの親子関係を解析する（ステップ１５０４）。ここでは、上述したように、アスペクトで記述されたアドバイスに対しても一般のメソッド呼び出しと同様に親子関係の解析を行う。
図１６は、メソッド呼び出しの親子関係の解析例を示す図である。
図１６において、矢印によりメソッド呼び出し間の親子関係が示されている（矢印の先が子供（呼び出し先））。図示のように、アスペクトで記述された部分（ForeignCurrencyAspect$1、ForeignCurrencyAspect$2）に関しても、他のメソッド呼び出しとの関係が示されている。なお、アスペクトを示す角の丸い矩形に記述された名称において、「<アスペクト名>$n」とある「ｎ（図示の例では１および２）」は、そのアスペクト中のｎ番目のアドバイスであることを示している。
【００４０】
次に解析処理部２０は、ステップ１５０３で解析されたメソッド呼び出し間の関係に基づいて、呼び出し先の子供のメソッド呼び出しから順番に個々のメソッド呼び出しに着目し、ステップ１５０２で生成された構文木に基づき、プログラムスライシングの技術を用いて、各メソッド呼び出しにおけるプログラム依存グラフを生成する（ステップ１５０５）。このとき、呼び出される各メソッド内部のデータフローをサマライズしたインターフェース情報も同時に生成する。インターフェース情報の内容については後述する。
【００４１】
図１６の場合を例に取ると、まず、Account.depositMoneyとAccount.withdrawMoneyのプログラム依存グラフが生成され、各々のプログラム依存グラフに基づいて、各メソッド呼び出しのデータフローのインターフェース情報が生成される。このインターフェース情報は、ForeignCurrencyAspectの１番目のアドバイス（ForeignCurrencyAspect$1）のプログラム依存グラフを生成する際に利用される。ForeignCurrencyAspect$1のプログラム依存グラフが生成されると、これに基づいてこのアドバイスのインターフェース情報が生成される。同様の手順でForeignCurrencyAspect$2およびBalanceFormat.printのインターフェース情報が生成され、これらのインターフェース情報がSampleMain.mainのプログラム依存グラフの生成に利用される。
【００４２】
なお、図１６において、ForeignCurrencyAspect$1が、Account.depositMoneyとAccount.withdrawMoney用に２つも受けられているのは、ソースコード上は同じForeignCurrencyAspect$1であっても、Account.depositMoneyとAccount.withdrawMoneyのどちらに織り込まれるかによって、ForeignCurrencyAspect$1自体のインターフェース情報が変わる可能性があるためである。さらにこの場合、プログラム依存グラフも別に生成する必要がある。ただし、本動作例では、以下で説明する解析の結果、インターフェース情報はAccount.depositMoneyとAccount.withdrawMoneyで同じになるので、最終的にはこれら２つのForeignCurrencyAspect$1のノードは、１つにまとめることができ、プログラム依存グラフも１つとなる。
【００４３】
以下、上記で説明した順番に基づき、プログラム依存グラフが生成される過程を説明する。
図１７は、Account.depositMoneyメソッドのプログラム依存グラフを示す図である。
図１７において、点線で示されたノードは、そのメソッドを呼び出す際のデータの入出力に相当する仮想的なノード（以下、仮想ノード）である。この仮想ノードの内容が、このメソッド呼び出しによるデータフローをサマライズしたインターフェース情報となる。入出力相当の仮想ノードに基づいて、ここではインターフェース情報を以下のように表記する。
USE(<1stParam>, this.balance)&DEF(<returnVal>, this.balance)
ここで、USE()は、そのメソッドの呼び出し箇所で使用されるデータを示し、DEF()は、代入されるデータを示す。また、<1stParam>は、そのメソッド呼び出しの第１引数であり、<returnVal>は、戻り値である。したがって図１７の例では、他にクラスのフィールドthis.balanceの値が使用され、代入されることが分かる。
なお、ここではAccount.depositMoneyメソッドに対するインターフェース情報を挙げたが、Account.withdrawMoneyメソッドに関しても同様の解析を行うと、同じインターフェース情報になる。つまり、計算の中身は異なっても、呼び出し側への影響は同じということである。そのため、結果的に図１６における２つのForeignCurrencyAspect$1ノードは同一となり、そのプログラム依存グラフも１つとなる。
【００４４】
ところで、ある程度大きいメソッドにおいて、引数やフィールドの値を受けて、お互いに干渉しないまったく別の計算が行われ、結果も別の形で返される場合、そのメソッドに相当するプログラム依存グラフは１つではなく、分離された複数のプログラム依存グラフとなる可能性がある。その場合、上記のインターフェース表記は、次に示すように複数になる場合がある。
USE(<1stParam>, this.x)&DEF(<returnVal>), USE(this.y)&DEF(this.y)
これは、本来２つの別の機能を実行するメソッドが、１つのメソッドとして実装されていることに相当する。このような場合は、このメソッドを呼び出す側でのプログラム依存グラフ生成の際も、その呼び出しに相当するプログラム依存グラフのノード（文に相当）は、内部的には２つの別のノードとしてプログラム依存グラフを生成する。
【００４５】
図１８は、ForeignCurrencyAspect$1アドバイスのプログラム依存グラフを示す図、図１９は、SampleMain.mainメソッドのプログラム依存グラフを示す図である。
上述したように、図１８に示すForeignCurrencyAspect$1アドバイスのプログラム依存グラフは、Account.depositMoneyメソッドおよびAccount.withdrawMoneyメソッドのインターフェース情報に基づいて生成される。また、Proceed()は、Account.depositMoneyに相当し、インターフェースは既に次のようにサマライズされているものを利用する。
USE(<1stParam>, this.balance)&DEF(<returnVal>, this.balance)
なお既に述べたように、その２つのメソッドのインターフェース情報は同じであったので、メソッドごとに、ForeignCurrencyAspect$1アドバイスのプログラム依存グラフを生成する必要はない。
同様に、ForeignCurrencyAspect$1アドバイス、ForeignCurrencyAspect$2アドバイスおよびBalanceFormat.printメソッドのインターフェース情報を用いて、図１９に示すSampleMain.mainメソッドのプログラム依存グラフが生成される。
【００４６】
以上のようにして、解析処理部２０により、各メソッド呼び出しにおけるプログラム依存グラフが生成されたならば、次に、影響追跡部３０が、１つのアスペクトを選択し（ステップ１５０６）、そのアスペクトが元のプログラムに影響を与える基点を検出してリストアップする（ステップ１５０７）。基点の検出基準は上述したとおりである。
例として、図１８のForeignCurrencyAspect$1アドバイスに関して、基点を調査する。ForeignCurrencyAspect$1アドバイスはaroundアドバイスであるので、上記の段落［００２６］で述べた３つの基点基準について、それぞれ考える。
【００４７】
まず、基点基準１については、プログラム依存グラフにおいてthis.balanceに対する更新（代入）があるように見えるが、これは本来の織り込み対象のAccount.depositMoneyメソッドもしくはAccout.withdrawMoneyメソッドの呼び出しに相当するproceed（）によるものであり、その他では、this.balanceの値の更新（代入）はない。したがって、基点基準１は当てはまらない。
【００４８】
次に、基点基準２については、メソッド呼び出しのパラメータの値ｍがそのまま、proceed（）のパラメータとして渡るのではなく、ｍ／ｒという除算が行われてから渡っているので、かかる値が更新されるので、基点となる。このようなチェックは、proceed（）のパラメータからデータ依存関係を逆にたどりながら、途中に更新操作があるかどうかをチェックすることにより実現される。
【００４９】
次に、基点基準３については、プログラム依存グラフで、仮想ノード「Ｏｕｔ：」の<returnVal>からデータ依存関係を逆にたどり、ノード「６：」にたどり着くことで、proceed（）からの戻り値の値に＊ｒという乗算をしていることが分かるので、基点となる。
【００５０】
なお、上記の説明では、ｍ／ｒや＊ｒという操作があることが条件となるような表現を用いたが、実際には、値を変化させない単純な代入（例えば、ｘ＝ｙなど）以外の操作が生じた際には全て「基点」と認識する。
以上をまとめると、ForeignCurrencyAspect$1アドバイスでは、ノード「６：」のパラメータと変数ｘが基点として検出され、これらがリストアップされる。
【００５１】
着目したアスペクトに関して基点をリストアップしたならば、次に影響追跡部３０は、このアスペクトの織り込み箇所の１つを選択し（ステップ１５０８）、選択された織り込み箇所における基点を１つ選択し、プログラム依存グラフにおけるアスペクトの影響を追跡し、マーキングする（ステップ１５０９）。ここで、アスペクトの影響追跡およびマーキングとは、基点から順にプログラム依存グラフのデータ依存と制御依存のアークを矢印方向にたどり、訪問したノードおよびたどったアークの全てにそのアスペクトから影響があるという印（情報）を付加していくことである。付加する情報は、例えば、各アスペクトに対して予め設定されたＩＤ情報（アスペクトＩＤ）とすることができる。
【００５２】
図２０は、図１８に示したForeignCurrencyAspect$1アドバイスのプログラム依存グラフにおいて、２つの基点（ノード「６：」のパラメータと変数ｘ）から影響追跡としてたどった依存関係のアークとノードを太線で示した図である。
また、図２１は、図１７において、ノード「６：」のパラメータの基点から影響を追跡し、Account.depositMoneyメソッドの中を影響追跡してたどったノードとアークを太線で示した図である。図２１と図１１に示したAccountクラスのソースコードとを比較すると、図２１において太線で示された、アスペクトの影響の波及する箇所は、図１１において太字で記述されたアスペクトの織り込みにより影響を受ける箇所に相当している。図１１によれば、ForeignCurrencyアスペクトの織り込みによる影響が表示されているが、顧客番号に関わるところは影響が無いことが分かる（ここでは、説明の便宜上、変数の参照更新が明確になるために、あえてbalance += mと書かずに、balance = balance + mと記述してある）。
【００５３】
さらに、図２１における２つの基点からの影響追跡は、ForeignCurrencyAspect$1アドバイスの織り込みが行われている全ての箇所で行われる。その結果、SampleMain.mainメソッドにおいても、ForeignCurrencyAspect$1アドバイスの織り込みの影響が波及する。
図２２は、図１９において、かかるアドバイスの織り込みの影響を追跡してたどったノードとアークを太線で示した図である。SampleMain.mainメソッドにおけるForeignCurrencyAspect$1アドバイスの織り込みの影響は、最終的に図２２に示したように波及し、これは、図１０において太字で記述されたアスペクトの織り込みにより影響を受ける箇所に相当している。
【００５４】
さて、影響追跡部３０は、ステップ１５０９のマーキング処理を、ステップ１５０８で選択された織り込み箇所における全ての基点に対して行う（ステップ１５０９、１５１０）。未処理の基点がなくなったならば、次に影響追跡部３０は、ステップ１５０８に戻り、改めて同じアスペクトにおける未処理の１つの織り込み箇所を選択し、同様の処理を繰り返す（ステップ１５１１）。そして、ステップ１５０６で選択されたアスペクトにおける全ての織り込み箇所に対して処理が完了したならば、次に影響追跡部３０は、ステップ１５０６に戻り、改めて未処理の１つのアスペクトを選択し、同様の処理を繰り返す（ステップ１５１２）。
以上のようにして、処理対象のプログラムに含まれる全てのアスペクトにおける全ての織り込み箇所に対し、全ての基点から、アスペクトの織り込みによる影響の波及経路をマーキングしたならば、影響追跡部３０は、マーキングされたプログラム依存グラフを、図１のメインメモリ１０３や磁気ディスク装置１０５等の記憶装置に格納して処理を終了する。
【００５５】
図２３は、影響追跡部３０により生成され、所定の記憶装置に格納される、マーキングされたプログラム依存グラフのデータ構造を示す図である。
図２３に示すように、プログラム依存グラフのデータは、プログラムの文に対応するノードのデータであるステートメント、ノード内に記述される変数、各ノード間の関係を表す制御依存アーク及びデータ依存アークの４種類のデータによって構成される。各ステートメントは、ステートメントＩＤ、制御依存アークのリストへの順方向のポインタである順制御依存ポインタリスト、制御依存アークのリストへの逆方向のポインタである逆制御依存ポインタ、データ依存アークのリストへの順方向のポインタである順データ依存ポインタリスト、当該ステートメントに含まれる変数のリストへのポインタである変数リスト、構文木中のステートメントへのポインタ、影響を受けるアスペクトのアスペクトＩＤのリストである影響アスペクトＩＤリストを、それぞれ含む。また、各変数は、変数ＩＤ、ステートメントへのポインタ、データ依存アークのリストへの逆方向のポインタである逆データ依存ポインタリスト、構文木中の変数へのポインタを、それぞれ含む。各制御依存アークは、ソース文へのポインタ、ターゲット文へのポインタ、影響アスペクトＩＤリストを、それぞれ含む。各データ依存アークは、ソース文へのポインタ、ターゲット変数へのポインタ、影響アスペクトＩＤリストを、それぞれ含む。
【００５６】
プログラムにおける制御依存関係は各文の間を「制御依存アーク」を経由してつなぐことで表され、データ依存関係は文に属する変数と文との間を「データ依存アーク」を経由してつなぐことで表される。どちらの依存関係も、図５に示したプログラム依存グラフの表記における矢印の順方向、逆方向のどちらもたどることができるようにポインタが張られる。上記のように、ステートメント、データ依存アーク、制御依存アークのデータ構造には、影響を受けるアスペクトのアスペクトＩＤを付加できるリストをポイントするポインタが入っている。制御依存アークとデータ依存アークのデータ構造において、「ソース」はアークの矢印の元を意味し、「ターゲット」はアークの矢印の先を意味している。
【００５７】
以上のようにしてアスペクトの織り込みによる影響がマーキングされたプログラム依存グラフが生成されると、表示制御部４０が、このプログラム依存グラフのデータと図１５のステップ１５０２の処理で解析処理部２０により生成された構文木および記号表に基づいて、図６に示したような出力画面を生成し、表示出力する。
すなわち上述したように、アスペクトの織り込みによる影響がマーキングされたプログラム依存グラフのノードとアークには、影響を与えるアスペクトのアスペクトＩＤが付加されている。そこで、表示制御部４０はこの情報に基づき、詳細表示ウィンドウ６２０に表示されるソースコードにおいて、選択されたアスペクトにより影響を受けるノードに相当する文に対して、図６に示すように太字表記したり表示色を変更したりするなどの表示制御を行い、さらにそのアスペクトＩＤが付加された制御依存関係およびデータ依存関係のアークを矢印として表示する。この結果、詳細表示ウィンドウ６２０には、選択されたクラスに応じて、図１０〜１２に示した様式でソースプログラムが表示されることとなる。データ依存関係の矢印にある変数名は、図２３に示されたデータ依存アークのデータ構造中のターゲット変数へのポインタをたどり、変数のデータ構造中の変数ＩＤを得、この変数ＩＤに基づいて記号表から検索して取得し表示する。
また、表示制御部４０は、処理対象のプログラムを構成する全てのＪａｖａプログラムを表示した織り込み影響表示ウィンドウ６１０において、アスペクトの織り込みが影響を与える（影響の波及を含む）全てのＪａｖａプログラムに対して、図６に示すように太字表記したり表示色を変更したりするなどの表示制御を行う。
【００５８】
ここで、上記動作例で用いたプログラムのSampleMainクラスを実行した出力結果を検証する。
図２４は、アスペクトの織り込み無しでの実行結果を示す図である。
図２４に示す実行結果によれば、日本円による入出金が行われ、Accountオブジェクト中の残高も日本円のままである。そして、SampleMainのプログラムロジック上、日本円で処理されている限り残高がマイナスになることはない。
【００５９】
図２５は、ForeignCurrencyアスペクトを織り込んだ後の実行結果を示す図である。
図２５に示す実行結果によれば、ForeignCurrencyアスペクトの織り込みによりAccountオブジェクト中の残高はドル立てに変わっている。上記のように図２４の場合には残高がマイナスになることはないが、図２５の例では、預金（入金）した際と、引出し（出金）した際に、円／ドルの換算レールが変わっているために、為替差損が生じ残高がマイナスになっている。そして、BalanceFormat.printメソッドは、元々マイナスの値を想定していないために、エラーを出力している。
【００６０】
図２６は、ForeignCurrencyアスペクトに加え、Loggingアスペクトも織り込んだ場合の実行結果を示す図である。
図２５に示した出力内容に加えて、AccountクラスのdepositMoneyメソッドおよびwithdrawMoneyメソッドのターゲット・オブジェクトのCustomerIDと、メソッドのパラメータの値がログとして出力されている。
【００６１】
円による銀行預金の処理だった元々のプログラムのSampleMainクラス（図１０参照）は、最後に確認した預金残高とこれから引き出そうとしている金額を比較して、預金残高がマイナスなら引き出さないというロジックになっている。したがって、元のプログラムは、残高（balance）がマイナスには決してならない。
しかし、ForeignCurrencyアスペクト（図１３）の織り込みによってドルによる外貨預金に変更され、ドル立てで預金される（Accountオブジェクトのbalanceフィールドにドルが入る）ようにプログラムが変更されると、残高がマイナスになってしまう場合が起こる。すなわち、最後に確認した時点での預金残高が為替の変動により目減りしてしまい、マイナスにならずに引き出せるはずであった金額をそのまま引き落とすことによって、実際の残高がマイナスになる場合である。これにより、BalanceFormat.print（）メソッドのパラメータに想定していなかったマイナスの残高が渡されてしまい。図２５の出力結果でエラーが出力された。BalanceFormatクラス自体には、ForeignCurrencyアスペクトの織り込みがなされていないが、SampleMainクラスへの織り込みの影響が波及したことにより想定外のことが起きたわけである。
【００６２】
さて、これをふまえて、本実施形態によるアスペクトの織り込みによる影響の波及の様子が明示された各Ｊａｖａプログラム（SampleMainクラス、Accountクラス、BalanceFormatクラス）のソースコードである図１０〜１２を参照すると、次のことが分かる。
BalanceFormatクラス自体（より正確にはBalanceFormat.printメソッド）が、アスペクトの織り込みの影響が受けることが示されており（図１２）、想定と異なる値が発生した箇所は、ForeignCurrencyアスペクトの織り込みによる影響を受けていることが示されている。また、そのForeignCurrencyアスペクトの織り込みの影響は、BalanceFormatクラスのみならず、影響を受ける全てのクラス中で示されており、矢印を逆にたどることにより、その値を決定した流れを追跡することができるようになっている。
【００６３】
また、BalanceFormat.printメソッドが影響を受けるということは、既存のテストケースの中で、そのBalanceFormat.printメソッドを起動するテストケースを実行する必要があるということが分かる。すなわち、アスペクトの織り込みがなされていないクラスであっても、そのクラスに含まれるメソッド呼び出しのテストを省略できるとは限らない。
一方、詳細な動作説明は省くが、本実施形態における処理対象であるSampleMain.java、Account.java、BalanceFormat.java、ExchangeRate.javaの４つのクラスに対するLoggingアスペクトの織り込みは、元のプログラム中の文の実行順序や文からの出力結果に影響を与えないことが、テストを実施することなく検証できる。したがって、Loggingアスペクトの織り込みに対しては、各クラスに対するテストを省略することができる。
【００６４】
さらにまた、図１０、図１１、図１２の各ソースコード中で太字表記された文と太字表記されていない文とを参照すると、SampleMainクラス、Accountクラス、BalanceFormatクラスでも、CustomerIDに関係する部分は太字表記されていないことが分かる。つまり、このForeignCurrencyアスペクトの織り込みによっては、CustomerIDに関係する部分は影響を受けないことが分かる。
【００６５】
図１０〜１２に示したソースコードの表記は、上述したように図６に示した詳細表示ウィンドウ６２０の表示そのままである。したがって、ユーザ（プログラマ）は、本実施形態による解析結果として表示制御部４０により表示出力される出力画面を参照することにより、プログラムの実行前の段階で、上記のようなアスペクトの織り込みによる影響の判断や追跡を行うことが可能である。
【００６６】
以上のように、本実施形態は、アスペクト指向プログラミングにおいて、アスペクト織り込みによって元のプログラムの何処に影響があるかを解析し、その影響の波及の様子も含めて表示出力することができる。
したがって、本実施形態をアスペクトの織り込み後にバグが生じたプログラムに対して適用すれば、ユーザ（プログラマ）は、表示出力された画面を参照することにより、そのバグの原因となったアスペクトの追跡を容易に行うことができる。
【００６７】
また、本実施形態をアスペクトが織り込まれたプログラムの実行前に適用すれば、ユーザ（プログラマ）は、表示出力された画面を参照することにより、このプログラムを実行することなく、当該プログラムに織り込まれたアスペクトが元のプログラム中の文の実行に影響を与えるか否か、影響を与える場合はプログラムのどの文に影響を与えるかを検証することができる。
【００６８】
さらに、本実施形態をアスペクトが織り込まれたプログラムのテスト実行前に適用すれば、ユーザ（プログラマ）は、表示出力された画面を参照することにより、アスペクトの織り込み前に行われたテストケースに対し、再テストの要否を判断することができ、テスト工程の効率化に寄与することができる。
【図面の簡単な説明】
【００６９】
【図１】本実施形態によるプログラム解析及び解析結果の出力を行うのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。
【図２】本実施形態のプログラム解析システムの機能構成を示す図である。
【図３】プログラムのソースコードにおけるデータ依存関係および制御依存関係の例を示す図である。
【図４】図３におけるデータ依存関係および制御依存関係をコントロールフローグラフ上で示した図である。
【図５】本実施形態の解析処理部により生成されるプログラム依存グラフの構成を説明する図である。
【図６】本実施形態の表示制御部により表示出力される出力画面の構成例を示す図である。
【図７】図６に示した表示画面の織り込み影響表示ウィンドウの他の表示例を示す図である。
【図８】図６に示した表示画面の詳細表示ウィンドウの表示内容を説明する図である。
【図９】図６に示した表示画面の詳細表示ウィンドウの他の表示内容を説明する図である。
【図１０】本実施形態の処理対象であるSampleMainクラスのソースコードを示す図である。
【図１１】本実施形態の処理対象であるAccountクラスのソースコードを示す図である。
【図１２】本実施形態の処理対象であるBalanceFormatクラスのソースコードを示す図である。
【図１３】本実施形態の処理対象であるForeignCurrencyアスペクトのソースコードを示す図である。
【図１４】本実施形態の処理対象であるLoggingアスペクトのソースコードを示す図である。
【図１５】本実施形態の動作を説明するフローチャートである。
【図１６】本実施形態におけるメソッド呼び出しの親子関係の解析例を示す図である。
【図１７】本実施形態によるAccount.depositMoneyメソッドのプログラム依存グラフを示す図である。
【図１８】本実施形態によるForeignCurrencyAspect$1アドバイスのプログラム依存グラフを示す図である。
【図１９】本実施形態によるSampleMain.mainメソッドのプログラム依存グラフを示す図である。
【図２０】図１８に示したプログラム依存グラフにおいて、２つの基点から影響追跡としてたどった依存関係のアークとノードを太線で示した図である。
【図２１】図１７に示したプログラム依存グラフにおいて、Account.depositMoneyメソッドの中を影響追跡してたどったノードとアークを太線で示した図である。
【図２２】図１９に示したプログラム依存グラフにおいて、アドバイスの織り込みの影響を追跡してたどったノードとアークを太線で示した図である。
【図２３】本実施形態におけるマーキングされたプログラム依存グラフのデータ構造を示す図である。
【図２４】アスペクトの織り込み無しでのSampleMainクラスの実行結果を示す図である。
【図２５】ForeignCurrencyアスペクトを織り込んだ後のSampleMainクラスの実行結果を示す図である。
【図２６】ForeignCurrencyアスペクトおよびLoggingアスペクトを織り込んだ場合のSampleMainクラスの実行結果を示す図である。
【図２７】アスペクト指向プログラミングにより作成された図形エディタのＵＭＬ図である。
【図２８】図２７の図形エディタにおける画面更新機能を実現するアスペクトの記述の例を示す図である。
【図２９】Aspect Visualizerの出力画面の例を示す図である。
【符号の説明】
【００７０】
１０…プログラム格納部、２０…解析処理部、３０…影響追跡部、４０…表示制御部、１０１…ＣＰＵ（Central Processing Unit：中央処理装置）、１０３…メインメモリ、１０４…ビデオカード、１０５…磁気ディスク装置（ＨＤＤ）、１１０…ディスプレイ、６１０…織り込み影響表示ウィンドウ、６２０…詳細表示ウィンドウ
【図１】
2005258944.tif 000003
【図２】
2005258944.tif 000004
【図３】
2005258944.tif 000005
【図４】
2005258944.tif 000006
【図５】
2005258944.tif 000007
【図６】
2005258944.tif 000008
【図７】
2005258944.tif 000009
【図８】
2005258944.tif 000010
【図９】
2005258944.tif 000011
【図１０】
2005258944.tif 000012
【図１１】
2005258944.tif 000013
【図１２】
2005258944.tif 000014
【図１３】
2005258944.tif 000015
【図１４】
2005258944.tif 000016
【図１５】
2005258944.tif 000017
【図１６】
2005258944.tif 000018
【図１７】
2005258944.tif 000019
【図１８】
2005258944.tif 000020
【図１９】
2005258944.tif 000021
【図２０】
2005258944.tif 000022
【図２１】
2005258944.tif 000023
【図２２】
2005258944.tif 000024
【図２３】
2005258944.tif 000025
【図２４】
2005258944.tif 000026
【図２５】
2005258944.tif 000027
【図２６】
2005258944.tif 000028
【図２７】
2005258944.tif 000029
【図２８】
2005258944.tif 000030
【図２９】
2005258944.tif 000031