(57)【特許請求の範囲】
【請求項１】
プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出する抽出手段と、
前記被影響要素を記憶する被影響要素記憶部と、
ソースコード内における前記被影響要素の出現により求められ、前記既存プログラムの一部の変更によって、前記既存プログラムの他の部分において影響が与えられる範囲である影響範囲を特定する影響範囲特定手段と、
前記影響範囲を記憶する影響範囲記憶部と、
前記プログラムのソースコードに内在する外部変数、引数、及び返り値の少なくとも一つの数又はこれらの数の組み合わせを加算することにより求められ、前記被影響要素が前記既存プログラム全体に及ぼす影響度を判定する影響度判定手段と、
前記影響度を記憶する影響度記憶部と、
前記影響範囲と前記影響度とを用いて、前記ソースコード又は前記プログラムの変更計画に応じて予め生成された分布マップの一方のベクトルに前記影響範囲の数値若しくは正規値を割り付けるとともに他方のベクトルに前記影響度の数値若しくは正規値を割り付けることによって、前記既存プログラムの変更の危険度を算出する危険度算出手段とを有することを特徴とする変更危険度測定システム。
【請求項２】
前記危険度算出手段が、
前記影響度と前記影響範囲の数値若しくは正規値を用いて危険度を算出する危険度算出部と、
前記影響度と前記影響範囲とをパラメータとして２次元的に危険度を表示する危険度表示部とを有することを特徴とする請求項１記載の変更危険度測定システム。
【請求項３】
抽出手段を用いて、プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出するステップと、
前記被影響要素を被影響要素記憶部に記憶するステップと、
影響範囲特定手段を用いて、前記被影響要素記憶部から被影響要素を取り出し、ソースコード内における前記被影響要素の出現により求められ、既存プログラムの一部の変更によって、前記既存プログラムの他の部分において影響が与えられる範囲である影響範囲を特定するステップと、
前記影響範囲を影響範囲記憶部に記憶するステップと、
影響度判定手段を用いて、前記被影響要素記憶部から被影響要素を取り出し、前記プログラムのソースコードに内在する外部変数、引数、及び返り値の少なくとも一つの数又はこれらの数の組み合わせを加算することにより求められ、該被影響要素が前記既存プログラム全体に及ぼす影響度を判定するステップと、
前記影響度を影響度記憶部に記憶するステップと、
危険度算出手段を用いて、前記影響範囲記憶部に記憶された影響範囲と前記影響度記憶部に記憶された影響度とにより、前記ソースコード又は前記プログラムの変更計画に応じて予め生成された分布マップの一方のベクトルに前記影響範囲の数値若しくは正規値を割り付けるとともに他方のベクトルに前記影響度の数値若しくは正規値を割り付けることによって、前記プログラム変更データによる前記既存プログラムの変更の危険度を算出するステップとを有することを特徴とする変更危険度測定方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、プログラムの変更を行う際に、この変更によって副次的に引き起こされる可能性の有る変更結果の発生度を危険度として算出する変更危険度測定システム、変更危険度測定方法及び変更危険度測定プログラムに関するものである。
【０００２】
【従来の技術】
ソフトウェアの開発工程において、プログラムの変更作業は不可避の作業である。また、プログラムの変更を行う技術の１つとして再構成（refactoring）という技術が存在する。再構成技術とは、既存プログラムの保守性、拡張性を向上させるための技術であり、既存プログラムの動作を変更すること無く、モジュール構成、クラス構成等を変更し、よりプログラムに安定性を持たせようとするものである。
【０００３】
上記のようなプログラムの変更作業で常に問題となるのが、変更作業の結果、プログラマが意図した変更結果（目的変更結果）を導き出すのみならず、多くはプログラマの意図しない副次的結果（副作用結果）を共に発生させてしまうという点である。
【０００４】
既存プログラムの変更作業において発生する副作用結果を如何に予測、回避するか、また、回避不可の場合は、既存プログラムのどの箇所に副作用結果が発生するのかを調べる為に様々な技術が開発されている。例えば、プログラム中の各要素の影響関係を調べるためには、「スライシング」という技術が多く使われて来た（特開平６−２０２９０５号公報、特開平６−１７５８８４号公報、特開平７−１３４６６４号公報参照）。「スライシング」とは、既存プログラムを改造する際、改造対象機能および非改造機能について計算している部分を、プログラムの依存関係と制御依存関係を用いて、プログラム内から抽出する技術のことである。一方、プログラムの各要素関係を測定するという観点では、凝集度の計測を行う技術が提案されている（特開平１１−２２４２１０号公報参照）。凝集度とは、プログラムの機能構成単位、すなわち関数やメソッドなどが、いかに機能的に独立しているかを示す度合いであり、構成要素単体の性質をあらわす尺度となる。この指標の定量的評価は大体七段階に分けられ、一番高いのが「機能的凝集度」と呼ばれるもので、単一の機能が提供可能なプログラム機能構成単位を指し、これより弱い凝集度としては例えば「時間的凝集度」と呼ばれるものがあり、これは初期化処理をまとめた関数等を指す。一番弱いのが「暗号的凝集度」と呼ばれ、お互いに全くかかわりのない二つ以上の機能が一つの関数にまとまっているプログラム機能構成単位を指す。このように凝集度を用いると、関数やメソッドの機能を計測し、プログラムの品質を数値として客観的に示すことができる。
【０００５】
【発明が解決しようとする課題】
しかしながら、上記の従来技術では、既存プログラムの変更作業は、変更作業後に発生する副作用結果がいずれも０と想定される場合のみ実施された。つまり、安全が保証された変更のみを対象としており、少しでも変更後に副作用結果を孕む危険のあるような変更は放置されるしかないという問題があった。
【０００６】
スライシング技術に関しては、非改造機能に影響を与えないように改造を行うことはできるが、逆に、非改造部分から改造部分が影響を受け、正しく改造できない場合が発生する場合も存在した。また、スライシングによって得られる結果は、あくまで各要素の影響関係の有無を調べるだけであって影響度の測定は不可能であった為、スライシングの結果が、既存プログラムの変更方針を決定する為の判断基準とは成り得なかった。
【０００７】
凝縮度の測定技術に関しては、既存プログラムの変更作業において、手続きの凝縮度が密であるかどうかは直接プログラムの変更には関係せず、手続きの凝縮度が高ければ変更作業にとって適、不適とは、一概には説明できなかった。
【０００８】
また、再構成の案には唯一の解が存在する訳ではなく、同等の効果が得られる複数の再構成案が存在し得るが、複数存在する再構成案の内の最適案、適案、不適案等のランク付けの判断は容易ではなく、その結果、プログラムの再構成の有効性は一般のユーザに認識されているものの、実際に適用されることは少なかった。
【０００９】
このように、従来技術によれば、既存プログラムの変更を行う際に、その変更によって引き起こされる新規バグ発生等のプログラムの副作用結果を予測することは可能であっても、この副作用結果を影響度として客観的に測定し、この測定値を用いてプログラムの変更計画を柔軟に行うための指針となる情報を得ることが困難であった。
【００１０】
本発明は、上記の問題に鑑みて為されたもので、複数存在する変更計画のそれぞれについて、その影響度の高低や影響範囲の狭広を測定し、この測定情報から危険度を算出し、複数存在する変更計画内より最も適した変更計画を選択する際の指針として用いることが出来る変更危険度測定システム、変更危険度測定方法及び変更危険度測定プログラムを提供することを目的とする。
【００１１】
【課題を解決するための手段】
上記の目的を達するため、本発明の第１の特徴は、(イ)プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出する抽出手段と、(ロ)被影響要素を記憶する被影響要素記憶部と、(ハ)ソースコード内における前記被影響要素の出現により求められ、既存プログラムの一部の変更によって、前記既存プログラムの他の部分において影響が与えられる範囲である影響範囲を特定する影響範囲特定手段と、(ニ)影響範囲を記憶する影響範囲記憶部と、(ホ) 前記プログラムのソースコードに内在する外部変数、引数、及び返り値の少なくとも一つの数又はこれらの数の組み合わせを加算することにより求められ、被影響要素が既存プログラム全体に及ぼす影響度を判定する影響度判定手段と、(へ)影響度を記憶する影響度記憶部と、（ト）影響範囲と影響度とを用いて、前記ソースコード又は前記プログラムの変更計画に応じて予め生成された分布マップの一方のベクトルに前記影響範囲の数値若しくは正規値を割り付けるとともに他方のベクトルに前記影響度の数値若しくは正規値を割り付けることによって、既存プログラムの変更の危険度を算出する危険度算出手段とを有する変更危険度測定システムであることを要旨とする。
【００１２】
本発明の第１の特徴に係る変更危険度測定システムによれば、影響度と影響範囲の双方を考慮して変更危険度を算出する方式を採ることにより、それぞれ一方のみを考慮する方式と比べて優れた危険度予測を立てることが可能である。
【００１３】
尚、本発明の第１の特徴において、危険度算出手段は、（チ）影響度と影響範囲の数値若しくは正規値を用いて危険度を算出する危険度算出部と、（リ）影響度と影響範囲とをパラメータとして、２次元的に危険度を表示する危険度表示部とを有しても良い。このような危険度算出手段によれば、危険度算出手段の算出結果である危険度を影響範囲と影響度とを組にしたベクトル値として評価し、評価結果を危険度表示部に表示することができる。
【００１４】
ここで「数値」とは数量化された値と定義し、「数量化」とは出現位置毎に出現回数をカウントすることと定義する。また、「正規値」とは正規化された値と定義し、「正規化」とはデータを特定の変換によって一定範囲に収めることと定義する。尚、上記特定の変換には、計算式等を用いて一定の値を求めること等がある。一例として、縦ベクトルを数量化若しくは正規化された影響度、横ベクトルを数量化若しくは正規化された影響範囲とし、原点をｍｉｎ、原点より離れるたびｍａｘに近づくように設定する。パラメータ群にはソースコード、変更計画に応じて危険度を数種類の分布マップ上に割り付ける。更に、影響範囲や影響度に任意の重み付けを行うことにより、変更計画の目的に応じた危険度の算出を行い、算出結果を表示することが可能である。
【００１５】
本発明の第２の特徴は、(イ) 抽出手段を用いて、プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出するステップと、(ロ)被影響要素を被影響要素記憶部に記憶するステップと、(ハ) 影響範囲特定手段を用いて、被影響要素記憶部から被影響要素を取り出し、ソースコード内における前記被影響要素の出現により求められ、既存プログラムの一部の変更によって、前記既存プログラムの他の部分において影響が与えられる範囲である影響範囲を特定するステップと、(ニ)影響範囲を影響範囲記憶部に記憶するステップと、(ホ) 影響度判定手段を用いて、被影響要素記憶部から被影響要素を取り出し、前記プログラムのソースコードに内在する外部変数、引数、及び返り値の少なくとも一つの数又はこれらの数の組み合わせを加算することにより求められ、被影響要素が既存プログラム全体に及ぼす影響度を判定するステップと、(へ)影響度を影響度記憶部に記憶するステップと、(ト) 危険度算出手段を用いて、影響範囲記憶部に記憶された影響範囲と影響度記憶部に記憶された影響度とにより、前記ソースコード又は前記プログラムの変更計画に応じて予め生成された分布マップの一方のベクトルに前記影響範囲の数値若しくは正規値を割り付けるとともに他方のベクトルに前記影響度の数値若しくは正規値を割り付けることによって、プログラム変更データによる既存プログラムの変更の危険度を算出するステップとを有する変更危険度測定方法であることを要旨とする。
【００１６】
又、付け加えると、この変更危険度測定方法は、（チ）被影響要素の既存プログラム内分布状況から影響範囲を特定するステップの影響範囲の単位が、（リ）一つのプログラム構成要素を一つの影響範囲とする単位と、機能、性質に共通点のあるプログラム構成要素の集合体を一つの影響範囲とする単位とを有し、影響範囲特定手段が影響範囲を特定する際に、一つのプログラム構成要素を一つの影響範囲とする単位と機能、性質に共通点のあるプログラム構成要素の集合体を一つの影響範囲とする単位の内一つを選択するステップを含んでいても良い。
【００１７】
本発明の第３の特徴は、プログラム変更による危険度を測定する変更危険度測定システムを駆動制御するためのプログラムであって、（イ）プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出手段に抽出させる命令と、（ロ）被影響要素を被影響要素記憶部に記憶させる命令と、（ハ）被影響要素記憶部から被影響要素を取り出し、ソースコード内における前記被影響要素の出現により求められ、既存プログラムの一部の変更によって、前記既存プログラムの他の部分において影響が与えられる範囲である影響範囲を影響範囲特定手段に特定させる命令と、（ニ）影響範囲を影響範囲記憶部に記憶させる命令と、（ホ）被影響要素記憶部から被影響要素を取り出し、前記プログラムのソースコードに内在する外部変数、引数、及び返り値の少なくとも一つの数又はこれらの数の組み合わせを加算することにより求められ、被影響要素が既存プログラム全体に及ぼす影響度を影響度判定手段に判定させる命令と、（ヘ）影響度を影響度記憶部に記憶させる命令と、（ト）影響範囲記憶部に記憶された影響範囲と影響度記憶部に記憶された影響度とを用いて、前記ソースコード又は前記プログラムの変更計画に応じて予め生成された分布マップの一方のベクトルに前記影響範囲の数値若しくは正規値を割り付けるとともに他方のベクトルに前記影響度の数値若しくは正規値を割り付けることによって、プログラム変更データによる既存プログラムの変更の危険度を危険度算出手段に算出させる命令とを有する変更危険度測定プログラムであることを要旨とする。
【００１８】
本発明の第３の特徴に係るプログラムは、プログラム記憶部に保存される。この変更危険度測定プログラムを中央演算装置（ＣＰＵ）が読み出すことにより、抽出手段と、影響範囲特定手段と、影響度判定手段と、危険度算出手段と、再構成手段とに上記の命令を実行させることが可能となる。
【００１９】
【発明の実施の形態】
本発明の実施の形態に係る変更危険度測定システムにおいては、被影響要素の既存プログラム内分布状況である「影響範囲」と被影響要素が既存プログラム全体に及ぼす「影響度」の両方を考慮に入れて変更の危険度を算出する（図１６、図１７参照）。ここで「危険度」とは、特定の変更計画がどの程度の範囲に渡ってどれくらいの影響を与えるかと言うことを総合的に判断して得られる尺度である。例えば、非常に独立性の高い要素に対する変更を行う場合を考える。このような要素は、影響度と言う観点では非常に低いことが考えられるが、仮にこの要素がプログラム中で広く使用されている場合には危険度はそれなりに高くなる。逆に独立性の低い要素に対する変更を行う場合を考える。このような要素は、他の要素との繋がりが比較的強く、影響度と言う観点では大きいことが考えられる。しかしこの要素がプログラム中で数箇所でしか使用されていないのならば、その危険度はそれほど高くはならない。
【００２０】
危険度を算出する場合、影響範囲と影響度を数量化若しくは正規化しておくことが望ましいが、本発明では両方とも、定量化にソースコード内の情報だけを用いる為、上限の決まった値をとることは明らかであり、出現位置及び出現回数をカウントして数量化したり、若しくは、予め設定された計算式により適当な正規化をすることが可能である。
【００２１】
ここで、本発明の実施の形態に係る「影響範囲」について説明する。影響範囲は、プログラム全体をメソッド（関数）単位で見たときの広がり具合と、クラス（モジュール） 単位で見たときの広がり具合に差が生じる可能性がある。具体例で見てみると、図１３では、メソッド単位で見ると、メソッド ｍ１は９つのメソッドで使われており、メソッドｍ２は４つのメソッドで使われていることから、メソッド ｍ１のほうが影響範囲が広いと言うことが出来る。しかしながら、クラス単位で見ると、メソッド ｍ１はクラス Ｃ、Ｄ及びＥの３つのクラスで使われているが、メソッドｍ２ はクラス Ｂ、Ｄ、Ｅ及びＩの４つのクラスで使われている。影響範囲の定義としていずれを取るかは画一的に決められる問題ではない。例えばオブジェクト指向言語であれば、各クラスは比較的独立性が高く設計されていることが期待されるため、単純にメソッドの数で数えるよりもクラスの数で影響範囲を定量化する方が妥当なケースが多い。しかしながらＣ言語などの場合は各モジュール（クラス）の独立性が必ずしも高くは無く、関数単位での定量化が望ましいケースもある。つまり、「影響範囲」はプログラムの変更計画や使用するプログラミング言語に応じて柔軟な単位変更が望まれる。
【００２２】
「影響度」は、プログラム（ソースコード）内に存在する外部変数、引数、クラス変数及び返り値等をカウントした値、若しくは、カウントした値を正規化した正規値より求められる。外部変数、引数、クラス変数及び返り値等が他のソースコードに及ぼす影響については、直接影響を及ぼす１次的影響、間接的に影響を受ける２次的影響等が考えられる。また、影響度は、変数の種類や使用するプログラミング言語に応じた柔軟な変更を必要とする。
【００２３】
まず単純に影響度のみを考慮する方式の問題点に付いて考察する。図１４では、２つのメソッドメソッドｍ１とメソッドｍ２の影響度が同じであるとする。このとき、影響度のみを考慮して危険度を算出する場合、影響度が同じであるから危険度も同じと算出される。しかしながらこのケースでは、メソッドｍ１ に関する変更を行うと、プログラム中の他の９つの要素への２次影響が派生する可能性がある。一方、メソッドｍ２に関する変更では、他の４つの要素への２次影響が派生する可能性がある。この場合、双方の変更の危険度が同じであるとするのは妥当ではないことは明白である。
【００２４】
次に影響範囲のみを考慮する方式の問題点に付いて考察する。図１５に示される通り、２つのメソッド、メソッドｍ１とメソッドｍ２ は、いずれもプログラム中の他の４つの要素への２次影響派生の可能性を持っている。影響範囲のみを考慮すれば、これら二つのメソッドに関する変更作業の危険度は同じと算出される。しかしながら、このケースで、メソッドｍ１とメソッドｍ２の影響度に差があるとする。メソッドｍ１ よりもメソッドｍ２のほうが、使用している外部変数やパラメータの数などが多い場合、この２つの影響度の差を考慮せずに危険度が同等であるとすることが妥当ではないことは明白である。
【００２５】
本発明の実施の形態の説明では、Ｊａｖａ やＣ＋＋といった一般のオブジェクト指向言語を対象とした変更を題材とする。
【００２６】
（プログラム変更危険度測定システム）
本発明の実施の形態に係るプログラム変更危険度測定システムは、図１に示すように、中央演算装置（ＣＰＵ）２０、プログラム記憶部２１、データ記憶部２２と、制御の指示及びデータの入力を行う入力部２３と、データの出力を行う出力部２４と、ホストコンピュータ２５及びインタフェース２６およびこれらを接続するシステムバス２７等からなる。
【００２７】
ＣＰＵ２０がプログラム記憶部２１に格納された変更危険度測定プログラムを実行することにより本実施の形態に係る変更危険度測定システムによる処理が実現される。ＣＰＵ２０は、抽出手段１、影響範囲特定手段２、影響度判定手段３、危険度算出手段４、再構成手段５等のモジュールを内蔵している。抽出手段１は、既存プログラムとプログラム変更データから、プログラム変更データにより影響を受ける既存プログラム内のプログラム構成要素を被影響要素として抽出する。影響範囲特定手段２は、被影響要素から影響範囲を特定する。影響度判定手段３は、被影響要素が既存プログラム全体に及ぼす影響度を判定する。危険度算出手段４は、影響度と影響範囲を用いて、プログラム変更データによる既存プログラムの変更の危険度を算出する。再構成手段５は、算出された危険度を基に、最も適したプログラム変更データを選択する際の支援を行う。
【００２８】
プログラム記憶部２１は、被影響要素抽出プログラム、影響範囲特定プログラム、影響度判定プログラム、危険度算出プログラム及び再構成プログラムを有している。また、これらのプログラムはそれぞれソフトウェアの論理的な機能単位であり、それぞれが互いに物理的に異なるシステム上で動作することも可能である。データ記憶部２２は、被影響要素記憶部８と、影響範囲記憶部９と、影響度記憶部１０と、危険度記憶部１１と、再構成記憶部１２と、ソースコード記憶部６と、変更計画記憶部７とを備えている。被影響要素記憶部８は被影響要素抽出プログラムの実行結果等を格納し、影響範囲記憶部９は影響範囲特定プログラムの実行結果等を格納し、影響度記憶部１０は影響度判定プログラムの実行結果等を格納し、危険度記憶部１１は危険度算出プログラムの実行結果等を格納し、再構成記憶部１２は再構成プログラムの実行結果等を格納する。また、ソースコード記憶部６は入力部２３より入力されたソースコードを格納し、変更計画記憶部７は入力部２３より入力された変更計画を格納する。入力部２３は、キーボード、マウス等を設けソースコード、変更計画等のデータの入力を行う。尚、入力部２３は、上記の他に、インタフェース２６を介したホストコンピュータ２５やフロッピーディスク等の記憶装置から入力させるようにしても良い。出力部２４は、表示部、プリンタ等を設けデータの出力を行う。尚、出力部２４は、上記の他に出力結果をファイルやフロッピーディスク等の記憶装置に格納したり、インタフェース２６を介してホストコンピュータ２５に出力するようにしても良い。
【００２９】
図２に示すように、本発明の実施の形態に係る抽出手段１は、構文解析部１１と、被影響要素抽出部１２とを有している。構文解析部１１は、入力部２３より変更計画７ａとソースコード６ａを読み込み、構文解析を行い、構文構造、変数定義等の影響範囲を特定する際に必要と思われる情報を作成する。尚、図示しないが、入力された変更計画７ａは変更計画記憶部７へ、ソースコード６ａはソースコード記憶部６へ送信され、記憶される。被影響要素抽出部１２は、構文解析部１１で解析された変更計画７ａとソースコード６ａを用いて、変更計画７ａを実行した結果、変更の可能性のあるソースコード箇所（被影響要素情報８ａ）をソースコード内より抽出する。変更計画の例としては、ＵＮＩＸのｐａｔｃｈコマンドで使用される差分情報等が挙げられる。尚、抽出された被影響要素８ａは要素ごとに被影響要素記憶部８に格納される。
【００３０】
図３に示すように、本発明の実施の形態に係る影響範囲特定手段２は、単位決定部２０と、メソッド探索部２１と、クラス探索部２２と、影響範囲特定部２３とを有している。単位決定部２０は、記憶部７に格納されている変更計画７ａと、被影響要素記憶部８に格納されている被影響要素８ａを１つ取り出し、変更計画７ａの目的に応じて、オペレータの指示若しくは格納されているプログラムによって影響範囲の単位を決定する。本実施形態ではメソッド単位とクラス単位の２つの単位を使用する。単位決定部２０でメソッド単位を選択すると、被影響要素８ａはメソッド探索部２１へ送信され、クラス単位を選択すると被影響要素８ａはクラス探索部２２へ送信される。
【００３１】
メソッド探索部２１では、スライシング技術等を用いて、被影響要素８ａとなるメソッドを探索する。探索された被影響要素８ａはメソッド単位で影響範囲特定部２３に送信される。クラス探索部２２では、クラス間依存関係グラフ等を用いて被影響要素８ａとなるクラスを探索する。探索された被影響要素８ａはクラス単位で影響範囲特定部２３に送信される。影響範囲特定部２３は、単位ごとに、被影響要素８ａのソースコード６ａ内での分布状況を判定する。具体的には被影響要素８ａの出現位置、出現回数等を抽出する。尚、被影響要素８ａの出現位置、出現回数の抽出は被影響要素８ａとソースコード６ａの併合処理等を行うことにより実現する。また、影響範囲は後に危険度を算出する際に使用される為、数量化若しくは正規化する。影響範囲特定部２３によって求められた被影響要素８ａの出現位置、出現回数、正規化された数値等の情報は影響範囲記憶部９に格納される。尚、影響範囲の単位には、メソッド単位、クラス単位、ブロック単位、変数単位等のものが考えられ、いずれの単位においても使用可能とする。
【００３２】
図４に示すように、本発明の実施の形態に係る影響度判定手段３は、影響度判定手段３は影響度抽出部３０と、影響度正規部３１とを有している。影響度判定手段３は、被影響要素記憶部８に格納されている被影響要素８ａを１つ取り出し、影響度の基となる被影響要素８ａに含まれている影響度を抽出する。影響度には動的情報８ｂと静的情報８ｃの２種類の情報が存在する。動的情報８ｂは、抽出手段１により被影響要素８ａとしてカウントされた回数や、動作プロファイルに基づいた実行回数カウント等を指し、静的情報８ｃは、被影響要素８ａのプログラム中での参照頻度、被影響要素８ａと他の要素間の相互依存関係等を指す。抽出された影響度の内、動的情報８ｂは影響度正規部３１へ送信され、静的情報８ｃは影響度記憶部１０へ送信、格納される。影響度正規部３１では動的情報の数量化若しくは正規化を行う。動的情報８ｂとして数量化若しくは正規化される外部変数、引数、クラス変数及び返り値等の情報は、出現回数等をカウントして数量化するか若しくは計算式等を用いて正規化する。尚、影響度正規部３１によって求められた数値等の情報は、動的情報８ｂとして影響度記憶部１０に格納される。影響度記憶部１０に格納された情報は蓄積され、影響度算出式の生成等といった影響度値の適正化の際に利用する、外部からの補助的情報として今後利用する。
【００３３】
図５に示すように、本発明の実施の形態に係る危険度算出手段４は、危険度算出部４０と、危険度表示部４１とを有している。危険度算出部４０は、影響範囲記憶部９に記憶された影響範囲情報９ａと、この影響範囲情報９ａとペアの被影響要素８ａを一つずつ取り出し、影響度記憶部１０より影響範囲情報９ａに対応する影響度情報１０ａを取り出し、取り出された影響範囲情報９ａ、被影響要素８ａ、影響範囲情報９ａを合わせて被影響要素８ａ毎の危険度を算出する。尚、影響範囲や影響度の他にも、計算式に任意の重み付け（数値代入）をすることで、様々な目的に応じた危険度の算出を行うことが可能である。尚、危険度算出部４０によって求められた数値等の情報は、危険度記憶部１１に格納される。
【００３４】
危険度表示部４１は、危険度算出部４０によって求められた数値等の情報を編集し、図１に示す出力部等を用いて危険度の情報を閲覧する準備を行う。具体的に、第１のパラメータとして影響度を入力し、第２のパラメータとして影響範囲を入力し、第１のパラメータと第２のパラメータとで２次元的に表現されるパラメータ群を構成し、２次元的に危険度を表示する(図１６、図１７参照)。表示方法としては、単純な線形結合だけでなく、様々なポリシーを反映した組み合わせを考える事が可能である。
【００３５】
図６に示すように、本発明の実施の形態に係る再構成手段５は、再構成候補抽出部５０と、再構成危険度算出部５２と、再構成実行支援部５４とより構成される。再構成候補抽出部５０は、ソースコード記憶部６に入力されたソースコード６ａを取り出して構文解析し、再構成のための候補案を探し出し、再構成候補５１を抽出する。抽出された再構成候補５１は再構成危険度算出部５２へ送信され、再構成記憶部５５にて一時記憶される。
【００３６】
再構成危険度算出部５２は、抽出された再構成候補５１とソースコード６ａを基に再構成の危険度を算出する。再構成候補５１は算出された危険度を付加され、危険度付再構成候補５３として再構成実行支援部５４へ送信され、再構成記憶部５５にて記憶される。再構成実行支援部５４では、危険度付再構成候補５３を用いて、実際に基のソースコード６ａを再構成するために有益となる情報を提示し、再構成の支援を行う。尚、再構成候補５１、危険度付再構成候補５３、再構成済みソースコード５５ａは再構成記憶部５５にて記憶される。
【００３７】
（変更危険度測定方法）
次に、本発明の実施の形態に係る変更危険度測定システムを用いた測定方法について説明する。オペレータがソースコード６ａと変更計画７ａを入力し、危険度を出力し、危険度に基づき再構成する動作を図７に示すフローチャートを用いて説明する。
【００３８】
（ａ）ステップＳ１０１では、先ず、図７に示すように、オペレータがソースコード６ａと変更計画７ａを入力する。最初に入力部２３から対象となるソースコード６ａを読み込みソースコード記憶部６に格納し、次に入力部２３から変更計画７ａを読み込み変更計画記憶部７に格納する。
【００３９】
（ｂ）ステップＳ１０２では、ステップＳ１０１で格納されたソースコード６ａと変更計画７ａを、再びソースコード記憶部６及び変更計画記憶部７より読み出し、これらを解析し、構文構造、変数定義等の各情報を作成し、抽出処理の準備を行う。
【００４０】
（ｃ）ステップＳ１０３では、抽出手段１を用いて、被影響要素８ａの抽出処理を行う。変更計画７ａから、変更要素を一つずつ取り出して、その要素が影響を与え得る要素（被影響要素８ａ）をソースコード６ａ内から抽出する。抽出された被影響要素８ａは被影響要素記憶部８に送信され、格納される。
【００４１】
（ｄ）ステップＳ１０４では、影響範囲特定手段２を用いて、被影響要素８ａの影響範囲特定処理を行う。被影響要素記憶部８に格納されている被影響要素８ａを一つずつ取り出して、変更計画７ａの目的に応じて範囲の単位を決定し、被影響要素８ａのソースコード６ａ内分布位置等を範囲の単位ごとに判定する。判定された影響範囲は影響範囲記憶部９に送信され、格納される。
【００４２】
（ｅ）ステップＳ１０５では、影響度判定手段３を用いて、被影響要素８ａの影響度判定処理を行う。変更計画７ａから、変更要素を一つずつ取り出し、変更要素に対応する被影響要素８ａをソースコード６ａ内から抽出する。抽出された影響度は影響度記憶部１０に送信され、格納される。
【００４３】
（ｆ）ステップＳ１０６では、危険度算出手段４を用いて、危険度の算出処理を行う。影響度の数量化若しくは正規化された値と、影響範囲の数量化若しくは正規化された値を取り出し、計算式を用いて危険度を算出し、汎用機等の画面上に出力する。算出された危険度の情報は危険度記憶部１１に送信され、格納される。
【００４４】
（ｇ）ステップＳ１０７では、再構成手段５を用いて、ステップＳ１０１〜Ｓ１０６で得た変更の危険度の情報を基に再構成処理を行う。ソースコード記憶部６よりソースコード６ａを取り出し、再構成候補５１を抽出する。更に、抽出された再構成候補５１に基づいて危険度を算出し、算出された危険度付再構成候補５３を基に再構成支援を実行する。再構成支援済みのソースコードは再構成記憶部５５に送信され、格納される。
【００４５】
図７に示したステップＳ１０２では、ステップＳ１０１で格納されたソースコード６ａと変更計画７ａを解析し、構文構造、変数定義等の各情報を作成し、抽出処理の準備を行う。構文等を解析するアルゴリズムは、コンパイラ等に使われる公知の技術を用いる。これは、記号表（変数定義情報）と構文木（構文構造情報）から構成されており、登録されている情報には、変数名、定義されている行番号、変数の型、変数の初期値、上位（親）の変数の情報へのポインタ、下位の先頭（長子）の変数の情報へのポインタ、同じ親をもち次に定義されている変数（弟）へのポインタ、その変数が再定義している変数の情報へのポインタ、その変数を再定義している変数の情報のリストへのポインタ、構文木上でその変数が設定されている箇所へのポインタのリスト、構文木上でその変数が参照されている箇所へのポインタのリスト、その変数と包含関係にある変数の情報等がある。
【００４６】
構文木はプログラムの実行順序に応じて得られる文のつながりを表すことによりプログラムの構文構造を表現する。構文木の個々のノードはプログラムの命令文や式に相当し、各々情報を持ち、情報全体でプログラムを構成する。構文木が持ち合わせる情報には、代入文の場合には、文種別（＝代入）情報として、行番号、ベーシックブロックへのポインタ、代入元の式へのポインタ、代入先の変数に対応する名前表のコラムへのポインタ、次の文へのポインタ等がある。条件分岐文の場合には、文種別（＝条件分岐）情報として、行番号、ベーシックブロックへのポインタ、条件式情報へのポインタ、then部の文の先頭へのポインタ、else部の文の先頭へのポインタ、次の文へのポインタ等がある。また、条件式の情報としては、演算子の種別、右辺の式の情報へのポインタ、左辺の式の情報へのポインタ等がある。
【００４７】
次に、図８を用いて、図７におけるステップＳ１０３（被影響要素８ａの抽出処理）の動作の流れについて説明する。
【００４８】
（ａ）先ず、ステップＳ２０１で抽出の対象となるソースコード６ａを読み込み、次にステップＳ２０２にてソースコード６ａの変更を目的とする変更計画７ａを読み込む。このとき、ソースコード６ａ１つに対し、変更計画７ａは複数存在していても良い。
【００４９】
（ｂ）次にステップＳ２０３では、ステップＳ２０２で読み込まれた変更計画７ａより一つの変更要素を取り出し、その変更要素が影響を与える可能性のある箇所（被影響要素８ａ）をソースコード６ａ内より検索し、被影響要素８ａ数をカウントし、数量化する。尚、特定の変更ｃによって影響を受ける被影響要素８ａの集合を、
ε（ｃ）・・・・・（１）
と定義する。尚、正規化に関しては変更例にて説明する。
【００５０】
（ｃ）次にステップＳ２０５で、検索された被影響要素８ａは１つずつ抽出され、被影響要素記憶部８において記憶される。最後にステップＳ２０６で、現在処理した変更要素が、最後の変更要素であったかどうかの判定を行い、最後の変更要素でなかったらステップＳ２０３へ戻り、上記の動作を繰り返す。最後の変更要素であったなら、この抽出処理を終了する。
【００５１】
次に、図９を用いて、図７のステップＳ１０４（影響範囲の特定処理）の動作の流れについて説明する。
【００５２】
（ａ）先ずステップＳ３０１で、抽出の対象となるソースコード６ａを読み込み、ステップＳ３０２で、ステップＳ１０３で作成された被影響要素情報８を読み込む。
【００５３】
（ｂ）次に、ステップＳ３０３では、影響範囲そのものの単位を決定する。これは、ステップＳ３０３にて取り出された１つの被影響要素８ａを、変更計画７ａの目的や使用されているプログラミング言語等に応じて、ソースコード６ａを区分する単位を変更するもので、オペレータ若しくは格納されているプログラムによって実行される。本実施形態ではメソッド単位と、クラス単位とでソースコード６ａを区分けする。メソッド単位と決定されると、ソースコード６ａはメソッド単位に区分けされ、クラス単位と決定されると、ソースコード６ａはクラス単位に区分けされる。
【００５４】
（ｃ）次にステップＳ３０４で、被影響要素情報８より一つの被影響要素８ａを取り出す。その後ステップＳ３０５で被影響要素８ａの、ソースコード６ａ内での出現位置、出現回数を求める。
【００５５】
（ｄ）ステップＳ３０６では、出現位置、出現回数に基づき影響範囲を特定し、また影響範囲を数量化若しくは正規化する。影響範囲として、特定の変更ｃの影響範囲は、被影響要素８ａ集合ε（ｃ）の各要素が存在するメソッドの数として表現され、メソッドの出現回数を出現位置（メソッド及びクラス）毎にカウントして数量化し、これを、
ρ（ｃ）・・・・・（２）
と定義する。尚、正規化に関しては変更例にて説明する。
【００５６】
（ｅ）尚、特定された影響範囲及び数量化若しくは正規化された影響範囲は、ステップＳ３０７で影響範囲記憶部にて記憶される。
【００５７】
（ｆ）最後にステップＳ３０８では、現在処理した被影響要素８ａが、最後の被影響要素８ａであったかどうかの判定を行い、最後の被影響要素８ａでなかったらステップＳ３０４へ戻り、上記の動作を繰り返す。最後の被影響要素８ａであったなら、この特定処理を終了する。
【００５８】
次に、図１０を用いて、図７のステップＳ１０５（影響度の判定処理）の動作の流れについて説明する。
【００５９】
（ａ）先ずステップＳ４０１で、ステップＳ１０３で作成された被影響要素８ａ情報を読み込み、ステップＳ４０２で、被影響要素８ａ情報より一つの被影響要素８ａを取り出す。
【００６０】
（ｂ）次にステップＳ４０３では、その被影響要素８ａの影響度を判定する。影響度には動的情報と静的情報の２種類の情報があり、動的情報としては、被影響要素８ａ抽出手段により被影響要素８ａとしてカウントされた回数と、動作プロファイルに基づいた実行しカウントされた回数とがあり、具体的に、外部変数、引数、クラス変数及び返り値等を指す。静的情報としては、被影響要素８ａのプログラム中での参照頻度、被影響要素８ａと他の要素間の相互依存関係がある。本実施形態では、影響度の内、重要とみなされる動的情報は数量化若しくは正規化し、静的情報は影響度記憶部１０へ送信、格納される。
【００６１】
ここで、動的情報の影響度を数量化若しくは正規化する。特定の変更ｃの影響度は、特定の要素（メソッド及びクラス）で使用される外部変数、引数、クラス変数及び返り値の総数とし、外部変数、引数、クラス変数及び返り値を、メソッド及びクラス内での出現毎にカウントし、これを、
Δ(m)  ・・・・・（３）
と定義する。尚、正規化に関しては変更例にて説明する。
【００６２】
（ｃ）ステップＳ４０４で、判定された影響度及び数量化若しくは正規化された影響度は、影響度記憶部１０にて記憶される。最後にステップＳ４０５で、現在処理した被影響要素８ａが、最後の被影響要素８ａであったかどうかの判定を行い、最後の被影響要素８ａでなかったらステップＳ４０２へ戻り、上記の動作を繰り返す。最後の被影響要素８ａであったなら、この判定処理を終了する。
【００６３】
次に、図１１を用いて、図７のステップＳ１０６（危険度の算出処理）の動作の流れについて説明する。
【００６４】
（ａ）先ずステップＳ５０１で、影響範囲情報９ａを読み込み、影響範囲情報９ａより、被影響要素８ａと影響範囲情報９ａのペアを一つ取り出す（Ｓ５０２）。次にステップＳ５０３で、被影響要素８ａと影響範囲情報９ａのペアに対応する影響度を影響度記憶部１０から読み込む。
【００６５】
（ｂ）次にステップＳ５０４では、被影響要素８ａ毎の危険度を算出する。危険度と、影響範囲情報９ａとを合わせて、被影響要素８ａ毎の危険度を算出する。危険度算出には、本実施形態では、特定の変更ｃについて、式（１）、式（２）及び式（３）を用いて以下の式で危険度Ｄ（ｃ）を算出する。
【００６６】
Ｄ（ｃ）＝［（Ｃρρ（ｃ））2 ＋Σ（ＣΔΔ（ｍ））2 ］１／２・・・（４）
右辺のΣの項は、ε（ｃ）の要素である変数ｍを変化させたときの総和である。また、Ｃρ、ＣΔは任意係数である。
【００６７】
（ｃ）次にステップＳ５０５では、現在処理した被影響要素８ａと影響範囲のペアが、最後のペアであったかどうかの判定を行い、最後のペアでなかったらステップＳ５０２へ戻り、上記の動作を繰り返す。最後のペアであったなら、この算出処理をぬける。
【００６８】
（ｄ）最後にステップＳ５０６では、全ての変更計画７ａを重ね合わせて危険度を算出し、危険度を表示する。危険度の表示方法として、本実施形態では２つの表示例について説明する。
【００６９】
（１）危険度は高いが影響範囲が狭いケースと影響範囲は広いが危険度は低いケースについての表示例
図１６に示されるように影響度は高いが影響範囲は狭いケースは領域Ａとして表され、影響範囲は広いが影響度は低いケースは領域Ｂとして表される。この場合、パラメータ郡は、両方とも危険度は低くなるように設定されている。
【００７０】
（２）影響範囲と影響度の組合せ方は一定ではないが、影響範囲と影響度の値によって組合せ方を変化するケースについての表示例
図１７に示される方法では、以下の定義がなされている：
領域Ａ：危険度は０とする；
領域Ｂ：危険度は影響範囲ρに等しいとする；
領域Ｃ：危険度は影響度Δに等しいとする；
領域Ｄ：危険度はρとΔの最大値とする；
領域Ｅ：危険度は１（最大値）とする。
【００７１】
尚、上記の危険度表示は、ステップＳ５０４で被影響要素８ａの危険度算出毎に表示してもよい。
【００７２】
次に、図１２を用いて、図７のステップＳ１０７（再構成の支援処理）の動作の流れについて説明する。
【００７３】
（ａ）先ずステップＳ６０１では、ソースコード６ａを読み込み、ステップＳ６０２で、再構成候補５１を探し出し、抽出する。尚、ステップＳ６０２で使用する構成及び手順は変更計画７ａを作成する際に使用する構成及び手順と同様とし、再構成候補５１は変更計画７ａに相当するものとする。
【００７４】
（ｂ）次にステップＳ６０３では、ソースコード６ａと再構成候補５１を基に、再構成候補５１の危険度を算出する。再構成候補危険度の算出には危険度算出手段４で使用したステップ（Ｓ１０６）や計算式を用いる。再構成候補危険度が算出されると、再構成候補危険度を基のソースコード６ａに付加し、危険度付再構成候補を作成する。
【００７５】
（ｃ）ステップＳ６０４では、ステップＳ６０３にて作成された危険度付再構成候補５３に再構成の実行を支援する情報を作成し、危険度付再構成候補５３に加えて、汎用機等の画面上に出力する。オペレータは出力の支援情報によって再構成の危険度や妥当性を判断し、再構成を実行する。
【００７６】
尚、本発明による再構成の「支援」とは、ソースコード６ａ及び変更計画７ａの解析によって得られる変更計画の変更内容、要求された変更によって影響を受ける影響範囲及び影響度の指摘、変更によって引き起こされる副作用結果の修正指示、副作用結果修正の可能性の検討結果、要求された変更計画の妥当性の判断及びその理由等を指す。
【００７７】
（変更危険度システム、方法及びプログラムの使用例）
ここで具体例を用いて本発明の作用を説明する。 図１８は入力された数式を逆ポーランド記法に変換するJavaプログラムを示している。今ここで変更計画７ａとして、
（イ）    error()の変更
表示メッセージを一部変更する（図１９）
（ロ）    isDigit()の変更
真偽値判定の順序を変更する（図２０）
の二つを考え、それぞれの危険度を測定する。
【００７８】
まず（イ）のerror()の変更を考える。この変更による被影響要素８ａは、error() 自身のみである。次にこの被影響要素８ａの影響範囲を調べると、match() とterm()のに箇所で使用されていることが分かり、出現回数は２回であるため、式（２）より、この変更の影響範囲は２となる。
【００７９】
次に被影響要素８ａの影響度を定量化する。error()は他の要素の動作に影響を全く与えないため、影響度は最小である。式（３）より、この影響度は０と定量化される。これら影響範囲と影響度とを重ね合わせて危険度を求める。任意係数Ｃρ、ＣΔ  の両方の値を１とし、式（４）を用いると、危険度は２となる。
【００８０】
次に（ロ）のisDigit() の変更を考える。この変更による被影響要素８ａは、isDigit()自身とこのメソッドの返り値を利用しているterm()である。次にこれら被影響要素８ａの影響範囲を調べると、isDigit()自身はterm()で使用されており、term()はexpression()内の４箇所で使用されている。term()自身で１回、expression()で４回出現している為、式（２）より、この変更の影響範囲は５となる。
【００８１】
次に被影響要素８ａの影響度を定量化する。isDigit()は、その返り値がterm()の動作に影響を与える。影響を与える変数は１つであるため、式（３）より、この影響度は１と定量化される。これら影響範囲と影響度とを重ね合わせて危険度を求める。任意係数Ｃρ、ＣΔの両方の値を１とし、式（４）を用いると、危険度は６となる。
【００８２】
以上説明した通り、本発明により（イ）と（ロ）の変更を比較すると、後者の方がより危険度の高い変更であると言うことが定量的に評価される。
【００８３】
（変更例）
本発明の実施の形態では影響範囲と影響度の両方を考慮して危険度を算出するが、影響範囲、影響度の両方とも、その定量化にはソースコード内の情報だけを用いているので、上限の決まった値を取ることは明らかであるといった観点から見ると、被影響要素となるメソッド（クラス）が、ソースプログラムに含まれる全メソッド（クラス）に対し、どれ程含まれているか等の割合を基に正規化することも可能である。よって、ステップＳ３０６における影響範囲の正規化には、以下の計算式を用いても良い。
【００８４】
影響範囲として、特定の変更ｃの非影響要素集合ε（ｃ）の各要素が存在するメソッドの数を取る場合
ρR(c)=ρ(c)／Elms  ・・・・・（５）
但し、Elmsはプログラム中の全要素数とする。
【００８５】
また、ステップＳ４０３における影響度の正規化には以下の計算式を用いても良い。
ΔR(m)=（gv(m)+pv(m)+cv(m)+rv(m)）／（GV+pv(m)+CV+rv(m)）  ・・・・・（６）
但し、gv(m)をmの使用する外部変数の数、pv(m)をmの引数の数、cv(m)をmの使用するクラス変数の数、rv(m)をmの返り値の数、GVを全外部変数の数、CVを全クラス変数の数とする。また、GV+pv(m)+CV+rv(m)=0の場合は、Δ(m)=0とする。
【００８６】
上記、式（５）、式（６）によって正規化された値を、式（４）に代入し、危険度を求めることも可能である。
【００８７】
【発明の効果】
以上説明した通り、本発明により複数存在する変更計画のそれぞれについて、 その影響度や影響範囲の広狭を定量的に測定し、それらの情報から危険度を算出し、再構成を実験し、より安全な変更計画を選び出す際の指針として用いることが出来る。
【図面の簡単な説明】
【図１】本発明の実施の形態に係る変更危険測定システムの構成を表すブロック図である。
【図２】本発明の実施の形態に係る抽出手段の概略を示すブロック図である。
【図３】本発明の実施の形態に係る影響範囲特定手段の概略を示すブロック図である。
【図４】本発明の実施の形態に係る影響度判定手段の概略を示すブロック図である。
【図５】本発明の実施の形態に係る危険度算出手段の概略を示すブロック図である。
【図６】本発明の実施の形態に係る再構成手段の概略を示すブロック図である。
【図７】本発明の実施の形態に係る変更危険測定方法の全体の流れを示すフロー図である。
【図８】本発明の実施の形態に係る被影響要素を抽出するステップの動作の流れを示すフロー図である。
【図９】本発明の実施の形態に係る影響範囲を特定するステップの動作の流れを示すフロー図である。
【図１０】本発明の実施の形態に係る影響度を判定するステップの動作の流れを示すフロー図である。
【図１１】本発明の実施の形態に係る危険度を算出するステップの動作の流れを示すフロー図である。
【図１２】本発明の実施の形態に係る再構成を実行するステップの動作の流れを示すフロー図である。
【図１３】影響範囲におけるメソッド単位とクラス単位の差異を説明するモデル図である。
【図１４】影響範囲と影響度の組み合わせを説明するモデル図である。
【図１５】影響範囲と影響度の組み合わせを説明するモデル図である。
【図１６】影響度と影響範囲の２次元パラメータ表示例である。
【図１７】影響度と影響範囲の２次元パラメータ表示例である。
【図１８】本発明の実施の形態に係るプログラムの一例である。
【図１９】本発明の実施の形態に係るプログラムの変更の一例である。
【図２０】本発明の実施の形態に係るプログラムの変更の一例である。
【符号の説明】
１      抽出手段
２      影響範囲特定手段
３      影響度判定手段
４      危険度算出手段
５      再構成手段
６      ソースコード記憶部
６ａ    ソースコード
７      変更計画記憶部
７ａ    変更計画
８      被影響要素記憶部
８ａ    被影響要素情報
９      影響範囲記憶部
９ａ    影響範囲情報
１０    影響度記憶部
１０ａ  影響度情報
１１    危険度記憶部
１２    再構成記憶部
２０    ＣＰＵ
２１    プログラム記憶部
２２    データ記憶部
２３    入力部
２４    出力部
【図１】
0003842592.tif 000002
【図２】
0003842592.tif 000003
【図３】
0003842592.tif 000004
【図４】
0003842592.tif 000005
【図５】
0003842592.tif 000006
【図６】
0003842592.tif 000007
【図７】
0003842592.tif 000008
【図８】
0003842592.tif 000009
【図９】
0003842592.tif 000010
【図１０】
0003842592.tif 000011
【図１１】
0003842592.tif 000012
【図１２】
0003842592.tif 000013
【図１３】
0003842592.tif 000014
【図１４】
0003842592.tif 000015
【図１５】
0003842592.tif 000016
【図１６】
0003842592.tif 000017
【図１７】
0003842592.tif 000018
【図１８】
0003842592.tif 000019
【図１９】
0003842592.tif 000020
【図２０】
0003842592.tif 000021