(57)【要約】【課題】コンピュータプログラムをロジックとデータアクセスとに分離すること。【解決手段】コンピュータは、コンピュータプログラムのソースコードを記憶部に記憶し、ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を抽出して保持する（Ｓ１００）。コンピュータは、抽出された境界候補に基づいて、ソースコードからデータアクセス処理を抽出し（Ｓ１０２−Ｓ１０５）、抽出されたデータアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換え（Ｓ１０６）、ソースコードからロジック処理を抽出する（Ｓ１０７）。【選択図】図７
2012203726.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより、コンピュータプログラムを分析するための方法であって、
前記コンピュータは、
（Ａ）分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、
（Ｂ）前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、
（Ｃ）抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出し、
（Ｄ）抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、前記ソースコードからロジック処理を抽出する、
コンピュータプログラムの分析方法。
【請求項２】
さらに、前記コンピュータは、
（Ｅ）前記ソースコードから抽出された前記データアクセス処理及び前記ロジック処理を画面に出力させる、
請求項１に記載のコンピュータプログラムの分析方法。
【請求項３】
前記（Ｃ）では、
（Ｃ１）前記境界候補を基準としてデータ依存関係のある処理を抽出し、
（Ｃ２）前記データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出する、
請求項１または請求項２のいずれかに記載のコンピュータプログラムの分析方法。
【請求項４】
前記（Ｂ）では、
（Ｂ１）条件文の条件部を入力側の境界候補として抽出し、
（Ｂ２）代入文を出力側の境界候補として抽出する、
請求項１〜３のいずれかに記載のコンピュータプログラムの分析方法。
【請求項５】
前記データアクセス用情報は、抽出された前記データアクセス処理が参照するデータの名称に基づいて作成される、
請求項１〜４のいずれかに記載のコンピュータプログラムの分析方法。
【請求項６】
前記データアクセス用情報は、抽出された前記データアクセス処理が参照する前記データの前記名称及び前記データの参照順序に基づいて生成される、
請求項５に記載のコンピュータプログラムの分析方法。
【請求項７】
前記データアクセス処理により参照されるデータは、共有メモリに記憶されている、
請求項１〜６のいずれかに記載のコンピュータプログラムの分析方法。
【請求項８】
さらに、前記コンピュータは、
（Ｆ）ユーザからの指示に応じて、抽出された前記データアクセス処理を前記ソースコードに戻したり、または、前記ソースコードの中から指定された処理をデータアクセス処理として抽出したりする、
請求項１〜７のいずれかに記載のコンピュータプログラムの分析方法。
【請求項９】
コンピュータプログラムを分析するコンピュータプログラム分析装置であって、
所定の分析プログラムを格納する記憶部と、
前記所定の分析プログラムを実行するマイクロプロセッサとを備え、
前記マイクロプロセッサは、前記所定の分析プログラムを実行することにより、
（Ａ）分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、
（Ｂ）前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、
（Ｃ）抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出し、
（Ｄ）抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、前記ソースコードからロジック処理を抽出する、
コンピュータプログラム分析装置。
【請求項１０】
前記（Ｃ）では、
（Ｃ１）前記境界候補を基準としてデータ依存関係のある処理を抽出し、
（Ｃ２）前記データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出する、
請求項９に記載のコンピュータプログラム分析装置。
【請求項１１】
コンピュータを、分析対象コンピュータプログラムを分析するための装置として機能させるためのコンピュータプログラムであって、
前記コンピュータに、
（Ａ）前記分析対象コンピュータプログラムのソースコードを記憶部に記憶させ、
（Ｂ）前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持させ、
（Ｃ）抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出させ、
（Ｄ）抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えさせて、前記ソースコードからロジック処理を抽出させる、
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの分析方法及び分析装置に関する。
【背景技術】
【０００２】
コンピュータのハードウェアおよびソフトウェアは年々進歩している。一般的なアプリケーションプログラムの場合、オペレーティングシステムまたはハードウェア等の変化に追従すべく、作り直される。
【０００３】
これに対し、ある種のコンピュータプログラムは、長期間にわたって使用される。例えば、鉄道運行管理システムのような大規模な情報制御システムは、一度構築されると、その後１０〜１５年間程度は、既存のソースコードに手を加えない。必要な範囲内でコードを継ぎ足しながら、部分的に改造したり、改修したりする。
【０００４】
特に、情報制御システムの開発初期では、ＣＰＵやメモリなどのコンピュータリソースを十分に使用することができなかった。使用可能なコンピュータリソースの少ない時代に性能を発揮すべく、情報制御システムのプログラムは、共有メモリを利用する。共有メモリを使用するため、そのプログラムの中では、ロジック処理とデータアクセス処理とが分離されずに混在している。ロジック処理とデータアクセス処理とが混在しているため、そのプログラムは、可読性が低く、保守性も悪い。また、データアクセス処理が整理されないため、同一のデータアクセス処理がプログラムの様々な場所に出現することがある。そのため、プログラムが肥大化し、保守性の悪いものとなる。
【０００５】
一方、現在は、コンピュータリソースを十分に使用できるため、限られたコンピュータリソースで性能をできるだけ発揮させる必要性に乏しい。それよりもむしろ、可読性及び保守性の良いプログラムが求められている。
【０００６】
そこで、古い時代に作成されたプログラム資産（ソースコード）を、新しいコンピュータシステムに適したプログラム資産に変換することが求められている。
【０００７】
ところで、コンパイラで利用されるスライシング技術を活用して、目的にあったソースコードに変換することが知られている。コンパイラでは、命令間に、データ依存（ＤＤ：Data Dependence）または処理依存（ＣＤ：Control Dependence）などの依存関係があるかを分析する。コンパイラは、依存関係がない処理を抽出し、その実行順序を変更することで、プログラムを最適化する。
【０００８】
特許文献１では、データフロー分析によりデータ依存を分析する。これにより、入力データを直接参照する命令文から入力関連処理を分離し、出力データを直接参照する命令文から出力関連処理を分離し、出力データを直接更新する命令文から業務関連処理を分離するようになっている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平９−２３６２６１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
特許文献１に記載の従来技術は、入出力データが明確に分かっている場合を前提としている。しかし、複数タスクが共有メモリを介してデータを共有するような情報制御プログラムでは、各タスク間でどのデータを共有しているのかはわかるが、入力データがどれで、出力データがどれであるか、必ずしも明確ではない。そのため、情報制御プログラムでは、入出力データを基準として情報制御プログラム内から処理を分離することは、困難である。
【００１１】
そこで、本発明の目的は、入出力データが不明確な場合も、コンピュータプログラムを分析してロジック処理とデータアクセス処理とに分離することのできるコンピュータプログラムの分析方法及び分析装置を提供することにある。
【課題を解決するための手段】
【００１２】
上記課題を解決すべく、本発明に従うコンピュータプログラムを解析する方法は、コンピュータにより、コンピュータプログラムを分析するための方法であって、コンピュータは、（Ａ）分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、（Ｂ）ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、（Ｃ）抽出された境界候補に基づいて、ソースコードからデータアクセス処理を抽出し、（Ｄ）抽出されたデータアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、ソースコードからロジック処理を抽出する。
【００１３】
さらに、コンピュータは、（Ｅ）ソースコードから抽出されたデータアクセス処理及びロジック処理を画面に出力させてもよい。
【００１４】
さらに、（Ｃ）では、（Ｃ１）境界候補を基準としてデータ依存関係のある処理を抽出し、（Ｃ２）データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出してもよい。
【００１５】
さらに、（Ｂ）では、（Ｂ１）条件文の条件部を入力側の境界候補として抽出し、（Ｂ２）代入文を出力側の境界候補として抽出してもよい。
【００１６】
データアクセス用情報は、抽出されたデータアクセス処理が参照するデータの名称に基づいて作成してもよい。
【００１７】
データアクセス用情報は、抽出されたデータアクセス処理が参照するデータの名称及びデータの参照順序に基づいて生成してもよい。
【００１８】
本発明は、コンピュータプログラムを分析する装置、または、コンピュータプログラムを分析するためのコンピュータプログラムとして把握することもできる。
【図面の簡単な説明】
【００１９】
【図１】図１は、コンピュータプログラム分析装置のハードウェア構成である。
【図２】図２は、分析対象プログラムのソースコードの例を示す。
【図３】図３は、分析対象プログラムを実行する装置を示す。
【図４】図４は、情報制御システムの基本動作を模式的に示す説明図である。
【図５】図５は、共有データの構成例を示す。
【図６】図６は、データ種別情報の構成例を示す。
【図７】図７は、ロジック処理とデータアクセス処理を分離するための処理を示すフローチャートである。
【図８】図８は、ロジック処理とデータアクセス処理との境界候補に関する情報を管理するテーブルの一例である。
【図９】図９は、分析対象プログラムのノード間のデータ依存及び処理依存を管理するテーブルの一例である。
【図１０】図１０は、ノード間のデータ依存及び処理依存を示すプログラム依存グラフの例である。
【図１１】図１１は、データ依存のあるノードの例を示す。
【図１２】図１２は、プログラム依存の例を示す。
【図１３】図１３は、プログラムから分離されたデータアクセス処理を示す。
【図１４】図１４は、分離されたデータアクセス処理の他の例を示す。
【図１５】図１５は、プログラムから分離されたロジック処理の例を示す。
【図１６】図１６は、コンピュータプログラムの分析結果を示す画面例である。
【発明を実施するための形態】
【００２０】
以下、図面に基づいて、本発明の実施の形態を説明する。本実施形態では、後述のように、入力データを受け取り、入力データの内容をチェックして、制御対象が適切に動作するように出力データを作成するという、情報制御システムの基本動作に着目する。本実施形態では、例えば、条件文の条件部または代入文を基準として、ソースコードから、ロジック処理とデータアクセス処理との境界候補を検索する。
【００２１】
さらに、本実施形態では、境界候補を基準として、データ依存関係または処理依存関係のある処理を、データアクセス処理として抽出する。本実施形態では、ソースコードからデータアクセス処理のコードを取り除いた残り部分を、ロジック処理として抽出する。このように、本実施形態では、入出力データが明確に分かっていない場合でも、プログラムをロジック処理とデータアクセス処理とに分離できる。
【００２２】
従って、プログラムを修正する場合は、ロジック処理に集中して作業できるため、修正作業の効率が向上する。さらに、ロジック処理とデータアクセス処理とを区別できるため、データアクセス処理の部分を間違えて修正してしまうという事態を防止できる。これにより、プログラムの修正ミスを少なくできる。また、抽出したデータアクセス処理間を比較することにより、同一のデータアクセスについては１つに纏めることができる。そのため、プログラム内の様々な場所に実装されているデータアクセス処理の重複を省くことができる。このように、本実施形態では、古いプログラムを分析して、可読性及び保守性の高い新しいプログラムを得ることができる。
【実施例１】
【００２３】
以下、図面に従い、発明を実施するための形態について述べる。図１は、本実施例に係るプログラム分析装置１のシステム構成を示す。
【００２４】
プログラム分析装置１は、例えば、記憶部１１と、マイクロプロセッサ（以下、ＣＰＵ）１２と、メモリ１３と、入力部１４と、出力部１５と、通信部１６とを含むコンピュータとして構成される。
【００２５】
記憶部１１は、例えば、ハードディスクドライブまたはフラッシュメモリデバイスのような比較的大容量の記憶装置として構成される。記憶部１１には、分析対象プログラムのソースコード２１と、各種情報２２−２５と、分析対象ソースコードから分離されたデータアクセス処理のコード２６と、分析対象ソースコードから分離されたロジック処理のコード２７と、分析プログラム３１とが記憶される。
【００２６】
ＣＰＵ１２は、分析プログラム３１を実行することにより、分析対象ソースコードからロジック処理とデータアクセス処理とを分離する機能を実現する。分析プログラム３１は、記憶部１１からメモリ１３に転送されて、ＣＰＵ１２により実行される。メモリ１３には、作業領域も設けられる。
【００２７】
入力部１４は、ユーザからの情報または指示を受け付けるための装置である。入力部１４としては、例えば、キーボード、マウス等のポインティングデバイス、タッチパネル、マイクロフォン等のいずれか一つまたは複数を用いることができる。出力部１５は、ユーザに情報を提示したりするための装置である。出力部１５としては、例えば、ディスプレイ装置、スピーカー、プリンタ等のいずれか一つまたは複数を用いることができる。
【００２８】
通信部１６は、例えば、ＬＡＮ（Local Area Network）またはインターネットのような通信ネットワークと接続して通信するための回路である。
【００２９】
なお、プログラム分析装置１に接続されるコンピュータ端末を用いて、ユーザとプログラム分析装置１とが情報を交換する構成としてもよい。その場合、プログラム分析装置１から入力部１４及び出力部１５を取り除くことができる。さらに、図１では、一台のコンピュータからプログラム分析装置１を構成する例を示すが、これに限らず、複数のコンピュータを連携させることで一つのプログラム分析装置１を構成してもよい。
【００３０】
図２は、分析対象プログラムのソースコード２１の例を示す。ソースコード２１は、制御対象となる列車を識別する列車ＩＤを引数として取得し、列車の状態及び信号機の状態などをチェックし、信号機に制御指示を出力する。ソースコードの左側には、各行（各ノード）を識別するための連続数字を付してある。
【００３１】
さらに、連続数字のさらに左側には、本実施形態の理解のために、後述する境界候補となるノードを示すための矢印を付してある。Ｓ１２，Ｓ１５，Ｓ２２，Ｓ３２に付された白い矢印は、境界であると判断されるノードを示す。Ｓ１４に付された黒い矢印は、境界ではないと判断されたノードを示す。
【００３２】
図３は、分析対象プログラムを実行するためのプログラム実行装置５のハードウェア構成を示す。プログラム実行装置５も図１で述べたプログラム分析装置１と同様に、例えば、記憶部５１と、ＣＰＵ５２と、メモリ５３と、入力部５４と、出力部５５と、通信部５６とを備える。
【００３３】
ハードディスクドライブまたはフラッシュメモリデバイス等から構成可能な記憶部５１には、分析対象のソースコード２１をコンパイルした結果である、分析対象プログラム５０が格納されている。
【００３４】
メモリ５３は、分析対象プログラム５０により利用される共有メモリデータ６１−６５を記憶する。共有メモリデータには、プログラム間で共有する列車情報（ＴｒａｉｎＡｒｒａｙ）６１と、駅情報（ＳｔａｔｉｏｎＡｒｒａｙ）６２と、ダイヤ情報（ＴｉｍｅｔａｂｌｅＡｒｒａｙ）６３と、進路情報（ＲｏｕｔｅＡｒｒａｙ）６４と、信号機情報（ＳｉｇｎａｌＡｒｒａｙ）６５とがある。
【００３５】
ＣＰＵ５２は、記憶部５１からプログラム５０をメモリ５３にロードして実行する。プログラム５０は、共有データ６１−６５を適宜利用しながら、所定の機能を実現する。
【００３６】
図４は、分析対象プログラム５０のソースコード２１（分析対象ソースコード）の基本動作を模式的に示す。通常の場合、情報制御システムは、入力データを受け取り、その内容をチェックし、制御対象が適切に動作するように出力データを作成するという、基本動作を有する。図４では、入力データを複数回チェックして、それぞれ出力データを作成している。
【００３７】
基本動作に着目することにより、ソースコード２１に含まれているロジック処理とデータアクセス処理とを分離可能である。例えば、ロジック処理は、基本的に、ｉｆ文またはｓｗｉｔｃｈ文のような、条件文を組み合わせて構成される。図４の例では、入力データをチェックする部分がロジック処理である。
【００３８】
条件文の中では、入力となるデータアクセス部からのデータを参照する。また、出力部では、データアクセス部に対して出力値を設定する。制御プログラムの有する基本的構成に鑑みると、ロジック処理とデータアクセス処理との境界部分は、条件文の条件部または代入文の左辺に現れる。
【００３９】
データアクセス処理からロジック処理に移る入力側境界は、ｉｆ文またはｓｗｉｔｃｈ文など条件文または所定の関数で検出可能である。所定の関数としては、例えば、２つのメモリ値を比較する関数、２つの時間を比較する関数などを挙げることができる。それらの関数による比較結果を条件文の条件部にて評価する。それらの関数についても、条件文と同様に扱うものとする。一方、ロジック処理からデータアクセス処理に移る出力側境界は、代入文または所定の関数で検出可能である。所定の関数としては、例えば、メモリコピー関数のように代入文を使わずに値をセットすることができる関数を挙げることができる。それらの関数についても、代入文と同様に扱うものとする。
【００４０】
図５は、共有メモリデータ６１−６５の情報を管理する共有メモリ情報２２である。共有メモリデータは、分析対象プログラムにより利用される。
【００４１】
共有メモリ情報２２は、例えば、データ名２２１と、共有メモリ変数名２２２と、プライマリキー（図中「ＰＫ」）２２３と、属性名２２４と、属性メンバ名２２５とを保持している。データ名２２１は、データ種別を示す情報である。共有メモリ変数名２２２は、共有メモリにアクセスするときに使用する変数の名称である。プライマリキー２２３は、データ種別ごとに共有メモリ上のデータに一意にアクセスするための情報である。属性名２２４とは、データの属性を示す。属性メンバ名２２５とは、属性にアクセスするときのメンバ名である。
【００４２】
共有メモリ上のデータにアクセスする場合には、例えば、図２のソースコード２１の２行目に示すように、変数名２２２に示す変数名「ＴｒａｉｎＡｒｒａｙ」を利用する。さらに、そのデータの属性にアクセスする場合には、図２のソースコード２１の３行目に示すように、メンバ名２２５で示した「ＴｒａｉｎＩｄ」及び「ＳｔａｔｉｏｎＩｄ」を利用する。
【００４３】
変数名により共有メモリを特定する場合を説明したが、これに代えて、共有メモリ上のデータのアドレスを取得するための「ＧｅｔＳｈａｒｅｄＭｅｍｏｒｙ（ＴＹＰＥ＿ＴＲＡＩＮ, ｔｒａｉｎＩｄ）」または「ＧｅｔＴｒａｉｎ（ｔｒａｉｎＩｄ）」などのアクセス関数を用意し、そのアクセス関数を介して共有メモリ上のデータにアクセスしても良い。
【００４４】
ＧｅｔＳｈａｒｅｄＭｅｍｏｒｙは、データを識別するＩＤとＰＫを引数にとり、その引数に対応する共有メモリ上のデータを返す関数である。ＧｅｔＴｒａｉｎは、共有メモリ上の列車情報を取得する専用の関数であり、ＰＫである列車番号を引数にとり、その引数に対応する共有メモリ上の列車情報を返す。このような関数を用いる場合、図４の共有メモリ情報２２は、データを識別するＩＤ、および、アクセス関数の名前を保持する。
【００４５】
図６は、ソースコード２１に出現するデータとそのデータの分類とを示す、データ種別情報２３の構成例である。データ種別情報２３は、図７で後述する分離処理により抽出された処理がロジック処理であるか、それともデータアクセス処理であるかを判別するために使用される。
【００４６】
ソースコード２１に出現するデータの種別としては、制御対象ＩＤ  ２３１と、共有メモリのデータ２３２と、定数値（配列インデックス）２３３と、定数値（配列インデックス除く）２３４と、繰り返し文インデックス２３５とがある。一時的に利用するローカル変数は、データ種別に含めない。
【００４７】
制御対象ＩＤ  ２３１は、引数として与えられる制御対象を識別するための識別子である。定数値２３３は、配列のインデックスとして使用する定数値である。定数値２３４は、配列インデックス以外として使用する定数値である。繰り返し文インデックス２３５は、ｆｏｒ文などの繰返文のインデックスである。
【００４８】
制御対象ＩＤ  ２３１と、共有メモリ上のデータ２３２と、配列のインデックスとして使用する定数値２３３と、繰り返し文のインデックス２３５とは、データアクセス処理として分類される。配列インデックス以外に使用される定数値２３４は、ロジック処理として分類される。
【００４９】
図７は、分析プログラム３１が実行する分離処理を示すフローチャートである。分離処理では、以下に述べるように、分析対象プログラムのソースコード２１を、ロジック処理を記述するコードとデータアクセス処理を記述するコードとに分離する。分析プログラム３１は、分析対象プログラムのソースコード２１及び共有メモリ情報２２を入力とし、ユーザからの指示で起動する。分析プログラム３１は、ＣＰＵ１２に読み込まれて実行されることで、分離処理を実現する。ＣＰＵ１２は、プログラム分析装置１の頭脳である。従って、分離処理の動作の主体は、分析プログラム、ＣＰＵ、プログラム分析装置のいずれでもよい。ここでは、分析プログラムを主語として説明する。
【００５０】
本実施形態では、ソースコードを構成する構文要素として「ノード」という概念を使用する。ノードとは、ソースコード中の代入文もしくは関数呼出文などの文、または、条件文もしくは繰返文の条件部などの命令を示す。
【００５１】
また、特殊なノードとして、関数の引数に対応するノード、関数の戻り値に対応するノード、共有メモリ上の変数に対応するノードがある。
【００５２】
ノードは、ノードを一意に識別するノードＩＤを持つ。ここでは、文および条件部について、「Ｓ」＋行番号をノードＩＤとして設定する。関数の引数に対応するノードには、「関数名」＋「＿ｐｉｎ_」＋「引数名」をノードＩＤとして設定する。関数の戻り値に対応するノードには、「関数名」＋「＿ｅｘｉｔ」をノードＩＤとして設定する。共有メモリ上の変数に対応するノードには、「ｇｉｎ＿」＋「変数名」をノードＩＤとして設定する。
【００５３】
まず最初に、分析プログラム３１は、ロジック処理とデータアクセス処理の境界となる箇所の候補を抽出する（Ｓ１００）。抽出された境界候補情報は、図８に示す境界候補情報２４に登録される。
【００５４】
図８を参照する。境界候補情報２４は、例えば、ノードＩＤ２４ａと、変数名２４ｂと、分類２４ｃと、可否フラグ２４ｄと、データアクセスコード２４ｅと、用語名２４ｆとを管理する。
【００５５】
ノードＩＤ２４ａは、境界候補が現れる、ソースコード上の位置を示す。変数名２４ｂは、境界候補で直接参照している変数の名を示す。分類２４ｃは、境界候補が入力側の境界候補であるか、それとも出力側の境界候補であるかの種別を示す。
【００５６】
可否フラグ２４ｄは、境界候補を、ロジック処理とデータアクセス処理の境界として判定したか否かを示す。データアクセスコード２４ｅは、境界候補を境界と判定した場合に、境界候補から呼び出すデータアクセスに対応する。用語名２４ｆは、境界でのデータアクセスを識別するための情報であり、「データアクセス用情報」の一例である。
【００５７】
図４で示したように、ロジック処理とデータアクセス処理の境界は、条件文の条件部及び代入文に現れる。境界を検出するために、分析プログラム３１は、図２のソースコード２１の中から、条件文の条件部で参照している箇所と、ローカル変数以外に代入されている代入文の箇所とを、境界候補としてリストアップする。
【００５８】
図７のＳ１００では、境界候補情報２４のうち、ノードＩＤ２４ａ及び変数名２４ｂを登録する。例えば、図２のソースコード２１の１２行目では、条件文の中で「ｔｉｍｅ１」を参照している。従って、分析プログラム３１は、境界候補情報２４に、境界候補２４１「ノードＩＤ：Ｓ１２、変数名：ｔｉｍｅ１、分類：入力」を登録する。図２のソースコード２１の１５行目では、変数「ｓｉｇｎａｌ１．Ｃｏｎｔｒｏｌ」に値を設定している。そこで、分析プログラム３１は、境界候補２４４「ノードＩＤ：Ｓ１５、変数名：ｓｉｇｎａｌ１．Ｃｏｎｔｒｏｌ、分類：出力」を境界候補情報２４に登録する。
【００５９】
分析プログラム３１は、分析対象プログラムのソースコード２１を、データ依存及び処理依存について分析する（Ｓ１０１）。調査された依存関係は、図９の依存関係情報２５に登録される。
【００６０】
図９を参照する。依存関係情報２５は、例えば、始点ＩＤ２５ａと、終点ＩＤ２５ｂと、依存関係２５ｃと、変数名２５ｄとを管理する。
【００６１】
始点ＩＤ２５ａは、依存関係の始点となるノードを識別する情報である。終点ＩＤ２５ｂは、依存関係の終点となるノードを識別する情報である。依存関係２５ｃは、依存関係の種別を示す情報である。依存関係の種別には、データ依存と、処理依存がある。変数名２５ｄは、データ依存の場合に依存関係を成り立たせる変数の名前である。
【００６２】
データ依存は、変数を宣言する部分からその変数を参照する部分への依存関係である。例えば、図２のソースコード２１の２行目で宣言している変数「ｔｒａｉｎ１」を、３行目で参照している。従って、分析プログラム３１は、依存関係情報２５に、データ依存２５３「始点ＩＤ：Ｓ２、終点ＩＤ：Ｓ３、依存関係：データ依存、変数名：ｔｒａｉｎ１」を登録する。
【００６３】
図２のソースコード２１の１行目で、関数Ｃｈｅｃｋの引数「ｔｒａｉｎＩｄ」は、２行目で参照しているため、依存関係情報２５にデータ依存２５１「始点ＩＤ：Ｃｈｅｃｋ_pin_ｔｒａｉｎＩｄ、終点ＩＤ：Ｓ２、依存関係：データ依存、変数名：ｔｒａｉｎＩｄ」を登録する。
【００６４】
図２のソースコード２１の２行目では、図５の共有メモリ情報２２の２２ａで宣言している共有メモリ「ＴｒａｉｎＡｒｒａｙ」を参照している。そこで、依存関係情報２５には、データ依存関係２５２「始点ＩＤ：ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ、終点ＩＤ：Ｓ２、依存関係：データ依存、変数名：ＴｒａｉｎＡｒｒａｙ」が登録される。
【００６５】
図２のソースコード２１の３３行目では、関数ＣｈｅｃｋＳｉｇｎａｌに対してｒｅｔｕｒｎを返している。この場合には、依存関係情報２５に、データ依存関係２５７「始点ＩＤ：Ｓ３３、終点ＩＤ：ＣｈｅｃｋＳｉｇｎａｌ＿ｅｘｉｔ、依存関係：データ依存、変数名：−」が登録される。
【００６６】
図２のソースコード２１の１３行目では、関数ＣｈｅｃｋＳｉｇｎａｌを実行して、戻り値を参照している。この場合には、依存関係情報２５に、データ依存関係２５８「始点ＩＤ：ＣｈｅｃｋＳｉｇｎａｌ＿ｅｘｉｔ、終点ＩＤ：Ｓ１３、依存関係：データ依存、変数名：−」を登録する。
【００６７】
処理依存は、制御構文における依存関係である。制御構文には、条件文と繰り返し文とがある。条件文には、例えば、ｉｆ文、ｓｗｉｔｃｈ文がある。繰り返し文には、ｗｈｉｌｅ文、ｆｏｒ文がある。条件文では、条件部から、条件成立時または不成立時に実行される文への制御依存ができる。繰返文では、条件部から、繰り返し実行される文への制御依存ができる。
【００６８】
例えば、図２のソースコード２１の１２行目の条件部が成立したとき、１３行目の文が実行される。従って、依存関係情報２５に、処理依存２５９「始点ＩＤ：Ｓ１２、終点ＩＤ：Ｓ１３、依存関係：処理依存、変数名：−」が登録される。
【００６９】
このように依存関係分析をした結果を纏めると、図２のソースコード２１について、図１０に示すプログラム依存グラフ（ＰＤＧ：Program Dependence Graph）２４ｐｇを作成できる。プログラム依存グラフは、ソースコード２１上の各ノードを、データ依存を示す線（図１０中の実線矢印）、または、処理依存を示す線（図１０中の点線矢印）で結びつけたものである。
【００７０】
図７に戻る。分析プログラム３１は、Ｓ１０３からＳ１０６までのステップを、Ｓ１００で抽出した境界候補ごとに実行する（Ｓ１０２）。
【００７１】
分析プログラム３１は、境界候補情報２４に対して、依存関係情報２５に登録されたデータ依存を参照する。これにより、分析プログラム３１は、境界候補となる変数名とデータ依存関係にある、ノード群を抽出する（Ｓ１０３）。
【００７２】
分析プログラム３１は、まず、境界候補を基準として、終点ＩＤと変数名が基準と合致するデータ依存を検索する。見つかった場合、そのデータ依存の始点ＩＤと合致するデータ依存を検索する。複数のデータ依存が見つかった場合には、見つかったデータ依存それぞれに対して実行する。これらの処理を、新たなデータ依存が見つからなくなるまで繰り返す。
【００７３】
例えば、境界候補情報２４の境界候補２４１「文ＩＤ：Ｓ１２、変数名：ｔｉｍｅ１」を基準として、図９の依存関係情報２５からデータ依存関係を検索すると、データ依存２５６「始点ＩＤ：Ｓ４、終点ＩＤ：Ｓ１２、変数名：ｔｉｍｅ１」が見つかる。
【００７４】
見つかったデータ依存２５６の「始点ＩＤ：Ｓ４」を終点に持つデータ依存関係を検索すると、データ依存２５５「始点ＩＤ：Ｓ３、終点ＩＤ：Ｓ４、変数名：ｔａｂｌｅ１」が見つかる。さらに、見つかったデータ依存２５５の「始点ＩＤ：Ｓ３」を終点に持つデータ依存を検索すると、データ依存２５３とデータ依存２５４が見つかる。
【００７５】
上述の処理を新たなデータ依存が見つからなくなるまで続けることにより、データ依存として、２５１、２５２、２５３、２５４、２５５、２５６が見つかる。また、データ依存に関係するノードとして、Ｃｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄ、ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ、ｇｉｎ＿ＴｉｍｅｔａｂｌｅＡｒｒａｙ、Ｓ２、Ｓ３、Ｓ４が見つかる。
【００７６】
これらのデータ依存を纏めると、図１１（ａ）のようなデータ依存グラフ２４１ｄｇを得る。図１１（ａ）のデータ依存グラフ２４１ｄｇは、図１０のプログラム依存グラフ２４ｐｇのサブグラフとなる。
【００７７】
他の境界候補情報２４に対しても、同様に実行する。例えば、境界情報２４３に対するデータ依存を纏めると、図１１（ｂ）のようなデータ依存グラフ２４３ｄｇとなる。
【００７８】
図７に戻る。分析プログラム３１は、図１０のデータ種別情報２３を用いることで、Ｓ１０３で抽出した処理がデータアクセス処理であるか否かを判定する（Ｓ１０４）。Ｓ１０３で抽出したデータ依存グラフは、データ依存の流入のないノードの中でデータを宣言している。分析プログラム３１は、宣言しているデータの種類に基づいて、ロジック処理であるかデータアクセス処理であるかを判別する。
【００７９】
例えば、図１１（ａ）に示す境界候補２４１についてのデータ依存グラフ２４１ｄｇにおいて、データ依存の流入のないノードは、Ｃｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄ、ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ、ｇｉｎ＿ＴｉｍｅｔａｂｌｅＡｒｒａｙである。関数Ｃｈｅｃｋは、分析対象プログラムの基底となる関数である。関数Ｃｈｅｃｋの引数であるｔｒａｉｎＩｄは、制御対象を示す。従って、Ｃｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄで定義するｔｒａｉｎＩｄは、制御対象情報である。
【００８０】
図６のデータ種別情報２３を参照すると、制御対象ＩＤ２３１に示すように、制御対象情報は「データアクセス」であると定義されている。また、ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ及びｇｉｎ＿ＴｉｍｅｔａｂｌｅＡｒｒａｙは、共有メモリ上のデータである。図６のデータ種別情報２３を参照すると、共有メモリ２３２は「データアクセス」であると定義されている。
【００８１】
データ依存の流入のない全てのノードが「データアクセス」と定義されているため、分析プログラム３１は、境界情報２４１を基準とする処理を、データアクセス処理であると判別する。分析プログラム３１は、図８の境界候補２４１の可否フラグ２４ｄに「ＯＫ」を設定し、Ｓ１０５に進む。
【００８２】
一方、図１１（ｂ）に示す境界候補２４３についてのデータ依存グラフ２４３ｄｇにおいて、データ依存の流入のないノードは、Ｃｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄ、Ｓ３３、Ｓ３５である。Ｃｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄは、上記のように「データアクセス」に分類される。
【００８３】
これに対し、Ｓ３３は、図２の３３行目に示すように、定数ＯＫを参照している。Ｓ３５は、図２の３５行目に示すように、定数ＮＧを参照している。図６のデータ種別情報２３を参照すると、配列インデックスではない定数値２３４は、「ロジック」であると定義されている。分析プログラム３１は、データ依存の流入のないノードの一部（Ｓ３３，Ｓ３５）に「ロジック」と定義されるものが含まれているため、境界情報２４３を基点とする処理はロジック処理であると判別する（Ｓ１０４：ＮＯ）。分析プログラム３１は、図８の境界候補２４３の可否フラグ２４ｄに「ＮＧ」を設定した後、次の境界候補についてデータアクセスであるか否かを判定する（Ｓ１０３，Ｓ１０４）。
【００８４】
分析プログラム３１は、Ｓ１０４で可否フラグ２４ｄが「ＯＫ」となった境界候補情報２４について、依存関係情報２５の依存関係２５ｃを参照し、境界候補となる変数にアクセスするためのデータアクセス処理を抽出する（Ｓ１０５）。
【００８５】
分析プログラム３１は、まず、境界候補を基準として、終点ＩＤと変数名が基準と合致する、データ依存の依存情報を検索する。見つかった場合、分析プログラム３１は、その依存情報の始点ＩＤと合致する、データ依存及び処理依存を検索する。複数のデータ依存及び処理依存が見つかった場合、見つかったデータ依存及び処理依存のそれぞれに対して実行する。これを新たな依存情報が見つからなくなるまで繰り返す。
【００８６】
例えば、境界候補２４１に対して、依存関係の検索を進めると、図１２（ａ）のプログラム依存グラフ２４１ｐｇができる。プログラム依存グラフ２４１ｐｇは、ノードＣｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄ、ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ、ｇｉｎ＿ＴｉｍｅｔａｂｌｅＡｒｒａｙ、Ｓ２、Ｓ３、Ｓ４を含む。
【００８７】
図２のソースコード２１から、境界候補２４１のノードＳ４を除く、見つかった全てのノードに対する命令だけを抽出すると、図１３（ａ）のデータアクセス処理２６１を得られる。プログラム依存グラフ２４１ｐｇでは、データ依存の流入のない引数として、制御対象情報である列車の列車ＩＤを取る。従って、抽出されたデータアクセス処理２６１は、引数として列車ＩＤを取る。
【００８８】
さらに、境界候補２４１の分類２４ｃは「入力」である。また、境界候補２４１の変数名２４ｂに設定されている「ｔｉｍｅ１」の型は、Ｔｉｍｅである。従って、データアクセス処理２６１の戻り値の型は、Ｔｉｍｅとなる。分析プログラム３１は、抽出したデータアクセス処理２６１について、図８の境界候補２４１のデータアクセスコード２４ｅに「２６１」を登録する。
【００８９】
また、境界候補２４４に対して、依存関係の検索を進めると、図１２（ｂ）のプログラム依存グラフ２４４ｐｇができる。プログラム依存グラフ２４４ｐｇは、ノードＣｈｅｃｋ_ｐｉｎ_ｔｒａｉｎＩｄ、ｇｉｎ＿ＴｒａｉｎＡｒｒａｙ、ｇｉｎ＿ＲｏｕｔｅＡｒｒａｙ、ｇｉｎ＿ＳｉｇｎａｌＡｒｒａｙ、Ｓ２、Ｓ１０、Ｓ１１、Ｓ１５を含む。境界候補２４１のノードＳ１５を除く、見つかった他の全てのノードに対する命令だけを抽出すると、図１３（ｃ）のデータアクセス処理２６４を得る。
【００９０】
プログラム依存グラフ２４４ｐｇでは、データ依存の流入のない引数として、制御対象情報である列車の列車ＩＤを取る。従って、抽出されたデータアクセス２６４は、引数として列車ＩＤを取る。さらに、境界候補２４４は、その分類２４ｃが「出力」であるため、出力値を引数に持つ。
なお、Ｓ１０７により抽出したデータアクセス処理は、同一のコードがプログラムの他の部分にも出現し、重複したコードとなっている場合がある。そこで、抽出したデータアクセス処理間を比較することにより、同一の処理であるかを判定する。判定は、例えば、抽出したプログラム依存グラフで、ローカル変数名を除いて同一のグラフとなっているかで判定する。同一処理であると判定した場合には、図8の境界候補情報24のデータアクセスコード24eを１つに集約する。これにより、重複したデータアクセス処理を取り除くことができる。
【００９１】
同様にして、境界候補２４２に対しては、図１３（ｂ）のデータアクセス処理２６２を得る。境界候補２４５に対しては、図１３（ｄ）のデータアクセス処理２６５を得る。境界候補２４６に対しては、図１３（ｅ）のデータアクセス処理２６６を得る。
【００９２】
分析プログラム３１は、Ｓ１０５で抽出された各データアクセス処理について、データアクセス処理を識別するための用語名２４ｆを設定する（Ｓ１０６）。分析プログラム３１は、データアクセス処理内で参照される、共有メモリのデータ名及び属性名から、用語名２４ｆを作成する。
【００９３】
例えば、図１１（ａ）の境界候補２４１に対するデータ依存グラフ２４１ｄｇを参照すると、制御対象情報である列車ＩＤから処理が始まることがわかる。ノードＳ２において、共有メモリＴｒａｉｎＡｒｒａｙにアクセスしているため、分析プログラム３１は、図５の共有メモリ情報２２の２２ａからデータ名「列車」を取得する。
【００９４】
次に、ノードＳ３では、共有メモリＴｉｍｅｔａｂｌｅＡｒｒａｙにアクセスしているため、分析プログラム３１は、図５の共有メモリ情報２２の２２ｃから、データ名「ダイヤ」を取得する。
【００９５】
さらに、ノードＳ４では、共有メモリＴｉｍｅｔａｂｌｅＡｒｒａｙの属性ＳｔａｒｔＴｉｍｅにアクセスしているため、分析プログラム３１は、図５の共有メモリ情報２２の２２ｃ３の属性名「出発予定時刻」を取得する。
【００９６】
取得した名称を纏めることにより、分析プログラム３１は、境界候補２４１に対するデータアクセス処理の用語名として「列車_ダイヤ_出発予定時刻」を生成する。分析プログラム３１は、図８の境界候補情報２４のうち境界候補２４１に対応する用語名２４ｆに、「列車_ダイヤ_出発予定時刻」を登録する（Ｓ１０６）。分析プログラム３１は、他のデータアクセス処理についても、前記同様に用語名を生成し、図８の境界候補情報２４の用語名２４ｆに登録する。
【００９７】
分析プログラム３１は、ソースコード２１から、Ｓ１０５で抽出したデータアクセス処理を取り除くことで、ロジック処理を抽出する（Ｓ１０７）。分析プログラム３１は、可否フラグ２４ｄが「ＯＫ」に設定された境界候補情報２４について、ソースコード２１を、入力となる部分を「GｅｔＴｅｒｍ」に、出力となる部分を「ＳｅｔＴｅｒｍ」に置き換える。
【００９８】
分析プログラム３１は、GｅｔＴｅｒｍの第１引数に、データアクセスを識別する用語名を設定する。分析プログラム３１は、それ以降の引数に、データアクセスで参照する制御対象情報、または、繰返文インデックスを指定する。例えば、境界候補２４１は、「GｅｔＴｅｒｍ（“列車_ダイヤ_出発予定時刻”， ｔｒａｉｎＩｄ）」となる。
【００９９】
分析プログラム３１は、ＳｅｔＴｅｒｍの第１引数に、データアクセス処理を識別する用語名を指定する。第２引数には、設定値が指定される。第３以降の引数には、データアクセス処理で参照する制御対象情報、または、繰返文インデックスが指定される。例えば、境界候補２４３は、「ＳｅｔＴｅｒｍ（“列車_進路_信号機_制御情報”，ＯＫ，ｔｒａｉｎＩｄ）」となる。
【０１００】
次に、分析プログラム３１は、ソースコード２１に存在する文から、Ｓ１０５で抽出したデータアクセス処理に含まれる文を取り除く。例えば、図２のソースコード２１の２行目、３行目、４行目は、境界候補２４１のデータアクセス処理に含まれるため、分析プログラム３１は、２〜４行目をソースコード２１から取り除く。この結果、図１５に示すように、ロジック処理だけが残ったソースコードが得られる。
【０１０１】
分析プログラム３１は、ロジック処理とデータアクセス処理の分離結果を、出力部１５に表示する（Ｓ１０８）。
【０１０２】
図１６は、分析対象プログラムのソースコード２１を分析した結果を表示する分析結果画面４を示す。分析結果画面４は、例えば、ロジック表示部４１と、データアクセスリスト表示部４２と、データアクセス詳細表示部４３とを備える。
【０１０３】
ロジック表示部４１は、ソースコード２１から抽出されたロジック処理を表示する。データアクセスリスト表示部４２は、ソースコード２１から抽出されたデータアクセス処理のリストとして、境界候補情報２４の情報の少なくとも一部（例えば、用語名等）が表示される。リスト表示部４２で選択されたデータアクセス処理の詳細は、詳細表示部４３に表示される。
【０１０４】
このように構成される本実施形態によれば、入力データ及び出力データが不明確なコンピュータプログラムであっても、ロジック処理とデータアクセス処理とに分離することができる。さらに、重複したデータアクセスコードを取り除くことができる。従って、プログラムの構成を理解し易くなり、かつ、プログラムの修正時にはロジック処理に集中して作業すればよい。さらに、データアクセス処理とロジック処理とを分離できるため、間違えてデータアクセス処理を修正したりすることを防止できる。それらの結果として、本実施形態では、保守性の高いソースコードを自動的に生成することができる。
【０１０５】
なお、本発明は、上述した実施形態に限定されない。当業者であれば、本発明の範囲内で、種々の追加や変更等を行うことができる。
【０１０６】
本実施形態では、分析プログラム３１は、データアクセス処理に対して、用語名を設定した（Ｓ１０６）。データアクセス処理を一意に識別できればよいので、用語名に代えて、例えば、連続値等の任意の識別子をデータアクセス処理に設定しても良い。
【０１０７】
また、分析結果画面４のリスト表示部４２において、ユーザが用語名を変更できるようにしてもよい。さらに、分析結果画面４のリスト表示部４２において、ユーザが、データアクセス処理の可否を変更できるようにしてもよい。これにより、ユーザは、例えば、データアクセス処理であると自動判定されたものをロジック処理に変更したり、逆に、ロジック処理であると自動判定したものをデータアクセス処理に変更したりできる。この結果、ユーザは、ロジック処理とデータアクセス処理との分離を手動で調整できる。
【０１０８】
分析プログラム３１は、先に、ソースコード２１全体のデータ依存及び処理依存を分析し（Ｓ１０１）、その後のステップで依存種別を参照する場合を説明した。これに代えて、依存関係情報が必要となるステップで、関係する依存関係のみを分析する構成としても良い。
【０１０９】
本実施形態は、以下のように表現することもできる。
「ロジックとデータアクセスが混在したプログラムを、ロジックとデータアクセスに分離するソースコード解析装置であって、
前記プログラムのソースコードを入力として受け取り、
前記ソースコードの条件文の条件部と代入文とを検索して、前記条件文の条件部を入力側の境界候補として抽出し、前記代入文を出力側の境界候補として抽出し、
抽出された前記境界候補を基準として、データ依存関係のある処理群を抽出し、
抽出された前記処理群が参照するデータ種別に基づいて、データアクセスであるかを判定し、
データアクセスであると判定した前記境界候補を基準として、データ依存関係または処理依存関係を分析し、
依存関係のある処理をデータアクセスとして抽出し、
抽出した前記データアクセスを前記ソースコードから取り除き、前記データアクセスを呼び出すように所定の情報に置き換えたコードをロジックとして抽出し、
抽出した前記ロジックと抽出した前記データアクセスとを、解析結果として出力する、ソースコード解析装置。」
【符号の説明】
【０１１０】
１：コンピュータプログラム分析装置、３１：分析プログラム
【図１】
2012203726.tif 000003
【図２】
2012203726.tif 000004
【図３】
2012203726.tif 000005
【図４】
2012203726.tif 000006
【図５】
2012203726.tif 000007
【図６】
2012203726.tif 000008
【図７】
2012203726.tif 000009
【図８】
2012203726.tif 000010
【図９】
2012203726.tif 000011
【図１０】
2012203726.tif 000012
【図１１】
2012203726.tif 000013
【図１２】
2012203726.tif 000014
【図１３】
2012203726.tif 000015
【図１４】
2012203726.tif 000016
【図１５】
2012203726.tif 000017
【図１６】
2012203726.tif 000018