JP2012203726A - コンピュータプログラムの分析方法及び分析装置 - Google Patents
コンピュータプログラムの分析方法及び分析装置 Download PDFInfo
- Publication number
- JP2012203726A JP2012203726A JP2011068839A JP2011068839A JP2012203726A JP 2012203726 A JP2012203726 A JP 2012203726A JP 2011068839 A JP2011068839 A JP 2011068839A JP 2011068839 A JP2011068839 A JP 2011068839A JP 2012203726 A JP2012203726 A JP 2012203726A
- Authority
- JP
- Japan
- Prior art keywords
- data access
- data
- extracted
- source code
- computer program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Abstract
【課題】コンピュータプログラムをロジックとデータアクセスとに分離すること。
【解決手段】コンピュータは、コンピュータプログラムのソースコードを記憶部に記憶し、ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を抽出して保持する(S100)。コンピュータは、抽出された境界候補に基づいて、ソースコードからデータアクセス処理を抽出し(S102−S105)、抽出されたデータアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換え(S106)、ソースコードからロジック処理を抽出する(S107)。
【選択図】図7
【解決手段】コンピュータは、コンピュータプログラムのソースコードを記憶部に記憶し、ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を抽出して保持する(S100)。コンピュータは、抽出された境界候補に基づいて、ソースコードからデータアクセス処理を抽出し(S102−S105)、抽出されたデータアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換え(S106)、ソースコードからロジック処理を抽出する(S107)。
【選択図】図7
Description
本発明は、コンピュータプログラムの分析方法及び分析装置に関する。
コンピュータのハードウェアおよびソフトウェアは年々進歩している。一般的なアプリケーションプログラムの場合、オペレーティングシステムまたはハードウェア等の変化に追従すべく、作り直される。
これに対し、ある種のコンピュータプログラムは、長期間にわたって使用される。例えば、鉄道運行管理システムのような大規模な情報制御システムは、一度構築されると、その後10〜15年間程度は、既存のソースコードに手を加えない。必要な範囲内でコードを継ぎ足しながら、部分的に改造したり、改修したりする。
特に、情報制御システムの開発初期では、CPUやメモリなどのコンピュータリソースを十分に使用することができなかった。使用可能なコンピュータリソースの少ない時代に性能を発揮すべく、情報制御システムのプログラムは、共有メモリを利用する。共有メモリを使用するため、そのプログラムの中では、ロジック処理とデータアクセス処理とが分離されずに混在している。ロジック処理とデータアクセス処理とが混在しているため、そのプログラムは、可読性が低く、保守性も悪い。また、データアクセス処理が整理されないため、同一のデータアクセス処理がプログラムの様々な場所に出現することがある。そのため、プログラムが肥大化し、保守性の悪いものとなる。
一方、現在は、コンピュータリソースを十分に使用できるため、限られたコンピュータリソースで性能をできるだけ発揮させる必要性に乏しい。それよりもむしろ、可読性及び保守性の良いプログラムが求められている。
そこで、古い時代に作成されたプログラム資産(ソースコード)を、新しいコンピュータシステムに適したプログラム資産に変換することが求められている。
ところで、コンパイラで利用されるスライシング技術を活用して、目的にあったソースコードに変換することが知られている。コンパイラでは、命令間に、データ依存(DD:Data Dependence)または処理依存(CD:Control Dependence)などの依存関係があるかを分析する。コンパイラは、依存関係がない処理を抽出し、その実行順序を変更することで、プログラムを最適化する。
特許文献1では、データフロー分析によりデータ依存を分析する。これにより、入力データを直接参照する命令文から入力関連処理を分離し、出力データを直接参照する命令文から出力関連処理を分離し、出力データを直接更新する命令文から業務関連処理を分離するようになっている。
特許文献1に記載の従来技術は、入出力データが明確に分かっている場合を前提としている。しかし、複数タスクが共有メモリを介してデータを共有するような情報制御プログラムでは、各タスク間でどのデータを共有しているのかはわかるが、入力データがどれで、出力データがどれであるか、必ずしも明確ではない。そのため、情報制御プログラムでは、入出力データを基準として情報制御プログラム内から処理を分離することは、困難である。
そこで、本発明の目的は、入出力データが不明確な場合も、コンピュータプログラムを分析してロジック処理とデータアクセス処理とに分離することのできるコンピュータプログラムの分析方法及び分析装置を提供することにある。
上記課題を解決すべく、本発明に従うコンピュータプログラムを解析する方法は、コンピュータにより、コンピュータプログラムを分析するための方法であって、コンピュータは、(A)分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、(B)ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、(C)抽出された境界候補に基づいて、ソースコードからデータアクセス処理を抽出し、(D)抽出されたデータアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、ソースコードからロジック処理を抽出する。
さらに、コンピュータは、(E)ソースコードから抽出されたデータアクセス処理及びロジック処理を画面に出力させてもよい。
さらに、(C)では、(C1)境界候補を基準としてデータ依存関係のある処理を抽出し、(C2)データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出してもよい。
さらに、(B)では、(B1)条件文の条件部を入力側の境界候補として抽出し、(B2)代入文を出力側の境界候補として抽出してもよい。
データアクセス用情報は、抽出されたデータアクセス処理が参照するデータの名称に基づいて作成してもよい。
データアクセス用情報は、抽出されたデータアクセス処理が参照するデータの名称及びデータの参照順序に基づいて生成してもよい。
本発明は、コンピュータプログラムを分析する装置、または、コンピュータプログラムを分析するためのコンピュータプログラムとして把握することもできる。
以下、図面に基づいて、本発明の実施の形態を説明する。本実施形態では、後述のように、入力データを受け取り、入力データの内容をチェックして、制御対象が適切に動作するように出力データを作成するという、情報制御システムの基本動作に着目する。本実施形態では、例えば、条件文の条件部または代入文を基準として、ソースコードから、ロジック処理とデータアクセス処理との境界候補を検索する。
さらに、本実施形態では、境界候補を基準として、データ依存関係または処理依存関係のある処理を、データアクセス処理として抽出する。本実施形態では、ソースコードからデータアクセス処理のコードを取り除いた残り部分を、ロジック処理として抽出する。このように、本実施形態では、入出力データが明確に分かっていない場合でも、プログラムをロジック処理とデータアクセス処理とに分離できる。
従って、プログラムを修正する場合は、ロジック処理に集中して作業できるため、修正作業の効率が向上する。さらに、ロジック処理とデータアクセス処理とを区別できるため、データアクセス処理の部分を間違えて修正してしまうという事態を防止できる。これにより、プログラムの修正ミスを少なくできる。また、抽出したデータアクセス処理間を比較することにより、同一のデータアクセスについては1つに纏めることができる。そのため、プログラム内の様々な場所に実装されているデータアクセス処理の重複を省くことができる。このように、本実施形態では、古いプログラムを分析して、可読性及び保守性の高い新しいプログラムを得ることができる。
以下、図面に従い、発明を実施するための形態について述べる。図1は、本実施例に係るプログラム分析装置1のシステム構成を示す。
プログラム分析装置1は、例えば、記憶部11と、マイクロプロセッサ(以下、CPU)12と、メモリ13と、入力部14と、出力部15と、通信部16とを含むコンピュータとして構成される。
記憶部11は、例えば、ハードディスクドライブまたはフラッシュメモリデバイスのような比較的大容量の記憶装置として構成される。記憶部11には、分析対象プログラムのソースコード21と、各種情報22−25と、分析対象ソースコードから分離されたデータアクセス処理のコード26と、分析対象ソースコードから分離されたロジック処理のコード27と、分析プログラム31とが記憶される。
CPU12は、分析プログラム31を実行することにより、分析対象ソースコードからロジック処理とデータアクセス処理とを分離する機能を実現する。分析プログラム31は、記憶部11からメモリ13に転送されて、CPU12により実行される。メモリ13には、作業領域も設けられる。
入力部14は、ユーザからの情報または指示を受け付けるための装置である。入力部14としては、例えば、キーボード、マウス等のポインティングデバイス、タッチパネル、マイクロフォン等のいずれか一つまたは複数を用いることができる。出力部15は、ユーザに情報を提示したりするための装置である。出力部15としては、例えば、ディスプレイ装置、スピーカー、プリンタ等のいずれか一つまたは複数を用いることができる。
通信部16は、例えば、LAN(Local Area Network)またはインターネットのような通信ネットワークと接続して通信するための回路である。
なお、プログラム分析装置1に接続されるコンピュータ端末を用いて、ユーザとプログラム分析装置1とが情報を交換する構成としてもよい。その場合、プログラム分析装置1から入力部14及び出力部15を取り除くことができる。さらに、図1では、一台のコンピュータからプログラム分析装置1を構成する例を示すが、これに限らず、複数のコンピュータを連携させることで一つのプログラム分析装置1を構成してもよい。
図2は、分析対象プログラムのソースコード21の例を示す。ソースコード21は、制御対象となる列車を識別する列車IDを引数として取得し、列車の状態及び信号機の状態などをチェックし、信号機に制御指示を出力する。ソースコードの左側には、各行(各ノード)を識別するための連続数字を付してある。
さらに、連続数字のさらに左側には、本実施形態の理解のために、後述する境界候補となるノードを示すための矢印を付してある。S12,S15,S22,S32に付された白い矢印は、境界であると判断されるノードを示す。S14に付された黒い矢印は、境界ではないと判断されたノードを示す。
図3は、分析対象プログラムを実行するためのプログラム実行装置5のハードウェア構成を示す。プログラム実行装置5も図1で述べたプログラム分析装置1と同様に、例えば、記憶部51と、CPU52と、メモリ53と、入力部54と、出力部55と、通信部56とを備える。
ハードディスクドライブまたはフラッシュメモリデバイス等から構成可能な記憶部51には、分析対象のソースコード21をコンパイルした結果である、分析対象プログラム50が格納されている。
メモリ53は、分析対象プログラム50により利用される共有メモリデータ61−65を記憶する。共有メモリデータには、プログラム間で共有する列車情報(TrainArray)61と、駅情報(StationArray)62と、ダイヤ情報(TimetableArray)63と、進路情報(RouteArray)64と、信号機情報(SignalArray)65とがある。
CPU52は、記憶部51からプログラム50をメモリ53にロードして実行する。プログラム50は、共有データ61−65を適宜利用しながら、所定の機能を実現する。
図4は、分析対象プログラム50のソースコード21(分析対象ソースコード)の基本動作を模式的に示す。通常の場合、情報制御システムは、入力データを受け取り、その内容をチェックし、制御対象が適切に動作するように出力データを作成するという、基本動作を有する。図4では、入力データを複数回チェックして、それぞれ出力データを作成している。
基本動作に着目することにより、ソースコード21に含まれているロジック処理とデータアクセス処理とを分離可能である。例えば、ロジック処理は、基本的に、if文またはswitch文のような、条件文を組み合わせて構成される。図4の例では、入力データをチェックする部分がロジック処理である。
条件文の中では、入力となるデータアクセス部からのデータを参照する。また、出力部では、データアクセス部に対して出力値を設定する。制御プログラムの有する基本的構成に鑑みると、ロジック処理とデータアクセス処理との境界部分は、条件文の条件部または代入文の左辺に現れる。
データアクセス処理からロジック処理に移る入力側境界は、if文またはswitch文など条件文または所定の関数で検出可能である。所定の関数としては、例えば、2つのメモリ値を比較する関数、2つの時間を比較する関数などを挙げることができる。それらの関数による比較結果を条件文の条件部にて評価する。それらの関数についても、条件文と同様に扱うものとする。一方、ロジック処理からデータアクセス処理に移る出力側境界は、代入文または所定の関数で検出可能である。所定の関数としては、例えば、メモリコピー関数のように代入文を使わずに値をセットすることができる関数を挙げることができる。それらの関数についても、代入文と同様に扱うものとする。
図5は、共有メモリデータ61−65の情報を管理する共有メモリ情報22である。共有メモリデータは、分析対象プログラムにより利用される。
共有メモリ情報22は、例えば、データ名221と、共有メモリ変数名222と、プライマリキー(図中「PK」)223と、属性名224と、属性メンバ名225とを保持している。データ名221は、データ種別を示す情報である。共有メモリ変数名222は、共有メモリにアクセスするときに使用する変数の名称である。プライマリキー223は、データ種別ごとに共有メモリ上のデータに一意にアクセスするための情報である。属性名224とは、データの属性を示す。属性メンバ名225とは、属性にアクセスするときのメンバ名である。
共有メモリ上のデータにアクセスする場合には、例えば、図2のソースコード21の2行目に示すように、変数名222に示す変数名「TrainArray」を利用する。さらに、そのデータの属性にアクセスする場合には、図2のソースコード21の3行目に示すように、メンバ名225で示した「TrainId」及び「StationId」を利用する。
変数名により共有メモリを特定する場合を説明したが、これに代えて、共有メモリ上のデータのアドレスを取得するための「GetSharedMemory(TYPE_TRAIN, trainId)」または「GetTrain(trainId)」などのアクセス関数を用意し、そのアクセス関数を介して共有メモリ上のデータにアクセスしても良い。
GetSharedMemoryは、データを識別するIDとPKを引数にとり、その引数に対応する共有メモリ上のデータを返す関数である。GetTrainは、共有メモリ上の列車情報を取得する専用の関数であり、PKである列車番号を引数にとり、その引数に対応する共有メモリ上の列車情報を返す。このような関数を用いる場合、図4の共有メモリ情報22は、データを識別するID、および、アクセス関数の名前を保持する。
図6は、ソースコード21に出現するデータとそのデータの分類とを示す、データ種別情報23の構成例である。データ種別情報23は、図7で後述する分離処理により抽出された処理がロジック処理であるか、それともデータアクセス処理であるかを判別するために使用される。
ソースコード21に出現するデータの種別としては、制御対象ID 231と、共有メモリのデータ232と、定数値(配列インデックス)233と、定数値(配列インデックス除く)234と、繰り返し文インデックス235とがある。一時的に利用するローカル変数は、データ種別に含めない。
制御対象ID 231は、引数として与えられる制御対象を識別するための識別子である。定数値233は、配列のインデックスとして使用する定数値である。定数値234は、配列インデックス以外として使用する定数値である。繰り返し文インデックス235は、for文などの繰返文のインデックスである。
制御対象ID 231と、共有メモリ上のデータ232と、配列のインデックスとして使用する定数値233と、繰り返し文のインデックス235とは、データアクセス処理として分類される。配列インデックス以外に使用される定数値234は、ロジック処理として分類される。
図7は、分析プログラム31が実行する分離処理を示すフローチャートである。分離処理では、以下に述べるように、分析対象プログラムのソースコード21を、ロジック処理を記述するコードとデータアクセス処理を記述するコードとに分離する。分析プログラム31は、分析対象プログラムのソースコード21及び共有メモリ情報22を入力とし、ユーザからの指示で起動する。分析プログラム31は、CPU12に読み込まれて実行されることで、分離処理を実現する。CPU12は、プログラム分析装置1の頭脳である。従って、分離処理の動作の主体は、分析プログラム、CPU、プログラム分析装置のいずれでもよい。ここでは、分析プログラムを主語として説明する。
本実施形態では、ソースコードを構成する構文要素として「ノード」という概念を使用する。ノードとは、ソースコード中の代入文もしくは関数呼出文などの文、または、条件文もしくは繰返文の条件部などの命令を示す。
また、特殊なノードとして、関数の引数に対応するノード、関数の戻り値に対応するノード、共有メモリ上の変数に対応するノードがある。
ノードは、ノードを一意に識別するノードIDを持つ。ここでは、文および条件部について、「S」+行番号をノードIDとして設定する。関数の引数に対応するノードには、「関数名」+「_pin_」+「引数名」をノードIDとして設定する。関数の戻り値に対応するノードには、「関数名」+「_exit」をノードIDとして設定する。共有メモリ上の変数に対応するノードには、「gin_」+「変数名」をノードIDとして設定する。
まず最初に、分析プログラム31は、ロジック処理とデータアクセス処理の境界となる箇所の候補を抽出する(S100)。抽出された境界候補情報は、図8に示す境界候補情報24に登録される。
図8を参照する。境界候補情報24は、例えば、ノードID24aと、変数名24bと、分類24cと、可否フラグ24dと、データアクセスコード24eと、用語名24fとを管理する。
ノードID24aは、境界候補が現れる、ソースコード上の位置を示す。変数名24bは、境界候補で直接参照している変数の名を示す。分類24cは、境界候補が入力側の境界候補であるか、それとも出力側の境界候補であるかの種別を示す。
可否フラグ24dは、境界候補を、ロジック処理とデータアクセス処理の境界として判定したか否かを示す。データアクセスコード24eは、境界候補を境界と判定した場合に、境界候補から呼び出すデータアクセスに対応する。用語名24fは、境界でのデータアクセスを識別するための情報であり、「データアクセス用情報」の一例である。
図4で示したように、ロジック処理とデータアクセス処理の境界は、条件文の条件部及び代入文に現れる。境界を検出するために、分析プログラム31は、図2のソースコード21の中から、条件文の条件部で参照している箇所と、ローカル変数以外に代入されている代入文の箇所とを、境界候補としてリストアップする。
図7のS100では、境界候補情報24のうち、ノードID24a及び変数名24bを登録する。例えば、図2のソースコード21の12行目では、条件文の中で「time1」を参照している。従って、分析プログラム31は、境界候補情報24に、境界候補241「ノードID:S12、変数名:time1、分類:入力」を登録する。図2のソースコード21の15行目では、変数「signal1.Control」に値を設定している。そこで、分析プログラム31は、境界候補244「ノードID:S15、変数名:signal1.Control、分類:出力」を境界候補情報24に登録する。
分析プログラム31は、分析対象プログラムのソースコード21を、データ依存及び処理依存について分析する(S101)。調査された依存関係は、図9の依存関係情報25に登録される。
図9を参照する。依存関係情報25は、例えば、始点ID25aと、終点ID25bと、依存関係25cと、変数名25dとを管理する。
始点ID25aは、依存関係の始点となるノードを識別する情報である。終点ID25bは、依存関係の終点となるノードを識別する情報である。依存関係25cは、依存関係の種別を示す情報である。依存関係の種別には、データ依存と、処理依存がある。変数名25dは、データ依存の場合に依存関係を成り立たせる変数の名前である。
データ依存は、変数を宣言する部分からその変数を参照する部分への依存関係である。例えば、図2のソースコード21の2行目で宣言している変数「train1」を、3行目で参照している。従って、分析プログラム31は、依存関係情報25に、データ依存253「始点ID:S2、終点ID:S3、依存関係:データ依存、変数名:train1」を登録する。
図2のソースコード21の1行目で、関数Checkの引数「trainId」は、2行目で参照しているため、依存関係情報25にデータ依存251「始点ID:Check_pin_trainId、終点ID:S2、依存関係:データ依存、変数名:trainId」を登録する。
図2のソースコード21の2行目では、図5の共有メモリ情報22の22aで宣言している共有メモリ「TrainArray」を参照している。そこで、依存関係情報25には、データ依存関係252「始点ID:gin_TrainArray、終点ID:S2、依存関係:データ依存、変数名:TrainArray」が登録される。
図2のソースコード21の33行目では、関数CheckSignalに対してreturnを返している。この場合には、依存関係情報25に、データ依存関係257「始点ID:S33、終点ID:CheckSignal_exit、依存関係:データ依存、変数名:−」が登録される。
図2のソースコード21の13行目では、関数CheckSignalを実行して、戻り値を参照している。この場合には、依存関係情報25に、データ依存関係258「始点ID:CheckSignal_exit、終点ID:S13、依存関係:データ依存、変数名:−」を登録する。
処理依存は、制御構文における依存関係である。制御構文には、条件文と繰り返し文とがある。条件文には、例えば、if文、switch文がある。繰り返し文には、while文、for文がある。条件文では、条件部から、条件成立時または不成立時に実行される文への制御依存ができる。繰返文では、条件部から、繰り返し実行される文への制御依存ができる。
例えば、図2のソースコード21の12行目の条件部が成立したとき、13行目の文が実行される。従って、依存関係情報25に、処理依存259「始点ID:S12、終点ID:S13、依存関係:処理依存、変数名:−」が登録される。
このように依存関係分析をした結果を纏めると、図2のソースコード21について、図10に示すプログラム依存グラフ(PDG:Program Dependence Graph)24pgを作成できる。プログラム依存グラフは、ソースコード21上の各ノードを、データ依存を示す線(図10中の実線矢印)、または、処理依存を示す線(図10中の点線矢印)で結びつけたものである。
図7に戻る。分析プログラム31は、S103からS106までのステップを、S100で抽出した境界候補ごとに実行する(S102)。
分析プログラム31は、境界候補情報24に対して、依存関係情報25に登録されたデータ依存を参照する。これにより、分析プログラム31は、境界候補となる変数名とデータ依存関係にある、ノード群を抽出する(S103)。
分析プログラム31は、まず、境界候補を基準として、終点IDと変数名が基準と合致するデータ依存を検索する。見つかった場合、そのデータ依存の始点IDと合致するデータ依存を検索する。複数のデータ依存が見つかった場合には、見つかったデータ依存それぞれに対して実行する。これらの処理を、新たなデータ依存が見つからなくなるまで繰り返す。
例えば、境界候補情報24の境界候補241「文ID:S12、変数名:time1」を基準として、図9の依存関係情報25からデータ依存関係を検索すると、データ依存256「始点ID:S4、終点ID:S12、変数名:time1」が見つかる。
見つかったデータ依存256の「始点ID:S4」を終点に持つデータ依存関係を検索すると、データ依存255「始点ID:S3、終点ID:S4、変数名:table1」が見つかる。さらに、見つかったデータ依存255の「始点ID:S3」を終点に持つデータ依存を検索すると、データ依存253とデータ依存254が見つかる。
上述の処理を新たなデータ依存が見つからなくなるまで続けることにより、データ依存として、251、252、253、254、255、256が見つかる。また、データ依存に関係するノードとして、Check_pin_trainId、gin_TrainArray、gin_TimetableArray、S2、S3、S4が見つかる。
これらのデータ依存を纏めると、図11(a)のようなデータ依存グラフ241dgを得る。図11(a)のデータ依存グラフ241dgは、図10のプログラム依存グラフ24pgのサブグラフとなる。
他の境界候補情報24に対しても、同様に実行する。例えば、境界情報243に対するデータ依存を纏めると、図11(b)のようなデータ依存グラフ243dgとなる。
図7に戻る。分析プログラム31は、図10のデータ種別情報23を用いることで、S103で抽出した処理がデータアクセス処理であるか否かを判定する(S104)。S103で抽出したデータ依存グラフは、データ依存の流入のないノードの中でデータを宣言している。分析プログラム31は、宣言しているデータの種類に基づいて、ロジック処理であるかデータアクセス処理であるかを判別する。
例えば、図11(a)に示す境界候補241についてのデータ依存グラフ241dgにおいて、データ依存の流入のないノードは、Check_pin_trainId、gin_TrainArray、gin_TimetableArrayである。関数Checkは、分析対象プログラムの基底となる関数である。関数Checkの引数であるtrainIdは、制御対象を示す。従って、Check_pin_trainIdで定義するtrainIdは、制御対象情報である。
図6のデータ種別情報23を参照すると、制御対象ID231に示すように、制御対象情報は「データアクセス」であると定義されている。また、gin_TrainArray及びgin_TimetableArrayは、共有メモリ上のデータである。図6のデータ種別情報23を参照すると、共有メモリ232は「データアクセス」であると定義されている。
データ依存の流入のない全てのノードが「データアクセス」と定義されているため、分析プログラム31は、境界情報241を基準とする処理を、データアクセス処理であると判別する。分析プログラム31は、図8の境界候補241の可否フラグ24dに「OK」を設定し、S105に進む。
一方、図11(b)に示す境界候補243についてのデータ依存グラフ243dgにおいて、データ依存の流入のないノードは、Check_pin_trainId、S33、S35である。Check_pin_trainIdは、上記のように「データアクセス」に分類される。
これに対し、S33は、図2の33行目に示すように、定数OKを参照している。S35は、図2の35行目に示すように、定数NGを参照している。図6のデータ種別情報23を参照すると、配列インデックスではない定数値234は、「ロジック」であると定義されている。分析プログラム31は、データ依存の流入のないノードの一部(S33,S35)に「ロジック」と定義されるものが含まれているため、境界情報243を基点とする処理はロジック処理であると判別する(S104:NO)。分析プログラム31は、図8の境界候補243の可否フラグ24dに「NG」を設定した後、次の境界候補についてデータアクセスであるか否かを判定する(S103,S104)。
分析プログラム31は、S104で可否フラグ24dが「OK」となった境界候補情報24について、依存関係情報25の依存関係25cを参照し、境界候補となる変数にアクセスするためのデータアクセス処理を抽出する(S105)。
分析プログラム31は、まず、境界候補を基準として、終点IDと変数名が基準と合致する、データ依存の依存情報を検索する。見つかった場合、分析プログラム31は、その依存情報の始点IDと合致する、データ依存及び処理依存を検索する。複数のデータ依存及び処理依存が見つかった場合、見つかったデータ依存及び処理依存のそれぞれに対して実行する。これを新たな依存情報が見つからなくなるまで繰り返す。
例えば、境界候補241に対して、依存関係の検索を進めると、図12(a)のプログラム依存グラフ241pgができる。プログラム依存グラフ241pgは、ノードCheck_pin_trainId、gin_TrainArray、gin_TimetableArray、S2、S3、S4を含む。
図2のソースコード21から、境界候補241のノードS4を除く、見つかった全てのノードに対する命令だけを抽出すると、図13(a)のデータアクセス処理261を得られる。プログラム依存グラフ241pgでは、データ依存の流入のない引数として、制御対象情報である列車の列車IDを取る。従って、抽出されたデータアクセス処理261は、引数として列車IDを取る。
さらに、境界候補241の分類24cは「入力」である。また、境界候補241の変数名24bに設定されている「time1」の型は、Timeである。従って、データアクセス処理261の戻り値の型は、Timeとなる。分析プログラム31は、抽出したデータアクセス処理261について、図8の境界候補241のデータアクセスコード24eに「261」を登録する。
また、境界候補244に対して、依存関係の検索を進めると、図12(b)のプログラム依存グラフ244pgができる。プログラム依存グラフ244pgは、ノードCheck_pin_trainId、gin_TrainArray、gin_RouteArray、gin_SignalArray、S2、S10、S11、S15を含む。境界候補241のノードS15を除く、見つかった他の全てのノードに対する命令だけを抽出すると、図13(c)のデータアクセス処理264を得る。
プログラム依存グラフ244pgでは、データ依存の流入のない引数として、制御対象情報である列車の列車IDを取る。従って、抽出されたデータアクセス264は、引数として列車IDを取る。さらに、境界候補244は、その分類24cが「出力」であるため、出力値を引数に持つ。
なお、S107により抽出したデータアクセス処理は、同一のコードがプログラムの他の部分にも出現し、重複したコードとなっている場合がある。そこで、抽出したデータアクセス処理間を比較することにより、同一の処理であるかを判定する。判定は、例えば、抽出したプログラム依存グラフで、ローカル変数名を除いて同一のグラフとなっているかで判定する。同一処理であると判定した場合には、図8の境界候補情報24のデータアクセスコード24eを1つに集約する。これにより、重複したデータアクセス処理を取り除くことができる。
なお、S107により抽出したデータアクセス処理は、同一のコードがプログラムの他の部分にも出現し、重複したコードとなっている場合がある。そこで、抽出したデータアクセス処理間を比較することにより、同一の処理であるかを判定する。判定は、例えば、抽出したプログラム依存グラフで、ローカル変数名を除いて同一のグラフとなっているかで判定する。同一処理であると判定した場合には、図8の境界候補情報24のデータアクセスコード24eを1つに集約する。これにより、重複したデータアクセス処理を取り除くことができる。
同様にして、境界候補242に対しては、図13(b)のデータアクセス処理262を得る。境界候補245に対しては、図13(d)のデータアクセス処理265を得る。境界候補246に対しては、図13(e)のデータアクセス処理266を得る。
分析プログラム31は、S105で抽出された各データアクセス処理について、データアクセス処理を識別するための用語名24fを設定する(S106)。分析プログラム31は、データアクセス処理内で参照される、共有メモリのデータ名及び属性名から、用語名24fを作成する。
例えば、図11(a)の境界候補241に対するデータ依存グラフ241dgを参照すると、制御対象情報である列車IDから処理が始まることがわかる。ノードS2において、共有メモリTrainArrayにアクセスしているため、分析プログラム31は、図5の共有メモリ情報22の22aからデータ名「列車」を取得する。
次に、ノードS3では、共有メモリTimetableArrayにアクセスしているため、分析プログラム31は、図5の共有メモリ情報22の22cから、データ名「ダイヤ」を取得する。
さらに、ノードS4では、共有メモリTimetableArrayの属性StartTimeにアクセスしているため、分析プログラム31は、図5の共有メモリ情報22の22c3の属性名「出発予定時刻」を取得する。
取得した名称を纏めることにより、分析プログラム31は、境界候補241に対するデータアクセス処理の用語名として「列車_ダイヤ_出発予定時刻」を生成する。分析プログラム31は、図8の境界候補情報24のうち境界候補241に対応する用語名24fに、「列車_ダイヤ_出発予定時刻」を登録する(S106)。分析プログラム31は、他のデータアクセス処理についても、前記同様に用語名を生成し、図8の境界候補情報24の用語名24fに登録する。
分析プログラム31は、ソースコード21から、S105で抽出したデータアクセス処理を取り除くことで、ロジック処理を抽出する(S107)。分析プログラム31は、可否フラグ24dが「OK」に設定された境界候補情報24について、ソースコード21を、入力となる部分を「GetTerm」に、出力となる部分を「SetTerm」に置き換える。
分析プログラム31は、GetTermの第1引数に、データアクセスを識別する用語名を設定する。分析プログラム31は、それ以降の引数に、データアクセスで参照する制御対象情報、または、繰返文インデックスを指定する。例えば、境界候補241は、「GetTerm(“列車_ダイヤ_出発予定時刻”, trainId)」となる。
分析プログラム31は、SetTermの第1引数に、データアクセス処理を識別する用語名を指定する。第2引数には、設定値が指定される。第3以降の引数には、データアクセス処理で参照する制御対象情報、または、繰返文インデックスが指定される。例えば、境界候補243は、「SetTerm(“列車_進路_信号機_制御情報”,OK,trainId)」となる。
次に、分析プログラム31は、ソースコード21に存在する文から、S105で抽出したデータアクセス処理に含まれる文を取り除く。例えば、図2のソースコード21の2行目、3行目、4行目は、境界候補241のデータアクセス処理に含まれるため、分析プログラム31は、2〜4行目をソースコード21から取り除く。この結果、図15に示すように、ロジック処理だけが残ったソースコードが得られる。
分析プログラム31は、ロジック処理とデータアクセス処理の分離結果を、出力部15に表示する(S108)。
図16は、分析対象プログラムのソースコード21を分析した結果を表示する分析結果画面4を示す。分析結果画面4は、例えば、ロジック表示部41と、データアクセスリスト表示部42と、データアクセス詳細表示部43とを備える。
ロジック表示部41は、ソースコード21から抽出されたロジック処理を表示する。データアクセスリスト表示部42は、ソースコード21から抽出されたデータアクセス処理のリストとして、境界候補情報24の情報の少なくとも一部(例えば、用語名等)が表示される。リスト表示部42で選択されたデータアクセス処理の詳細は、詳細表示部43に表示される。
このように構成される本実施形態によれば、入力データ及び出力データが不明確なコンピュータプログラムであっても、ロジック処理とデータアクセス処理とに分離することができる。さらに、重複したデータアクセスコードを取り除くことができる。従って、プログラムの構成を理解し易くなり、かつ、プログラムの修正時にはロジック処理に集中して作業すればよい。さらに、データアクセス処理とロジック処理とを分離できるため、間違えてデータアクセス処理を修正したりすることを防止できる。それらの結果として、本実施形態では、保守性の高いソースコードを自動的に生成することができる。
なお、本発明は、上述した実施形態に限定されない。当業者であれば、本発明の範囲内で、種々の追加や変更等を行うことができる。
本実施形態では、分析プログラム31は、データアクセス処理に対して、用語名を設定した(S106)。データアクセス処理を一意に識別できればよいので、用語名に代えて、例えば、連続値等の任意の識別子をデータアクセス処理に設定しても良い。
また、分析結果画面4のリスト表示部42において、ユーザが用語名を変更できるようにしてもよい。さらに、分析結果画面4のリスト表示部42において、ユーザが、データアクセス処理の可否を変更できるようにしてもよい。これにより、ユーザは、例えば、データアクセス処理であると自動判定されたものをロジック処理に変更したり、逆に、ロジック処理であると自動判定したものをデータアクセス処理に変更したりできる。この結果、ユーザは、ロジック処理とデータアクセス処理との分離を手動で調整できる。
分析プログラム31は、先に、ソースコード21全体のデータ依存及び処理依存を分析し(S101)、その後のステップで依存種別を参照する場合を説明した。これに代えて、依存関係情報が必要となるステップで、関係する依存関係のみを分析する構成としても良い。
本実施形態は、以下のように表現することもできる。
「ロジックとデータアクセスが混在したプログラムを、ロジックとデータアクセスに分離するソースコード解析装置であって、
前記プログラムのソースコードを入力として受け取り、
前記ソースコードの条件文の条件部と代入文とを検索して、前記条件文の条件部を入力側の境界候補として抽出し、前記代入文を出力側の境界候補として抽出し、
抽出された前記境界候補を基準として、データ依存関係のある処理群を抽出し、
抽出された前記処理群が参照するデータ種別に基づいて、データアクセスであるかを判定し、
データアクセスであると判定した前記境界候補を基準として、データ依存関係または処理依存関係を分析し、
依存関係のある処理をデータアクセスとして抽出し、
抽出した前記データアクセスを前記ソースコードから取り除き、前記データアクセスを呼び出すように所定の情報に置き換えたコードをロジックとして抽出し、
抽出した前記ロジックと抽出した前記データアクセスとを、解析結果として出力する、ソースコード解析装置。」
「ロジックとデータアクセスが混在したプログラムを、ロジックとデータアクセスに分離するソースコード解析装置であって、
前記プログラムのソースコードを入力として受け取り、
前記ソースコードの条件文の条件部と代入文とを検索して、前記条件文の条件部を入力側の境界候補として抽出し、前記代入文を出力側の境界候補として抽出し、
抽出された前記境界候補を基準として、データ依存関係のある処理群を抽出し、
抽出された前記処理群が参照するデータ種別に基づいて、データアクセスであるかを判定し、
データアクセスであると判定した前記境界候補を基準として、データ依存関係または処理依存関係を分析し、
依存関係のある処理をデータアクセスとして抽出し、
抽出した前記データアクセスを前記ソースコードから取り除き、前記データアクセスを呼び出すように所定の情報に置き換えたコードをロジックとして抽出し、
抽出した前記ロジックと抽出した前記データアクセスとを、解析結果として出力する、ソースコード解析装置。」
1:コンピュータプログラム分析装置、31:分析プログラム
Claims (11)
- コンピュータにより、コンピュータプログラムを分析するための方法であって、
前記コンピュータは、
(A)分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、
(B)前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、
(C)抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出し、
(D)抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、前記ソースコードからロジック処理を抽出する、
コンピュータプログラムの分析方法。
- さらに、前記コンピュータは、
(E)前記ソースコードから抽出された前記データアクセス処理及び前記ロジック処理を画面に出力させる、
請求項1に記載のコンピュータプログラムの分析方法。
- 前記(C)では、
(C1)前記境界候補を基準としてデータ依存関係のある処理を抽出し、
(C2)前記データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出する、
請求項1または請求項2のいずれかに記載のコンピュータプログラムの分析方法。
- 前記(B)では、
(B1)条件文の条件部を入力側の境界候補として抽出し、
(B2)代入文を出力側の境界候補として抽出する、
請求項1〜3のいずれかに記載のコンピュータプログラムの分析方法。
- 前記データアクセス用情報は、抽出された前記データアクセス処理が参照するデータの名称に基づいて作成される、
請求項1〜4のいずれかに記載のコンピュータプログラムの分析方法。
- 前記データアクセス用情報は、抽出された前記データアクセス処理が参照する前記データの前記名称及び前記データの参照順序に基づいて生成される、
請求項5に記載のコンピュータプログラムの分析方法。
- 前記データアクセス処理により参照されるデータは、共有メモリに記憶されている、
請求項1〜6のいずれかに記載のコンピュータプログラムの分析方法。
- さらに、前記コンピュータは、
(F)ユーザからの指示に応じて、抽出された前記データアクセス処理を前記ソースコードに戻したり、または、前記ソースコードの中から指定された処理をデータアクセス処理として抽出したりする、
請求項1〜7のいずれかに記載のコンピュータプログラムの分析方法。
- コンピュータプログラムを分析するコンピュータプログラム分析装置であって、
所定の分析プログラムを格納する記憶部と、
前記所定の分析プログラムを実行するマイクロプロセッサとを備え、
前記マイクロプロセッサは、前記所定の分析プログラムを実行することにより、
(A)分析対象のコンピュータプログラムのソースコードを記憶部に記憶し、
(B)前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持し、
(C)抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出し、
(D)抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えることにより、前記ソースコードからロジック処理を抽出する、
コンピュータプログラム分析装置。
- 前記(C)では、
(C1)前記境界候補を基準としてデータ依存関係のある処理を抽出し、
(C2)前記データ依存関係のある処理が参照するデータの種別に基づいて、データアクセス処理を抽出する、
請求項9に記載のコンピュータプログラム分析装置。
- コンピュータを、分析対象コンピュータプログラムを分析するための装置として機能させるためのコンピュータプログラムであって、
前記コンピュータに、
(A)前記分析対象コンピュータプログラムのソースコードを記憶部に記憶させ、
(B)前記ソースコードから、ロジック処理とデータアクセス処理との間の境界を示す境界候補を少なくとも一つ以上抽出して保持させ、
(C)抽出された前記境界候補に基づいて、前記ソースコードからデータアクセス処理を抽出させ、
(D)抽出された前記データアクセス処理を、当該データアクセス処理を呼び出すためのデータアクセス用情報に置き換えさせて、前記ソースコードからロジック処理を抽出させる、
コンピュータプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011068839A JP2012203726A (ja) | 2011-03-25 | 2011-03-25 | コンピュータプログラムの分析方法及び分析装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011068839A JP2012203726A (ja) | 2011-03-25 | 2011-03-25 | コンピュータプログラムの分析方法及び分析装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012203726A true JP2012203726A (ja) | 2012-10-22 |
Family
ID=47184656
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011068839A Withdrawn JP2012203726A (ja) | 2011-03-25 | 2011-03-25 | コンピュータプログラムの分析方法及び分析装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2012203726A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2018181121A (ja) * | 2017-04-18 | 2018-11-15 | 富士通株式会社 | 分析装置、分析プログラム及び分析方法 |
-
2011
- 2011-03-25 JP JP2011068839A patent/JP2012203726A/ja not_active Withdrawn
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2018181121A (ja) * | 2017-04-18 | 2018-11-15 | 富士通株式会社 | 分析装置、分析プログラム及び分析方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8589884B2 (en) | Method and system for identifying regression test cases for a software | |
KR101732764B1 (ko) | 코드 클론 검출을 이용하는 지능형 코드 디퍼런싱을 수행하는 방법 및 시스템 | |
US8612372B2 (en) | Detection rule-generating facility | |
KR101106595B1 (ko) | 소프트웨어 테스트의 자동화 장치 및 그 방법 | |
JP2014503910A (ja) | コードクローンの通知およびアーキテクチャの変更の視覚化 | |
US20120266137A1 (en) | Method and apparatus to semantically connect independent build and test processes | |
US20130125098A1 (en) | Transformation of Computer Programs | |
US9389852B2 (en) | Technique for plagiarism detection in program source code files based on design pattern | |
JP6268029B2 (ja) | テストケース生成装置及びテストケース生成方法 | |
An et al. | An empirical study of crash-inducing commits in Mozilla Firefox | |
JP6256115B2 (ja) | 操作探索プログラム、操作探索方法、および操作探索装置 | |
JP2011113354A (ja) | ログ出力装置、ログ出力方法、ログ出力用プログラム | |
US20160253157A1 (en) | Software refactoring | |
JP5602871B2 (ja) | 照会リネージの自動生成のための方法、システム、およびコンピュータ・プログラム | |
JP6440895B2 (ja) | ソフトウェア分析装置及びソフトウェア分析方法 | |
US8819626B2 (en) | Sharable development environment bookmarks for functional/data flow | |
US9396239B2 (en) | Compiling method, storage medium and compiling apparatus | |
US9335990B2 (en) | Method, a system, and a non-transitory computer-readable medium for supporting application development | |
JP2013077124A (ja) | ソフトウェアテストケース生成装置 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
JP2012203726A (ja) | コンピュータプログラムの分析方法及び分析装置 | |
JP2016057658A (ja) | 障害情報管理システムおよび障害情報管理方法 | |
CN114691197A (zh) | 代码分析方法、装置、电子设备和存储介质 | |
JP6336919B2 (ja) | ソースコードレビュー方法及びそのシステム | |
JP2017151594A (ja) | 支援装置、支援方法及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Application deemed to be withdrawn because no request for examination was validly filed |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20140603 |