プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶領域と、を備え、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援システムにおいて、前記プロセッサは、前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され、前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割し、前記機能グループ群が実現する機能ごとに前記機能モジュール群を一つに纏めることによって、同じ機能を実現する機能モジュール群を機能モジュールとして管理し、前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納し、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定し、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記重複する差分をユーザに提示することを特徴とするプログラム開発支援システム。前記プロセッサは、前記同じ機能を実現する機能モジュール群に同じタグを付与することによって、前記同じ機能を実現する機能モジュール群を一つに纏めることを特徴とする請求項1に記載のプログラム開発支援システム。前記記憶領域には、予め指定された差分ごとに、当該差分に対応して前記基本モジュールのソースファイルを修正した修正ソースファイルである修正パターンデータが格納され、前記プロセッサは、前記重複する差分が前記修正パターンデータの予め指定された差分に一致するか否かを判定し、前記重複する差分が前記修正パターンデータの予め指定された差分に一致すると判定された場合、前記一致する差分に対応する前記修正ソースファイルをユーザに提示することを特徴とする請求項1に記載のプログラム開発支援システム。前記プロセッサは、前記機能モジュールが実現する機能を示すキーワードの入力を受け付け、前記差分リストにおいて、前記追加された機能モジュールのキーワードと前記追加された機能モジュールによる差分とを対応付け、前記機能モジュールを前記プログラムに新たに追加した場合、前記差分リストを参照し、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在するか否かを判定し、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在すると判定された場合、当該機能モジュールの差分をユーザに提示することを特徴とする請求項1に記載のプログラム開発支援システム。前記プロセッサは、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出され、前記基本モジュールで定義される基本関数を特定し、前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在するか否かを判定し、前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在すると判定された場合、前記複数の基本関数を集約した集約関数を新たに生成し、前記新たに生成された集約関数、前記集約関数を構成する複数の基本関数、前記複数の基本関数の呼び出し元の機能関数をユーザに提示することを特徴する請求項1に記載のプログラム開発支援システム。前記複数存在すると判定された基本関数のうち、少なくとも一つの基本関数が、ある機能モジュールで定義される第1機能関数が呼び出す第2機能関数を介して呼び出される間接呼出関数である場合、当該間接呼出関数以外の基本関数のみを集約した集約関数を新たに生成することを特徴とする請求項5に記載のプログラム開発支援システム。第1機能モジュールを前記プログラムに追加した場合に少なくとも三つの前記基本関数からなる第1基本関数を集約した第1集約関数が生成されている場合、前記プロセッサは、第2機能モジュールを前記プログラムに新たに追加する場合、前記第2機能モジュールで定義される機能関数が、前記第1基本関数のうち少なくとも二つ以上であって前記第1基本関数の数未満の前記基本関数からなる第2基本関数を呼び出す場合、当該機能関数によって呼び出される第2基本関数を集約した新たな第2集約関数を生成し、前記第2集約関数と、前記第1基本関数のうち第2基本関数でない基本関数と、を集約した新たな第3集約関数を生成することを特徴とする請求項5に記載のプログラム開発支援システム。前記プロセッサは、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出される前記基本モジュールで定義される基本関数を特定し、前記特定した基本関数に、ある機能モジュールで定義される第1機能関数が呼び出す第2機能関数を介して呼び出される間接呼出関数が含まれるか否かを判定し、前記基本関数に前記間接呼出関数が含まれると判定された場合、前記間接呼出関数を、前記第2機能関数を介して前記第1機能関数から呼び出される関数として管理し、当該間接呼出関数が前記第2機能関数を経由して前記第1機能関数から呼び出されることを把握可能にユーザに提示することを特徴とする請求項1に記載のプログラム開発支援システム。前記基本モジュール及び前記機能モジュールは複数の状態を定義し、前記プロセッサは、前記複数の状態を遷移しながら、前記プログラムを実行し、前記状態の遷移元及び遷移先を示す状態遷移図をユーザに提示し、前記機能モジュールを前記プログラムに追加した場合、又は、前記機能モジュールを前記プログラムから削除した場合、当該機能モジュールの追加又は削除の前後で変更された状態、及び、前記変更された状態が遷移元又は遷移先となる遷移関係の差分を状態差分リストとして前記記憶領域に格納することを特徴とする請求項1に記載のプログラム開発支援システム。前記プロセッサは、前記機能モジュールを追加する場合、前記状態差分リストを参照し、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであるか否かを判定し、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであると判定された場合、前記状態差分リストを参照し、前記削除された機能モジュールの状態の差分に基づいて、当該削除された機能モジュールが前記プログラムから削除される前の状態遷移図をユーザに提示することを特徴とする請求項9に記載のプログラム開発支援システム。プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶領域と、を備える計算機システムによって実行され、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援方法において、前記方法は、前記プロセッサが、前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割するステップと、前記プロセッサが、前記機能グループ群が実現する機能ごとに前記機能モジュール群を一つに纏めることによって、同じ機能を実現する機能モジュール群を機能モジュールとして管理するステップと、前記プロセッサが、前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納するステップと、前記プロセッサが、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定するステップと、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記プロセッサが、前記重複する差分をユーザに提示するステップと、を含むことを特徴とするプログラム開発支援方法。前記機能モジュールを管理するステップでは、前記プロセッサが、前記同じ機能を実現する機能モジュール群に同じタグを付与することによって、前記実現する機能が同じ機能モジュール群を一つに纏めることを特徴とする請求項11に記載のプログラム開発支援方法。前記記憶領域には、予め指定された差分ごとに、当該差分に対応して前記基本モジュールのソースファイルを修正した修正ソースファイルである修正パターンデータが格納され、前記方法は、前記プロセッサが、前記重複する差分が前記修正パターンデータの予め指定された差分に一致するか否かを判定するステップと、前記重複する差分が前記修正パターンデータの予め指定された差分に一致すると判定された場合、前記プロセッサが、前記一致する差分に対応する前記修正ソースファイルをユーザに提示するステップと、を含むことを特徴とする請求項11に記載のプログラム開発支援方法。前記方法は、前記プロセッサが、前記機能モジュールが実現する機能を示すキーワードの入力を受け付けるステップと、前記プロセッサが、前記差分リストにおいて、前記追加された機能モジュールのキーワードと前記追加された機能モジュールによる差分とを対応付けるステップと、前記プロセッサが、前記機能モジュールを前記プログラムに新たに追加した場合、前記差分リストを参照し、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在するか否かを判定するステップと、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在すると判定された場合、前記プロセッサが、当該機能モジュールの差分をユーザに提示するステップと、を含むことを特徴とする請求項11に記載のプログラム開発支援方法。前記方法は、前記プロセッサが、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出され、前記基本モジュールで定義される基本関数を特定するステップと、前記プロセッサが、前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在するか否かを判定するステップと、前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在すると判定された場合、前記プロセッサが、前記複数の基本関数を集約した集約関数を新たに生成するステップと、前記プロセッサが、前記新たに生成された集約関数、前記集約関数を構成する複数の基本関数、前記複数の基本関数の呼び出し元の機能関数をユーザに提示するステップと、を含むことを特徴する請求項11に記載のプログラム開発支援方法。前記複数存在すると判定された基本関数のうち、少なくとも一つの基本関数が、ある機能モジュールで定義される第1機能関数が呼び出す第2機能関数を介して呼び出される間接呼出関数である場合、前記プロセッサが、当該間接呼出関数以外の基本関数のみを集約した集約関数を新たに生成するステップを含むことを特徴とする請求項15に記載のプログラム開発支援方法。第1機能モジュールを前記プログラムに追加した場合に少なくとも三つの前記基本関数からなる第1基本関数を集約した第1集約関数が生成されている場合、前記方法は、前記プロセッサが、第2機能モジュールを前記プログラムに新たに追加する場合、前記第2機能モジュールで定義される機能関数が、前記第1基本関数のうち少なくとも二つ以上であって前記第1基本関数の数未満の前記基本関数からなる第2基本関数を呼び出す場合、当該機能関数によって呼び出される第2基本関数を集約した新たな第2集約関数を生成するステップと、前記第2集約関数と、前記第1基本関数のうち第2基本関数でない基本関数と、を集約した新たな第3集約関数を生成するステップと、を含むことを特徴とする請求項15に記載のプログラム開発支援方法。前記方法は、前記プロセッサが、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出される前記基本モジュールで定義される基本関数を特定するステップと、前記プロセッサが、前記特定した基本関数に、ある機能モジュールで定義される第1機能関数が呼び出す第2機能関数を介して呼び出される間接呼出関数が含まれるか否かを判定するステップと、前記プロセッサが、前記基本関数に前記間接呼出関数が含まれると判定された場合、前記間接呼出関数を、前記第2機能関数を介して前記第1機能関数から呼び出される関数として管理するステップと、前記プロセッサが、当該間接呼出関数が前記第2機能関数を経由して前記第1機能関数から呼び出されることを把握可能にユーザに提示するステップと、を含むことを特徴とする請求項11に記載のプログラム開発支援方法。前記基本モジュール及び前記機能モジュールは複数の状態を定義し、前記方法は、前記プロセッサが、前記複数の状態を遷移しながら、前記プログラムを実行するステップと前記プロセッサが、前記状態の遷移元及び遷移先を示す状態遷移図をユーザに提示するステップと、前記プロセッサが、前記機能モジュールを前記プログラムに追加した場合、又は、前記機能モジュールを前記プログラムから削除した場合、当該機能モジュールの追加又は削除の前後で変更された状態、及び、前記変更された状態が遷移元又は遷移先となる遷移関係の差分を状態差分リストとして前記記憶領域に格納するステップと、を含むことを特徴とする請求項11に記載のプログラム開発支援方法。前記方法は、前記プロセッサが、前記機能モジュールを追加する場合、前記状態差分リストを参照し、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであるか否かを判定するステップと、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであると判定された場合、前記プロセッサが、前記状態差分リストを参照し、前記削除された機能モジュールの状態の差分に基づいて、当該削除された機能モジュールが前記プログラムから削除される前の状態遷移図をユーザに提示するステップと、を含むことを特徴とする請求項19に記載のプログラム開発支援方法。上述の変更履歴技術では、単に変更履歴を管理するだけであって、新規コード追加時に既存コードの同じ部分が複数回変更されていても、当該部分をユーザに提示するものではない。このため、ユーザは、新規コード追加する場合、既存コードの変更が必要になるコードを探索し、当該コードを変更する作業が繰り返され、作業効率が悪く、既存コードに必要な変更がなされない可能性もある。したがって、本発明は、プログラムに新規機能を追加する場合のユーザの作業効率を向上させ、必要な変更がなされないことを防止するプログラム開発支援システムを提供することを目的とする。本発明の代表的な一例を示せば、各種プログラムを実行するプロセッサと、前記プロセッサによって実行される各種プログラムを格納する記憶領域と、を備え、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援システムにおいて、前記プロセッサは、前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割し、前記機能グループ群が実現する機能ごとに前記機能モジュール群のソースファイルを一つに纏めることによって、実現する機能が同じ機能モジュール群のソースファイルを機能モジュールとして管理し、前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納し、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定し、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記重複する差分をユーザに提示することを特徴とする。本発明によれば、プログラムに新規機能を追加する場合のユーザの作業効率を向上させ、必要な変更がなされないことを防止するプログラム開発支援システムを提供できる。以下、本発明の実施の形態について図面を参照しつつ説明する。第1実施形態以下、本発明の第1実施の形態について、図1~図16を用いて説明する。図1は、本発明の第1実施形態のプログラム開発支援システム101のブロック図である。プログラム開発支援システム101は、図示しないプロセッサ、メモリ、及びハードディスクドライブHDDを備える。プロセッサは、メモリに格納された各種プログラムを実行する。メモリは、各種プログラム、及び各種プログラムを実行する場合に使用する各種データを格納する。HDDは、各種データを格納する。プログラム開発支援システム101は、ソースファイル格納部102、差分リスト103、基本モジュール差分検出部104、差分比較部105、修正案作成部106、プログラム修正処理部107、基本関数リスト108、基本関数リスト作成部109、基本関数リスト比較部110、及び入出力インタフェース部111を備える。ソースファイル格納部102、差分リスト103、及び基本関数リスト108は、図示しないメモリに格納される。基本モジュール差分検出部104、差分比較部105、修正案作成部106、プログラム修正処理部107、基本関数リスト作成部109、及び基本関数リスト比較部110は、図示しないメモリに格納されるプログラムであって、図示しないCPUによって実行される。入出力インタフェース部111は、入力部例えば、キーボード及びマウス等及び出力部例えば、ディスプレイ等の表示装置及びプリンタ等に接続されるインタフェースである。プログラム開発支援システム101の各構成部について説明する。ソースファイル格納部102は、プログラムの開発中の最新バージョンのソースファイル、及び、過去のバージョンのソースファイルを格納する記憶領域である。ソースファイル格納部102については図2で詳細を説明する。差分リスト103は、ある機能モジュールを開発中のプログラム以下、開発中のプログラムを単にプログラムというに追加した場合の機能モジュール追加前後の基本モジュールのソースファイル以下、基本ソースファイルというの差分を示すリストであり、図示しないメモリに格納される。ここで、基本モジュールは、プログラムの基本的な機能な実現するソースファイルであり、機能モジュールは、基本モジュールより後にプログラムに追加され、プログラムの追加的な機能を実現する機能モジュール群のソースファイルを同じ機能ごとに一つに纏めたソースファイルである。基本モジュール及び機能モジュールについては、図2で詳細を説明する。基本モジュール差分検出部104は、ある機能モジュールをプログラムに追加した場合の基本ソースファイルの差分を検出し、差分リスト103を生成する。差分比較部105は、差分リスト103を参照し、ある機能モジュールを追加した場合の基本ソースファイルの差分が、他の機能モジュールを追加する前の差分と重複しているか否かを判定し、差分が重複している場合、重複した差分を入出力インタフェース部111を介してユーザに提示する。ユーザに提示するとは、当該差分を表示装置に表示してもよいし、当該差分をプリンタから出力してもよいし、他の計算機等に出力する等を含む。修正案作成部106について説明する。図示しないメモリには、予め指定された差分ごとに基本ソースファイルの修正案を記憶した修正パターンデータ不図示が格納されている。修正案作成部106は、修正パターンデータを参照し、差分比較部105によって重複すると判定された差分に対応する修正案を作成し、作成した修正案を入出力インタフェース部111を介して提示する。プログラム修正処理部107は、基本ソースファイル、機能モジュールのソースファイル機能ソースファイルを修正する。基本関数リスト108は、機能モジュールで定義される機能関数が呼び出す基本関数及び集約関数を管理するリストであり、図示しないメモリに格納される。基本関数は、基本モジュールで定義される関数である。集約関数は、複数の機能モジュールの機能関数が共通して呼び出す複数の基本関数を集約した関数である。なお、基本関数リスト108については、図4及び図5で詳細を説明する。基本関数リスト作成部109は、機能ソースファイルを解析することによって、機能関数で呼び出す基本関数を特定し、基本関数リスト108を作成する。基本関数リスト比較部110は、基本関数リスト108を参照し、複数の機能モジュールの機能関数が共通して呼び出す複数の基本関数を検出し、検出した複数の基本関数を集約した集約関数を作成する。図2は、本発明の第1実施形態のソースファイル格納部102の説明図である。ソースファイル格納部102は、上述したように、すべてのバージョンのプログラムのソースファイルを格納する。ソースファイル格納部102は、プログラムのバージョン201ごとに、プログラムを基本モジュール202及び機能モジュール群204を分けて管理する。具体的には、図示しないCPUが同じ機能モジュール203に属するソースファイルに同じタグを付与することによって、ソースファイル格納部102は各機能モジュール203を管理する。この場合、ソースファイル格納部102は、基本モジュール202にはタグが付与されていないので、基本モジュール202と機能モジュール群204とを分けて管理できる。なお、基本モジュール202のソースファイルに基本モジュールを示すタグが付与されてもよい。また、ソースファイル格納部102は、タグによって基本モジュール202及び機能モジュール群204を管理しなくてもよく、例えば、格納される記憶領域を分けて管理してもよい。この場合、機能モジュール203ごとに格納される記憶領域が異なる。バージョン201について説明する。機能モジュールが追加された場合、CPUがバージョン201の整数部分をインクリメントし、既存の基本モジュール及び既存の機能モジュールが変更された場合、CPUがバージョン201の小数点以下の値をインクリメントする。図2において、例えば、バージョン201がv0.1であるプログラムは、v0の基本モジュールのソースファイルが変更されたプログラムである。バージョン201がv1は、v0.1のプログラムに機能モジュール1が追加されたプログラムである。図3は、本発明の第1実施形態の差分リスト103の説明図である。差分リスト103は、機能モジュールnをプログラムに追加した場合、機能モジュールnの追加後の基本ソースファイルと、機能モジュールnの追加前の直前のバージョンvn-1.xの基本ソースファイルとの差分が登録される。当該差分は基本モジュール差分検出部104によって検出されるが、基本モジュール差分検出部104は、差分を検出する場合、機能モジュール追加前後の基本ソースファイルの異なる箇所の構造のまとまりを差分として検出する。具体的には、機能モジュールを追加したことによって、switch分の分岐が一つ増加した場合、増加した分岐を差分として検出するのではなく、switch分全体を差分として検出する。差分リスト103は、機能モジュール301、ソースファイル名302、開始位置303、及び終了位置304を含む。機能モジュール301には、プログラムに追加された機能モジュールの一意な識別子が登録される。ソースファイル名302には、機能モジュール301に登録された一意な識別子によって識別される機能モジュールの追加によって差分が生じた基本ソースファイルの一意な識別子が登録される。開始位置303には、当該レコードのソースファイル名302に登録された識別子によって識別される基本ソースファイルの差分の開始位置である行番号が登録される。終了位置304には、当該レコードのソースファイル名302に登録された識別子によって識別される基本ソースファイルの差分の終了位置である行番号が登録される。図4A、図4B、図5A、及び図5Bは、本発明の第1実施形態の基本関数リスト108の説明図である。図4Aは、本発明の第1実施形態の基本関数リスト比較部110によって集約関数が作成される前の基本関数リスト108の説明図である。図4Bは、本発明の第1実施形態の基本関数リスト比較部110によって集約関数が作成された後の基本関数リスト108の説明図である。基本関数リスト108は、機能モジュールで定義される機能関数によって呼び出される基本関数及び集約関数を管理する。基本関数_集約関数401には、機能モジュールで定義される機能関数によって呼び出される基本関数及び集約関数の識別子が登録される。図4Aでは、基本関数_集約関数401には、基本関数であるf_x、及びf_yが登録される。また、図4Bでは、基本関数_集約関数401には、基本関数の他、集約関数であるf_fが登録される。集約関数402には、基本関数又は集約関数の呼び出し元となる集約関数の識別子が登録される。機能モジュール403A~403Bには、プログラムに追加されている機能モジュールの識別子が登録される。機能関数404には、各機能モジュールで定義され、基本関数又は集約関数の呼び出し元となる機能関数の識別子が登録される。基本関数リスト108では、基本関数又は集約関数が呼び出される場合、当該基本関数又は集約関数のレコードで呼び出し元となる機能関数又は集約関数のセルにフラグが設定される。図4A、図4B、図5A、及び図5Bでは、フラグが設定された状態を○と示す。例えば、図4Aでは、基本関数f_xは、機能関数f1_1、及びf2_1に呼び出される。したがって、基本関数リスト比較部110は、基本関数リスト108の各レコードを参照することによって、各基本関数が異なる機能モジュールで定義される機能関数によって共通して呼び出されるか否かを判定できる。そして、基本関数リスト比較部110は、異なる機能モジュールで定義される機能関数によって共通して呼び出されるレコードが複数存在する場合、当該レコードの基本関数_集約関数401に登録された識別子によって識別される基本関数を集約した集約関数を作成する。基本関数リスト比較部110の集約関数の作成処理について説明する。機能モジュール2がプログラムに追加される前の状態では、機能モジュール1がプログラムに追加された状態であり、機能モジュールが一つしかないので、複数の機能モジュールで定義される機能関数によって共通して呼び出される基本関数は存在せず、集約関数が生成されていないものとする。機能モジュール2がプログラムに追加された場合、基本関数リスト比較部110は、基本関数f_x、f_y、及びf_zが機能関数f1_1及びf2_1に共通して呼び出され、機能関数f1_1及びf2_1を定義する機能モジュールが異なることを検出する。次に、基本関数リスト比較部110は、検出した基本関数f_x、f_y、及びf_zを集約した集約関数f_fを作成する。そして、基本関数リスト比較部110は、集約関数f_f、集約関数f_fの元になった基本関数f_x、f_y、及びf_z、並びに、基本関数f_x、f_y、及びf_zの呼び出し元となる機能関数f1_1及びf2_1をユーザに提示する。次に、基本関数リスト作成部109は、ユーザから集約関数の作成確認指示を受け付けた場合、図4Bに示すように、作成した集約関数f_fの識別子を基本関数_集約関数401及び集約関数402に登録する。集約関数f_fは基本関数f_x、f_y、及びf_zを呼び出すので、基本関数リスト作成部109は、集約関数402のf_fのカラムの基本関数f_x、f_y、及びf_zのセルにフラグを設定する。そして、機能関数f1_1及びf1_2は、基本関数f_x、f_y、及びf_zを呼び出す代わりに、集約関数f_fを呼び出すので、基本関数リスト作成部109は、機能関数f1_1及びf1_2のカラムの基本関数f_x、f_y、及びf_zのセルのフラグの設定を解除し、集約関数f_fのセルにフラグを設定する。なお、基本関数リスト比較部110は、ユーザから集約関数の作成確認指示を受け付けない場合、作成した集約関数f_fを破棄し、基本関数リスト作成部109は、基本関数リスト108を変更しない。このように、異なる機能モジュールで定義された機能関数に共通して呼び出される基本関数を集約した集約関数が作成されるので、集約関数作成後、ユーザは、集約関数を示すコードを記載すればよい。このため、重複コードが削減され、プログラムがスリム化でき、プログラムの保守及び管理が容易になる。なお、類似コードを検出する技術としては、コピーペーストによって作成されたコードであるクローンコードを検出する技術であるCCFinderが知られている特開2003-29978号公報。CCFinderは、クローンコードを検出し、ペースト後に識別子及びコードの変更にも対応しており、完全一致でない類似コードも検出できる。また、CCFinderを用いて検出されたクローンコードに変わる共通関数を自動的に作成する方法も知られている特開2009-176064号公報。しかしながら、CCFinderでは、コードを比較するだけであって、新たな機能を追加するための二つソースコードの両方に、既存のソースコード内に用意された複数の関数が他のコードを挟んで記載されている場合には、当該関数を示すコードを検出できないものであった。集約関数作成処理では、関数の呼び出し関係を示す基本関数リストを作成するので、上述のようなソースコードであっても、関数を検出することが可能となる。次に、機能モジュール3をプログラムに追加した場合の基本関数リスト比較部110による集約関数の作成処理について図5A及び図5Bを用いて説明する。図5Aは、本発明の第1実施形態の機能モジュール3がプログラムに追加され、集約関数が作成される前の基本関数リスト108の説明図である。図5Bは、本発明の第1実施形態の機能モジュール3がプログラムに追加され、集約関数が作成された後の基本関数リスト108の説明図である。機能モジュール3がプログラムに追加された場合、基本関数リスト比較部110は、追加された機能モジュール3で定義された機能関数f3_1が集約関数f_fの元になった基本関数f_x、f_y、及びf_zのうちf_x及びf_yを呼び出すこと、つまり、新たな機能関数が集約関数の元になった基本関数群の一部の基本関数を呼び出すことを検出する。次に、基本関数リスト比較部110は、集約関数f_fの元になった基本関数f_x、f_y、及びf_zのうち機能関数f3_1によって呼び出されるf_x及びf_yを集約するように、集約関数f_fを変更する。なお、基本関数リスト比較部110は、これらの基本関数f_x及びf_yを集約した集約関数f_h不図示を新たに作成してもよい。ここで、既存の集約関数f_fの集約関係を変更する方式、及び、新たな集約関数f_hを作成する方式を総称して、新たな集約関数を作成するという。次に、基本関数リスト比較部110は、変更前の集約関数の基になった基本関数f_x、f_y、及びf_zのうち新たな機能関数f3_1に呼び出されないf_zと変更後の集約関数f_fとを集約した新たな集約関数f_gを作成する。以上より、変更後の集約関数f_fは、基本関数f_x及びf_yから構成されるので、機能関数f3_1から呼び出される。また、集約関数f_gは、集約関数f_f及び基本関数f_z、つまり、基本関数f_x、f_y、及びf_zから構成されるので、機能関数f1_1及びf1_2から呼び出される。集約関数を構成する基本関数又は集約関数、及び当該集約関数を呼び出す機能関数の関係を集約関数の集約関係という。基本関数リスト比較部110は、変更後の集約関数f_fの集約関係、及び新たに作成した集約関数f_gの集約関係をユーザに提示する。次に、基本関数リスト作成部109は、ユーザから集約関数の作成確認指示を受け付けた場合、図5Bに示すように、上述した変更後の集約関数f_f及びf_gの集約関係を基本関数リスト108に登録する。以上によって、基本関数リスト比較部110は、新たに追加された機能モジュールで定義された機能関数によって呼び出される基本関数が既存の集約関数を構成する基本関数のうちの一部の基本関数である場合、当該一部の基本関数を集約する集約関数、及び、既存の集約関数を構成する基本関数のうち追加された機能関数によって呼び出されない基本関数と当該一部の基本関数を集約する集約関数とを集約した集約関数を作成する。これによって、既存の集約関数の一部の基本関数を呼び出す機能関数が追加されても、既存の集約関数と矛盾が生じない集約関数を新たに作成することができる。図6は、本発明の第1実施形態の機能モジュール追加時処理のフローチャートである。当該処理は、新たな機能モジュールNがプログラムに追加された場合に、図示しないCPUによって実行される。CPUは、当該機能モジュールの追加前後の基本ソースファイルの差分を検出し、所定の場合に当該差分をユーザに提示する基本モジュール差分処理を実行する501。基本モジュール差分処理は、基本モジュール差分検出部104、差分比較部105、修正案作成部106、及びプログラム修正処理部107による処理である。なお、基本モジュール差分処理は図7で詳細を説明する。次に、CPUは、追加された機能モジュールで定義される機能関数が呼び出す基本関数に基づいて集約関数を生成する重複関数集約処理を実行し502、機能モジュール追加時処理を終了する。重複関数集約処理は、基本関数リスト作成部109及び基本関数リスト比較部110による処理である。なお、重複関数集約処理は図9で詳細を説明する。図7は、本発明の第1実施形態の基本モジュール差分処理のフローチャートである。まず、CPUは、機能モジュールNの追加前後の基本ソースファイルの差分を検出し、検出した差分と機能モジュールNと対応付けて差分リスト103に格納する601。次に、CPUは、機能モジュールNの追加による差分がステップ601の処理で検出されたか否かを判定する602。なお、ステップ601及び602の処理は、CPUが基本モジュール差分検出部104のプログラムを実行することによって実現される。ステップ602の処理で、機能モジュールNの追加によって差分が検出されないと判定された場合、基本モジュール差分処理を終了し、図9に示す重複関数集約処理に移行する。一方機能モジュールNの追加によって差分が検出されたと判定された場合、CPUは、差分リスト103を参照し、機能モジュールNによる差分と既存の機能モジュール1~N-1による差分とを比較する603。CPUは、ステップ603の処理の比較結果を参照し、機能モジュールNによる差分が既存の機能モジュール1~N-1による差分と重複するか否かを判定する604。具体的には、CPUは、差分リスト103を参照し、機能モジュールNの開始位置303に登録された行番号及び終了位置304に登録された行番号によって特定される差分を、機能モジュール1~N-1の差分に含むものがあるか否かを判定する。つまり、CPU機能モジュールNの開始位置303に登録された行番号以下の行番号が開始位置303に登録され、かつ終了位置304に登録された行番号以上の行番号が終了位置304に登録されたレコードが存在するか否かを判定する。ステップ604の処理で機能モジュールNによる差分が既存の機能モジュール1~N-1による差分と重複しないと判定された場合、基本モジュール差分処理を終了し、図9に示す重複関数集約処理に移行する。一方、ステップ604の処理で機能モジュールNによる差分が既存の機能モジュール1~N-1による差分と重複すると判定された場合、CPUは、機能モジュールNによる差分、及び、機能モジュールNによる差分と重複する機能モジュールの差分をユーザに提示する605。これによって、ユーザは、追加する機能モジュールによる基本ソースファイルの差分が、過去の機能モジュールによる基本ソースファイルの差分と重複する場合、追加する機能モジュールによる差分の変更を再度確認できるので、基本ソースファイルの変更箇所の誤りを防止でき、作業効率を向上させ、必要な変更がなされないことを防止できる。また、過去の機能モジュールの追加による基本ソースファイルの差分もユーザに提示されれば、追加する機能モジュールによる差分が、過去の機能モジュールによる差分に対応しているかを確認でき、基本ソースファイルの変更の誤りを防止できる。ステップ605の処理では、機能モジュールNによる差分及び機能モジュールNによる差分と重複する機能モジュールの差分の少なくとも一方がユーザに提示されればよい。なお、差分のユーザへの提示は、差分をディスプレイに表示してもよいし、差分をプリンタ等から印刷してもよい。また、ステップ603~605の処理は、CPUが差分比較部105のプログラムを実行することによって実現される。次に、CPUは、基本ソースファイルのソースコードのうち機能モジュールNの追加によって変更されたソースコード変更ソースコードが、図示しないメモリに格納された図示しない修正パターンデータに登録された予め指定されたソースコードと一致するか否かを判定する606。ステップ606の処理で、変更ソースコードが修正パターンデータに登録されたソースコードと一致すると判定された場合、CPUは、修正パターンデータを参照し、当該ソースコードに対応する修正ソースファイルを抽出し、抽出した修正ソースファイルをユーザに提示する607。なお、ステップ606及び607の処理は、CPUが修正案作成部106のプログラムを実行することによって実現される。次に、CPUは、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部111から入力されたか否かを判定する608。ステップ608の処理で、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部111から入力されたと判定された場合、又は、ステップ606の処理で、変更ソースコードが修正パターンデータに登録されたソースコードと一致しないと判定された場合、CPUは、基本ソースファイル及び機能モジュール1~Nの機能ソースファイル以下、ソースファイルに対するユーザによる修正の入力を受け付け609、ステップ610の処理に移行する。一方、ステップ608の処理で、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部111から入力されていないと判定された場合、CPUは、ステップ609の処理を実行せずに、ステップ610の処理に移行する。そして、CPUは、入力された内容でソースファイルを修正する許可を示すデータが入出力インタフェース部111を介して入力されたか否かを判定する610。ステップ610の処理で、入力された内容でソースファイルを修正する許可を示すデータが入力されたと判定された場合、CPUは、入力された内容でソースファイルを修正し611、ソースファイルの修正内容に基づいて、機能モジュール1~Nの差分リスト103を修正し612、基本モジュール差分処理を終了し、図9に示す重複関数集約処理に移行する。一方、ステップ610の処理で、入力された内容でソースファイルを修正する許可を示すデータが入力されていないと判定された場合、基本モジュール差分処理を終了し、図9に示す重複関数集約処理に移行する。なお、ステップ608~612の処理は、CPUがプログラム修正処理部107のプログラムを実行することによって実現される。図8は、本発明の第1実施形態のユーザに提示する修正ソースファイルの説明図である。図8Aは、機能モジュールが追加されない場合の基本ソースファイル701A、機能モジュール1が追加された場合の基本ソースファイル701B、及び機能モジュール2が追加された場合の基本ソースファイル701Cの説明図である。基本ソースファイル701Bでは、基本ソースファイル701Aの関数basefunc702に、機能モジュール1で定義された関数mod1func703Aが追加される。また、基本ソースファイル701Cでは、基本ソースファイル701Bの関数basefunc702に、機能モジュール1で定義された関数mod2func703Bが追加される。このように、機能モジュールが追加されるごとに、基本ソースファイル701の関数basefunc702に、追加された機能モジュールで定義された関数が追加されていく。このように、機能モジュールの追加ごとに関数が追加されるタイプの基本ソースファイルの差分は、図3で説明した構造のまとまりとして検出できない。このため、基本モジュール差分検出部104は、差分の開始位置よりも所定行上に位置する行番号を開始位置303に登録し、差分の終了位置よりも所定行下に位置する行番号を終了位置304に登録することによって、本来の差分の範囲より拡大した範囲を差分として検出する。機能モジュール2が追加された場合には、図8Aの基本ソースファイル701Cでは、mod2funcA703Bが本来の差分となるが、mod2funcA703Bよりも所定行上の行からmod2funcA703Bよりも所定行下の行までが差分として検出される。したがって、ステップ601の処理で検出される差分は、mod1funcA703A及びmod2funcA703Bを含む。ステップ603の処理では、ステップ601の処理で検出された差分mod1funcA703A及びmod2funcA703Bは、機能モジュール1が追加された場合の差分mod1funcA703Aと重複するので、ステップ605の処理で当該差分がユーザに提示される。次に、ステップ607の処理について説明する。ここで、図示しない修正データベースには、追加された機能モジュールで定義された関数の追加を示す差分が登録されているものとする。ステップ607の処理では、CPUは、ステップ601の処理で検出された差分、及び機能モジュール1が追加された場合の差分に基づいて、追加された機能モジュールで定義された関数が追加されることを把握し、当該差分が上述した修正データベースに登録された差分と一致すると判定する。ステップ608の処理で、修正データベースに登録された差分のうちステップ601の処理で検出された差分と一致する差分に対応する修正ソースファイルがユーザに提示される。追加された機能モジュールで定義された関数の追加を示す差分に対応する修正ソースファイルを、図8Bを用いて説明する。この修正ソースファイルは、機能モジュールが追加された場合、追加された機能モジュールで定義される関数を基本ソースファイルの関数に追加するように基本ソースファイルを修正するものである。図8Bに示す修正ソースファイルでは、基本モジュールに追加されたすべての機能モジュールに対して、各機能モジュールで定義された関数modxfuncA関数をbasefunc関数に追加している704。これによって、機能モジュールを追加する場合の基本ソースファイルへの変更が一般化できるため、機能モジュールを追加又は削除しても、基本ソースファイルを変更する必要がなくなる。なお、図8のソースコードは説明の簡単のために用いたものであり、実際には使用するプログラミング言語のソースコードを用いる。また、図8に示す修正ソースファイルは、オブジェクト指向型プログラミングのクラス及びメソッド等を利用することによっても実現できる。リファクタリングを必要とする様々な修正ソースファイルのパターンが知られているMartinFowler著RefactoringImprovingtheDesignofExistingCodeAddisonWesleyProfessional1999年参照。この文献に記載されたパターンを修正ソースファイルの作成に利用できる。以上のように、修正ソースファイルは、機能モジュールの追加による基本ソースファイルの差分に対して、機能モジュールを追加しても基本ソースファイルを変更する必要がなくなるように、差分を一般化したコードを基本ソースファイルに埋め込むように基本ソースファイルを修正する。これによって、機能モジュールを追加又は削除する場合の基本モジュールへの変更作業が削減され、機能モジュールを追加又は削除する場合の開発効率が向上する。図9は、本発明の第1実施形態の重複関数集約処理のフローチャートである。重複関数集約処理は、機能モジュール1~N-1で定義される機能関数1~n-1が呼び出す基本関数リスト108は作成され、機能関数1~n-1で重複して呼び出される複数の基本関数を集約した集約関数が既に作成されている状態で、機能モジュールNが追加されることによって実行されるものとする。まず、CPUは、追加した機能モジュールNのソースファイルを解析し、追加した機能モジュールNで定義される機能関数nが呼び出す基本関数及び集約関数を特定し、特定した基本関数及び集約関数を抽出することによって、基本関数リスト108を作成する801。なお、ステップ801の処理では、機能関数が呼び出す基本関数のうち予め指定された基本関数のみが抽出されるようにしてもよい。これによって、重複関数集約処理の対象となるユーザの所望の基本関数のみに限定でき、重複関数集約関数処理によるCPUの負荷が軽減できる。次に、CPUは、機能モジュール1~N-1及び集約関数の基本関数リスト108と、機能モジュールNの基本関数リスト108と、を比較する802。ステップ802の処理を図5Aを用いて具体的に説明する。ここでは、追加された機能モジュールNは機能モジュール3であるとする。CPUは、基本関数リスト108の機能モジュール1~2の識別子が登録された機能モジュール403A及び403Bのカラムのうち、機能関数f1_1~f1_3及びf2_1~f2_3が登録されたカラムでフラグが設定されている基本関数を取得する。また、CPUは、基本関数リスト108の集約関数402の集約関数f_fが登録されたカラムでフラグが設定されている基本関数を取得する。さらに、CPUは、基本関数リスト108の機能モジュール3の識別子が登録された機能モジュール403Cの機能関数f3_1~f3_4のカラムでフラグが設定されている基本関数を取得する。そして、CPUは、これらの取得した基本関数が重複するか否かを比較する。次に、CPUは、ステップ802の処理の比較結果を参照し、機能モジュールNで定義された機能関数nによって呼び出される基本関数が、機能モジュール1~N-1で定義される機能関数1~n-1によって呼び出される基本関数、又は集約関数によって呼び出される基本関数と重複するか否かを判定する803。ステップ803の処理の判定方法について説明する。機能関数nによって呼び出される基本関数のうち、機能関数1~n-1、又は集約関数によって呼び出される基本関数と重複する基本関数が複数存在する場合、機能関数nによって呼び出される基本関数が機能関数1~n-1、又は集約関数によって呼び出される基本関数と重複すると判定される。ステップ803の処理で、機能関数nによって呼び出される基本関数が、機能関数1~n-1、又は集約関数によって呼び出される基本関数及び集約関数によって呼び出される基本関数と重複しない場合、重複した基本関数に基づき集約関数を作成する必要がないので、重複関数集約処理を終了する。一方、ステップ803の処理で、機能関数nによって呼び出される基本関数が、機能関数1~n-1によって呼び出される基本関数、及び集約関数によって呼び出される基本関数の少なくとも一方と重複すると判定された場合、CPUは、重複する基本関数を集約する集約関数を作成し、作成した集約関数及び当該集約関数の集約関係をユーザに提示する804。また、作成した集約関数をソースコードに反映した修正案を提示する804。ステップ804の処理を具体的に説明する。ステップ803の処理で機能関数nによって呼び出される基本関数が機能関数1~n-1によって呼び出される基本関数と重複すると判定された場合、CPUは、複数の機能関数1~nに重複して呼び出される複数の基本関数を集約した集約関数を作成する。例えば、図4Aに示す場合、機能モジュール2が追加されたとすると、基本関数f_x、f_y、及びf_zは異なる機能モジュールのf1_1及びf2_1によって呼び出されるので、これらの基本関数を集約した集約関数f_fが作成される。ステップ803の処理で機能関数nによって呼び出される基本関数が集約関数によって呼び出される基本関数の一部と重複すると判定された場合、CPUは、集約関数によって呼び出される基本関数のうち、機能関数nによって呼び出される基本関数と重複する基本関数を集約した新たな集約関数を作成する。また、CPUは、当該集約関数のうち、機能関数によって呼び出されない基本関数と新たに作成された集約関数とを集約した集約関数を作成する。例えば、図5Aに示す場合、機能モジュール3が追加されたとすると、集約関数f_fによって呼び出される基本関数f_x、f_y、及びf_zのうち、機能関数f3_1によって呼び出されるf_x及びf_yを集約した新たな集約関数f_fを作成する。そして、CPUは、元の集約関数f_fによって呼び出される基本関数f_x、f_y、及びf_zのうち、機能関数f3_1によって呼び出されないf_zと、新たに作成された集約関数f_fとを集約した集約関数f_gを作成する。ステップ803の処理で集約関数によって呼び出される基本関数の全部の基本関数が機能関数nによって呼び出される基本関数と重複する場合、新たな集約関数を作成する必要がないため、機能モジュール3のソースコードに集約関数を適用した修正案を提示する。ユーザプログラマは、ステップ804の処理で、提示された集約関数及び当該集約関数の集約関係に基づき、修正案として提示された基本ソースファイル及び機能ソースファイルに修正の必要があるか否かを判定し、修正の必要がある場合、その旨を入出力インタフェース部111を介してプログラム開発支援システム101に入力する。CPUは、これらのソースファイルに修正の必要がある旨が入出力インタフェース部111を介して入力されたか否かを判定する805。ここで、ユーザは、これらのソースファイルのソースコードに修正の必要があると判定した場合、ソースファイルのソースコードを修正するための修正用ソースコードを入出力インタフェース部111を介してプログラム開発支援システム101に入力する。このため、ステップ805の処理で、これらのソースファイルに修正の必要がある旨が入出力インタフェース部111を介して入力されたと判定されたと場合、CPUは、入出力インタフェース部111を介して修正用コードの入力を受け付け806、ステップ807の処理に移行する。一方、ステップ805の処理で、これらのソースファイルに修正の必要がある旨が入出力インタフェース部111を介して入力さていないと判定された場合、修正用コードが入力されないので、ステップ807の処理に移行する。CPUは、これらの修正用のソースファイルを適用して現在のソースコードを修正する必要があるか否かを判定する807。ステップ807の処理で、現在のソースコードを修正する必要がないと判定された場合、CPUは重複関数集約処理を終了する。一方、ステップ807の処理で、現在のソースコードを修正する必要があると判定された場合、CPUは、基本モジュール及び機能モジュール1~Nのソースコードを修正し、基本関数リスト108を修正する808。次に、CPUは、ステップ804の処理で作成された集約関数の集約関係を基本関数リスト108に登録し809、重複関数集約処理を終了する。以上によって、複数の機能モジュールから呼び出される基本関数が複数存在する場合、これらの基本関数を集約した集約関数が作成される。これによって、ユーザは、新たに機能モジュールを作成する場合、これらの基本関数を一つの集約関数として扱うことができるので、関数の呼び忘れ及び関数の引き渡しのミスを防止でき、バグ発生率を低減させることができ、プログラムの開発効率を向上させることができる。また、重複する関数を示すコードを削減できるので、プログラムのソースコードを低減させることができ、保守管理が容易になる。さらに、集約関数によって呼び出される基本関数の一部の基本関数が、追加された機能関数によって呼び出される基本関数と重複する場合、当該重複する基本関数を集約した新たな集約関数が作成されるとともに、集約関数によって呼び出される基本関数のうち追加された機能関数によって呼び出されない基本関数と新たに作成された集約関数とを集約した集約関数が新たに作成される。これによって、既存の集約関数の一部の基本関数を呼び出す機能関数が追加されても、既存の集約関数と矛盾が生じない集約関数を新たに作成することができる。図10A~図10Bを用いて、図9に示す重複関数集約処理で集約関数を新たに作成した場合の基本モジュールのソースコード基本ソースコード902a~902c、機能モジュール1~3のソースコード機能ソースコード9031a、9031b、9032a、9032b、9033a、及び9033b以下、総称して903を説明する。図10Aは、本発明の第1実施形態の集約関数作成前のプログラムのソースコード901aの説明図である。プログラムのソースコード901aは、基本ソースコード902a、及び機能ソースコード9031a~9033aを含む。図5A及び図5Bでは、機能モジュール2が追加され集約関数が既に作成された状態で、機能モジュール3が新たに追加される場合について説明したが、図10A~図10Cでは、集約関数が何も作成されていない状態、つまり機能モジュールが追加されていない状態で、新たに機能モジュール1~3が追加される場合について説明する。基本ソースコード902aでは、基本関数f_x、f_y、及びf_zが定義される。機能ソースコード9031aでは機能関数f1_1が定義され、当該機能関数f1_1は基本関数f_x、f_y、及びf_zを呼び出す。機能ソースコード9032aでは機能関数f2_1が定義され、当該機能関数f1_1は基本関数f_x、f_y、及びf_zを呼び出す。機能ソースコード9033aでは機能関数f3_1が定義され、当該機能関数f1_1は基本関数f_x、及びf_yを呼び出す。図10Bは、本発明の第1実施形態の集約関数作成後のプログラムのソースコード901bの説明図である。図10Bに示すプログラムのソースコード901bは、図9に示す重複関数集約処理によって集約関数が作成された場合、作成された集約関数に対応するために、図10Aに示すプログラムのソースコード901aを修正したものである。基本関数f_x及びf_yは、機能関数f1_1、f2_1、及びf3_1で共通して呼び出されるので、基本関数f_x及びf_yを集約した集約関数f_fが作成される。また、基本関数f_x、f_y、及びf_zは、機能関数f1_1及びf2_1で共通して呼び出されるので、基本関数f_x及びf_yを集約した集約関数f_fと基本関数f_zを集約した集約関数f_gが作成される。このため、基本ソースコード902bでは、集約関数f_fが基本関数f_x及びf_yを呼び出す旨の定義、及び集約関数f_gが集約関数f_f及び基本関数f_zを呼び出す旨の定義が追加される。また、機能ソースコード9031bでは、機能関数f1_1が集約関数f_gを呼び出すように修正される。機能ソースコード9032bでは、機能関数f2_1が集約関数f_gを呼び出すように修正される。機能ソースコード9033bでは、機能関数f3_1が集約関数f_fを呼び出すように修正される。これによって、機能モジュール1~3によって呼び出される関数の数が削減できる。図10Cは、所定条件が成立した場合、基本モジュールで集約関数f_f及びf_gを呼び出すように修正された基本ソースコード903cの説明図である。基本ソースコード903cでは、所定条件が成立するか否かによって、集約関数f_f及びf_gのうちいずれかが呼び出される。具体的には、基本ソースコード903cでは、所定条件が成立する場合、集約関数f_fが呼び出され、所定条件が成立しない場合、集約関数f_gが呼び出される。例えば、集約関数f_fを呼び出す機能モジュールが所定数以上である場合、基本ソースコード903cで集約関数f_fを呼び出すようにしてもよいし、集約関数f_gを呼び出す機能モジュールが所定数以上である場合、基本ソースコード903cで集約関数f_gを呼び出すようにしてもよい。基本ソースコード903cで集約関数が呼び出されれば、機能ソースコードで集約関数を呼び出す必要がなくなる。なお、図10A~図10Cに示すソースコードは説明の簡単のために用いたものであり、実際には使用するプログラミング言語のソースコードを用いる。次に、ある機能関数が他の機能関数を呼び出し、当該他の機能関数が基本関数を呼び出す場合の基本関数リスト108の作成方法、及び基本関数リスト108の比較方法について、図11~図14を用いて説明する。なお、このような関数の構造を入れ子構造という。図11は、本発明の第1実施形態の入れ子構造の関数のソースコードの説明図である。図11は、ある機能モジュール例えば、機能モジュール1とするのソースコードを示す。当該機能モジュールでは、機能関数f1_1、f1_2、及びf1_3が定義されている。機能関数f1_1は、基本関数f_w及びf_xを呼び出し、機能関数f1_2を呼び出す。機能関数f1_2は、基本関数f_y、及び機能関数f1_3を呼び出す。機能関数f1_3は、基本関数f_zを呼び出す。図12は、本発明の第1実施形態の入れ子構造の関数を定義する機能関数の基本関数リスト108を作成するための補助リスト1101の説明図である。補助リスト1101は、基本関数リスト作成部109によって作成され、基本関数リスト108の一部に記憶される。補助リスト1101の構成は、図4に示す基本関数リスト作成部109の構成と同じであるので、説明を省略する。基本関数リスト作成部109は、図11で説明したように、機能関数f1_1が基本関数f_w及びf_xの他に機能関数f1_2を呼び出すため、基本関数_集約関数401に基本関数f_w及びf_xの他に機能関数f1_2を登録する。そして、基本関数リスト作成部109は、基本関数_集約関数401がf_w、f_x及びf1_2が機能関数f1_1によって呼び出されることを登録する。同様に、基本関数リスト作成部109は、機能モジュールf1_2が、基本関数f_yの他に機能関数f1_3を呼び出すため、基本関数_集約関数401に基本関数f_yの他に機能関数f1_3を登録する。そして、基本関数リスト作成部109は、基本関数_集約関数401がf_y及びf1_3が機能関数f1_2によって呼び出されることを登録する。さらに、基本関数リスト作成部109は、機能モジュールf1_3が、基本関数f_zを呼び出すため、基本関数_集約関数401に基本関数f_zを登録する。そして、基本関数リスト作成部109は、基本関数_集約関数401がf_zが機能関数f1_3によって呼び出されることを登録する。以上によって、補助リスト1101が作成される。図13は、本発明の第1実施形態の補助リスト1101に基づいて作成された基本関数リスト108の説明図である。基本関数リスト作成部109は、補助リスト1101作成後、補助リスト1101に基づいて基本関数リスト108を作成する。基本関数リスト作成部109は、ある機能モジュールの機能関数が他の機能関数を呼び出す場合、当該他の機能関数が呼び出す関数を特定する処理を、ある機能モジュールの機能関数が呼び出すすべての機能関数の基本関数を特定するまで繰り返し実行する。具体的には、基本関数リスト作成部109は、図12に示す補助リスト1101を参照し、機能関数f1_1が呼び出す関数が基本関数f_w及びf_x並びに機能関数f1_2であることを特定する。機能関数f1_1が呼び出す関数に機能関数f1_2が含まれるので、基本関数リスト作成部109は、補助リスト1101を参照し、機能関数f1_2が呼び出す関数を特定する。機能関数f1_2は基本関数f_y及び機能関数f1_3を呼び出すため、基本関数リスト作成部109は、補助リスト1101を参照し、機能関数f1_3が呼び出す関数を特定する。機能関数f1_3は基本関数f_zを呼び出すため、機能関数f_1が呼び出す機能関数の基本関数を特定したので、特定処理を終了する。上述の処理で、基本関数リスト作成部109は、機能関数f1_1は基本関数f_w及びf_x並びに機能関数f1_2を呼び出し、機能関数f1_2は基本関数f_y及び機能関数f1_3を呼び出し、機能関数f1_3は基本関数f_zを呼び出すことを特定する。つまり、基本関数リスト作成部109は、機能関数f1_1は基本関数f_w、f_x、f_y、及びf_zを呼び出し、機能関数f1_2は基本関数f_y及びf_zを呼び出し、機能関数f1_3は基本関数f_zを呼び出すことを特定する。したがって、基本関数リスト作成部109は、基本関数リスト108の機能関数f1_1のカラムに基本関数f_w、f_x、f_y、及びf_zを呼び出すことを登録し、機能関数f1_2のカラムに基本関数f_y及びf_zを呼び出すことを登録し、機能関数f1_3のカラムに基本関数f_zを呼び出すことを登録する。なお、機能関数が直接呼び出さない基本関数、つまり、他の機能関数を介して呼び出される基本関数基本関数f_y及びf_zには、当該基本関数を直接呼び出す機能関数、及び当該基本関数を直接呼び出す機能関数を直接呼び出す機能関数が登録される。具体的には、図13に示す基本関数リスト108の基本関数_集約関数401にf_yが登録されたレコードのf1_1のセルには、当該基本関数f_yが機能関数f1_2によって直接呼び出されることが登録される。また、図13に示す基本関数リスト108の基本関数_集約関数401にf_zが登録されたレコードのf1_2のセルには、当該基本関数f_zが機能関数f1_3によって直接呼び出され、機能関数f1_3が機能関数f1_2によって直接呼び出されることが登録される。ここで、基本関数リスト比較部110は、図13に示す基本関数リスト108を参照し、基本関数f_w、f_x、f_y、及びf_zが異なる機能モジュールの機能関数f1_1及びf2_1によって重複して呼び出されることを検出する。この場合、基本関数リスト比較部110は、ユーザが重複して呼び出される関数の入れ子構造を把握可能な形式で検出画面1301図14参照をユーザに提示する。図14は、本発明の第1実施形態の入れ子構造を把握可能な形式の検出画面1301の説明図である。基本関数リスト比較部110は、図13に示す基本関数リスト108を参照し、ある機能関数から他の機能関数を介して間接的に呼び出される基本関数間接呼出基本関数の入れ子構造をユーザに提示する。例えば図14に示す検出画面1301では、機能関数f_yがf_y:<f1_2と表示され、機能関数f_zがf_z:<f1_3<f1_2と表示されることによって、これらの基本関数の入れ子構造がユーザに提示される。なお、図14に示す検出画面1301は、一例であり、他の提示方法を用いて、基本関数の入れ子構造をユーザに提示してもよい。さらに、基本関数リスト比較部110は、異なる機能モジュールの機能関数f1_1及びf2_1によって重複して呼び出される複数の基本関数があり、これら複数の基本関数の一部の基本関数が機能関数を介して間接的に呼び出される間接呼出基本関数である場合、間接呼出基本関数を集約した集約関数及び間接呼出基本関数でない基本関数を集約した集約関数を作成するとともに、これら複数の基本関数を集約した集約関数を作成し、作成した集約関数をユーザに提示する。以上によって、ユーザは入れ子構造を把握できる。また、入れ子構造の基本関数から構成される集約関数と入れ子構造でない基本関数から構成される集約関数とが作成され、重複するすべての基本関数を集約した集約関数が作成されるので、ユーザは、どちらの集約関数を用いるかを選択できる。次に、図15及び図16を用いて本実施形態の効果について説明する。図15は、本発明の第1実施形態の機能モジュールが追加された場合の基本モジュール及び機能モジュールに対する修正の説明図である。基本モジュール差分検出部104は、機能モジュール1が追加された場合、機能モジュール1の追加前後の基本モジュールの差分diff1を検出する。また、基本モジュール差分検出部104は、機能モジュール2が追加された場合、機能モジュール2の追加前後の基本モジュールの差分diff2を検出する。そして、差分比較部105は、機能モジュール1追加時の差分diff1及び機能モジュール2追加時の差分diff2を比較し、重複修正箇所を検出し1802A、当該個所をユーザに提示する。ユーザ又は修正案作成部は、重複修正箇所に基づいて、基本モジュール並びに機能モジュール1及び2を修正する1804。また、基本関数リスト比較部110は、機能モジュール1の機能関数機能関数1及び機能モジュール2の機能関数機能関数2によって重複した呼び出される複数の関数を集約した集約関数を作成する1803。新たな集約関数が作成された場合、基本モジュール並びに機能モジュール1及び2が、新たな集約関数に対応するように、修正される1805。ユーザは、ステップ1802の処理で検出された重複修正箇所、及びステップ1803の処理で作成された集約関数の結果を活用し、新たな機能モジュール3を開発する1806及び1807。これによって、ユーザは、修正箇所を予め把握でき、複数の基本関数を集約した集約関数のコードを用いることができるので、プログラムの開発効率が向上する。図16は、本発明の第1実施形態の機能モジュールの開発作業時間の説明図である。機能モジュールの開発作業時間は、機能モジュール独自の機能新機能固有の処理の開発にかかる時間と、機能モジュールを基本モジュールに追加するための基本モジュールの修正等固定的な処理にかかる時間と、を含む。図15に示すように、機能モジュールが追加されるごとに、重複修正箇所がユーザに提示されることによって重複修正箇所が修正しなくてもよいように修正されるため、固定的な処理にかかる時間を削減でき、機能モジュールの開発作業時間が徐々に削減されることになる。第2実施形態以下、本発明の第2実施形態を図17~図19を用いて説明する。第2実施形態では、機能モジュール追加前後の基本モジュールの差分と当該機能モジュールが実現する機能のジャンルを示すキーワードとを対応付けて差分リスト103に記憶され、ある機能モジュールを追加した場合、追加した機能モジュールのキーワードと一致する機能モジュールの差分がユーザに提示される。これによって、同じジャンルの機能を実現する機能モジュールの基本モジュールに対する修正は同じ個所にされる場合が多いことため、当該修正箇所をユーザに提示できる。図17は、本発明の第2実施形態の差分リスト103の説明図である。本実施形態の差分リスト103のうち、図3に示す第1実施形態の差分リスト103と同じ構成は同じ符号を付与し、説明を省略する。本実施形態の差分リスト103は、機能モジュール301、ソースファイル名302、開始位置303、終了位置304、及びキーワード1401を含む。キーワード1401には、機能モジュールが実現する機能機能のジャンルを示すキーワードが登録される。当該キーワードは、機能モジュールが追加される場合にユーザにより入出力インタフェース部111を介してプログラム開発支援システム101に入力される。これによって、機能モジュールの追加前後の基本モジュールの差分とキーワードとが対応付けられる。図18は、本発明の第2実施形態の差分リスト検索テーブル1501の説明図である。差分リスト検索テーブル1501は、キーワードと機能モジュールの識別子とを対応付けるテーブルであり、図示しないメモリに記憶される。差分リスト検索テーブル1501は、キーワード1502及び機能モジュール1503を含む。キーワード1502にはキーワードが登録され、機能モジュール1503にはキーワードに対応する機能モジュールの一意な識別子が登録される。なお、機能モジュール1503には、キーワードに対応する機能モジュールが複数存在する場合もあるので、複数の機能モジュールの一意な識別子が登録される場合もある。図19は、本発明の第2実施形態のユーザ提示処理のフローチャートである。ユーザ提示処理は、CPUが差分比較部105のプログラムを実行することによって、実現される。ユーザ提示処理は、機能モジュールが追加された場合に入力されるキーワードkeyxがプログラム開発支援システムに入力された場合に実行される。まず、CPUは、入力されたキーワードに対応する差分を検索する1601。具体的には、CPUは、図18に示す差分リスト検索テーブル1501を参照し、キーワード1502に登録されたキーワードが入力されたキーワードと一致するレコードを検索する。次に、CPUは、ステップ1601の処理の検索結果に基づいて、入力されたキーワードに対応する差分が存在するか否かを判定する1602。ステップ1602の処理で、入力されたキーワードに対応する差分が存在すると判定された場合、CPUは、図17に示す差分リスト103を参照し、入力されたキーワードに対応する差分を取得し、取得した差分をユーザに提示し1603、ユーザ提示処理を終了する。具体的には、CPUは、図17に示す差分リスト103のキーワード1401に登録されたキーワードが入力されたキーワードと一致するレコードを取得する。そして、CPUは、取得したレコードのソースファイル名302に登録されたソースファイルの一意な識別子、開始位置303に登録された差分の開始位置、及び終了位置304に登録された差分の終了位置によって特定される差分をユーザに提示する。一方、ステップ1602の処理で、入力されたキーワードに対応する差分が存在しないと判定された場合、ユーザ提示処理を終了する。本実施形態では、機能モジュールが追加された場合の基本モジュールへの修正は、機能モジュールが実現する機能が一致する場合、同じ個所に集中する可能性が高いので、追加された機能モジュールと同じ機能を実現する機能モジュールの追加前後の基本モジュールの差分をユーザに提示する。ユーザは、必要に応じて提示された差分に基づいて基本モジュールを修正する。これによって、プログラムの修正漏れを防止でき、バグの発生率が削減されるので、プログラムの開発作業の効率が向上する。第3実施形態第3実施形態を図20~図27を用いて説明する。第3実施形態では、基本モジュール及び機能モジュールは複数の状態を提供するものであって、ある状態で所定条件が成立すると他の状態に遷移する場合、機能モジュールの追加又は削除以下、機能モジュールの追加又は削除を総称して機能モジュールの変更という前後の状態の差分が記憶され、機能モジュールの変更前に追加又は削除される状態をユーザに提示する。これによって、機能モジュールの変更に伴う状態の追加又は削除を確実に行うことができる。図20は、本発明の第3実施形態の基本モジュール及び機能モジュールによって提供される状態の説明図である。図20に示す図は状態遷移図であり、入出力インタフェース部111を介して図示しない表示装置に表示される。図20では、基本モジュールに機能モジュール1、2及び3が順に追加されているものとする。基本モジュールは状態Base_1~Base_5を提供し、機能モジュール1は状態Mod1_1~Mod1_3を提供し、機能モジュール2は状態Mod2_1を提供し、機能モジュール3は状態Mod3_1を提供する。CPUは、状態Base_1~Base_5の順に状態を遷移させるが、状態Base_2で第1条件condition1が成立すると、状態Mod1_1に状態を遷移させる。CPUは、状態Mod1_1に状態を遷移させた後、状態Mod1_2に状態を遷移させ、状態Mod1_2で第4条件condition4が成立すると、状態Mod2_1に遷移させ、状態Base_4に遷移させる。また、CPUは、状態Mod1_2で第5条件condition5が成立すると、状態Mod3_1に状態を遷移させ、状態Base_4に状態を遷移させる。また、CPUは、状態Base_3で第3条件condition3が成立すると、状態Mod2_1に遷移させ、状態Base_4に遷移させる。また、CPUは、状態Base_4で第2条件condition2が成立すると、状態Mod1_3に遷移させ、状態Base_5に遷移させる。図21は、本発明の第3実施形態の機能モジュールが追加される前の状態遷移図を表示させるためのファイルであるstd_conf1801の説明図である。std_conf1801は、図示しないメモリに記憶され、機能モジュールが変更されるごとに変更される。ellipseは各状態を示す円であり、arrowはある状態の遷移先の状態を示す矢印である。実際に、状態遷移図を表示するためには、各状態を示す円及び遷移先を示す矢印の位置もstd_conf1801に記憶されなければならないが、本実施形態では省略する。図22は、本発明の第3実施形態の機能モジュール1~3が追加された後のstd_conf1801の説明図である。ellipseには、機能モジュール1が提供する状態Mod1_1~1_3、機能モジュール2が提供する状態Mod2_1、及び機能モジュール3が提供する状態Mod3_1が追加される。arrowには、追加された状態Mod1_1~1_3、Mod2_1、及びMod3_1の遷移元及び遷移先を示す矢印が追加される。なお、std_conf1801のarrowよりも前に状態が定義されていれば、ellipseで定義される状態の順番が異なっていてもよい。なお、図示しない状態差分検出部が、機能モジュール追加前後のstd_conf1801の差分を検出する。また、std_conf1801は、状態遷移図を表示するためのファイルであるので、図7に示す第1実施形態の修正ソースファイル及び図10A~図10Cに示す第1実施形態のプログラムのソースコードの形式と異なるものである。図23は、本発明の第3実施形態の状態差分リスト2001の説明図である。状態差分リスト2001は、図示しないメモリに記憶されるもので、図示しない状態差分検出部によって検出されたstd_conf1801の状態の差分が記憶される。状態差分リスト2001は、バージョン2002、モジュール名2003、追加削除2004、ソースファイル名2005、コード2006、追加削除2007、及びキーワード2008を含む。バージョン2002にはプログラムのバージョンが登録される。モジュール名2003には、追加又は削除された機能モジュールの一意な識別子が登録される。追加削除2004には、機能モジュールが追加されたか削除されたかを示す情報が登録される。コード2006には、追加又は削除されたstd_conf1801のコードが登録される。追加削除2007には、std_conf1801のコードが追加されたか削除されたかを示す情報が登録される。キーワード2008には、追加又は削除された機能モジュールが実現する機能のキーワードが登録される。状態差分リスト2001のレコード2009Aは、機能モジュール1が基本モジュールに追加された場合のstd_conf1801の差分を示す。コード2006には、状態Mod1_1~Mod1_3が追加され、これらの状態Mod1_1~Mod1_3の遷移元及び遷移先が追加される。状態差分リスト2001のレコード2009B及び2009Cは、それぞれ機能モジュール2及び3が追加された場合のstd_conf1801の差分を示す。状態差分リスト2001のレコード2009Dは、機能モジュール1が削除された場合のstd_conf1801の差分を示す。機能モジュール1が削除される場合、機能モジュール1が提供する状態が削除されるが、機能モジュール1が提供する状態のみが遷移元となる状態図20に示す状態Mod3_1も削除される必要がある。ここで、機能モジュールの削除によるstd_conf1801のコードを削除するコード削除処理について説明する。まず、ユーザは、削除する機能モジュール1のキーワードをプログラム開発支援システムに入力する。CPUは、キーワードの入力を受け付けた場合、状態差分リスト2001のキーワード2008に登録されたキーワードが入力されたキーワードと一致するレコードのコード2006に登録された差分追加されたコードを取得し、取得した差分に基づいて削除する状態を状態遷移図上に表示する図24参照。図24は、本発明の第3実施形態の削除する状態を表示した状態遷移図の説明図である。図24に示す状態遷移図は、図20に示す状態遷移図から機能モジュール1を削除する場合に表示される。具体的には、機能モジュール1が削除される場合に削除される状態が点線で囲まれて表示される。機能モジュール1が提供する状態である状態Mod1_1及びMod1_2が点線2101で囲まれて表示され、状態Mod1_3が点線2102で囲まれて表示される。これによって、ユーザは、機能モジュール1の削除に伴って削除される状態を把握しやすくなる。CPUは、図24に示す状態遷移図を表示した後、std_conf1801のarrowに登録されたコードのうち、削除する状態を含むコードを削除する。これは、削除対象の機能モジュールが追加された後に、他の機能モジュールが追加され、削除対象の機能モジュールが提供する状態が他の機能モジュールが提供する状態の遷移元及び遷移先となっている場合があり、この遷移元及び遷移先を示す矢印を削除するためのものである。図22に示すstd_conf1801では、arrowBase_2toMod1_1withcondition1、arrowMod1_1toMod1_2、arrowBase_4toMod1_3withcondition2、arrowMod1_3toBase_5、arrowMod1_2toMod2_1withcondition4、及び、arrowMod1_2toMod3_1withcondition5が削除される。次に、CPUは、std_conf1801のarrowに登録されたコードのうち削除されていないコードを参照して、遷移元の状態及び遷移先の状態を取得する。そして、CPUは、取得した遷移元の状態のうち遷移先の状態にないものを特定し、特定した遷移元の状態を含むコード及び特定した状態を削除する。但し、状態遷移の開始位置である状態本例においてはBase1は除外する。これは、削除対象となる状態が遷移元となり、遷移し得ない状態を削除するためのものである。図22に示すstd_conf1801では、arrowMod3_1toBase4、及びMod3_1が削除される。このように、コード削除処理によって、削除対象となる機能モジュールが提供する状態、及び当該状態のみが遷移元となる状態が削除され、これらの状態の矢印も削除される。以上のコード削除処理によって更新されたstd_conf1801を図25に示す。次に、CPUは、std_conf1801から削除したコードを図23に示す状態差分リスト2001に登録するため状態差分リスト2001に新たなレコード2009Dを追加する。そして、CPUは、更新されたstd_conf1801に基づいて図26に示す状態遷移図を表示する。図25は、本発明の第3実施形態の機能モジュール1削除後のstd_conf1801の説明図である。上述したコード削除処理によって、図22に示すstd_conf1801から、機能モジュール1が提供する状態Mod1_1~Mod1_3、及び、機能モジュール1が提供する状態Mod1_2のみが遷移元となる状態Mod3_1が削除される。また、これらの状態の遷移元及び遷移先を示す矢印も削除される。図26は、本発明の第3実施形態の機能モジュール1削除後の状態遷移図の説明図である。図26に示す状態遷移図では、図20及び図24に示す状態遷移図から状態Mod1_1~Mod1_3、及びMod3_1が削除され、削除された状態に向かう矢印及び削除された状態から出る矢印も削除される。次に、機能モジュール1が基本モジュールから削除された後、機能モジュール1が基本モジュールに再度追加された場合について図27を用いて説明する。この場合、ユーザは、追加する機能モジュールが実現する機能のキーワードをプログラム開発支援システムに入力する。CPUは、追加する機能モジュールのキーワードの入力を受け付けた場合、図23に示す状態差分リスト2001のレコードのうちキーワード2008が、入力されたキーワードと一致するレコードを特定する。そして、CPUは、特定したレコードのうち、追加削除2004に機能モジュールが削除されたことを示す情報が登録されたレコードであって、かつ、最も新しいバージョンがバージョン2002に登録されたレコード最新削除レコードを特定する。そして、CPUは、特定した最新削除レコードのコード2006に登録された差分に基づいて、現在の状態遷移図に当該差分を反映した図27に示す状態遷移図を表示する。図27は、本発明の第3実施形態の機能モジュール1が再度追加された場合の状態遷移図の説明図である。図27では、CPUが、最新削除レコードに基づいて、機能モジュール1が追加された場合に追加が必要となる状態及び矢印を点線で表示する。なお、第3実施形態は、第2実施形態のプログラム開発支援システム101に適用することを前提にして説明したが、第1実施形態のプログラム開発支援システム101に適用することも可能である。この場合、図23に示す状態差分リスト2001のキーワード2008は削除される。また、追加又は削除される機能モジュールを特定するためユーザは当該機能モジュールのキーワードを入力したが、当該機能モジュールの一意な識別子を入力することになる。以上のように、第3実施形態では、機能モジュールが追加又は削除される場合、当該機能モジュールの追加前後又は削除前後の状態の差分を記憶するので、機能モジュールが追加又は削除される場合、以前の差分に基づいて、機能モジュールの追加又は削除により削除される状態を事前に把握できる。また、機能モジュールが追加される場合、当該機能モジュールが以前に削除された機能モジュールであれば、当該削除時の差分に基づいて、機能モジュールが追加された場合に追加される状態を事前に把握できる。これは、例えば、機能モジュールにバグがあり当該機能モジュールを削除し、当該機能モジュールのバグを修正してから追加する場合に有用である。以上、本発明の各実施形態について説明したが、上記実施形態は本発明の適用例を示したものであり、本発明の技術的範囲を上記各実施形態の具体的構成に限定する趣旨ではない。本発明の要旨を逸脱しない範囲において種々変更可能である。