(57)【要約】【課題】シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なデバッグ装置及びデバッガ制御方法を実現すること。【解決手段】アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算手段と、前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化手段と、前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化手段と、を具備する。【選択図】図１
2008090557.tif 000002
【特許請求の範囲】
【請求項１】
アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、
前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算手段と、
前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化手段と、
前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化手段と、を具備するデバッガ制御装置。
【請求項２】
前記ターゲットプログラムの実行中にブレークポイントイベントを発生するデバッガカーネルと、
前記命令コード表に基づいて前記ターゲットプログラムにブレークポイントを追加するよう前記デバッガカーネルを制御するブレークポイント追加手段と、をさらに具備することを特徴とする請求項１に記載のデバッガ制御装置。
【請求項３】
前記ブレークポイント追加手段は、
前記デバッガカーネルにおけるブレークポイントイベントの発生に応じて前記命令コード表を参照し、該命令コード表に基づいて追加すべきブレークポイントを求め、ブレークポイント表に追加するイベント処理手段と、
前記ブレークポイント表に記載されたブレークポイントを前記ターゲットプログラムに追加するよう前記デバッガカーネルを制御する手段と、を具備する請求項１記載のデバッガ制御装置。
【請求項４】
前記イベント処理手段は、
前記ターゲットプログラムにおけるサブルーチンコールの入口のみをジョインポイントとする場合は関数先頭のブレークポイントを用い、
前記サブルーチンコールの出口のみをジョインポイントとする場合は関数先頭のブレークポイントにおいて戻り番地を随時追加して戻り番地のブレークポイントを用い、
サブルーチンコールの入口と出口の双方をジョインポイントとする場合は関数先頭のブレークポイントにおいて戻り番地を随時追加することにより先頭と戻り番地のブレークポイントの双方を用いる請求項３記載のデバッガ制御装置。
【請求項５】
アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶ステップと、
前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算ステップと、
前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化ステップと、
前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化ステップと、を有するデバッガ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アスペクト指向プログラムの処理機能を備えたデバッガ制御装置及びデバッガ制御方法に関する。
【背景技術】
【０００２】
シンボリックデバッガ（Ｓｙｍｂｏｌｉｃ  Ｄｅｂｕｇｇｅｒ）は、マシン語プログラムに付属するシンボル情報を利用して、命令番地にブレークポイント（Ｂｒｅａｋ  Ｐｏｉｎｔ）を設定してプログラムを実行し、ブレークポイントで中断したプログラム変数の参照及び更新する機能を有する。公知のシンボリックデバッガ（例えば下記非特許文献１を参照）は、シンボル情報とブレークポイントの関係は基本的に１対１の関係にあり、ブレークポイントの指定は対象シンボルを列挙する単純な形式を基本としている。また、プログラム変数の参照や更新に利用するコマンド言語は、利用者の対話的な入力を想定しており極めて簡易な言語仕様である。
【０００３】
アスペクト指向プログラミング（Ａｓｐｅｃｔ  Ｏｒｉｅｎｔｅｄ  Ｐｒｏｇｒａｍｍｉｎｇ）は、オブジェクト指向プログラミング（Ｏｂｊｅｃｔ  Ｏｒｉｅｎｔｅｄ  Ｐｒｏｇｒａｍｍｉｎｇ）言語のモジュール化機能の不足を補う新しいプログラミングの機構である。アスペクト指向言語は複数のクラスに対して一括したロジックの追加等が可能であり、例えばプログラムのテストやデバッグ用途のロジックを対象プログラムから分離して開発し、合成できる利便性を有する。公知のアスペクト指向プログラミング言語（例えば下記非特許文献２を参照）は、プログラム言語処理系（コンパイラ）レベルの実装であり、プログラムへロジックの追加等を行うにはプログラム全体のコンパイルが必要である。
【非特許文献１】Ｒｉｃｈａｒｄ  Ｍ．Ｓｔａｌｌｍａｎ  ｅｔ．ａｌ．，“Ｄｅｂｕｇｇｉｎｇ  Ｗｉｔｈ  ＧＤＢ：Ｔｈｅ  ＧＮＵ  Ｓｏｕｒｃｅ−Ｌｅｖｅｌ  Ｄｅｂｕｇｇｅｒ”，ＩＳＢＮ：１８８２１１４８８４，Ｆｒｅｅ  Ｓｏｆｔｗａｒｅ  Ｆｏｕｎｄａｔｉｏｎ，２００２．
【非特許文献２】Ｇｒｅｇｏｒ  Ｋｉｃｚａｌｅｓ  ｅｔ．ａｌ，“Ａｎ  Ｏｖｅｒｖｉｅｗ  ｏｆ  ＡｓｐｅｃｔＪ”，“Ｌｅｃｔｕｒｅ  Ｎｏｔｅｓ  ｉｎ  Ｃｏｍｐｕｔｅｒ  Ｓｃｉｅｎｃｅ  （ＬＮＳＣ）”，ｖｏｌ．２０７２，ｐｐ．３２７−３５５，Ｓｐｒｉｎｇｅｒ，２００１．
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は、シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なデバッグ装置及びデバッガ制御方法を実現することを目的とする。
【課題を解決するための手段】
【０００５】
本発明の一観点に係るデバッガ制御装置は、アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上のジョインポイントの集合を指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、前記複数のブレークポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイントの部分集合を計算するジョインポイント計算手段と、前記ジョインポイント部分集合の各ジョインポイントにおいてポイントカット論理式を簡略化するポイントカット論理式の簡略化手段と、前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するエンコード手段と、を具備する。
【発明の効果】
【０００６】
本発明によれば、シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なプログラム実行環境を実現することができる。
【発明を実施するための最良の形態】
【０００７】
以下、図面を参照しながら本発明の実施形態を説明する。
【０００８】
図１に示すように、本発明の一実施形態に係るプログラム実行システムは、ＣＰＵ等のハードウェア資源及びオペレーティングシステム（ＯＳ）等の基本ソフトウェアを有する計算機プラットフォーム１と、シンボリックデバッガのカーネル（ＤＢＧ：Ｄｅｂｕｇｇｅｒ）２及びシンボリックデバッガのインターフェース２０と、アスペクト指向ベリファイア（ＡＯＶ：Ａｓｐｅｃｔ  Ｏｒｉｅｎｔｅｄ  Ｖｅｒｉｆｉｅｒ）カーネル（以下、「ＡＯＶカーネル」）３と、スクリプト評価装置（ＥＶＡＬ：Ｅｖａｌｕａｔｏｒ）４とから構成されている。スクリプト言語で記述されたアスペクト記述ファイル５はＡＯＶカーネル３に入力される。マシン語で記述された実行形式ファイル６は、計算機プラットフォーム１に入力されて実行されるが、同実行形式ファイル（プログラム）６を対象としてデバッグ作業を行う際には、同プログラム６（ターゲットプログラム）は、デバッガカーネル２からの制御を受ける。
【０００９】
図２に示すように、ＡＯＶカーネル３は、アスペクト指向言語の構文解析装置（ＰＡＲＳＥ）７と、構文解析装置（ＰＡＲＳＥ）７により得られる構文解析結果（ＰＣＴＡＢ８とＡＤＴＡＢ９）に基づいて実行前の最適化を行う最適化装置（ＯＰＴＩＭ）１０とを有する。これらは、ターゲットプログラム６の実行前に、アスペクト記述ファイルに記述されたアスペクト指向プログラム５を解析して最適化する部分に相当する。
【００１０】
また、ＡＯＶカーネル３は、ターゲットプログラム６の実行前に、エンコード結果（ＪＰＴＡＢ）１１に基づきブレークポイントを初期化設定してターゲットプログラム６を開始する初期化装置（ＩＮＩＴ）１４と、デバッガカーネル２からブレークポイント発生の通知を受け取ってブレークポイント発生イベントを処理するイベント処理装置（ＨＡＮＤＬＥ）１２を有する。さらに、ＡＯＶカーネル３は、ブレークポイント発生イベントに応じてアスペクト指向プログラム５のスクリプト命令を評価するスクリプト評価装置４（ＥＶＡＬ）を有する。
【００１１】
本実施形態は、シンボリックデバッガとアスペクト指向プログラミングの処理装置を連動させることで、コンパイル不要でターゲットプログラム６にインタープリタ言語のプログラムを合成することができる。ブレークポイントは、アスペクト指向プログラミング言語のポイントカット構文の形式によって指定可能とし、ブレークポイントにおいてアスペクト指向プログラミング言語のコマンドが実行され、プログラム変数を参照し又は更新できるようにする。また、ターゲットプログラム６の実行中に必要となるブレークポイントの数を最小化し、及びブレークポイント発生時の計算量を最小化するための最適化の仕組みを備える。
【００１２】
ここで、アスペクト指向プログラミング言語について説明する。
【００１３】
「アスペクト指向（aspect-oriented）」とは、オブジェクト指向（object-oriented）の枠組みではモジュール化が困難な横断的関心事（cross cutting concerns）をモジュール化する新たなモジュール化の枠組み（パラダイム=paradigm）のことをいう。この枠組みを具体化するプログラミング言語として、アスペクト指向の考え方を取り入れてJava（登録商標）言語を拡張したAspectJ言語などが有名である。
【００１４】
「ジョインポイント（join point）」とは、アスペクト指向プログラミング言語において、対象プログラム上のアスペクト（後述）の織り込み可能な箇所の全体であり、「結合点」と表記されることもある。本明細書中の「ジョインポイント部分集合」とは、ポイントカット式を固定した場合に、ポイントカット式が真となり得るジョインポイントの全体を示すものと約束する。例えば図３に示すように、ロジック追加が可能なターゲットプログラム６上の場所の集合がジョインポイント（ｊｏｉｎ−ｐｏｉｎｔ）である。以下の具体的では、ジョインポイントは、ターゲットプログラム６のサブルーチンコールの直前又は直後、クラスのメンバ変数のアクセス（参照又は更新）の直前又は直後の全体と定義する。
【００１５】
「アスペクト（aspect）」とは、アスペクト指向言語の基本的なモジュール化の構文要素のことであり、オブジェクト指向言語のクラス（class）に相当する。アスペクトは、どのジョインポイントへ如何なる処理を織り込む（weave）かの情報を含む。前者はポイントカット（後述）と呼ばれる論理式の形で記述する、後者はアドバイス（後述）と呼ばれる手続きの形で記述する。アスペクトの意味としては、対象プログラムの各ジョインポイントにおいてポイントカットの論理式を評価して、評価結果が真となる場合に限り、対応するアドバイスを実行する。
【００１６】
「ポイントカット（pointcut）」とは、原始ポイントカット（primitive pointcut）と呼ばれる原子項を論理演算子（論理和「∧」又は「｜｜」、「論理積∨」又は「＆＆」、論理否定「¬」又は「！」）で任意に結合した論理式である。原始ポイントカットは、プログラム実行前に値の定まる静的ポイントカットと、プログラム実行時に値の定める動的ポイントカットに大別できる。どのような原始ポイントカットを利用可能かは、各アスペクト指向言語の詳細に依存する。
【００１７】
アスペクト指向プログラム５の記述において、ロジック追加対象となるターゲットプログラム６上の場所を指定するために、図４に示すような「ポイントカット（ｐｏｉｎｔ−ｃｕｔ）論理式」を使用する。図５にポイントカット構文を示す。ターゲットプログラム６に追加するロジックの指定は、あらかじめ定義したポイントカット論理式への参照とロジック内容を指定するアドバイス（ａｄｖｉｃｅ）文を使用する。図６にアドバス構文を示す。
【００１８】
「アドバイス（advice）」とは、オブジェクト指向言語におけるメソッドに対応する構文要素であり、アドバイスの織り込み位置を指定するポイントカットまたはポイントカットへの参照と、具体的な処理の内容を宣言する。
【００１９】
上述したように、ポイントカット論理式は原始ポイントカット（ｐｒｉｍｉｔｉｖｅ  ｐｏｉｎｔ−ｃｕｔ）を論理和、論理積、論理否定で任意に結合した論理式である。また、原始ポイントカットは、プログラム実行前に真偽値の定まる静的ポイントカットと、プログラム実行時に真偽値の定まる動的ポイントカットに分類できる。原始ポイントカットの分類例を図７に示す。動的ポイントカットはターゲットプログラムのシンボルを引数とする１階ポイントカットと、ポイントカット自体を引数とする２階ポイントカットなどが存在する。例えば図７の原始ポイントカット「ｃａｌｌ（＜ｓｉｇｎ＞）」は、プログラムの記号パタン＜ｓｉｇｎ＞にマッチするシンボル（サブルーチン識別子）のジョインポイントを選択し、「ｉｆ（＜ｃｏｎｄ＞）」はプログラム実行中にジョインポイント上で式＜ｃｏｎｄ＞を評価して真なら当該ジョインポイントを選択し、「ｃｆｌｏｗ（＜ｅｘｐｒ＞）」はポイントカット＜ｅｘｐｒ＞の選択するジョインポイントの間に追加するジョインポイントを選択する。
【００２０】
図８にポイントカットの応用例を示す。ポイントカット論理式「ｃａｌｌ（Ｍ３）」がモジュールＭ３呼び出し（サブルーチンコール）全体を選択し、ポイントカット論理式「ｃａｌｌ（Ｍ４）∧！ｃｆｌｏｗ（ｃａｌｌ（Ｍ５））」はモジュールＭ４呼び出しの中でモジュールＭ５以外が呼ぶケースを選択する。
【００２１】
図６に示したアドバイス構文は「参照するポイントカット論理式をプログラム実行時に各ジョインポイントで評価した結果が真ならば対応するロジックを実行する。」という意味を有する。なお、アドバイスはジョインポイントの前又は後（「ｂｅｆｏｒｅ」又は「ａｆｔｅｒ」）の修飾子が付き、サブルーチンコールの場合は、追加ロジックを実行する場所が呼び出しの直前又は直後の意味と解釈する。
【００２２】
＜静的（事前）最適化及び動的最適化＞
アスペクト指向プログラム５の処理系をシンボリックデバッガのブレークポイント機能を利用して実現する際に、各ブレークポイント上で評価するポイントカット論理式の計算において、実行前に値の決まらない部分のみを評価することが望ましい。また、ジョインポイントの全体に対応する全てのサブルーチンコールの直前又は直後にブレークポイントを挿入するのは効率が悪い。したがって、ターゲットプログラム６に挿入するブレークポイントの数を最小限に抑えることが望ましい。
【００２３】
本実施形態のデバッガ制御装置は、ブレークポイントに関わる最適化処理のための最適化装置を備える。この最適化装置は、ポイントカット論理式から最小限のジョインポイント部分集合を計算するジョインポイント計算装置、計算した各ジョインポイント上でポイントカット論理式を簡略化するポイントカット簡略化装置、及び実行中に、ブレークポイントを必要に応じて追加するブレークポイント追加装置から成る。図２に示した構成において、最適化装置１０が、ジョインポイント計算装置及びポイントカット簡略化装置を備えていてもよい。また、イベント処理装置１２がブレークポイント追加装置を備えていてもよい。
【００２４】
なお、以下の説明では、ターゲットプログラム６の具体例として図９に示す入力プログラム例を用い、アスペクト指向プログラム５の具体例として図１０に示す入力アスペクト例を用いる。また、最適化装置の動作に先立って、以下の情報があらかじめ生成されるものとする。すなわち、ＡＯＶカーネル３は、アスペクト記述（図１０：入力アスペクト例）を構文解析することによりポイントカット表（図１１：ＰＣＴＡＢ）８とアドバイス表（図１２：ＡＤＴＡＢ）９を生成する。デバッガカーネル（ＤＢＧ）２は、ターゲットプログラム６のシンボル情報を解析してシンボル表（図１３：ＳＭＴＡＢ）を生成する。
【００２５】
＜ジョインポイント計算装置＞
ジョインポイント計算装置は、ポイントカット表（ＰＣＴＡＢ）８とターゲットプログラム６の静的なシンボル表（ＳＭＴＡＢ）を入力として、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算する。ポイントカット表８は図１４に示すポイントカット構文木と等価な内容である。
【００２６】
最初に、アドバイス表（ＡＤＴＡＢ）９が参照するポイントカット構文木に現れる高階の原始ポイントカット「ｃｆｌｏｗ（＜ｅｘｐｒ＞）」に対して、ポイントカット論理式「＜ｅｘｐｒ＞」が選択する区間の開始と終了を記録する二個のアドバイス文を、システムが生成してアドバイス表（ＡＤＴＡＢ）９に追加する。図１５は、図１２に示したアドバイス表（ＡＤＴＡＢ）９に、システムがアドバイス文を追加した後の様子を示している。
【００２７】
次に、ポイントカット論理式を評価する前処理として、ポイントカット論理式にドモルガンの法則を適用して等価変形を行い、否定演算子「！」が原始ポイントカットに直接作用する形に変形する。この様子を図１６に示す。また、図１７は、処理後のポイントカット表を示している。
【００２８】
次に、ポイントカット構文木のノードを後行順（ｐｏｓｔ−ｏｒｄｅｒ）で辿りながら、各ノードに対応するジョインポイント部分集合を計算する。この様子を図１８に示す。図１９は、処理後のポイントカット表を示している。なお、構文木の末端となる原始ポイントカット（図７、図２０：原始ポイントカット）に関しては、静的な原始ポイントカットの場合は記号パタンに合致するジョインポイントの部分集合、動的な原始ポイントカットの場合はジョインポイントの全集合とする。
【００２９】
最後に、アドバイスから参照されるポイントカット構文木の根ノードに対応するジョインポイントの集合を最小なジョインポイント部分集合とする。この過程を宣言的に記述したものが図２１に示すジョインポイント演算子である。図２１に現れるポイントカット論理式はドモルガンの法則による変形後の論理式とする。また、図２２乃至図２４に、最小ジョインポイントを求めるための具体的な手続き等を示す。図２２はノード構造体を示しており、図２３はドモルガン演算、図２４はジョインポイント計算の手続を示している。図２３に示す手続は、構文解析木の根ノード以下をドモルガンの法則を適用して等価変形するものである。図２４及び図２５に示す手続は、ドモルガン演算後の構文解析木の根ノードを入力して事前評価シンボルを計算するものである。
【００３０】
上記のように、ポイントカット論理式が真となり得るジョインポイント集合を計算する際に、ポイントカット論理式にドモルガンの法則を適用して否定演算子が原始ポイントカットへ作用する形へ書き換える必要がある。このような事前処理が必要な理由について説明する。
【００３１】
たとえば、ジョインポイントの全体がＪＰ＝Ω＝｛ｆｕｎ１，ｆｕｎ２，ｆａｃｔ｝であり、ポイントカット論理式ｐｃが真となり得るジョインポイント集合をＳ［ｐｃ］と表記すると、静的な原始ポイントカットに対する作用はＳ［ｃａｌｌ（ｆｕｎ＊）］＝｛ｆｕｎ１，ｆｕｎ２｝、動的な原始ポイントカットに対する作用はＳ［ｉｆ（ｘ）］＝Ｓ［¬ｉｆ（ｘ）］＝Ω等と定義から定まる。原始ポイントカットを論理演算子で結合した一般のポイントカット式に対する作用は、Ｓ［ｃａｌｌ（ｆｕｎ＊）∧¬ｃａｌｌ（ｆｕｎ１）］＝Ｓ［ｃａｌｌ（ｆｕｎ＊）］∩Ｓ［ｃａｌｌ（ｆｕｎ１）］＾ｃ＝｛ｆｕｎ１，ｆｕｎ２｝∩（Ω−｛ｆｕｎ１｝）＝｛ｆｕｎ２｝の様に計算できる。つまり、原始ポイントカットの各々にＳ［  ］を作用して集合へ置き換え、論理演算の和積を集合演算の和積へ置き換え（∧→∩、∨→∪）、ポイントカット式の否定を補集合に置き換える（Ｓ［¬ｐｃ］＝Ｓ［ｐｃ］＾ｃ）。ただし、この置き換え規則は動的な原始ポイントカットと否定演算子が共存すると上手く働かない。たとえば、ポイントカット式ｐｃ＝¬（ｃａｌｌ（ｆｕｎ＊）∧ｉｆ（ｘ））の場合に単純に、Ｓ［ｐｃ］＝（Ｓ［ｃａｌｌ（ｆｕｎ＊）］∩Ｓ［ｉｆ（ｘ）］）＾ｃ＝（｛ｆｕｎ１，ｆｕｎ２｝∩Ω）＾ｃ＝｛ｆａｃｔ｝となるが、本来の定義よりポイントカット式ｐｃが真になり得る場合を考えると、ｃａｌｌ（ｆｕｎ＊）＝ｆａｌｓｅまたはｉｆ（ｘ）＝ｆａｌｓｅの場合となるが、後者は実行前に不定なのでＳ［ｐｃ］＝Ωとすべきである。これを解決するには、ポイントカットの論理式をドモルガンの法則を適用して等価な論理式に変形ｐｃ＝¬（ｃａｌｌ（ｆｕｎ１）∧ｉｆ（ｘ））＝¬ｃａｌｌ（ｆｕｎ１）∨¬ｉｆ（ｘ）した後、前記の置き換え規則を適用することでＳ［ｐｃ］＝Ｓ［ｆｕｎ１］＾ｃ∪Ω＝（Ω−｛ｆｕｎ１｝）∪Ω＝Ωと正しく評価できる。なお、ここで用いた論理記号（∧、∨、¬）は、それぞれプログラム上の記号（＆＆、｜｜、！）と同じ意味の記号と約束する。
【００３２】
＜ポイントカット簡略化装置＞
ジョインポイント計算装置の出力としてジョインポイント部分集合が決まると、各ジョインポイント上で評価すべきポイントカット論理式を簡略化できる。静的な原始ポイントカットに、ジョインポイントを指定した場合の論理定数を割り付け、論理演算子の論理定数に対する性質を利用して論理式を簡略化する。これを図２６乃至図２８に示す。図２６はある一点のジョインポイントの評価例を示し、図２７はコード生成の例を示している。図２８は簡略化処理後のポイントカット表を示している。
【００３３】
簡略化済みのポイントカット論理式は、スタックマシンの命令コード列の形にエンコードしてジョインポイント毎に保存する。この例を図２９に示す。スタックマシンは例えば図３０に示すような仕様内容とする。なお、入力するポイントカット構文木はドモルガンの法則を適用して中間ノードに否定演算子が存在しない形に変形済みとする。
【００３４】
最初に、ジョインポイントを固定してポイントカット構文木のノードを後行順（ｐｏｓｔ−ｏｒｄｅｒ）で辿りながら、各ノードに対応する評価ラベルを計算する。この様子を図２６に示す。また、評価ラベル計算後のポイントカット表を図２８に示す。
【００３５】
なお、構文木の末端となる、図２０に示した原始ポイントカットに関しては、静的な原始ポイントカットの場合は記号パタンの合致有無に応じた真偽値の評価ラベル（ＴＲＵＥ又はＦＡＬＳＥ）、動的な原始ポイントカットの場合は不定値の評価ラベル（ＬＥＡＦ）を割り当てる。評価ラベルの論理演算について、論理積演算は図３１に示すような演算規則に従い、論理和演算は図３２に示すような演算規則に従うものとする。
【００３６】
評価ラベル「ＬＥＡＦ」は、一方の子ノードが不定値、ラベル「ＮＯＤＥ」は双方の子ノードが不定値の意味とし、最適化後段の命令コード生成に利用する。
【００３７】
次に、ポイントカット構文木のノードを後行順（ｐｏｓｔ−ｏｒｄｅｒ）に辿りながら、ノードの評価ラベルが定数値（ＴＲＵＥ又はＦＡＬＳＥ）の場合は定数値に対応する命令コードを生成する。評価ラベルが未定値の「ＬＥＡＦ」の場合は値が未定の子ノードへ降り、未定値の「ＮＯＤＥ」の場合は双方の子ノードへ降りる。中間ノードに対しては二項演算子（ＡＮＤ又はＯＲ）に対応する命令コードを出力し、末端ノードの「ＬＥＡＦ」に対しては規則（図２０：原始ポイントカット）の項目「ｅｖａｌａｔ（ｐｃ）」の命令コードを生成する。末端ノードに否定演算子が付く場合は末端ノードの命令コードを出力後に否定演算子ＮＯＴに対応する命令コードを出力する（図２９：命令コード表）。最後に、当該ポイントカットで実行すべきアドバイスの命令を条件付評価の命令コード（ＩＦＤＯ）を出力する。
【００３８】
図３３は、以上で説明したポイントカット簡略化の過程を宣言的に記述したものである。また、図３４乃至図３７にポイントカット簡略化の具体的な手続き等を示す。図３４及び図３５はポイントカット評価の手続を示し、図３６及び図３７は命令コード生成の手続を示している。図３４及び図３５に示すポイントカット評価の手続は、ジョインポイントを指定して構文木ノードに実行前評価ラベルを付与する。図３６及び図３７に示す命令コード生成の手続は、ラベル付与後の構文解析木の根ノードをコンパイルし、命令コードを生成する。
【００３９】
ここで、上記評価ラベル付与の処理を行う技術的意義について説明する。
【００４０】
ポイントカット式が真となり得るジョインポイント部分集合の計算が済むと、各ジョインポイントにおいてポイントカット式の構造を簡略化することが可能となる。例えば、先に紹介したジョインポイントの全体がＪＰ＝Ω＝｛ｆｕｎ１，ｆｕｎ２，ｆａｃｔ｝、ポイントカット式がｐｃ＝¬（ｃａｌｌ（ｆｕｎ＊）∧ｉｆ（ｘ））の場合を考えると、ジョインポイントの集合はＳ［ｐｃ］＝Ωとなる。ジョインポイントをｆｕｎ１またはｆｕｎ２に固定して、静的な原始ポイントカットに論理定数を割り付けるとｐｃ＝¬（ｔｒｕｅ∧ｉｆ（ｘ））＝¬ｉｆ（ｘ）となる。ジョインポイントをｆａｃｔに固定して同様に論理定数を割り付けるとｐｃ＝¬（ｆａｌｓｅ∧ｉｆ（ｘ））＝ｔｒｕｅとなる。この様なジョインポイントを固定したポイントカット式の簡略化を二段階に分けて行う。一段目の処理は、ポイントカットの構文木を探索して、真偽値が確定するノードにラベル（Ｌ＿ＴＲＵＥまたはＬ＿ＦＡＬＳＥ）を割り付け、真偽値が不定のノードにラベル（Ｌ＿ＬＥＡＦまたはＬ＿ＮＯＤＥ）を割り付ける。二段目の処理は、ラベルの値を参考にポイントカット構文木を探索し簡略化の結果をスタックマシン用の命令コードへエンコードして保存する。ターゲットプログラムの実行中には、簡略結果となるスタックマシン用の命令コードを評価することで、実行時の計算量を節約できる。
【００４１】
以上説明したアスペクト記述の（事前）最適化処理の結果、各ジョインポイントで評価すべき命令列を記載した命令コード表（ＪＰＴＡＢ）１１が出力される。
【００４２】
＜ブレークポイント追加装置＞
シンボリックデバッガ２の提供するブレークポイントの機能を用いて、アスペクト指向プログラミングにおけるジョインポイントの機能を実現する。ブレークポイント追加装置への入力は各ジョインポイントの命令コード表（ＪＰＴＡＢ）１１である。ブレークポイント追加装置は、ブレークポイントの初期化装置（ＩＮＩＴ）１４とイベント処理装置（ＨＡＮＤＬＥ）１２から構成される。なお、シンボリックデバッガ・インターフェース２０は、図３８に示すような、標準的なデバッガインタフェイスを提供するものと仮定する。
【００４３】
基本的なジョインポイント処理の流れを図３９及び図４０に示す。これらの図に示す本例の場合、関数「ｆｕｎｃ」の前後にアドバイスが挿入される。
【００４４】
ブレークポイントの初期化装置１４が、ターゲットプログラム６の開始前に関数「ｆｕｎｃ」の先頭アドレスを調べてブレークポイント「ｂｐ＃１」を挿入する。ターゲットプログラム６を開始してターゲットプログラム６の実行命令が「ｆｕｎｃ」の先頭に達すると、ブレークポイント「ｂｐ＃１」のイベントが発生する。イベント処理装置１２が関数の戻り番地を調べて、ブレークポイント表（ＢＰＴＡＢ）１３に、新たにブレークポイント「ｂｐ＃２」を追加し、入口の命令コードを評価し、ターゲットプログラム６を継続する。同様にブレークポイント「ｂｐ＃２」のイベントが発生すると、イベント処理装置１２が出口の命令コードを評価し、ターゲットプログラム６を継続する。再びブレークポイント「ｂｐ＃１」でイベント処理装置１２が関数の戻り番地を調べてブレークポイント「ｂｐ＃３」を追加し、入口の命令コードを評価し、ターゲットプログラム６を継続する。ブレークポイント「＃ｂｐ３」のイベント処理装置１２が出口の命令コードを評価して、ターゲットプログラム６を継続する。以下同様に、必要に応じて戻り番地へブレークポイントをブレークポイント表（ＢＰＴＡＢ）１３に追加してゆく。
【００４５】
アスペクト指向言語のアドバイスは、ポイントカット式で選択したジョインポイントと対応するサブルーチンの入口または出口で実行する。実装上は、ブレークポイントを用いてサブルーチンの入口または出口でターゲットプログラムの実行を中断してアドバイスを実行する。入口はサブルーチン先頭の命令番地へブレークポイントを設定する。サブルーチン入口の命令番地は、通常はターゲットプログラムのシンボル表から調べることができる。サブルーチン出口に対応する命令番地は、複数ある戻り命令の箇所に対応して、シンボル表から調べることができない。そこで、当該関数のサブルーチンの戻り先の命令番地を入口で停止した際に調べて、戻り先の命令番地へ出口に対応するブレークポイントを設定することで代用する。本実施形態のような、サブルーチン出口におけるブレークポイントの利用方式は、ターゲットプログラム実行中に必要に応じてブレークポイントを追加するものであることから、利用するブレークポイントの総数を少なく抑える効果がある。
【００４６】
初期化装置１４は、図４１に示す手順に従ってブレークポイントの追加登録処理を行う。すなわち、ターゲットプログラム６の開始前にジョインポイント命令コード表（ＪＰＴＡＢ）１１の各エントリに対して次の処理を行う（図２９：命令コード表、図４２：命令コード表）。
【００４７】
先ずステップＳ１において、ジョインポイントの種類を決定する（ステップＳ１）。当該ジョインポイントの種類「ｔｙｐｅ」は、入口又は出口の一方で命令コードの評価が必要な場合は「ＢＥＦＯＲＥ」又は「ＡＦＴＥＲ」とし、双方で命令コードの評価が必要な場合は「ＢＯＴＨ＝ＢＥＦＯＲＥ｜ＡＦＴＥＲ」とする。次に、ジョインポイントのシンボル名から関数先頭の命令番地「ｐｃ」を調べる（ステップＳ２）。次に、ジョインポイント識別子「ｊｐ」の種類を「ｔｙｐｅ」、先頭番地「ｔｏｐ」を「ｐｃ」に、戻り番地列「ｒｅｔ［］」を空に初期化する。最後に、命令番地「ｐｃ」にブレークポイント「ｂｐ」を追加し、ブレークポイントの到達時にジョインポイント識別子「ｊｐ」を参照可能なように参照関係を設定する。図４３はブレークポイント追加前のブレークポイント表、図４４はブレークポイント追加後のブレークポイント表を示している。
【００４８】
イベント処理装置１２は、ブレークポイント発生のイベントで起動され、図４５に示す手順に従ってイベント処理を実行する。初期化時に設定された参照関係によりジョインポイント識別子「ｊｐ」を取得する（ステップＳ１）。次にターゲットプログラム６の命令番地「ｐｃ」を調べる（ステップＳ２）。命令番地が関数の先頭アドレス（「ｐｃ＝ｊｐ．ｔｏｐ？」）であるか否かをステップＳ３において判定し、（「ｐｃ＝ｊｐ．ｔｏｐ？」）であるならば、ステップＳ５において入口の命令コード「ｅｎｔｅｒ［］」を評価する。先頭アドレス以外ならば、ステップＳ４において出口の命令コード「ｌｅａｖｅ［］」を評価して終了する。ステップＳ５において入口の命令コードを評価した後、ステップＳ６においては出口の評価が必要であるか否かを判定する。出口の評価が必要である場合にはターゲットプログラム６の戻り番地「ｐｃ'」を調べる（ステップＳ７）。次に、戻り番地が戻り命令番地列「ｒｅｔ［］」に含まれるか否かを判定する（ステップＳ８）。戻り番地が戻り命令番地列「ｒｅｔ［］」に含まれない場合は新たにブレークポイントを番地「ｐｃ'」に追加する（ステップＳ９）。その他の場合はイベント処理装置１２を終了する（図４６：命令コード表、図４４：ブレークポイント表）。
【００４９】
以上説明した本発明の実施形態によれば、次のような作用効果を得ることができる。
【００５０】
（１）シンボリックデバッガのブレークポイント機能において、ブレークポイントの集合を定義して補集合、和集合や積集合による指定、ターゲットプログラムの制御フローに依存した指定等の高度なブレークポイントの指定が利用できる。
【００５１】
（２）シンボリックデバッガとアスペクト指向プログラム処理系との間にデバッガインタフェイス層（ＩＮＩＴ、ＨＡＮＤＬＥ）を設けた結果、上位のアスペクト指向プログラム処理系が下位のデバッガの詳細に依存せず、移植性が向上する。
【００５２】
（３）シンボリックデバッガのプログラム変数を参照又は更新する機能において、汎用プログラミング言語の機能を有するコマンド言語を利用することで、プログラム変数の参照作業や更新作業における人手を減らせる。
【００５３】
（４）マシン語プログラムへのロジック追加等にアスペクト指向プログラミング言語の構文を利用できる。
【００５４】
（５）マシン語プログラムへアスペクト指向プログラムを合成して実行した結果をコンパイル不要の短時間で確認できる。
【００５５】
（６）実行中のマシン語プログラムを中断して、アスペクト指向プログラムの合成後に再開すると、プログラムを終了することなくロジックの追加等が可能となり、プログラムのメンテナンスに利用できる。
【００５６】
（７）プログラムの構成モジュールに対して呼び出しプロトコル（規約）などをアスペクト指向プログラミング言語で記述し、アスペクト指向プログラムと合成してプログラムを実行することでモジュール間のプロトコルを動的に検証できる（図８：応用例）。
【００５７】
（８）テスト用のロジックをプログラムとは別に作成して、実行環境上で速やかに合成できる。
【００５８】
（９）デバッグ用のロジックをプログラムとは別に作成して、実行環境上で速やかに合成できる。
【００５９】
（１０）テスト用のロジックでプログラムの変数（関数のリターン値など）を変更することで、プログラムの例外処理テストを簡単に実施できる。
【００６０】
本発明は、計算機プログラム開発時に用いられるデバッガ装置、テスト装置、検証装置、及び障害発生装置、ならびに計算機プログラム運用時に用いられるメンテナンス装置等に対して適用可能である。プログラムの構成モジュール間のプロトコル（呼び出しなど規約）をアスペクト指向言語で記述して、プログラムに合成して実行することで、対象プログラムの修正不要でモジュール間のプロトコルを検証する装置、プログラムの一部又は全ての構成モジュール間の呼び出し履歴をファイル又は主メモリに記録する処理をアスペクト指向言語で記述してプログラムに合成して実行することで、対象プログラムの修正不要で実行履歴を記録する装置、プログラムの一部又は全ての構成モジュール間の呼び出し時刻をファイル又は主メモリに記録する処理をアスペクト指向言語で記述してプログラムに合成して実行することで、対象プログラムの修正不要で実行時間を記録する装置等として実施することもできる。
【００６１】
また、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【００６２】
【図１】本発明の一実施形態に係るプログラム実行システムを示すブロック図
【図２】上記プログラム実行システムが備えるＡＯＶカーネルのブロック図
【図３】アスペクト指向プログラミング言語について、ターゲットプログラムとアスペクト記述の関係を示す図
【図４】ポイントカット（ｐｏｉｎｔ−ｃｕｔ）とアドバイスを示す図
【図５】ポイントカット構文を示す図
【図６】アドバス構文を示す図
【図７】原始ポイントカットの分類を示す図
【図８】ポイントカット論理式の記述例を示す図
【図９】入力プログラム例を示す図
【図１０】入力アスペクト例を示す図
【図１１】ポイントカット表を示す図
【図１２】アドバイス表を示す図
【図１３】シンボル表を示す図
【図１４】ポイントカット構文木を示す図
【図１５】図１２に示したアドバイス表に、システムがアドバイス文を追加した後の様子を示す図
【図１６】ポイントカット論理式にドモルガンの法則による等価変形を行う様子を示す図
【図１７】処理後のポイントカット表を示す図
【図１８】ポイントカット構文木のノードを探索してジョインポイントの部分集合を計算する様子を示す図
【図１９】処理後のポイントカット表を示す図
【図２０】原始ポイントカットの解釈を示す図
【図２１】ジョインポイント演算子を示す図
【図２２】手続的表現の場合のノード構造体を示す図
【図２３】ポイントカット論理式へのドモルガン演算の手続例を示す図
【図２４】ジョインポイント計算の手続例を示す図
【図２５】ジョインポイント計算の手続例を示す図
【図２６】ポイントカット論理式の定点評価例を示す図
【図２７】ポイントカット論理式のコード化の例を示す図
【図２８】簡略化処理後のポイントカット表を示す図
【図２９】スタックマシンの命令コード列にコード化された簡略化済みのポイントカット論理式を示す図
【図３０】スタックマシンの命令コード仕様内容を示す図
【図３１】評価ラベルの論理積演算規則を示す図
【図３２】評価ラベルの論理和演算規則を示す図
【図３３】ポイントカット簡略化の過程の宣言的な記述例を示す図
【図３４】ポイントカット論理式の評価ラベル付け手続例を示す図
【図３５】ポイントカット論理式の評価ラベル付け手続例を示す図
【図３６】ポイントカット論理式の命令コード化の手続例を示す図
【図３７】ポイントカット論理式の命令コード化の手続例を示す図
【図３８】シンボリックデバッガのインタフェイスの一例を示す図
【図３９】ジョインポイント処理の流れを説明するための図
【図４０】ジョインポイント処理の流れを説明するための図
【図４１】ブレークポイントの追加登録処理の手順を示すフローチャート
【図４２】命令コード表を示す図
【図４３】ブレークポイント追加前のブレークポイント表を示す図
【図４４】ブレークポイント追加後のブレークポイント表を示す図
【図４５】ブレークポイント到達時の処理手順を示すフローチャート
【図４６】命令コード表を示す図
【符号の説明】
【００６３】
１…計算機プラットフォーム；
２…デバッガカーネル；
３…ＡＯＶカーネル；
４…スクリプト評価装置；
５…アスペクト記述ファイル；
６…ターゲットプログラム（実行形式ファイル）；
２０…シンボリックデバッガインターフェイス
【図１】
2008090557.tif 000003
【図２】
2008090557.tif 000004
【図３】
2008090557.tif 000005
【図４】
2008090557.tif 000006
【図５】
2008090557.tif 000007
【図６】
2008090557.tif 000008
【図７】
2008090557.tif 000009
【図８】
2008090557.tif 000010
【図９】
2008090557.tif 000011
【図１０】
2008090557.tif 000012
【図１１】
2008090557.tif 000013
【図１２】
2008090557.tif 000014
【図１３】
2008090557.tif 000015
【図１４】
2008090557.tif 000016
【図１５】
2008090557.tif 000017
【図１６】
2008090557.tif 000018
【図１７】
2008090557.tif 000019
【図１８】
2008090557.tif 000020
【図１９】
2008090557.tif 000021
【図２０】
2008090557.tif 000022
【図２１】
2008090557.tif 000023
【図２２】
2008090557.tif 000024
【図２３】
2008090557.tif 000025
【図２４】
2008090557.tif 000026
【図２５】
2008090557.tif 000027
【図２６】
2008090557.tif 000028
【図２７】
2008090557.tif 000029
【図２８】
2008090557.tif 000030
【図２９】
2008090557.tif 000031
【図３０】
2008090557.tif 000032
【図３１】
2008090557.tif 000033
【図３２】
2008090557.tif 000034
【図３３】
2008090557.tif 000035
【図３４】
2008090557.tif 000036
【図３５】
2008090557.tif 000037
【図３６】
2008090557.tif 000038
【図３７】
2008090557.tif 000039
【図３８】
2008090557.tif 000040
【図３９】
2008090557.tif 000041
【図４０】
2008090557.tif 000042
【図４１】
2008090557.tif 000043
【図４２】
2008090557.tif 000044
【図４３】
2008090557.tif 000045
【図４４】
2008090557.tif 000046
【図４５】
2008090557.tif 000047
【図４６】
2008090557.tif 000048