(57)【特許請求の範囲】
【請求項１】
ソースコードに含まれる命令文であって、代入、分岐、繰り返しのいずれかに該当する命令文に相当する機能を特定する第１情報と、
当該機能への入力となる変数を示す第２情報と、
当該機能において、分岐又は繰り返しが存在する場合、当該分岐又は繰り返しの条件になっている変数を示す第３情報と、
当該機能の出力となる変数を示す第４情報を
一つのレコード中に有するデータである第１のデータフローリストを生成し、その第１のデータフローリストにおける構造同値の変数同士及び機能同士を統合するように当該第１のデータフローリストを書き換えて第２のデータフローリストを出力する第１の手段と、
前記第２のデータフローリストを受け取り、当該第２のデータフローリストから、データのみの関係を取り出したリストであるデータ関係リストを生成し、当該データ関係リストを元に、当該データ関係リストにおける関係が密なデータ同士をまとめる処理であるクラスタリングを実行し、当該クラスタリングの結果を元に当該第２のデータフローリストを書き換えて第３のデータフローリストを出力する第２の手段と
を有するデータフロー図生成装置。
【請求項２】
前記第１の手段は、前記第１のデータフローリストに含まれる変数であって、前記第１のデータフローリストにおいて、機能への入力となる変数を示す第２情報、及び当該分岐又は繰り返しの条件になっている変数を示す第３情報として登場する回数が所定の回数以上である変数を探索開始点と決定し、
上記探索開始点から所定の回数で辿れる範囲である部分データフローリストを決定し、
前記部分データフローリストのそれぞれについて、当該部分データフローリストに含まれる各機能の入力の数及び出力の数を決定し、
前記部分データフローリストの各機能の入力の数及び出力の数が、他の部分データフローリストの各機能の入力の数及び出力の数と一致するか否かを判定し、
各機能の入力の数及び出力の数と一致する部分データフローリスト同士を一つにまとめるように、前記第１のデータフローリストのレコードを統合し、レコードを削除し、又はレコード中の変数を書き換えて第２のデータフローリストを生成する
請求項１に記載のデータフロー図生成装置。
【請求項３】
前記第２の手段は、前記第２のデータフローリストを受け取り、第２のデータフローリストにおける機能への入力となるデータを示す第２情報、分岐又は繰り返しの条件になっているデータを示す第３情報、当該機能の出力となるデータを示す第４情報である変数を列挙し、列挙された変数のうち重複したものを除去した後に残った変数ごとに一つのレコードを有し、各レコードは、上記残った変数を示す第５情報と、前記第２のデータフローリストにおいて、前記残った変数が当該機能への入力となる変数として現れるレコードにおける当該機能の出力となる変数として格納されている変数を示す第６情報を有するデータであるデータ関係リストを生成し、
前記データ関係リストから、前記第２のデータフローリストに含まれる各機能の関係の密さの値を算出し、前記関係の密さの値に基づいて、関係が密なレコードまたは変数をまとめるように、前記第２のデータフローリストのレコードを統合し、レコードを削除し、又はレコード中の変数を書き換えて前記第３のデータフローリストを生成する
請求項１又は２に記載のデータフロー図生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、データフロー図生成装置に関する。
【背景技術】
【０００２】
既存のソフトウェアを活用して新たにソフトウェア開発を行う際には、その既存のソフトウェアの全体像の理解が重要で、そのためにはデータフロー図を用いると効果的である。なぜならば、データフロー図は、どのデータからどのデータが導かれるかその関係を直感的に表現した図であり、データの関係がわかると、ソフトにどんな機能が含まれているか予測でき、そして、どんな機能が含まれているかの予測がつけば、おおよそどんな動きをするソフトなのかも自ずとわかってくるためである。
【０００３】
但し、データフロー図は、その図が書かれてあったとしても、ソースコードの修正に追随できずに古い情報になってしまっていることが多い。結局、ソースコードを読解して手作業で新たなデータフロー図を生成せざるを得ないが、その生成には莫大な時間がかかる。そこで、ソフトウェアの全体像の理解が容易なデータフロー図を短時間で生成する技術が提案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１２−１６４０２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、従来のデータフロー図生成技術は、その抽出したデータフロー図が理解しにくいという問題点があった。
【０００６】
その理由の一つとして、単純に可視化しただけでは規模が大きく複雑で読めない点がある。ソースコード上の変数、演算の関係を忠実に可視化すると、規模が膨大で複雑になり、人が見て理解できる範囲を超えてしまうのである。
【０００７】
理解し難い二つ目の理由は、データフロー図の規模を小さくするために、設計で決めた括りを利用するからである。可視化する際に、表示する最小単位を丸めて、データフロー図の規模を押さえる技術がある。その丸める単位に関数やモジュールといった設計で決める単位を利用している。
【０００８】
しかし、設計で決める括りと、本来的な機能の括りは一致しないことが多い。設計では、保守性や拡張性なども考慮して機能を括るため、本来的な機能のくくりとは異なる。
本発明の目的は、ソースコードを入力として、理解が容易なデータフロー図を短時間で抽出する技術を提供することにある。
【課題を解決するための手段】
【０００９】
本発明の実施の形態はデータフロー図生成装置として提案される。このデータフロー図生成装置は、第１の手段と、第２の手段とを有する。
【００１０】
第１の手段は、ソースコードに含まれる命令文であって、代入、分岐、繰り返しのいずれかに該当する命令文に相当する機能を特定する第１情報と、当該機能への入力となる変数を示す第２情報と、当該機能において、分岐又は繰り返しが存在する場合、当該分岐又は繰り返しの条件になっている変数を示す第３情報と、当該機能の出力となる変数を示す第４情報を一つのレコード中に有するデータである第１のデータフローリストを生成し、その第１のデータフローリストにおける構造同値の変数同士及び機能同士を統合するように当該第１のデータフローリストを書き換えて第２のデータフローリストを出力する。
【００１１】
第２の手段は、前記第２のデータフローリストを受け取り、当該第２のデータフローリストから、データのみの関係を取り出したリストであるデータ関係リストを生成し、当該データ関係リストを元に、当該データ関係リストにおける関係が密なデータ同士をまとめる処理であるクラスタリングを実行し、当該クラスタリングの結果を元に当該第２のデータフローリストを書き換えて第３のデータフローリストを出力する。
【図面の簡単な説明】
【００１２】
【図１】本実施の形態にかかるデータフロー図生成装置の構成例を示す機能ブロック図
【図２】データフロー図生成装置が実行する処理であるデータフロー図生成処理の一例を示すフローチャート
【図３】データフローリスト生成処理の例を示したフローチャート
【図４】データフロー図生成装置に入力されるソースコードの例を示す図
【図５】図４に示すソースコードから生成される演算ブロックのデータ構成例を示す図
【図６】図４に示したソースコード１００から生成される変数リストのデータ構成例を示す図
【図７】図５に示した演算ブロックから生成された展開後のエントリ関数の演算ブロックのデータ構成例を示す図
【図８】データフローリストのデータ構成例を示す図
【図９】図８のデータフローリストに対応するデータフロー図
【図１０】分岐又は繰り返しのデータフローリスト生成規則に従って生成されたデータフローリストと、その元とである演算ブロックの例を示す図
【図１１】図７に示した演算ブロックから生成されたデータフローリストのデータ構成例を示す図
【図１２】図１１に示したデータフローリストをデータフロー図の形式で表示した図
【図１３】ステップＳ１０５の処理内容の例を示したフローチャート
【図１４】探索開始点を検出する例を説明するためのデータフローリストを示す図
【図１５】図１４に示したデータフローリストに対応するデータブロー図
【図１６】ステップＳ１３０３の処理内容を示すフローチャート
【図１７】第１の部分データフローリスト、第２の部分データフローリスト、第３の部分データフローリストのデータ構成例を示す図
【図１８】第１の部分データフローリスト、第２の部分データフローリスト、第３の部分データフローリストと、図１４に示した元のデータフローリストとの関係を、データフロー図として示した図
【図１９】図１７に示した各部分データフローリストにおける入出力数を記述した入出力数リストを示す図
【図２０】ステップＳ１３０７の処理内容を示すフローチャート
【図２１】ステップＳ１３０８の処理内容を示すフローチャート
【図２２】部分データフローリストの同一レコードを結合した結合部分データフローリストのデータ構成例を示す図
【図２３】削除後データフローリストのデータ構成例を示す図
【図２４】まとめ削除後データフローリストのデータ構成例を示す図
【図２５】統合後データフローリストのデータ構成例を示す図
【図２６】統合後データフローリストをデータフロー図の形式で表示した図
【図２７】データフローリスト抽象化処理の例を示したフローチャート
【図２８】統合後データフローリストの例と、その統合後データフローリストから生成されるデータ関係リストのデータ構成例を示す図
【図２９】図２８に示した統合後データフローリストに対応するデータフロー図
【図３０】データ関係リストに対応するデータの関係を模式的に示す図
【図３１】ステップＳ２７０２の処理内容の一例を示したフローチャート
【図３２】図２８に示したデータ関係リストから生成されたクラスタ化データ関係リストのデータ構成例を示す図
【図３３】モジュラリティ算出リストのデータ構成例を示す図
【図３４】６つの展開クラスタ化データ関係リストに対応するモジュラリティ算出リスト を示す図
【図３５】クラスタ化データ関係リストのデータ構成例を示す図
【図３６】モジュラリティ算出リストのデータ構成例を示す図
【図３７】クラスタ化データ関係リストを更新した結果得られる新たなクラスタ化データ関係リストのデータ構成例を示す図
【図３８】展開クラスタ化データ関係リストのモジュラリティを算出するモジュラリティ算出リストのデータ構成例を示す図
【図３９】ステップＳ２７０１の段階で得られたデータ関係リストに対応する、データ（変数）の関係を示す図と、図３７に示すクラスタ化データ関係リストに対応する、データの関係を示す図を対比して示す図
【図４０】図２７に示すステップＳ２７０３の処理内容の一例を示したフローチャート
【図４１】出力付きクラスタ化データ関係リストのデータ構成例を示す図
【図４２】ステップＳ４００２においてレコードを削除する処理の結果得られたデータフローリストを示す図
【図４３】抽象化データフローリストのデータ構成例を示す図
【図４４】図２８のデータフローリスト２５００に相当するデータフロー図
【図４５】抽象化データフローリスト４３００に相当するデータフロー図
【図４６】データフローリスト図式化処理によって生成されるデータフロー図の例を示す図
【図４７】図４６のデータフロー図の元となるデータフローリストを示す図
【図４８】データフロー図の例を示す図
【発明を実施するための形態】
【００１３】
以下、図面を参照して本発明の実施の形態にかかるデータフロー図生成装置を説明する。
［０．用語の定義］
本明細書中で使用する用語の定義を述べる。
［０．１．データフロー図］
「データフロー図」とは、どのデータから、どんな演算(=機能)を経て、どのデータが生成されるかの関係を有向グラフで示したものをいう。データフロー図において、矢印の元から先の方向にデータが流れることを意味する。また、データフロー図において、データとデータの間には、必ず機能が介在する。データ同士が直接接続される関係はありえない。
【００１４】
データフロー図の例を図４８に示す。この図４８に示すデータフロー図では、データAとデータBを入力として機能Aによる演算を経てデータCが出力されるという関係を示している。
【００１５】
［０．２．演算ブロック］
「演算ブロック」とは、ソースコードに含まれる以下の固まりをいう。
（１）分岐
「分岐」とは、分岐の条件式と、その条件成立/不成立時に実行される代入文のセットをいう。
例：if(varA > varB){ varA = varC;} else{ varC = varA; } 
【００１６】
（２）繰り返し
「繰り返し」とは、繰り返しの条件式と、繰り返し実行される代入文のセットをいう。
例：for(int i=0;i<10;i++){ varA = varA+1;}
【００１７】
（３）関数呼び出し
「関数呼び出し」とは、関数の呼び出しと、(もし関数の戻り値を格納するのであれば)その代入文のセットをいう。
例：varA = funcA();
【００１８】
（４）単純代入
「単純代入」とは、上記（１）から（４）のいずれにも含まれない代入文のことをいう。
例：varA = varB;
【００１９】
［０．３．エントリ関数］
「エントリ関数」とは、プログラムの実行開始時に最初に呼び出しされる関数をいう。例えばC言語ではmainという名前の関数がエントリ関数に相当する。
【００２０】
［０．４．スコープ］
「スコープ」とは、変数の名前の有効範囲をいい、ローカル又はグローバルのいずれかである。本明細書では、ローカルとは、当該変数を含む関数の中でのみ有効なものを指し、グローバルとは、当該変数を含む関数の外でも有効なものとする。例えば、スコープがローカルな変数varAがあり、それが関数func1とfunc2の中に登場したとしても、func1でのvarAとfunc2でのvarAは別の変数を指すということを意味する。一方で、スコープがグローバルな変数varBがあり、それが関数func1とfunc2の中に登場したとすると、func1でのvarBとfunc2でのvarBは同じ変数を指すということを意味する。
【００２１】
［０．５．クラスタリング］
「クラスタリング」とは、データの集まりをデータ間の類似度（あるい. は非類似度）に従って、いつかのグループに. 分けることをいう。クラスタリング手法には、最短距離法などの階層的手法 (hierarchical) と，k-means法などの分割最適化手法 (partitioning-optimization)がある。本実施の形態で用いるクラスタリング手法は、Louvain法であるが、本実施の形態で使用可能なクラスタリング手法がこれに限定される趣旨ではない。
【００２２】
［１．実施の形態］
［１．１．構成例］
本発明の実施の形態の一つは、データフロー図生成装置として提案される。このデータフロー図生成装置は、ソースコードからデータフロー図を生成する装置である。
【００２３】
データフロー図生成装置１は、コンピュータ、ワークステーション、サーバなどの情報処理装置であって、この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００２４】
本発明の実施の形態にかかるデータフロー図生成装置１の構成例について説明する。図１は、本実施の形態にかかるデータフロー図生成装置１の構成例を示す機能ブロック図である。なお、機能ブロック図中に示す構成要素は、構成要素の機能を機能ごとにまとめてブロックとして捉えたものであり、データフロー図生成装置１が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続」とは、データ、情報、命令などの送信及び／又は受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。本明細書中の他の構成要素の機能ブロック図の説明についても同様である。
【００２５】
本実施の形態にかかるデータフロー図生成装置１は、データフローリスト生成部１０と、データフローリスト抽象化部２０と、データフローリスト図式化部３０を有する。なお、データフローリスト生成部１０は本実施の形態の第１の手段に相当し、データフローリスト抽象化部２０は本実施の形態の第２の手段に相当する。
【００２６】
データフローリスト生成部１０はデータフローリスト抽象化部２０に接続されている。データフローリスト抽象化部２０は、データフローリスト図式化部３０に接続されている。
【００２７】
［１．１．１．データフローリスト生成部］
データフローリスト生成部１０は、ソースコード１００及びパラメータ２００を読み取り、ソースコード１００から関数を機能とみなし、当該機能を特定する情報と、当該機能への入力となる変数を示す情報と、当該機能において、分岐／繰り返しが存在する場合、当該分岐／繰り返しの条件になっている変数を示す情報とを一つのレコード中に有するデータであるデータフローリストを生成し、そのデータフローリストにおける構造同値の範囲の有無を判定し、構造同値の範囲同士を統合するように当該データフローリストを書き換える機能を有する。パラメータ２００は、全体のデータフローから構造同値な部分フローを見つけるのは一般にNP困難な問題なので、構造同値の探索範囲をパラメータで限定することで演算量を減らすために用いられるデータである。なお、「変数」は、単一の変数のみの場合だけでなく複数の変数からなる集合を含み、以下の記述においても同様である。
【００２８】
［１．１．２．データフローリスト抽象化部］
データフローリスト抽象化部２０は、データフローリスト生成部１０からデータフローリストを受信し、当該データフローリストから、データのみの関係を取り出したリストであるデータ関係リストを生成し、当該データ関係リストを元に、当該データ関係リストにおける関係が密なデータ同士をまとめる処理であるクラスタリングを実行し、当該クラスタリングの結果を元に当該データフローリストを書き換える機能を有する。
【００２９】
［１．１．３．データフローリスト図式化部］
データフローリスト図式化部３０は、データフローリスト抽象化部２０から出力された、クラスタリングの結果を元に書き換えられたデータフローリストを受信し、当該データフローリストから、所定の図式化規則に従って、データフロー図を生成する機能を有する。
［１．２．データフロー図生成装置の動作例］
【００３０】
本実施の形態にかかるデータフロー図生成装置１の動作を説明する。図２は、データフロー図生成装置１が実行する処理であるデータフロー図生成処理の一例を示すフローチャートである。
【００３１】
データフロー図生成処理において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリスト生成処理を実行する（Ｓ１０）。データフローリスト生成処理は、入力データであるソースコード１００を取得し、当該ソースコード１００に含まれる関数それぞれの演算ブロックを生成し、各演算ブロックから、関数に含まれる命令文を機能とみなし、当該機能を特定する情報（機能のＩＤと呼ぶ）と、当該機能への入力となる変数を示す情報（値入力と呼ぶ）と、当該機能において、分岐／繰り返しが存在する場合、当該分岐／繰り返しの条件になっている変数を示す情報（条件入力と呼ぶ）とを一つのレコード中に有するデータであるデータフローリストを生成し、そのデータフローリストにおける構造同値の範囲の有無を判定し、当該構造同値の範囲同士を統合するように当該データフローリストを書き換える処理であるデータフローリスト生成処理を実行する。
【００３２】
上記ステップＳ１０に続いて、データフロー図生成装置１、より詳しくはデータフローリスト抽象化部２０は、データフローリスト生成部１０からデータフローリストを受信し、当該データフローリストから、データのみの関係を取り出したリストであるデータ関係リストを生成し、当該データ関係リストを元に、当該データ関係リストにおける関係が密なデータ同士をまとめる処理であるクラスタリングを実行し、当該クラスタリングの結果を元に当該データフローリストを書き換える処理であるデータフローリスト抽象化処理を実行する（Ｓ２０）。
【００３３】
上記ステップＳ２０に続いて、データフロー図生成装置１、より詳しくはデータフローリスト図式化部３０は、データフローリスト抽象化処理実行後のデータフローリストを受信し、当該データフローリストから、所定の図式化規則に従って、データフロー図を生成する処理であるデータフローリスト図式化処理を実行する（Ｓ３０）。
以上でデータフロー図生成処理が終了する。
【００３４】
［１．２．１．データフローリスト生成処理の例］
上記データフローリスト生成処理（Ｓ１０参照）を詳述する。図３はデータフローリスト生成処理の例を示したフローチャートである。以下、図３を参照しながらデータフローリスト生成処理を説明する。
【００３５】
データフローリスト生成処理において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、入力されたソースコード１００を読み込み、このソースコードを構文解析し、当該ソースコードに含まれる各関数について、演算ブロックと変数リストを生成し、これらを記憶する（Ｓ１０１）。
【００３６】
図４に、データフロー図生成装置１に入力されるソースコード１００の例を示す。ここの例のソースコード１００は、３つの関数、main、func1、func2を含んでいる。
【００３７】
図５に、図４に示すソースコード１００から生成される演算ブロックのデータ構成例を示す。データフローリスト生成部１０は、３つの関数、main、func1、func2を含むソースコード１００から３つの演算ブロック、関数mainに対応する演算ブロック５０１＿１，関数func1に対応する演算ブロック５０１＿２、関数func2に対応する演算ブロック５０１＿３を生成する。なお、演算ブロックを他の演算ブロックと区別しない場合には、単に「演算ブロック５０１」と呼ぶ。
【００３８】
演算ブロック５０１は、対応する関数の命令文ごとに１のレコードを有するデータであって、各レコードは、当該演算ブロックに対応する関数を示す情報を格納するフィールド５０２と、当該レコードに対応する命令文の演算ブロック種別を示す情報を格納するフィールド５０３と、当該レコードに対応する命令文の内容を示す情報を格納するフィールド５０４とを有する。なお、本実施の形態では、演算ブロック種別は、分岐、繰り返し、関数呼び出し、単純代入のいずれかである。
【００３９】
なお、本明細書中、特に断りのない限り、図面に示すデータ中のレコードを特定する場合に、図中の最上行のレコードから順番に、第１のレコード、第２のレコード、第３のレコードのように呼ぶ。
【００４０】
変数リストは、対応する関数に含まれるごとに一つのレコードを有し、各レコードは、該当する変数の変数名を示す情報を格納するフィールド６０２と、当該変数のスコープを示す情報を格納するフィールド６０３を有するデータである。図６に、図４に示したソースコード１００から生成される変数リストのデータ構成例を示す。変数リスト６０１＿１は、関数mainに対応する変数リストである。変数リスト６０１＿２は、関数func1に対応する変数リストである。変数リスト６０１＿３は、関数func2に対応する変数リストである。
【００４１】
図３に戻りデータフローリスト生成処理の説明を続ける。ソースコード１００を読み込んだデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ソースコード１００中のエントリ関数に対応する演算ブロック５０１＿１の中に、演算ブロック種別を示す情報が「関数呼び出し」であるレコードであるか否かを判定する（Ｓ１０２）。ステップＳ１０２において当該レコードにおける演算ブロック種別を示す情報が「関数呼び出し」であると判定した場合（Ｓ１０２、Ｙｅｓ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、当該レコードを展開する（Ｓ１０３）。レコードを展開するとは、関数の引数と戻り値を呼び出し元と先でつなげ、変数の名前の重複を回避した上で、呼び出し元に、呼び出し先の内容を展開する。言い換えると、当該レコードを当該レコードの内容を示すフィールド５０４に記述されている、呼び出しされる関数（呼び出し先関数という）の演算ブロック５０１＿１に含まれる各レコードに置き換え、且つ、置き換えたレコードのフィールド５０４以下の手法で書き換える。
【００４２】
（１）引数のつなげかた：引数の単純代入文の右辺を、呼び出し元が渡している引数の変数名で置き換える。
（２）戻り値のつなげかた：戻り値の単純代入文の左辺を、呼び出し元が格納している引数の変数名で置き換える。
（３）スコープがローカルである変数と同じ変数が呼び出し元に既に存在していた場合は、変数名の末尾に任意の識別子を付加して名前の重複を回避する。
なお、上記は一般にインライン展開と呼ばれる手法であるが、当該手法に本実施の形態が限定される趣旨ではない。
【００４３】
ステップＳ１０３の実行後、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１０２に戻り、エントリ関数に対応する演算ブロックの次のレコードについて同様の判定を行う。
【００４４】
図７に、図５に示した演算ブロック５０１＿１、５０１＿２、５０１＿３から生成された展開後のエントリ関数の演算ブロックのデータ構成例を示す。展開後のエントリ関数の演算ブロック５０１＿１＿Ａにおいて、エントリ関数である関数mainに対応する演算ブロック５０１＿１の第１のレコードを、当該レコードのフィールド５０４に記述された呼び出し先関数func1に対応する演算ブロック５０１＿２の３つのレコードに置き換え（但し、関数名を示すフィールド５０２は元の演算ブロック５０１＿１の内容のまま）、同じく第２のレコードを、当該レコードのフィールド５０３に記述された呼び出し先関数func2に対応する演算ブロック５０１＿２の３つのレコードに置き換わる（但し、関数名を示すフィールド５０２は元の演算ブロック５０１＿１の内容のまま）。
【００４５】
また演算ブロック５０１＿１＿Ａのフィールド５０４は、演算ブロック５０１＿２における引数の単純代入の右辺が、演算ブロック５０１＿１の第１レコードのフィールド５０４に記述されている当該引数の変数名に置き換えられ、同様に、演算ブロック５０１＿２における戻り値の単純代入の左辺が、演算ブロック５０１＿１の第１レコードのフィールド５０４に記述されている当該引数の変数名に置き換える。
【００４６】
演算ブロック５０１＿３に記述された引数、戻り値も、同様に演算ブロック５０１＿１＿Ａにおいて、演算ブロック５０１＿１の第２レコード、フィールド５０４に記述された変数名に書き換えられる。
【００４７】
ステップＳ１０２に戻り、データフローリスト生成処理の説明を続ける。ステップＳ１０２において、判定の対象となるレコードの演算ブロック種別を示す情報が「関数呼び出し」でないと判定した場合（Ｓ１０２、Ｎｏ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、エントリ関数の演算ブロック５０１＿１＿Ａからデータフローリストを生成する（Ｓ１０４）。
【００４８】
データフローリストは、エントリ関数の演算ブロック５０１の各レコードに対応するレコードを有するデータである。データフローリストのレコードは、エントリ関数の演算ブロック５０１のレコードそれぞれをデータフロー図における「機能」とみなし、各機能への入力となる変数、出力となる変数を記述する。
【００４９】
図８にデータフローリストのデータ構成例を示す。データフローリスト８００は、レコード８０１を有し、レコード８０１のそれぞれは、当該レコードに相当する「機能」を特定する情報を格納するフィールド８０２、当該機能への入力となる変数を示す情報を格納するフィールド８０３、当該機能における条件入力を示す情報を格納するフィールド８０４、当該機能が出力する変数を示す情報を格納するフィールド８０５を有する。図８に示す演算ブロック５０１＿１０は、同じく図８に示したデータフローリスト８００の生成の元となるレコードを有する演算ブロックである。なお、データフローリスト８００は本実施の形態の第１のデータフローリストに相当する。
【００５０】
また、図８に示したデータフローリスト８００のレコードは、データフロー図として示すことが可能である。図８のデータフローリストに対応するデータフロー図を図９に示す。
【００５１】
［単純代入のデータフローリスト生成規則］
演算ブロックのレコードであって、その演算ブロック種別が単純代入である場合、データフローリスト生成部１０は、データフローリストのレコードを以下の規則に従って生成する。
第１のフィールド８０２（「機能のID」列）には、他と重複しない任意の数値を格納する。
【００５２】
第２のフィールド８０３（「値入力」列）には、元の演算ブロック５０１のレコードのフィールド５０４に記述されている命令文の代入の右辺に現れる変数名を格納する。
第３のフィールド８０４（「条件入力」列）には、何も格納しない（空欄とする）
【００５３】
第４のフィールド８０５（「出力」列）には、元の演算ブロック５０１のレコードのフィールド５０４に記述されている命令文の代入の左辺に現れる変数名を格納する。
なお、図８に示すデータフローリスト８００は、上記単純代入データフローリスト生成規則に従って生成されたものである。
【００５４】
［分岐又は繰り返しのデータフローリスト生成規則］
演算ブロックのレコードであって、その演算ブロック種別が分岐又は繰り返しである場合、データフローリスト生成部１０は、データフローリストのレコードを以下の規則に従って生成する。
第１のフィールド８０２（「機能のID」列）には、他と重複しない任意の数値
【００５５】
第２のフィールド８０３（「値入力」列）には、元の演算ブロック５０１のレコードのフィールド５０４に記述されている命令文の代入の右辺に現れる変数名を格納する。
【００５６】
第３のフィールド８０４（「条件入力」列）には、元の演算ブロック５０１のレコードのフィールド５０４に記述されている命令文の分岐或いは繰り返しの条件になっている変数名を格納する。
【００５７】
第４のフィールド８０５（「出力」列）には、元の演算ブロック５０１のレコードのフィールド５０４に記述されている命令文の代入の左辺に現れる変数名を格納する。
上記分岐又は繰り返しのデータフローリスト生成規則に従って生成されたデータフローリストと、その元である演算ブロックの例を図１０に示す。
【００５８】
［データフローリストの例］
上記単純代入、分岐又は繰り返しのデータフローリスト生成規則に従って、元となる演算ブロックから生成されたデータフローリストの例を示す。図１１は、図７に示した演算ブロック５０１＿１＿Ａから生成されたデータフローリスト８００＿１１のデータ構成例を示す図である。また、図１２に、図１１に示したデータフローリストをデータフロー図の形式で表示した図を示す。
【００５９】
図３に戻り、データフローリスト生成処理の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１０４において生成されたデータフローリストを、構造同値となる部分同士を統合するように更新する（Ｓ１０５）。「構造同値」とは、1つの範囲に含まれる任意のデータ(変数)を、別の範囲に含まれる任意のデータ(変数)に置き換えたときに、データ(変数)の名称以外に一切変化がないような置き換えが可能であることをいい、本実施の形態では、ソースコード中の一つの範囲に含まれる各機能の入力の数及び出力の数が、別の範囲の各機能の入力の数及び出力の数と一致する場合には、構造同値であるものとする。
【００６０】
上記ステップＳ１０５の処理内容を詳述する。図１３は、ステップＳ１０５の処理内容の例を示したフローチャートである。この処理において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、探索開始点を見つける（Ｓ１３０１）。
【００６１】
次に、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、探索開始点から所定の回数で辿れる範囲（レコード）を取り出す（Ｓ１３０３）。なお、取り出された範囲（レコード）を部分データフローリストと呼ぶ。
【００６２】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、上記部分データフローリストに含まれる機能の出力数を数える（Ｓ１３０５）。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０５の処理を各部分データフローリストについて実行する（Ｓ１３０４、Ｓ１３０６）。
【００６３】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、それぞれの部分データフローリストに含まれる機能の入出力数が、他の部分データフローリストに含まれる機能の入出力数と全て一致するか否かを判定する（Ｓ１３０７）。機能の入出力数が全て一致すると判定した場合（Ｓ１３０７、Ｙｅｓ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、一致する部分フローデータをまとめる（Ｓ１３０９）。一方、機能の入出力数が一致しないと判定した場合（Ｓ１３０７、Ｎｏ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、当該部分フローデータをそのままとする。
【００６４】
ステップＳ１３０８終了後、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、未処理の探索開始点があればその探索開始点についてステップＳ１３０３からステップＳ１３０８を実行する（Ｓ１３０２，Ｓ１３０９）。全ての探索開始点について処理が終了すると、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１０５の処理を終了する。
【００６５】
［探索開始点の検出（ステップＳ１３０１）］
上述のステップＳ１３０１の処理を詳述する。探索開始点を検出するため、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリストの値入力と条件入力の列に登録されている各変数の登場回数を集計し、登場回数がm回以上だった変数を探索開始点とする。なお、mはパラメータ２００に含まれる情報で、m=2をデフォルト値とし、2以上の任意の整数にユーザが変更してもよい。
【００６６】
図１４に、探索開始点を検出する例を説明するためのデータフローリストを示す。このデータフローリスト８００＿１４の全レコードの値入力を格納するフィールド８０３及び条件入力を格納するフィールド８０４に現れる変数名はＡからＬまでの１２個である。この１２個の変数のうち、登場回数がパラメータ値ｍ（＝２）以上であるものはＢ（登場回数３回）のみである。よって、このデータフローリスト８００＿１４の探索開始点はＢと決定される。
【００６７】
図１５に、図１４に示したデータフローリストに対応するデータブロー図を示す。図１５において、２以上の機能（丸枠内に数字で図示されている要素）の入力となっている変数（四角枠内に英文字で図示されている要素）は、Ｂのみであることがわかる。言い換えると、ステップＳ１３０１の処理は、データフロー図からm個以上の機能の入力となっているデータを見つけることに相当する。
【００６８】
［部分データフローリストの取り出し（Ｓ１３０３）］
上述のステップＳ１３０３の処理内容を詳述する。図１６に、ステップＳ１３０３の処理内容を示すフローチャートを掲げる。
ステップＳ１３０３の処理において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリスト中の、値入力（フィールド８０３）及び条件入力（フィールド８０４）に、ステップＳ１３０１で求めた探索開始点である変数名が記述されているレコードを見つける（Ｓ１６０２）。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１６０２で見つけたレコードの機能のＩＤ（フィールド８０２）を記憶する（Ｓ１６０３）。
【００６９】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１６０３で記憶した機能のＩＤに対応するレコードの出力（フィールド８０５）に記述された値が、値入力（フィールド８０３）又は条件入力（フィールド８０４）に現れるレコードを見つける（Ｓ１６０６）。
【００７０】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１６０３の実行により、該当するレコードが一以上見つかったか否かを判定する（Ｓ１６０７）。
【００７１】
該当するレコードが一以上見つかったと判定した場合（Ｓ１６０７、Ｙｅｓ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、当該レコードを記憶する（Ｓ１６０８）。該当するレコードが一以上見つからなかったと判定した場合（Ｓ１６０７、Ｎｏ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、そのままステップＳ１６０４に戻り、記憶している他のレコードについてステップＳ１６０５以降の処理を実行する。
【００７２】
データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、上記ステップＳ１６０６からステップＳ１６０８をｎ−１回繰り返す（Ｓ１６０５、Ｓ１６０９）。これは、探索開始点から所定回数nで辿れる範囲で部分データフローリストを取り出すことを意味する。なお、nはパラメータ２００に含まれる情報でn=2をデフォルト値とし、1以上の任意の整数にユーザが変更してもよい。
【００７３】
データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、上記ステップＳ１６０５からステップＳ１６０９までの処理を、ステップＳ１６０３及びステップＳ１６０８で記憶したレコードのそれぞれについて実行する（Ｓ１６０４、１６１０）。
【００７４】
ステップＳ１６１０の後、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリストから、ステップＳ１６０３及びステップＳ１６０８で記憶したレコードを取り出し、部分データフローリストを生成する（Ｓ１６１１）。
以上で、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０３の処理を終了する。
上記処理の具体例を示す。図１４に示したデータフローリストから部分データフローリストを生成する場合を以下に述べる。
【００７５】
図１４のデータフローリスト８００＿１４において、登場回数が２以上の変数はＢであり、変数Ｂを値入力（フィールド８０３）、若しくは条件入力（フィールド８０４）に有するレコードは、第２のレコード、第３のレコード、第４のレコードの３つのレコードである。
【００７６】
データフロー図生成装置１、より詳しくは、データフローリスト生成部１０はデータフローリスト８００＿１４の第２のレコードについて部分データフローリストを生成する。第２のレコードの出力（フィールド８０５）に記述されている変数はＦであり、Ｆを値入力（フィールド８０３）、若しくは条件入力（フィールド８０４）に有するレコードは第５のレコードのみである。繰り返し回数ｎー１（但し、ｎ＝２）なので、第５のレコードからさらに辿らない。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、第２のレコード及び第５のレコードからなる第１の部分データフローリストを生成する。
【００７７】
また、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は第３のレコードについて部分データフローリストを生成する。第３のレコードの出力（フィールド８０５）に記述されている変数はＧであり、Ｇを値入力（フィールド８０３）、若しくは条件入力（フィールド８０４）に有するレコードは第６のレコードのみである。繰り返し回数ｎー１（但し、ｎ＝２）なので、第６のレコードからさらに辿らない。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、第３のレコード及び第６のレコードからなる第２の部分データフローリストを生成する。
【００７８】
さらにまた、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は第４のレコードについて部分データフローリストを生成する。第４のレコードの出力（フィールド８０５）に記述されている変数名はＨであり、Ｈを値入力（フィールド８０３）、若しくは条件入力（フィールド８０４）に有するレコードは第７のレコードのみである。繰り返し回数ｎー１（但し、ｎ＝２）なので、第７のレコードからさらに辿らない。データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、第４のレコード及び第７のレコードからなる第３の部分データフローリストを生成する。
【００７９】
図１７に、上記第１の部分データフローリスト１７００＿１、第２の部分データフローリスト１７００＿２、第３の部分データフローリスト１７００＿３のデータ構成例を示す。
【００８０】
図１８に、上記第１の部分データフローリスト１７００＿１、第２の部分データフローリスト１７００＿２、第３の部分データフローリスト１７００＿３と、図１４に示した元のデータフローリスト８００＿１４との関係を、データフロー図として示した図を掲げる。図１８に示す通り、この処理は、データフロー図上で探索開始点からn個の機能を経由して辿れる範囲を部分フローデータリストとして抽出することに相当する。
【００８１】
［部分データフローリストの入出力数の計数（Ｓ１３０５）］
上述のステップＳ１３０５の処理内容の具体例を説明する。図１９は、図１７に示した各部分データフローリストにおける入出力数を記述したデータ（入出力数リストと呼ぶ）を示す図である。入出力数リスト１９００＿１は、部分データフローリスト１７００＿１から生成されたデータであり、入出力数リスト１９００＿２は、部分データフローリスト１７００＿２から生成されたデータであり、入出力数リスト１９００＿３は、部分データフローリスト１７００＿３から生成されたデータである。
【００８２】
［入出力数の一致の判定（Ｓ１３０７）］
上述のステップＳ１３０７の処理内容を詳述する。図２０に、ステップＳ１３０７の処理内容を示すフローチャートを掲げる。
【００８３】
ステップＳ１３０７の処理において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０３で生成された部分データフローリストから、任意の部分データフローリストを一つ選択する（Ｓ２００１）。説明の便宜上、選択された部分フローリストをaと呼ぶ。
【００８４】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、上記部分データフローリストａのレコードから一つ選択して、選択したレコードにおける値入力の数、条件入力の数、出力の数が全て同じとなるレコードを上記部分データフローリストa以外の部分データフローリストそれぞれから探索する（Ｓ２００３）。但し、後述するステップＳ２００５で記憶したレコードはこの探索から除外する。
【００８５】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ２００３で選択したレコードと値入力の数、条件入力の数、出力の数が全て同じとなるレコードが、上記部分データフローリストa以外の部分データフローリストの全てで見つかったか否かを判定する（Ｓ２００４）。
【００８６】
上記ステップＳ２００４で該当するレコードが見つかったと判定した場合（Ｓ２００４，Ｙｅｓ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、該当するレコードを記憶する（Ｓ２００５）。
【００８７】
データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、部分データフローリストaの他のレコードのそれぞれについて、ステップＳ２００３からステップＳ２００５の処理を実行する（Ｓ２００２、Ｓ２００６）。ステップＳ２００６の完了後、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０７の判定の結果を「Ｙｅｓ」と出力する（Ｓ２００８）。その後データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０７の処理を終了する。
【００８８】
一方、ステップＳ２００４において該当するレコードが見つからなかったと判定した場合（Ｓ２００４，Ｎｏ）、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０７の判定の結果を「Ｎｏ」と出力する（Ｓ２００７）。その後データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０７の処理を終了する。
【００８９】
ステップＳ１３０７の処理の具体例を図１９に示した入出力数リスト１９００＿１、１９００＿２、１９００＿３を用いて説明する。
入出力数リスト１９００＿１の第１のレコードの値入力の数、条件入力の数、出力の数は、「２，０，１」である。他の入出力数リスト１９００＿２、１９００＿３に値入力の数、条件入力の数、出力の数が「２，０，１」であるレコードがあるか否かを調べると、入出力数リスト１９００＿２の第１のレコード、入出力数リスト１９００＿３の第１のレコードが該当する。よって、入出力数リスト１９００＿１の第１のレコードの値入力の数、条件入力の数、出力の数の全てが一致するレコードが全ての他の入出力数リストに存在するとわかる。
【００９０】
同様に入出力数リスト１９００＿１の第２のレコードについて、他の入出力数リストに該当するレコードが存在するか調べる。入出力数リスト１９００＿１の第２のレコードの値入力の数、条件入力の数、出力の数は、「１，０，１」である。他の入出力数リスト１９００＿２、１９００＿３に値入力の数、条件入力の数、出力の数が「１，０，１」であるレコードがあるか否かを調べると、入出力数リスト１９００＿２の第２のレコード、入出力数リスト１９００＿３の第２のレコードが該当する。よって、入出力数リスト１９００＿１の第２のレコードの値入力の数、条件入力の数、出力の数の全てが一致するレコードが全ての他の入出力数リストに存在するとわかる。
【００９１】
よって、選択された部分データフローリストに相当する入出力数リスト１９００＿１の全てのレコードについて、他の部分フローデータリストに該当するレコードが存在すると判定される。この結果、ステップＳ１３０７の判定結果として、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は「Ｙｅｓ」を出力する。これは、３つの部分データフローリスト１７００＿１、１７００＿２、１７００＿３が構造同値であることを意味する。
【００９２】
なお、構造同値か否かの厳密な判定はNP（Non-deterministic Polynomial time）困難な問題になるので、本実施の形態では機能の入出力数の比較によって近似的に判定して、高速に判定できるようにしている。
【００９３】
［部分データフローリストをまとめる（Ｓ１３０８）］
上述のステップＳ１３０８の処理内容を詳述する。図２１に、ステップＳ１３０８の処理内容を示すフローチャートを掲げる。
ステップＳ１３０８において、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、全ての部分フローリストの同一レコードを結合した結合部分データフローリストを生成する（Ｓ２１０１）。
【００９４】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリスト８００から部分データフローリストが有する各レコードの機能のID（フィールド８０２）と同じ機能のID（フィールド８０２）のレコードを削除する（Ｓ２１０２）。
【００９５】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリスト８００の各レコードにおいて、値入力、条件入力、出力の中の要素αに、結合部分データフローリストを作成する際にまとめた要素βに含まれるものがあるならば、要素αを要素βで置き換える（Ｓ２１０３）。なお、ここにいう「要素」とは、一の変数又は複数の変数をいう。
【００９６】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、上記データフローリストに結合部分データフローリストを追加したものを新たなデータフローリスト８００とする（Ｓ２１０４）。
以上でデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、ステップＳ１３０８の処理を終了する。
［ステップＳ２１０１からステップＳ２１０４の具体例］
【００９７】
上記ステップＳ２１０１からステップＳ２１０４の具体例を示す。上述の図１７に示した３つの部分データフローリスト１７００＿１、１７００＿２、１７００＿３を用いてステップＳ２１０１からステップＳ２１０４を行うものとする。
【００９８】
図２２に、上記部分データフローリスト１７００＿１、１７００＿２、１７００＿３の同一レコードを結合した結合部分データフローリストのデータ構成例を示す。結合部分データフローリスト２２００は、データフローリスト８００と同一のデータ構成を有する。すなわち、結合部分データフローリスト２２００は、一の機能ごとに一つのレコードを有し、各レコードは第１のフィールド８０２、第２のフィールド８０３、第３のフィールド８０４、第４のフィールド８０５を有する。
第１のフィールド８０２は、当該レコードに対応する機能を一意に特定する情報（例えば、機能のＩD）を格納する。
第２のフィールド８０３には、当該機能に相当する関数への入力となる変数名が格納される。
第３のフィールド８０４には、当該機能に相当する関数が分岐若しくは繰り返しの条件文を有する場合に、当該条件文に含まれる変数名が格納される。
第４のフィールド８０５には、当該機能に相当する関数の出力となる変数名が格納される。
【００９９】
データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、結合部分データフローリスト２２００の第１のフィールド８０２に、データフローリスト８００及び部分データフローリスト１７００に登録されている機能のIDいずれとも重複しない任意の数値を書き込む。また、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、結合部分データフローリスト２２００の第２のフィールド８０３、第３のフィールド８０４、第４のフィールド８０５に、部分データフローリスト１７００＿１、１７００＿２、１７００＿３の同一レコード・同一フィールドの要素をひとまとめにした内容を格納する。図２２では、ひとまとめにしたことを記号「+」でつないで表現している。
【０１００】
例えば、結合部分データフローリスト２２００、第１のレコードの第２のフィールド８０３には、第１の部分データフローリスト１７００＿１、第１のレコードの第２のフィールド８０３に格納されている「Ｂ，Ｃ」と、第２の部分データフローリスト１７００＿２、第１のレコードの第２のフィールド８０３に格納されている「Ｂ，Ｄ」と、第３の部分データフローリスト１７００＿３、第１のレコードの第２のフィールド８０３に格納されている「Ｂ，Ｅ」を一つにまとめた内容である「Ｂ，Ｃ＋Ｄ＋Ｅ」を格納する。なお、同一フィールドに複数の変数名（例えば、第１の変数名、と第２の変数名）が格納されている場合には、第１の変数名同士でまとめ、第２の変数名同士でまとめるものとする。
【０１０１】
同様に、結合部分データフローリスト２２００、第１のレコードの第４のフィールド８０５には、第１の部分データフローリスト１７００＿１、第１のレコードの第４のフィールド８０５に格納されている「Ｆ」と、第２の部分データフローリスト１７００＿２、第１のレコードの第４のフィールド８０５に格納されている「Ｇ」と、第３の部分データフローリスト１７００＿３、第１のレコードの第４のフィールド８０５に格納されている「Ｈ」を一つにまとめた内容である「Ｆ＋Ｇ＋Ｈ」を格納する。
【０１０２】
また、結合部分データフローリスト２２００、第２のレコードの第２のフィールド８０３には、第１の部分データフローリスト１７００＿１、第２のレコードの第２のフィールド８０３に格納されている「Ｆ」と、第２の部分データフローリスト１７００＿２、第２のレコードの第２のフィールド８０３に格納されている「Ｇ」と、第３の部分データフローリスト１７００＿３、第２のレコードの第２のフィールド８０３に格納されている「Ｈ」を一つにまとめた内容である「Ｆ＋Ｇ＋Ｈ」を格納する。
【０１０３】
同様に、結合部分データフローリスト２２００、第２のレコードの第４のフィールド８０５には、第１の部分データフローリスト１７００＿１、第２のレコードの第４のフィールド８０５に格納されている「Ｉ」と、第２の部分データフローリスト１７００＿２、第２のレコードの第４のフィールド８０５に格納されている「Ｊ」と、第３の部分データフローリスト１７００＿３、第２のレコードの第４のフィールド８０５に格納されている「Ｋ」を一つにまとめた内容である「Ｉ＋Ｊ＋Ｋ」を格納する。
【０１０４】
また、部分データフローリスト１７００＿１、１７００＿２、１７００＿３の第１及び第２レコードの第３のフィールド８０４はいずれも空欄（データ無し）なので、結合部分データフローリスト第１及び第２レコードの第３のフィールド８０４は、いずれも空欄（データ無し）となる。
【０１０５】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、データフローリスト８００＿１４から、部分データフローリスト１７００＿１、１７００＿２、１７００＿３の各レコードの第１のフィールド８０２に格納されている情報（本例では機能のＩＤ番号）と、同一の情報を第１のフィールド８０２に格納しているレコードを削除する。
【０１０６】
図２３に、データフローリスト８００＿１４から、部分データフローリストのレコードに対応するレコードを削除した状態のデータフローリスト（削除後データフローリストと呼ぶ）のデータ構成例を示す。
【０１０７】
データフローリスト８００＿１４の第１から第８のレコードの第１のフィールド８０２には、それぞれ「１」、「２」、「３」、「４」、「５」、「６」、「７」、「８」が格納されている。
一方、第１の部分データフローリスト１７００＿１の第１及び第２のレコードの第１のフィールド８０２には、「２」と「５」が格納されており、第２の部分データフローリスト１７００＿２の第１及び第２のレコードの第１のフィールド８０２には、「３」と「６」が格納されており、第３の部分データフローリスト１７００＿３の第１及び第２のレコードの第１のフィールド８０２には、「４」と「７」が格納されている。
【０１０８】
よって、データフローリスト８００＿１４から「２」と「５」、「３」と「６」、「４」と「７」に対応するレコードを削除し、削除後データフローリスト２３００が生成される。
【０１０９】
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、削除後データフローリスト２３００の各レコードの第２のフィールド８０３（値入力）、第３のフィールド８０４（条件入力）、第４のフィールド８０５（出力）の中の要素（要素αと呼ぶ）に、結合部分データフローリスト２２００を作成する際にまとめた要素（要素βと呼ぶ）に含まれるものがあるならば、その要素αを要素βで置き換える（ステップＳ２１０３）。
【０１１０】
前述した結合部分データフローリスト２２００を作成する際にまとめた要素は、結合部分データフローリスト２２００の第１のレコードの第２のフィールド８０３の「Ｃ，Ｄ，Ｅ」と、第１のレコードの第４のフィールド８０５の「Ｆ，Ｇ，Ｈ」と、第２のレコードの第２のフィールド８０３の「Ｆ，Ｇ，Ｈ」と、第２のレコードの第４のフィールド８０５の「Ｉ，Ｊ，Ｋ」である。削除後データフローリスト２３００の各レコードの第２のフィールド８０３（値入力）、第３のフィールド８０４（条件入力）、第４のフィールド８０５（出力）の中に、上記に該当するものは、削除後データフローリスト２３００の第２のレコードの第２のフィールド８０３の「Ｉ，Ｊ，Ｋ」である。よって、データフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、削除後データフローリスト２３００の第２のレコードの第２のフィールド８０３の内容を「Ｉ，Ｊ，Ｋ」から「Ｉ＋Ｊ＋Ｋ」へ書き換える。図２４に書き換えられた削除後データフローリスト（まとめ削除後データフローリスト２４００と呼ぶ）のデータ構成例を示す。
【０１１１】
［ステップＳ２１０４の具体例］
次にデータフロー図生成装置１、より詳しくは、データフローリスト生成部１０は、まとめ削除後データフローリスト２４００に結合部分データフローリスト２２００の全レコードを追加して、新たなデータフローリスト（統合後データフローリスト２５００と呼ぶ）を生成し、出力する（Ｓ２１０４）。
【０１１２】
図２５に、まとめ削除後データフローリスト２４００に結合部分データフローリスト２２００の全レコードを追加することによって生成されたデータフローリストのデータ構成例を示す。統合後データフローリスト２５００は、構造同値の複数の部分を一つに統合した結果のデータフローリストである。図２６に、統合後データフローリスト２５００をデータフロー図の形式で表示した図を示す。図１５に示したデータフロー図が、図２６に示す内容に統合されていることがわかる。なお、統合後データフローリスト２５００は、本実施の形態の第２のデータフローリストに相当する。
【０１１３】
［１．２．２．データフローリスト抽象化処理の例］
図２に戻り、上記データフローリスト抽象化処理（Ｓ２０参照）を詳述する。図２７はデータフローリスト抽象化処理の例を示したフローチャートである。以下、図２７を参照しながらデータフローリスト抽象化処理を説明する。なお、本実施の形態では、Louvain法を用いたクラスタリングを行うものとして説明するが、本実施の形態がLouvain法に限定される趣旨ではなく、その他のクラスタリング手法を用いても本実施の形態は成立する。
【０１１４】
データフローリスト抽象化処理において、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、データフローリスト生成部１０から統合後データフローリスト２５００を受信し、この統合後データフローリスト２５００からデータ（変数）のみの関係を取り出したデータ関係リストを生成する（Ｓ２７０１）。図２８に、統合後データフローリスト２５００の例と、その統合後データフローリスト２５００から生成されるデータ関係リストのデータ構成例を示す。
【０１１５】
統合後データフローリスト２５００は、図２５に示したものと同様のデータ構成を有する。データ関係リスト２８００は、統合後データフローリスト２５００の値入力（フィールド８０２）、条件入力（フィールド８０２）、出力（フィールド８０２）に格納されている変数を全て列挙して、変数の重複除去した後に残った変数ごとに一つのレコードを有するデータである。各レコードは、変数を特定する情報を格納するフィールド２８０１と、同一レコードの「データ」列（フィールド２８０１）の変数が、元となる統合後データフローリスト２５００の値入力（フィールド８０３）又は条件入力（フィールド８０４）に格納されている変数として現れる機能（レコード）の出力に登録されている変数を格納する「関係するデータ」列（フィールド２８０２）を有する。なお、フィールド２８０２については重複除去はしない。なお、上記「データ」列（フィールド２８０１）の変数は、本実施の形態の「残った変数を示す情報」に相当する。
【０１１６】
図２８に示すデータ関係リスト２８００を例として説明する。統合後データフローリストの全レコードの各フィールドに含まれるデータ（変数）は、Ａ，Ｂ，Ｃ，Ｄの４種類のみであり、よってデータ関係リスト２８００は、Ａ，Ｂ，Ｃ，Ｄに対応する４つのレコードを有し、この４つのレコードのフィールド２８０１には、それぞれＡ，Ｂ，Ｃ，Ｄが格納される。
【０１１７】
データ関係リスト２８００のデータ（変数）Ａに対応するレコードである第１のレコードのフィールド２８０２は、統合後データフローリストにおいてＡが値入力（フィールド８０３）又は条件入力（フィールド８０４）に登場する機能（レコード）は第１のレコードであり、当該１のレコードの出力（フィールド８０５）はＢであるので、データ関係リスト２８００のデータ（変数）Ａに対応するレコードのフィールド２８０２には、Ｂが格納される。
【０１１８】
データ関係リスト２８００のデータ（変数）Ｂに対応するレコードである第２のレコードのフィールド２８０２は、統合後データフローリストにおいてＢが値入力（フィールド８０３）又は条件入力（フィールド８０４）に登場する機能（レコード）は第２のレコードと第３のレコードであり、当該２、第３のレコードの出力（フィールド８０５）はＡとＣであるので、データ関係リスト２８００のＢに対応するレコードである第２のレコードのフィールド２８０２には、ＡとＣが格納される。
【０１１９】
データ関係リスト２８００のＣに対応するレコードである第３のレコードのフィールド２８０２は、統合後データフローリストにおいてＣが値入力（フィールド８０３）又は条件入力（フィールド８０４）に登場する機能（レコード）は第４のレコードであり、当該４のレコードの出力（フィールド８０５）はＤであるので、データ関係リスト２８００のデータＣに対応するレコードのフィールド２８０２には、Ｄが格納される。
【０１２０】
データ関係リスト２８００のデータＤに対応するレコードである第４のレコードのフィールド２８０２は、統合後データフローリストにおいてＣが値入力（フィールド８０３）又は条件入力（フィールド８０４）に登場する機能（レコード）は第５のレコードのみであり、当該５のレコードの出力（フィールド８０５）はＣであるので、データ関係リスト２８００のデータＤに対応するレコードである第４のレコードのフィールド２８０２には、Ｃが格納される。
【０１２１】
図２９は、図２８に示した統合後データフローリスト２５００に対応するデータフロー図であり、図３０は、データ関係リスト２８００に対応する、データの関係を模式的に示す図である。図２９、図３０からわかるように、データ関係リストは、統合後データフローリストから機能を抜いて、データ間のみを
つないであげたものに相当する。
【０１２２】
図２７に戻り、データフローリスト抽象化処理の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、ステップＳ２７０１で生成されたデータ関係リスト２８００を元に、クラスタリングによって、関係が密なデータ同士をまとめる（Ｓ２７０２）。
【０１２３】
上記ステップＳ２７０２の処理内容を詳述する。図３１は、ステップＳ２７０２の処理内容の一例を示したフローチャートである。まず、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、データ関係リスト２８００の各レコード（より詳しくは当該レコードに対応するデータ）を一つのクラスタとするように、データ関係リスト２８００にクラスタを示す情報を格納するフィールドを付加し、各レコードの当該フィールドに、クラスタを示す情報（この例では、クラスタ番号１，２，３，４）を格納する。このクラスタを示す情報を付加されたデータ関係リストをクラスタ化データ関係リストと呼ぶ。図３２に、図２８に示したデータ関係リスト２８００から生成されたクラスタ化データ関係リスト３２００のデータ構成例を示す。
【０１２４】
クラスタ化データ関係リスト３２００は、クラスタごとに一つ又は複数のレコードを有するデータであって、各レコードはクラスタを示す情報を格納するフィールド３２０１と、データ（変数）名を格納するフィールド３２０２と、フィールド３２０２に格納されたデータに関係するデータを示す情報を格納するフィールド３２０３を有する。
【０１２５】
図３１に戻り、ステップＳ２７０２の処理内容の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０はクラスタ化データ関係リスト３２００のモジュラリティを算出する（Ｓ３１０２）。
モジュラリティの算出式の例を以下に示す。
モジュラリティ = Σm
m = y/x - (z/(2*x))^2
x =クラスタ化データ関係リスト３２００の全レコードの「関係するデータ」列（フィールド３２０２）の変数の数の合計値
y =当該クラスタの、「データ」列（フィールド３２０２）の変数と「関係するデータ」列（フィールド３２０３）の変数とで、重複している変数の数
【０１２６】
z = (当該クラスタの「データ」列（フィールド３２０２）の変数が、全レコードの「関係するデータ」列（フィールド３２０３）で登場する回数)＋(当該クラスタの「関係するデータ」列（フィールド３２０３）の変数数)
【０１２７】
図３３に、図３２に示したクラスタ化データ関係リスト３２００のモジュラリティの計算を示すデータ（モジュラリティ算出リスト３３００と呼ぶ）を掲げる。この計算結果として、モジュラリティ＝−０．２６が得られる。なお、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０はこのモジュラリティの値を判定基準値ｉとして記憶する。
【０１２８】
図３１に戻り、ステップＳ２７０２の処理内容の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタ化データ関係リスト３２００の任意のクラスタの２つを選び、選んだクラスタを組み合わせたクラスタ化データ関係リスト（展開クラスタ化データ関係リストと呼ぶ）を生成する（Ｓ３１０３，Ｓ３１０５）。
【０１２９】
一例をあげると、上記クラスタ１からクラスタ４に相当する４つのレコードを有するクラスタ化データ関係リストから、クラスタ１と２、クラスタ１と３、クラスタ１と４、クラスタ２と３、クラスタ２と４、クラスタ３と４のそれぞれが組み合わされた６つの展開クラスタ化データ関係リストが生成される。
【０１３０】
データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、上記展開クラスタ化データ関係リストそれぞれのモジュラリティを算出する（Ｓ３４０４）。
【０１３１】
図３４に上記６つの展開クラスタ化データ関係リストに対応するモジュラリティ算出リスト ３３００＿１、３３００＿２、３３００＿３、３３００＿４、３３００＿５、３３００＿６を示す。これらのモジュラリティ算出リスト ３３００＿１から３３０＿６を区別の便宜上、図３４の上から順番に第１のモジュラリティ算出リスト 、第２のモジュラリティ算出リスト 、第３のモジュラリティ算出リスト 、第４のモジュラリティ算出リスト 、第５のモジュラリティ算出リスト 、第６のモジュラリティ算出リスト と呼ぶ。
以下に、上記第１から第５のモジュラリティ算出リスト から得られたモジュラリティの値を示す。
第１のモジュラリティ算出リスト ３３００＿１から得られるモジュラリティ＝ｋ１＝０．０２
第２のモジュラリティ算出リスト ３３００＿２から得られるモジュラリティ＝ｋ２＝−０．３８
第３のモジュラリティ算出リスト ３３００＿３から得られるモジュラリティ＝ｋ３＝−０．２９
第４のモジュラリティ算出リスト ３３００＿４から得られるモジュラリティ＝ｋ４＝−０．２４
第５のモジュラリティ算出リスト ３３００＿５から得られるモジュラリティ＝ｋ５＝−０．３３
第６のモジュラリティ算出リスト ３３００＿６から得られるモジュラリティ＝ｋ６＝０．０２
【０１３２】
図３１に戻り、ステップＳ２７０２の処理内容の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、ステップＳ３１０４で算出したモジュラリティの値のうち最大値（max(kn)と呼ぶ）がステップＳ３１０２で算出した判定基準値iより大きいか否かを判定する（S３１０６）。
なお、図３４に示した例の場合は、
k1=0.02
k2=-0.38
k3=-0.29
k4=-0.24
k5=-0.33
k6=0.02
【０１３３】
上記より、max(kn) = k1 = k6 = 0.02であり、一方、判定基準値i=-0.26 なので、max(kn) > iが成立するため、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０はステップＳ３１０７に進み処理を続行することになる。
【０１３４】
図３１に戻り説明を続ける。上記最大値max(kn)がステップＳ３１０２で算出した判定基準値iより大きくないと判定した場合（Ｓ３１０６、Ｎｏ）、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０はステップＳ２７０２の処理を終了する。
【０１３５】
一方、上記最大値max(kn）がステップＳ３１０２で算出した判定基準値iより大きいと判定した場合（Ｓ３１０６、Ｙｅｓ）、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、モジュラリティの値が最大値max(kn)となった展開クラスタ化データ関係リストにおいて結合されている２つのクラスタについて、当該展開クラスタ化データ関係リストの元となるクラスタ化データ関係リスト３２００におけるレコード同士を実際に結合して一つのクラスタとする（Ｓ３１０７）。なお、展開クラスタ化データ関係リストにおいて結合されている２つのクラスタの組が複数ある場合には、元となるクラスタ化データ関係リスト３２００における任意の一つの組のクラスタ同士を結合する。
【０１３６】
図３５に、図３４に示すモジュラリティの計算結果から、図３２に示したクラスタ化データ関係リストのクラスタ（レコード）を結合して一つのクラスタ（レコード）としたクラスタ化データ関係リストのデータ構成例を示す。
【０１３７】
クラスタ化データ関係リスト３２００＿Ａは、ステップＳ３１０１において生成されたクラスタ化データ関係リストであり、クラスタ結合データ関係リスト３２００＿Ｂは、クラスタ化データ関係リスト３２００＿ＡからステップＳ３１０４を経て、ステップＳ３１０７で生成されたクラスタ化データ関係リストである。
【０１３８】
図３４に示した例では、複数の展開クラスタ化データ関係リストのうち、最大のモジュラリティの値max(kn)となるのはk1及びｋ6の展開クラスタ化データ関係リストである。k1である展開クラスタ化データ関係リスト（モジュラリティ算出リスト ３３００＿１参照）では、クラスタ１とクラスタ２が組み合わされており、ｋ6である展開クラスタ化データ関係リスト（モジュラリティ算出リスト ３３００＿６参照）ではクラスタ３とクラスタ４が組み合わされている。よって、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、元となるデータ関係リスト３２００＿Ａにおいて、上記クラスタの組のいずれかを実際に結合して新たなクラスタとする。ここではクラスタ化データ関係リスト３２００＿Ｂは、クラスタ１とクラスタ２を結合して新たにクラスタ１としたデータとなる。なお、いずれの組を用いるかは任意である。
【０１３９】
上記クラスタ化データ関係リスト３２００＿Ｂの生成後、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、前記判定基準値ｉの値を直近のmax(kn)の値に置き換える（Ｓ３１０８）。なお、この場合の判定基準値ｉは直近のmax(kn)＝０．０２に置き換えられる。
その後、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、前述のステップＳ３１０３に戻り、処理を続行する。
【０１４０】
［上記処理の具体例］
上記図３５に示したクラスタ化データ関係リスト３２００＿Ｂの生成後に、ステップＳ３１０３に戻った場合の処理内容を述べる。
【０１４１】
クラスタ化データ関係リスト３２００＿Ｂのクラスタ（レコード）はクラスタ１に該当する第１及び第２のレコードと、クラスタ３に該当する第３のレコードと、クラスタ４に該当する第４のレコードである。これらのクラスタの２つの組み合わせはクラスタ１とクラスタ３の組み合わせ、クラスタ１とクラスタ４の組み合わせ、クラスタ３とクラスタ４の組み合わせの三通りである。
【０１４２】
データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタ化データ関係リスト３２００＿Ｂのクラスタ１とクラスタ３に相当するレコードを結合した第１の展開クラスタ化データ関係リストと、クラスタ１とクラスタ４に相当するレコードを結合した第２の展開クラスタ化データ関係リストと、クラスタ３とクラスタ４に相当するレコードを結合した第３の展開クラスタ化データ関係リストを生成し、当該クラスタ化データ関係リストのモジュラリティを算出する（Ｓ３１０４）。
【０１４３】
図３６に、上記第１から第３の展開クラスタ化データ関係リストのモジュラリティを算出するモジュラリティ算出リスト３３００のデータ構成例を示す。モジュラリティ算出リスト３３００＿１１は、上記第１の展開クラスタ化データ関係リストのモジュラリティを計算したデータであり、モジュラリティ算出リスト３３００＿１２は、上記第２の展開クラスタ化データ関係リストのモジュラリティを計算したデータであり、モジュラリティ算出リスト３３００＿１３は、上記第３の展開クラスタ化データ関係リストのモジュラリティを計算したデータである。
【０１４４】
上記モジュラリティ算出リスト３３００＿１１に示すように、第１の展開クラスタ化データ関係リストのモジュラリティ＝k1＝−０．０８と計算されている。同様に、モジュラリティ算出リスト ３３００＿１２に示すように、第２の展開クラスタ化データ関係リストのモジュラリティ＝k2＝−０．１８と計算され、モジュラリティ算出リスト ３３００＿１３に示すように、第３の展開クラスタ化データ関係リストのモジュラリティ＝k3＝０．３と計算されている。
【０１４５】
次にデータフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、モジュラリティの最大値max(kn)が判定基準値iより大きいか否かを判定する（Ｓ３１０６）。図３６に示す通り、k1=−０．０８、k２=−０．１８、k３=０．３、より、モジュラリティの最大値max(kn) = k3= 0．３である。一方、判定基準値i=0.02なので、max(kn) > iが成立のため、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、その後ステップＳ３１０７に進み、データフローリスト抽象化処理を続行する。
【０１４６】
ステップＳ３１０７において、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、図３５に示すクラスタ化データ関係リスト３２００＿Bにおいて、max(kn)となるのは、n=3である、クラスタ３とクラスタ４に相当するレコードを結合した第３の展開クラスタ化データ関係リストだったので、ここで結合されている２つのクラスタ（クラスタ３とクラスタ４）を実際に結合して新たなクラスタ２とするようにクラスタ化データ関係リスト３２００＿Ｂを更新する。図３７に、クラスタ化データ関係リスト３２００＿Ｂを上記のように更新した結果得られる新たなクラスタ化データ関係リスト３２００＿Ｃのデータ構成例を示す。
【０１４７】
ステップＳ３１０７の後、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、判定基準値iをモジュラリティの最大値max(kn) = k3 = 0．３に更新し（Ｓ３１０８）、ステップＳ３１０４に進む。
【０１４８】
データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタ化データ関係リスト３２００＿Ｃのクラスタ１とクラスタ２を結合した展開クラスタ化データ関係リストを生成し、当該展開クラスタ化データ関係リストのモジュラリティを算出する（Ｓ３１０４）。図３８に、上記展開クラスタ化データ関係リストのモジュラリティを算出するモジュラリティ算出リスト ３３００＿３８のデータ構成例を示す。このモジュラリティ算出リスト ３３００＿３８からモジュラリティ＝k1＝０と計算されている。
【０１４９】
次にデータフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、モジュラリティの最大値max(kn)が判定基準値iより大きいか否かを判定する（Ｓ３１０６）。図３８に示す通り、k1=0より、max(kn) = k1 = 0である。一方、判定基準値i=0.3なので、max(kn) > iが不成立のため、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、データフローリスト抽象化処理を終了する。なお、実際にクラスタ１とクラスタ２は結合しないで処理を終了し、最終的なクラスタ化データ関係リストとして図３７に示すクラスタ化データ関係リスト３２００＿Ｃを得る。
【０１５０】
図３９に、ステップＳ２７０１で得られたデータ関係リストに対応する、データ（変数）の関係を示す図と、図３７に示すクラスタ化データ関係リスト３２００＿Ｃに対応する、データ（変数）の関係を示す図を対比して示す。データ（変数）Ａとデータ（変数）Ｂが一つのクラスタに、データ（変数）Ｃとデータ（変数）Ｄが別のクラスタにクラスタリングされたことがわかる。
以上で図２７に示すステップＳ２７０２の説明を終了する。
【０１５１】
図２７に戻り、データフローリスト抽象化処理の説明を続ける。データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタリング結果である、ステップＳ２７０２の結果得られるクラスタ化データ関係リストを元に、データフローリストを更新する（Ｓ２７０３）。
【０１５２】
上記ステップＳ２７０３の処理内容を詳述する。図４０は、図２７に示すステップＳ２７０３の処理内容の一例を示したフローチャートである。まず、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、ステップＳ２７０２の実行結果として得られたクラスタ化データ関係リストに基づいて、各クラスタの出力データを特定する（Ｓ４００１）。
【０１５３】
具体的には、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタ化データ関係リストにおける各クラスタについて、当該クラスタの「関係するデータ」列であるフィールド３２０３に格納されているデータ（変数）の中で、当該クラスタの「データ列」であるフィールド３２０２に格納されているデータ(変数）に含まれないデータ（変数）があるレコードを全て探す。
【０１５４】
上記条件に該当するレコードが見つかった場合、それらのレコードの「データ」列であるフィールド３２０２に格納されているデータ（変数）を全てまとめたものを当該クラスタの出力データとする。
【０１５５】
上記条件に該当するレコードが見つからなかった場合、当該クラスタに含まれるレコードの「データ」列の変数を全てまとめたものを当該クラスタの出力データとする。
【０１５６】
本実施の形態では、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、クラスタの出力データをクラスタ化データ関係リストに付加したデータである、出力付きクラスタ化データ関係リストを生成する。図４１に、出力付きクラスタ化データ関係リストのデータ構成例を示す。図４１に示す出力付きクラスタ化データ関係リスト４１００は、図３７に示すクラスタ化データ関係リスト３２００＿Ｃから生成された出力付きクラスタ化データ関係リストである。出力付きクラスタ化データ関係リスト４１００は、クラスタごとに一つ又は複数のレコードを有するデータであって、各レコードはクラスタを示す情報を格納するフィールド３２０１と、データ（変数）名を格納するフィールド３２０２と、フィールド３２０２に格納されたデータに関係するデータを示す情報を格納するフィールド３２０３と、該当するクラスタの出力データを示す情報を格納するフィールド３２０４を有する。
図４１に示す出力付きクラスタ化データ関係リスト４１００におけるフィールド３２０４に格納される情報は以下のように決定される。
【０１５７】
クラスタ化データ関係リスト３２００＿Ｃにおけるクラスタ１に相当する第１のレコード及び第２のレコードでは、Ｃのみがクラスタ１に該当する第１及び第２のレコードのデータ列（フィールド３２０２）に含まれない変数なので、そのＣを格納する第２のレコードのデータ列（フィールド３２０２）に格納されているＢが、出力付きクラスタ化データ関係リスト４１００のクラスタ１の出力データ（フィールド３２０４）に格納される。
【０１５８】
クラスタ化データ関係リスト３２００＿Ｃにおけるクラスタ2に該当する第３及び第４のレコードにおいては、関係するデータ列（フィールド３２０３）の変数がいずれもデータ列（フィールド３２０２）に含まれるので、上記条件に該当するレコードは存在しない。よって、クラスタ2に含まれるデータ列の変数全て（Ｃ、Ｄ）をまとめたもの（「Ｃ＋Ｄ」と表記）が、出力付きクラスタ化データ関係リスト４１００のクラスタ２の出力データ（フィールド３２０４）に格納される。
【０１５９】
図４０に戻り、図２７に示すステップＳ２７０３の処理内容の一例の説明を続ける。
出力付きクラスタ化データ関係リストを生成した後、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、データフローリストにおいて同一クラスタに含まれるデータと機能をまとめて、出力付きクラスタ化データ関係リストにおける当該クラスタの出力データに置き換えるようにデータフローリストを更新する（Ｓ４００２）。
【０１６０】
ステップＳ４００２の処理内容の具体例を詳述する。まず、データフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、統合後データフローリスト２５００の各レコードについて、値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数全てが、出力付きクラスタ化データ関係リスト４１００における同一クラスタに該当するレコードに含まれる変数であった場合は、そのレコードを削除する。よって、統合後データフローリスト２５００のレコードであって、当該レコードに格納されている変数が異なるクラスタであったレコードのみ残る。
【０１６１】
次にデータフロー図生成装置１、より詳しくは、データフローリスト抽象化部２０は、統合後データフローリスト２５００のレコードのうち、残されたレコードの各変数について、値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数を、出力付きクラスタ化データ関係リスト４１００において、その変数を「データ」列（フィールド３２０２）に含むクラスタの出力データ（フィールド３２０４）で置き換える。この置き換えを行った結果得られるデータフローリストを抽象化データフローリストと呼ぶ。
【０１６２】
上記の具体例を示す。図２５に示した統合後データフローリスト２５００と、図４１に示した出力付きクラスタ化データ関係リスト４１００に基づいて、ステップＳ４００２を実行した場合の例を述べる。
【０１６３】
図４２は、図２８に示した統合後データフローリスト２５００と、図４１に示した出力付きクラスタ化データ関係リスト４１００に基づいて、統合後データフローリスト２５００の各レコードについて、値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数全てが、出力付きクラスタ化データ関係リスト４１００における同一クラスタに該当するレコードに含まれる変数であった場合、そのレコードを削除する処理の結果得られたデータフローリストを示す。図４２に示すデータフローリスト４２００は、以下のように生成される。
【０１６４】
統合後データフローリスト２５００における機能のID=1（フィールド８０２）に該当する第１のレコードの値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数はＡとＢである。図４１に示す出力付きクラスタ化データ関係リスト４１００において、Ａはクラスタ１に該当する第１のレコード及び第２のレコードに格納されており、Ｂはクラスタ１に該当する第１のレコード及び第２のレコードに格納されている。よって、ＡとＢは同一クラスタのデータであるため、統合後データフローリスト２５００の第１のレコードは削除される。
【０１６５】
統合後データフローリスト２５００における機能のID=２（フィールド８０２）に該当する第２のレコードの値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数はＢとＡである。図４１に示す出力付きクラスタ化データ関係リスト４１００において、Ｂはクラスタ１に該当する第１のレコード及び第２のレコードに格納されており、Ａはクラスタ１に該当する第１のレコード及び第２のレコードに格納されている。よって、ＢとＡは同一クラスタのデータであるため、統合後データフローリスト２５００の第２のレコードは削除される。
【０１６６】
統合後データフローリスト２５００における機能のID=３（フィールド８０２）に該当する第３のレコードの値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数はＢとＣである。図４１に示す出力付きクラスタ化データ関係リスト４１００において、Ｂはクラスタ１に該当する第２のレコードの値入力（フィールド３２０２）に格納されており、Ｃはクラスタ２に該当する第３のレコード及び第４のレコードに格納されている。よって、ＢとＣは異なるクラスタのデータであるため、統合後データフローリスト２５００の第３のレコードは削除されない。
【０１６７】
統合後データフローリスト２５００における機能のID=４フィールド８０２）に該当する第４レコードの値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数はＣとＤである。図４１に示す出力付きクラスタ化データ関係リスト４１００において、Ｃはクラスタ２に該当する第３のレコード及び第４のレコード格納されており、Ｄはクラスタ２に該当する第３のレコード及び第４のレコードに格納されている。よって、ＣとＤは同一クラスタのデータであるため、統合後データフローリスト２５００の第４のレコードは削除される。
【０１６８】
統合後データフローリスト２５００における機能のID=５（フィールド８０２）に該当する第４レコードの値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数はＤとＣである。図４１に示す出力付きクラスタ化データ関係リスト４１００において、Ｄはクラスタ２に該当する第３のレコード及び第４のレコード格納されており、Ｃはクラスタ２に該当する第３のレコード及び第４のレコードに格納されている。よって、ＤとＣは同一クラスタのデータであるため、統合後データフローリスト２５００の第５のレコードは削除される。
【０１６９】
よって、統合後データフローリスト２５００の第１、第２、第４、第５のレコードが削除され、第３のレコードのみが残り、その結果図４２に示すデータフローリスト４２００が生成される。
【０１７０】
図４３に、データフローリスト４２００のレコードの各変数について、値入力（フィールド８０３）、条件入力（フィールド８０４）、出力（フィールド８０５）に含まれる変数を、出力付きクラスタ化データ関係リスト４１００において、その変数を「データ」列（フィールド３２０２）に含むクラスタの出力データ（フィールド３２０４）で置き換えることによって得られた抽象化データフローリストのデータ構成例を示す。
【０１７１】
図４３に示す抽象化データフローリスト４３００は、以下のように生成される。
（１）データフローリスト４２００の値入力（フィールド８０３）のＢについて
出力付きクラスタ化データ関係リスト４１００においてＢを「データ」列（フィールド３２０２）に含むレコードは、クラスタ１に該当する第１のレコードである。一方、出力付きクラスタ化データ関係リスト４１００においてクラスタ１に該当するレコードの出力データ（フィールド３２０４）に格納されている変数はＢである。よって、データフローリスト４２００の値入力（フィールド８０３）に格納されているＢをＢで置き換える(実質変わらない)。
【０１７２】
（２）データフローリスト４２００の出力（フィールド８０５）のＣについて
出力付きクラスタ化データ関係リスト４１００においてＣを「データ」列（フィールド３２０２）に含むレコードは、クラスタ２に該当する第３のレコードである。一方、出力付きクラスタ化データ関係リスト４１００において上記クラスタ２に該当するレコードの出力データ（フィールド３２０４）に格納されている変数はＣ＋Ｄである。よって、データフローリスト４２００の出力（フィールド８０５に格納されているＣをＣ＋Ｄで置き換える。
【０１７３】
上記のようにデータフローリスト４２００が格納する各変数（変数名）の置き換えを行った結果として、抽象化データフローリスト４３００が得られる。なお、抽象化データフローリスト４３００は本実施の形態の第３のデータフローリストに相当する。
【０１７４】
上述ステップＳ２７０３の処理の結果として、データフローリスト抽象化部２０は、統合後データフローリストを、抽象化データフローリストに変換することによって、データフロー図の規模と複雑さを低減する。
【０１７５】
図４４に、図２８に示すデータフローリスト２５００に相当するデータフロー図を示し、図４５に抽象化データフローリスト４３００に相当するデータフロー図を示す。図４５に示すデータフロー図は、図４４のデータフロー図に比べて規模と複雑さが低減されていることがわかる。
【０１７６】
［１．２．３．データフローリスト図式化処理の例］
図２に戻り、上記データフローリスト図式化処理（Ｓ３０参照）を詳述する。データフローリスト図式化処理において、データフロー図生成装置１、より詳しくは、データフローリスト図式化部３０は、以下の処理手順に従って、抽象化データフローリスト４３００からデータフロー図（若しくはデータフロー図を描画或いは印刷させるためのデータ）を生成する。
抽象化データフローリスト４３００の各レコードについて以下の処理を行う。
まず、データフローリスト図式化部３０は、第１の図形（例えば、楕円枠）を一つ用意する。
【０１７７】
データフローリスト図式化部３０は、対象とするレコードの「値入力」列（フィールド８０３）に格納されている各変数について、対応する変数の名前を付けた第２の図形（例えば、四角枠）を作り、その第２の図形から上記第１の図形への向きに、実線の矢印でつなぐ。
なお、既に同じ名前を有する第２の図形がある場合には、同じ名前の第２の図形を作らずに、その第２の図形と上記第１の図形とを矢印でつなぐ。
【０１７８】
データフローリスト図式化部３０は、上記レコードの「条件入力」列（フィールド８０４）に格納されている各変数の名前を付けた第２の図形を作り、その第２の図形から第１の図形への向きに、点線の矢印でつなぐ。なお、既に同じ名前の第２の図形がある場合には、同じ名前の第２の図形を作らずに、その第２の図形と上記第１の図形を矢印でつなぐ。
【０１７９】
データフローリスト図式化部３０は、上記レコードの「出力」列（フィールド８０５）の各変数の名前を付けた第２の図形を作り、上記第１の図形からその第２の図形への向きに、実線の矢印でつなぐ。なお、既に同じ名前の第２の図形がある場合には、同じ名前の第２の図形を作らずに、その第２の図形と上記第１の図形を矢印でつなぐ。
【０１８０】
データフローリスト図式化処理の具体例を示す。図４６に、データフローリスト図式化処理によって生成されるデータフロー図の例を示し、図４７に、図４６のデータフロー図の元となるデータフローリスト４７００を示す。
以上でデータフローリスト図式化処理の例の説明を終える。
【０１８１】
［２．利点］
本実施の形態によれば、ソースコードを入力として、理解が容易なデータフロー図を短時間で抽出することが可能である。
【０１８２】
［３．まとめ、その他］
本実施の形態によれば、ソースコードを入力として、理解が容易なデータフロー図を短時間で抽出することができる。
【０１８３】
別の実施例として、本発明を実装した試作ツールを用いて、C言語で記述された約1万行のソフトウェアで試行したところ、約15分でA3用紙1枚に収まる規模のデータフロー図が生成できた。またそれが十分に理解できるものであることが確認できた。
【０１８４】
試作ツールの利用者が、得られたデータフロー図を使って、そのソフトウェアをよく知る人に見せながら、全体のデータフローの流れを説明したところ、概ね正しくデータフローが生成されており、また、理解に必要十分なフローが残っていることが確認できた。
【０１８５】
ソフトウェアでは、変数はデータを格納する器である。1つの変数に、常に同じデータ(値は変わるかもしれないが)が格納されるとは限らないので、単に変数の読み書きの関係を線で結んだだけでは正しいデータフロー図にならない場合がある。同じデータが複数変数に格納される場合、同じ形状のデータフロー（構造同値）が複数あるならば、それらは同じデータが入っている可能性が高い。本実施の形態はそれらをまとめることができ、それによって理解が容易なデータフロー図を短時間で抽出することができる。
【０１８６】
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【符号の説明】
【０１８７】
１…データフロー図生成装置；  １０…データフローリスト生成部；  ２０…データフローリスト抽象化部；  ３０…データフローリスト図式化部
【図１】
0006301803.tif 000002
【図２】
0006301803.tif 000003
【図３】
0006301803.tif 000004
【図４】
0006301803.tif 000005
【図５】
0006301803.tif 000006
【図６】
0006301803.tif 000007
【図７】
0006301803.tif 000008
【図８】
0006301803.tif 000009
【図９】
0006301803.tif 000010
【図１０】
0006301803.tif 000011
【図１１】
0006301803.tif 000012
【図１２】
0006301803.tif 000013
【図１３】
0006301803.tif 000014
【図１４】
0006301803.tif 000015
【図１５】
0006301803.tif 000016
【図１６】
0006301803.tif 000017
【図１７】
0006301803.tif 000018
【図１８】
0006301803.tif 000019
【図１９】
0006301803.tif 000020
【図２０】
0006301803.tif 000021
【図２１】
0006301803.tif 000022
【図２２】
0006301803.tif 000023
【図２３】
0006301803.tif 000024
【図２４】
0006301803.tif 000025
【図２５】
0006301803.tif 000026
【図２６】
0006301803.tif 000027
【図２７】
0006301803.tif 000028
【図２８】
0006301803.tif 000029
【図２９】
0006301803.tif 000030
【図３０】
0006301803.tif 000031
【図３１】
0006301803.tif 000032
【図３２】
0006301803.tif 000033
【図３３】
0006301803.tif 000034
【図３４】
0006301803.tif 000035
【図３５】
0006301803.tif 000036
【図３６】
0006301803.tif 000037
【図３７】
0006301803.tif 000038
【図３８】
0006301803.tif 000039
【図３９】
0006301803.tif 000040
【図４０】
0006301803.tif 000041
【図４１】
0006301803.tif 000042
【図４２】
0006301803.tif 000043
【図４３】
0006301803.tif 000044
【図４４】
0006301803.tif 000045
【図４５】
0006301803.tif 000046
【図４６】
0006301803.tif 000047
【図４７】
0006301803.tif 000048
【図４８】
0006301803.tif 000049