JP2012164024A - データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム - Google Patents
データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム Download PDFInfo
- Publication number
- JP2012164024A JP2012164024A JP2011022014A JP2011022014A JP2012164024A JP 2012164024 A JP2012164024 A JP 2012164024A JP 2011022014 A JP2011022014 A JP 2011022014A JP 2011022014 A JP2011022014 A JP 2011022014A JP 2012164024 A JP2012164024 A JP 2012164024A
- Authority
- JP
- Japan
- Prior art keywords
- flow graph
- function
- variable
- data flow
- 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
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
【課題】データフローグラフを効率的に生成できるデータフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラムを提供することを課題とする。
【解決手段】手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成において、プログラムを解析して変数定義関数テーブルと関数コールグラフを生成し、データフローグラフの出力変数に関係する対象変数毎に、変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出し、その抽出された関数を用いて対象変数に関するコントロールフローグラフを生成し、その生成されたコントロールフローグラフに対して到達定義解析を行い、対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成する。
【選択図】図2
【解決手段】手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成において、プログラムを解析して変数定義関数テーブルと関数コールグラフを生成し、データフローグラフの出力変数に関係する対象変数毎に、変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出し、その抽出された関数を用いて対象変数に関するコントロールフローグラフを生成し、その生成されたコントロールフローグラフに対して到達定義解析を行い、対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成する。
【選択図】図2
Description
本発明は、手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するデータフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラムに関する。
手続き型言語(例えば、C言語)で記述されたプログラムは、人間にとってはデータの依存関係や計算過程等を理解するのが難しい。そこで、このようなプログラムを人間が直感的に理解できるようにするために、プログラムの演算をノード、変数をエッジで表現したグラフとしてモデリングしたデータフローグラフ[Data flow graph]を生成し、データフローグラフを用いてプログラムの解析を行っている。データフローグラフを生成する方法としては、解析対象のプログラムからコントロールフローグラフ[Control flow graph]を生成し、コントロールフローグラフに対して出力変数に関係する変数に関して到達定義解析を行い、到達定義解析で得られる情報から出力変数を出力とするデータフローグラフを生成する。また、特許文献1には、プログラムの処理アルゴリズムを表現するデータフローグラフの作成方式において、そのプログラムを実際に実行することにより、実行した命令の情報を外部記憶にトレースデータとして格納し、その格納したトレースデータに対して演算を施すことによりデータフローグラフを作成することが開示されている。
しかし、従来の到達定義解析では、解析対象のプログラムの中に含まれる全ての変数や関数(出力変数に関係する変数以外の変数や出力変数に関係する変数に関連する関数以外の関数も含む)を反映してコントロールフローグラフを生成し、そのコントロールフローグラフに対して到達定義解析を行っている。そのため、到達定義解析において出力変数に関係する変数以外の変数の到達定義の計算及び伝播も行うため、計算コスト(メモリ、計算時間等)が大きくなる。特に、プログラムが大規模になると(例えば、時間やイベントに同期して繰り返し実行されるタスクを含むプログラム)、コントロールフローグラフも大規模になり、到達定義解析の計算コストが大きくなる。その結果、効率的にデータフローグラフを生成できない。
そこで、本発明は、データフローグラフを効率的に生成できるデータフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラムを提供することを課題とする。
本発明に係るデータフローグラフ生成装置は、手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するデータフローグラフ生成装置であって、プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析手段と、データフローグラフの出力変数に関係する対象変数毎に、関数解析手段で生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出手段と、データフローグラフの出力変数に関係する対象変数毎に、関数抽出手段で抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成手段と、データフローグラフの出力変数に関係する対象変数毎に、コントロールフローグラフ生成手段で生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析手段と、到達定義解析手段で解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成手段とを備えることを特徴とする。
このデータフローグラフ生成装置では、関数解析手段によって、プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する。そして、データフローグラフ生成装置では、データフローグラフの出力変数に関係する処理の対象の変数毎に、関数抽出手段によって変数定義関数テーブルと関数コールグラフに基づいてその対象変数に関連する関数のみを抽出し、コントロールフローグラフ生成手段によってその抽出された関数を用いて対象変数に関するコントロールフローグラフを生成し、到達定義解析手段によってその生成されたコントロールフローグラフに対して到達定義解析を行う。したがって、プログラムに含まれる出力変数に関係する変数以外の変数(処理の対象外の変数)やその処理の対象外の変数のみに関連する関数については、コントロールフローグラフの生成や到達定義解析の対象となっていない。そして、データフローグラフ生成装置では、データフローグラフ生成手段によって、そのデータフローグラフの出力変数に関係する対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成する。このように、このデータフローグラフ生成装置は、テータフローグラフの出力変数に関係する変数毎にコントロールフローグラフを生成して到達定義解析を行い、その到達定義解析結果を統合してデータフローグラフを生成することにより、出力変数に関係する変数やその各変数に関連する関数のみを考慮してデータフローグラフを生成できるので、データフローグラフを効率的に生成できる。
本発明に係るデータフローグラフ生成方法は、手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するデータフローグラフ生成方法であって、プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析ステップと、データフローグラフの出力変数に関係する対象変数毎に、関数解析ステップで生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出ステップと、データフローグラフの出力変数に関係する対象変数毎に、関数抽出ステップで抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成ステップと、データフローグラフの出力変数に関係する対象変数毎に、コントロールフローグラフ生成ステップで生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析ステップと、到達定義解析ステップで解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成ステップとを含むことを特徴とする。このデータフローグラフ生成方法によれば、各ステップの処理を行うことにより、上記データフローグラフ生成装置の作用及び効果を奏する。
本発明に係るデータフローグラフ生成プログラムは、手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するためのデータフローグラフ生成プログラムであって、コンピュータに、プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析機能と、データフローグラフの出力変数に関係する対象変数毎に、関数解析機能で生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出機能と、データフローグラフの出力変数に関係する対象変数毎に、関数抽出機能で抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成機能と、データフローグラフの出力変数に関係する対象変数毎に、コントロールフローグラフ生成機能で生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析機能と、到達定義解析機能で解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成機能とを実現させることを特徴とする。このデータフローグラフ生成プログラムによれば、このプログラムをコンピュータに実行させることによって、上記データフローグラフ生成装置の作用及び効果を奏する。
本発明によれば、テータフローグラフの出力変数に関係する変数毎にコントロールフローグラフを生成して到達定義解析を行い、その到達定義解析結果を統合してデータフローグラフを生成することにより、出力変数に関係する変数やその各変数に関連する関数のみを考慮してデータフローグラフを生成できるので、データフローグラフを効率的に生成できる。
以下、図面を参照して、本発明に係るデータフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラムの実施の形態を説明する。なお、各図において同一又は相当する要素については同一の符号を付し、重複する説明を省略する。
本実施の形態では、本発明を、データフローグラフ生成装置に適用する。本実施の形態に係るデータフローグラフ生成装置は、解析対象のプログラム(ソースコード)とデータフローグラフの出力変数が決定されて入力されると、プログラムからコントロールフローグラフを生成し、コントロールフローグラフに対する到達定義解析で得られる情報からデータフローグラフを生成し、出力変数を出力とするデータフローグラフを生成する。本実施の形態に係るデータフローグラフ生成装置は、データフローグラフの生成だけを行う専用装置でもよいし、あるいは、汎用コンピュータでデータフローグラフ生成用のアプリケーションを実行することによって構成されてもよい。
なお、プログラムは、手続き型言語で記述されたプログラムである。図4には、手続き型言語で記述されたプログラムの一例を示しており、taskが繰り返し実行され、x,y,gin,goutがグローバル変数である。ちなみに、繰り返し実行されるタスクの変数としてグローバル変数を含む場合、タスクが繰り返し実行される毎に演算された変数がグローバル変数にストアされる。そして、このグローバル変数にストアされた前回値が、次にタスクが実行されるときに各演算で用いられる。
本実施の形態に係るデータフローグラフ生成装置を具体的に説明する前に、図4のプログラムを一部として含む大規模プログラムを例として、図5及び図6を参照して、従来のデータフローグラフの生成方法を説明しておく。ここでは、データフローグラフの出力変数を、グローバル変数のgoutとする。
図5には、図4のプログラムを一部として含む大規模プログラムを、関数単位で分割したものを示している。なお、図5に示すプログラムではグローバル変数x,y,gin,goutに関連する演算以外の演算は、任意の演算として「・・・」で示している。
データフローグラフを生成する場合、まず、プログラムの構文を解析し、その解析結果に基づいてコントロールフローグラフを生成する。コントロールフローグラフは、プログラムを実行したときに通る可能性のある全経路がグラフで表され、ノード及びノードとノードとを繋ぐエッジで構成される。図6には、図5に示すプログラムに含まれる全ての変数及び全ての関数から生成されたコントロールフローグラフCFGを示す。次に、このコントロールフローグラフCFGを用いて、グローバル変数についての到達定義を算出し、到達定義を伝播させ、各ノードの到達定義集合を求める。そして、各ノードの到達定義集合を用いて出力変数goutから到達定義を逆順に追跡し、その追跡した結果に基づいて出力変数goutを出力とするデータフローグラフを生成する。
出力変数goutのデータフローグラフを生成する場合、コントロールフローグラフCFGにおいて出力変数goutに関係するグローバル変数としてx,y,ginの到達定義を追跡する。しかし、コントロールフローグラフCFGは、図5に示す大規模プログラムに含まれる全ての変数や関数を対象として生成されているので、コントロールフローグラフ全体が大規模なものになり、出力変数goutに関係する変数以外の変数が関連する演算等に対応する多くのノードN0,N0・・・が含まれている。そのため、出力変数goutのデータフローグラフの生成に関係のない無駄なノードへの到達定義の伝播や関係のない変数の到達定義の計算等により、計算コスト(メモリ、計算時間など)が非常に大きくなる。
それでは、図1〜図3を参照して、本実施の形態に係るデータフローグラフ生成装置1について説明する。図1は、本実施の形態に係るデータフローグラフ生成装置の構成図である。図2は、本実施の形態に係るデータフローグラフ生成装置でのメイン処理の流れを示すフローチャートである。図3は、本実施の形態に係るデータフローグラフ生成装置でのグローバルコントロールフローグラフ生成処理の流れを示すフローチャートである。
データフローグラフ生成装置1は、解析対象のプログラム(ソースコード)Pと出力変数Voutが入力されると、プログラムPに含まれる関数を解析して変数定義関数テーブルと関数コールグラフを生成し、出力変数Voutに関係する処理の対象の変数毎に、変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出し、その抽出された関数を用いて対象変数に関するグローバルコントロールフローグラフを生成し、そのグローバルコントロールフローグラフに対して到達定義解析を行い、対象変数毎の到達定義解析結果に基づいてデータフローグラフDFGを生成する。
具体的な処理について説明する前、データフローグラフ生成装置1の処理で用いる変数や関数について説明しておく。処理中のカレント変数を「v」で示し、その処理中の変数vに関連するカレント関数を「f」で示す。カレント変数vを定義している関数の集合を「Ωdef」で示す。カレント変数vを参照している関数の集合を「Ωref」で示す。関数コールグラフにおける関数fとその上位の関数の集合を「↑f」で示す。カレント変数vに関連する関数の集合を「Π」で示し、関数集合Πは下記の式(1)で定義される。出力変数Voutに関係する変数であり、未だ処理を行っていない未処理変数キューを「VQ」で示す。
それでは、具体的な処理について説明する。解析者によって解析対象のプログラムPと出力変数Voutが決定され、データフローグラフ生成装置1にプログラムPと出力変数Voutが入力される。すると、データフローグラフ生成装置1では、プログラムPの構文を解析し、その解析結果に基づいてグローバル変数についての変数定義関数テーブルを算出(生成)するとともに関数のコールグラフを算出(生成)する(S1)。変数定義関数テーブルについてはプログラムPに含まれる全てのグローバル変数についてでもよいし、出力変数Voutに関係するグローバル変数についてだけでもよい。コールグラフについては、プログラムPに含まれる全ての関数についてでもよいし、出力変数Voutに関係するグローバル変数に関連する関数についてだけでもよい。
次に、データフローグラフ生成装置1では、変数定義関数テーブルに基づいて、出力変数Voutを定義している関数foutを取得する(S2)。そして、データフローグラフ生成装置1では、カレント変数vとして出力変数Voutを設定し、カレント関数fとして出力変数Voutを定義している関数foutを設定する(S3)。さらに、データフローグラフ生成装置1では、データフローグラフに出力変数Voutの出力ポートを付加する(S4)。ここまでの処理で、出力変数Voutの出力ポートのみからなるデータフローグラフが構成される。
カレント変数v、カレント関数fが設定(更新)される毎に、データフローグラフ生成装置1では、カレント変数vがグローバル変数か否かを判定する(S5)。カレント変数vは、最初にS3の処理で出力変数Voutが設定され、それ以降はS14の処理で出力変数Voutに関係する変数が設定される。カレント関数fは、最初にS3の処理で関数foutが設定され、それ以降はS14の処理で出力変数Voutに関係する各変数に関連する関数が設定される。
S5の判定でカレント変数vがグローバル変数でない(すなわち、ローカル変数)と判定した場合、データフローグラフ生成装置1では、カレント関数fについての到達定義解析を実行済みか否かを判定する(S6)。S6の判定でカレント関数fについての到達定義解析を実行していないと判定した場合、データフローグラフ生成装置1では、カレント関数fのコントロールフローグラフを生成し、そのコントロールフローグラフにおいてカレント変数vについての到達定義解析を実行する(S7)。そして、データフローグラフ生成装置1では、その到達定義解析結果に基づいて、データフローグラフにカレント変数vを定義している演算を追加する(S10)。ここまでの処理で、生成途中のデータフローグラフにカレント変数vとして設定されたローカル変数を定義している演算に対応するノードとエッジが追加されたデータフローグラフが構成される。S6の処理で到達定義解析を実行済みと判定した場合又はS7の処理が終了した場合、データフローグラフ生成装置1では、カレント変数v(ローカル変数)を定義している演算の右辺で参照されている変数を未処理変数キューVQに追加する(S11)。参照している変数がない場合、未処理変数キューVQには追加されない。
S5の判定でカレント変数vがグローバル変数と判定した場合、データフローグラフ生成装置1では、カレント変数vの定義が解析対象のプログラムP(ソースコード)に含まれるか否かを判定する(S8)。カレント変数vの定義がプログラムPに含まれている場合にはそのカレント変数v(グローバル変数)についての到達定義解析が可能であるが、カレント変数vの定義がプログラムPに含まれていない場合にはそのカレント変数vはプログラムP外で定義されて入力される値であり、到達定義解析ができない。
S8の判定でカレント変数vの定義がプログラムPに含まれていると判定した場合、データフローグラフ生成装置1では、カレント変数vに関するグローバルコントロールフローグラフを生成し、そのグローバルコントロールフローグラフにおいてカレント変数vについての到達定義解析を実行する(S9)。グローバルコントロールフローグラフは、カレント変数v(グローバル変数)に関係する部分だけを抽出し、そのカレント変数vに関連する関数をまたがって構成したコントロールフローグラフである。そして、データフローグラフ生成装置1では、その到達定義解析結果に基づいて、データフローグラフにカレント変数vを定義している演算を追加する(S10)。ここまでの処理で、生成途中のデータフローグラフにカレント変数vとして設定されたグローバル変数を定義している演算に対応するノードとエッジが追加されたデータフローグラフが構成される。さらに、データフローグラフ生成装置1では、カレント変数vを定義している演算の右辺で参照されている変数を未処理変数キューVQに追加する(S11)。なお、グローバルコントロールフローグラフの生成処理については、後で、図3のフローチャートに沿って詳細に説明する。
S8の判定でカレント変数vの定義がプログラムPに含まれていないと判定した場合、データフローグラフ生成装置1では、データフローグラフにカレント変数vの入力ポートを付加する(S12)。ここまでの処理で、生成途中のデータフローグラフに入力ポートが追加されたデータフローグラフが構成される。
S11の処理が終了した場合又はS12の処理が終了した場合、データフローグラフ生成装置1では、未処理変数キューVQが空か否かを判定する(S13)。S13の判定で未処理変数キューVQが空でないと判定した場合、データフローグラフ生成装置1では、未処理変数キューVQの中に残っている変数の中から一つ変数を取り出してカレント変数vとして更新するとともに、その更新されたカレント変数vに関連する関数をカレント関数fとして更新し(S14)、S5の処理に戻る。S13の判定で未処理変数キューVQが空と判定した場合、出力変数Voutに関係する全ての変数についての処理が終了したことになるので、データフローグラフ生成装置1では、処理を終了する。この時点で生成されているデータフローグラフが、生成完了の出力変数Voutを出力とするデータフローグラフである。
S9の処理でグローバルコントロールフローグラフを生成する場合、データフローグラフ生成装置1では、まず、変数定義関数テーブルとコールグラフに基づいて、カレント変数v(グローバル変数)に関連する関数集合Πを抽出する(S20)。この処理では、カレント変数vを定義している関数の集合Ωdefを抽出し、カレント変数vを参照している関数の集合Ωrefを抽出する。そして、関数集合Ωdefに含まれる各関数fdefについて、コールグラフから関数fdefとその上位の関数からなる関数集合↑fdefを抽出する。また、関数集合Ωrefに含まれる各関数frefについて、コールグラフから関数frefとその上位の関数からなる関数集合↑frefを抽出する。そして、上記の式(1)により、関数集合Ωdefに含まれる各関数fdefの関数集合↑fdefと関数集合Ωrefに含まれる各関数frefの関数集合↑frefの和集合を求め、カレント変数vに関連する関数集合Πを抽出する。
次に、データフローグラフ生成装置1では、カレント変数vに関連する関数集合Πに含まれる各関数についてのコントロールフローグラフを生成し、その各関数のコントロールフローグラフにおいてSESE[Single Entry Single Exit]領域を算出する(S21)。SESE領域は、一つの入力(入口)と一つの出力(出口)を持つ最小単位である。
次に、データフローグラフ生成装置1では、カレント変数vに関連する関数集合Πに含まれる各関数についてのSESE領域の中から、関数集合Πに含まれる各関数をコールしているSESE領域を選択し、カレント変数vを定義しているSESE領域を選択し、カレント変数vを参照しているSESE領域を選択し、その選択されたSESE領域を包含するSESE領域を選択する(S22)。ここで、カレント変数vに関連する全てのSESE領域が抽出される。
そして、データフローグラフ生成装置1では、選択されたSESE領域を用いて、そのSESE領域に含まれるノードだけを用いてコントロールフローグラフを構成する(S23)。この構成されたコントロールフローグラフが、グローバルコントロールフローグラフである。
なお、本実施の形態では、S1の処理が特許請求の範囲に記載する関数解析手段、関数解析ステップ、関数解析機能に相当し、S20の処理が特許請求の範囲に記載する関数抽出手段、関数抽出ステップ、関数抽出機能に相当し、S21〜S23の処理が特許請求の範囲に記載するコントロールフローグラフ生成手段、コントロールフローグラフ生成ステップ、コントロールフローグラフ生成機能に相当し、S9の処理が特許請求の範囲に記載する到達定義解析手段、到達定義解析ステップ、到達定義解析機能に相当し、S11の処理が特許請求の範囲に記載するデータフローグラフ生成手段、データフローグラフ生成ステップ、データフローグラフ生成機能に相当する。
次に、図4のプログラムを一部として含む大規模プログラムを例として、図7〜図18を参照して、データフローグラフ生成装置1におけるデータフローグラフの具体的な生成過程を説明する。図5には、図4のプログラムを一部として含む大規模プログラムを、関数に分割したものを示している。この大規模プログラムがプログラムPとして決定されるとともにグローバル変数goutが出力変数Voutとして決定されると、データフローグラフ生成装置1に、そのプログラムPの大規模プログラムと出力変数のgoutが入力される。ちなみに、出力変数goutに関係する変数としては、goutを定義する演算(gout=y*t)で参照されるグローバル変数yとローカル変数t、そのグローバル変数yを定義する演算(y=x+t)で参照されるグローバル変数xとローカル変数t、そのグローバル変数xを定義する演算(x=gin)で参照されるグローバル変数ginである。なお、出力変数Voutについては、y等の他の変数でもよい。
なお、各図で示すデータフローグラフでは、入出力ポートを楕円で表し、演算を四角形で表し、データセレクタをひし形で表し、エッジには変数が付加される。背景が白色のポートは未処理変数であることを意味し、さらなる拡張の可能性があることを示す。背景が黒色のポート、演算、データセレクタは処理済みであることを意味する。点線で示すエッジは、taskが繰り返し実行される場合のグローバル変数の前回値の参照を意味する。
まず、データフローグラフ生成装置1では、上記のS1の処理として、プログラムPの構文を解析し、プログラムPに含まれる関数のコールグラフとプログラムPに含まれる各変数についての変数定義関数テーブルを算出する。図7(a)には、図5に示す分割された各関数からなるコールグラフを示している。図7(b)には、以下の処理で必要となるグローバル変数gout,x,yについての変数定義関数テーブルを示している。
次に、データフローグラフ生成装置1では、上記のS2の処理として、式(2)に示すように、変数定義関数テーブルから、出力変数Vout(=gout)を定義している関数foutとして関数Gを取得する。また、データフローグラフ生成装置1では、上記のS3の処理として、式(3)に示すように、カレント変数vとして出力変数Vout(=gout)を設定する。また、データフローグラフ生成装置1では、上記のS3の処理として、式(4)に示すように、カレント関数fとして関数fout(=G)を設定する。
次に、データフローグラフ生成装置1では、上記のS4の処理として、データフローグラフに出力変数Vout(=gout)の出力ポートを付加する。ここで、図8に示すように、goutの出力ポートOPのみからなる生成途中のデータフローグラフDFG1が構成される。
次に、データフローグラフ生成装置1では、上記のS5の処理として、カレント変数v(=gout)がグローバル変数か否かを判定する。ここでは、カレント変数vはグローバル変数のgoutなので、グローバル変数と判定される。データフローグラフ生成装置1では、上記のS8の処理として、カレント変数v(=gout)の定義がプログラムPに含まれているか否かを判定する。ここでは、カレント変数vのgoutは関数G内の演算(gout=y*t)で定義されているので、プログラムPに含まれていると判定される。データフローグラフ生成装置1では、上記のS9の処理として、カレント変数v(=gout)に関するグローバルコントロールフローグラフを生成し、そのグローバルコントロールフローグラフにおいてカレント変数v(=gout)についての到達定義解析を実行する。図9(a)には、グローバル変数goutに関するグローバルコントロールフローグラフGCFGgoutを示しており、グローバルコントロールフローグラフGCFGgoutは、グローバル変数goutに関連する全てのSESE領域に含まれるノードだけを用いて構成されたコントロールフローグラフである。グローバルコントロールフローグラフGCFGgoutでは、ノード1が関数Gのifの条件式Rによる分岐であり、ノード1からノード2とノード3へエッジでそれぞれ繋がれ、ノード2がgoutを定義する演算(gout=y*t)であり、ノード2からノード3へエッジで繋がれる。さらに、グローバルコントロールフローグラフGCFGgoutでは、関数Gがコールされる関数F、その関数Fがコールされる関数Aの関係も示している。図9(b)には、そのグローバルコントロールフローグラフGCFGgoutにおいてグローバル変数goutの到達定義解析を実行した結果を示しており、各エッジにはグローバル変数goutについての到達定義の集合が付加されている。entryのノード1にはexitのノード3から前回値として到達定義集合{gout2’}が伝播され、ノード1からノード2とノード3に到達定義集合{gout2’}が到達し、ノード2からノード3に到達定義集合{gout2}が到達し、ノード3の到達定義集合が{gout2,gout2’}となる。
なお、プログラムPには繰り返し実行されるtaskが含まれており、グローバル変数の場合、taskが繰り返し実行される毎に演算された変数がグローバル変数にストアされ、このグローバル変数にストアされた前回値が次回のtask実行時に各演算で用いられる。そこで、本実施の形態では、この前回値を到達定義解析において反映するために、グローバル変数についてのグローバルコントロールフローグラフにおいて到達定義解析を実行する場合、グローバルコントロールフローグラフのexitノードの到達定義集合をentryノードに伝播しており、その伝播された到達定義集合に含まれる各到達定義に前回値を意味するアポストロフィ「’」を付加している。
次に、データフローグラフ生成装置1では、上記のS10の処理として、その到達定義解析結果に基づいて、図8に示す生成途中のデータフローグラフDFG1にカレント変数v(=gout)を定義している演算を追加する。図10には、グローバル変数goutを定義している演算を追加したデータフローグラフDFG2を示している。データフローグラフDFG2では、goutを出力する場合には今回値と前回値の2つのケースが考えられるのでgoutの今回値と前回値を選択するためのセレクタノードS1が付加され、入力ポートIP1のグローバル変数yと入力ポートIP2のローカル変数tが演算ノードA13にそれぞれ伝播され、前回実行時に演算ノードA13でグローバル変数yとローカル変数tを参照してgout(前回値)が演算され、その前回演算されたx(前回値)がセレクタノードS1に伝播され、今回実行時に演算ノードA13でグローバル変数yとローカル変数tを参照してgout(今回値)が演算され、その今回演算されたx(今回値)がセレクタノードS1に伝播され、セレクタノードS1でその2つのgoutから1つのgoutが選択され(実際には、プログラムPのtaskの前回実行時のステップ13のgout=y*tで演算されたgout値(前回値)又は今回実行時のステップ13のgout=y*tで演算されたgout値(今回値)がストアされたグローバル変数goutの値である)、その選択されたgoutが出力ポートOPに伝播される。
次に、データフローグラフ生成装置1では、上記のS11の処理として、式(5)に示すように、カレント変数v(=gout)を定義している演算(gout=y*t)の右辺で参照されている変数{y,t}を未処理変数キューVQに追加する。そして、データフローグラフ生成装置1では、上記のS13に示す処理として、未処理変数キューVQが空か否かを判定する。
未処理変数キューVQは空でないので、データフローグラフ生成装置1では、上記のS14の処理として、式(6)に示すように、未処理変数キューVQの中に残っている変数{y,t}の中からローカル変数tを取り出し、カレント変数vとして更新する。取り出す変数は任意の変数でよいが、ここでは、ローカル変数のtを取り出した。また、データフローグラフ生成装置1では、上記のS14の処理として、式(7)に示すように、その更新されたカレント変数v(=t)を参照している関数Gをカレント関数fとして更新する。これによって、未処理変数キューVQには、式(8)に示すように、グローバル変数yが残る。
上記のS5の処理に戻って、データフローグラフ生成装置1では、カレント変数v(=t)がグローバル変数か否かを判定する。ここでは、カレント変数vはローカル変数のtなので、グローバル変数でないと判定される。データフローグラフ生成装置1では、上記のS6の処理として、カレント関数f(=G)の到達定義解析が実行済みか否かを判定する。ここでは、カレント関数f(=G)の到達定義解析は実行していないと判定される。データフローグラフ生成装置1では、上記のS7の処理として、カレント関数f(=G)のコントロールフローグラフを生成し、そのコントロールフローグラフにおいてカレント変数v(=t)についての到達定義解析を実行する。図11には、カレント関数GのコントロールフローグラフCFGGを示している。コントロールフローグラフCFGGは、ノード1がtを定義する演算(t=100)であり、ノード2が関数Gのifの条件式Rによる分岐であり、ノード2からノード3とノード4へエッジでそれぞれ繋がれ、ノード3がgoutを定義する演算(gout=y*t)であり、ノード3からノード4へエッジで繋がれる。さらに、図11には、そのコントロールフローグラフCFGGにおいてローカル変数tの到達定義解析を実行した結果を示しており、ノード1からノード2を経由してノード3に到達定義集合{t1}が到達する。
そして、データフローグラフ生成装置1では、上記のS10の処理として、その到達定義解析結果に基づいて、図10に示す生成途中のデータフローグラフDFG2にカレント変数v(=t)を定義している演算を追加する。図12には、ローカル変数tを定義している演算を追加したデータフローグラフDFG3を示している。データフローグラフDFG3では、データフローグラフDFG2に対して、入力ポートIP2の代わりに演算ノードA11が追加され、今回実行時に演算ノードA11で100を参照してt(今回値)が演算され、その今回演算されたt(今回値)が演算ノードA13に伝播される。
次に、データフローグラフ生成装置1では、上記のS11の処理を行うが、カレント変数v(=t)を定義している演算(t=100)の右辺では変数を参照していないので、未処理変数キューVQには変数を追加しない。したがって、式(9)に示すように、未処理変数キューVQは変化しない。そして、データフローグラフ生成装置1では、上記のS13に示す処理として、未処理変数キューVQが空か否かを判定する。
未処理変数キューVQは空でないので、データフローグラフ生成装置1では、上記のS14の処理として、式(10)に示すように、未処理変数キューVQの中に残っている変数{y}の中からグローバル変数yを取り出し、カレント変数vとして更新する。また、データフローグラフ生成装置1では、上記のS14の処理として、式(11)に示すように、その更新されたカレント変数v(=y)を参照している関数Gをカレント関数fとして更新する。これによって、未処理変数キューVQは、式(12)に示すように、一旦、空となる。
上記のS5の処理に戻って、データフローグラフ生成装置1では、カレント変数v(=y)がグローバル変数か否かを判定する。ここでは、カレント変数vはグローバル変数のyなので、グローバル変数と判定される。データフローグラフ生成装置1では、上記のS8の処理として、カレント変数v(=y)の定義がプログラムPに含まれているか否かを判定する。ここでは、カレント変数vのyは関数A内の演算(y=x+t)で定義されているので、プログラムPに含まれていると判定される。データフローグラフ生成装置1では、上記のS9の処理として、カレント変数v(=y)に関するグローバルコントロールフローグラフを生成し、そのグローバルコントロールフローグラフにおいてカレント変数v(=y)についての到達定義解析を実行する。図13には、グローバル変数yに関するグローバルコントロールフローグラフGCFGyを示しており(図22も参照)、グローバルコントロールフローグラフGCFGyは、グローバル変数yに関連する全てのSESE領域に含まれるノードだけを用いて構成されたコントロールフローグラフである。グローバルコントロールフローグラフGCFGyでは、ノード1がyを定義する演算(y=x+t)であり、ノード1からノード2にエッジで繋がれ、ノード2が関数Gのifの条件式Rによる分岐であり、ノード2からノード3とノード4へエッジでそれぞれ繋がれ、ノード3がgoutを定義する演算(gout=y*t)であり、ノード3からノード4へエッジで繋がれる。さらに、グローバルコントロールフローグラフGCFGyでは、関数Gがコールされる関数F、その関数Fがコールされる関数Aの関係も示している。さらに、そのグローバルコントロールフローグラフGCFGyにおいてグローバル変数yの到達定義解析を実行した結果を示しており、各エッジにはグローバル変数yについての到達定義の集合が付加されている。entryのノード1にはexitのノード4から前回値として到達定義集合{y1’}が伝播され、ノード1からノード2に到達定義集合{y1}が到達し、ノード2からノード3とノード4に到達定義集合{y1}が到達し、ノード3からノード4に到達定義集合{y1}が到達する。これによって、goutを定義する演算(gout=y*t)で参照されるグローバル変数のyは今回値y1であることが判る。
そして、データフローグラフ生成装置1では、上記のS10の処理として、その到達定義解析結果に基づいて、図12に示す生成途中のデータフローグラフDFG3にカレント変数v(=y)を定義している演算を追加する。図14には、グローバル変数yを定義している演算を追加したデータフローグラフDFG4を示している。データフローグラフDFG4では、入力ポートIP1の代わりに演算ノードA6が追加され、入力ポートIP3のグローバル変数xと入力ポートIP4のローカル変数tが演算ノードA6にそれぞれ伝播され、今回実行時に演算ノードA6でグローバル変数xとローカル変数tを参照してy(今回値)が演算され、その今回演算されたy(今回値)が演算ノードA13に伝播される。
次に、データフローグラフ生成装置1では、上記のS11の処理として、式(13)に示すように、カレント変数v(=y)を定義している演算(y=x+t)の右辺で参照されている変数{x,t}を未処理変数キューVQに追加する。そして、データフローグラフ生成装置1では、上記のS13に示す処理として、未処理変数キューVQが空か否かを判定する。
未処理変数キューVQは空でないので、データフローグラフ生成装置1では、上記のS14の処理として、式(14)に示すように、未処理変数キューVQの中に残っている変数{x,t}の中からローカル変数tを取り出し、カレント変数vとして更新する。また、データフローグラフ生成装置1では、上記のS14の処理として、式(15)に示すように、その更新されたカレント変数v(=t)を参照している関数Aをカレント関数fとして更新する。これによって、未処理変数キューVQには、式(16)に示すように、グローバル変数xが残る。
上記のS5の処理に戻って、データフローグラフ生成装置1では、カレント変数v(=t)がグローバル変数か否かを判定する。ここでは、カレント変数vはローカル変数のtなので、グローバル変数でないと判定される。データフローグラフ生成装置1では、上記のS6の処理として、カレント関数f(=A)の到達定義解析が実行済みか否かを判定する。ここでは、カレント関数f(=A)の到達定義解析は実行していないと判定される。データフローグラフ生成装置1では、上記のS7の処理として、カレント関数f(=A)のコントロールフローグラフを生成し、そのコントロールフローグラフにおいてカレント変数v(=t)についての到達定義解析を実行する。
そして、データフローグラフ生成装置1では、上記のS10の処理として、その到達定義解析結果に基づいて、図14に示す生成途中のデータフローグラフDFG4にカレント変数v(=t)を定義している演算を追加する。図15には、ローカル変数tを定義している演算を追加したデータフローグラフDFG5を示している。データフローグラフDFG5では、データフローグラフDFG4に対して、入力ポートIP4の代わりに演算ノードA5が追加され、今回実行時に演算ノードA5で10を参照してt(今回値)が演算され、その今回演算されたt(今回値)が演算ノードA6に伝播される。
次に、データフローグラフ生成装置1では、上記のS11の処理を行うが、カレント変数v(=t)を定義している演算(t=10)の右辺では変数を参照していないので、未処理変数キューVQには変数を追加しない。したがって、式(17)に示すように、未処理変数キューVQは変化しない。そして、データフローグラフ生成装置1では、上記のS13に示す処理として、未処理変数キューVQが空か否かを判定する。
未処理変数キューVQは空でないので、データフローグラフ生成装置1では、上記のS14の処理として、式(18)に示すように、未処理変数キューVQの中に残っている変数{x}の中からグローバル変数xを取り出し、カレント変数vとして更新する。また、データフローグラフ生成装置1では、上記のS14の処理として、式(19)に示すように、その更新されたカレント変数v(=x)を参照している関数Aをカレント関数fとして更新する。これによって、未処理変数キューVQは、式(20)に示すように、一旦、空となる。
上記のS5の処理に戻って、データフローグラフ生成装置1では、カレント変数v(=x)がグローバル変数か否かを判定する。ここでは、カレント変数vはグローバル変数のxなので、グローバル変数と判定される。データフローグラフ生成装置1では、上記のS8の処理として、カレント変数v(=x)の定義がプログラムPに含まれているか否かを判定する。ここでは、カレント変数vのxは関数A内の演算(x=0)、関数C内の演算(x=x+1)、関数E内の演算(x=gin)で定義されているので、プログラムPに含まれていると判定される。データフローグラフ生成装置1では、上記のS9の処理として、カレント変数v(=x)に関するグローバルコントロールフローグラフを生成し、そのグローバルコントロールフローグラフにおいてカレント変数v(=x)についての到達定義解析を実行する。図16には、グローバル変数xに関するグローバルコントロールフローグラフGCFGxを示しており(図25も参照)、グローバルコントロールフローグラフGCFGxは、グローバル変数xに関連する全てのSESE領域に含まれるノードだけを用いて構成されたコントロールフローグラフである。グローバルコントロールフローグラフGCFGxでは、ノード1が関数Bのifの条件式Pによる分岐であり、ノード1からノード2とノード3へエッジでそれぞれ繋がれ、ノード2がxを定義する演算(x=x+1)であり、ノード2からノード3へエッジで繋がれ、ノード3からノード4へエッジで繋がれ、ノード4がyを定義する演算(y=x+t)であり、ノード4からノード5へエッジで繋がれ、ノード5が関数Bのifの条件式Qによる分岐であり、ノード5からノード6とノード7へエッジでそれぞれ繋がれ、ノード6がxを定義する演算(x=gin)であり、ノード6からノード8へエッジで繋がれ、ノード7がxを定義する演算(x=0)であり、ノード7からノード8へエッジで繋がれる。さらに、グローバルコントロールフローグラフGCFGxでは、関数Cがコールされる関数B、その関数Bがコールされる関数Aの関係及び関数Eがコールされる関数D、その関数Dがコールされる関数Aの関係を示している。さらに、そのグローバルコントロールフローグラフGCFGxにおいてグローバル変数xの到達定義解析を実行した結果を示しており、各エッジにはグローバル変数xについての到達定義の集合が付加されている。entryのノード1にはexitのノード8から前回値として到達定義集合{x6’,x7’}が伝播され、ノード1からノード2とノード3に到達定義集合{x6’,x7’}が到達し、ノード2からノード3に到達定義集合{x2,x6’,x7’}が到達し、ノード3からノード4に到達定義集合{x2,x6’,x7’}が到達する。これによって、yを定義する演算(y=x+t)で参照されるグローバル変数のxは今回値x2、前回値x6’、前回値x7’のいずれかのx値であることが判る。
そして、データフローグラフ生成装置1では、上記のS10の処理として、その到達定義解析結果に基づいて、図15に示す生成途中のデータフローグラフDFG5にカレント変数v(=x)を定義している演算を追加する。図17には、グローバル変数xを定義している演算を追加したデータフローグラフDFG6を示している。データフローグラフDFG6では、入力ポートIP3の代わりにセレクタノードS2、演算ノードA3、セレクタノードS3、演算ノードA8、演算ノードA9が追加され、入力ポートIP5のグローバル変数ginが演算ノードA8に伝播され、前回実行時に演算ノードA8でグローバル変数ginを参照してx(前回値)が演算され、その前回演算されたx(前回値)がセレクタノードS2及びセレクタノードS3に伝播され、前回実行時に演算ノードA9で0を参照してx(前回値)が演算され、その前回演算されたx(前回値)がセレクタノードS2及びセレクタノードS3に伝播され、セレクタノードS3には演算ノードA8で前回演算されたx(前回値)と演算ノードA9で前回演算されたx(前回値)が伝播され、セレクタノードS3でその2つのxから1つのxが選択され(実際には、プログラムのtaskの前回実行時のステップ8のx=ginで演算されたx値(前回値)又は前回実行時のステップ9のx=0で演算されたx値(前回値)がストアされたグローバル変数xの値である)、その選択されたxが演算ノードA3に伝播され、今回実行時に演算ノードA3でそのセレクタノードS3からのxと1を参照してx(今回値)が演算され、その演算されたx(今回値)がセレクタノードS2に伝播され、セレクタノードS2には演算ノードA8で前回演算されたx(前回値)と演算ノードA9で前回演算されたx(前回値)と演算ノードA3で今回演算されたx(今回値)が伝播され、セレクタノードS3でその3つのxから1つのxが選択され(実際には、プログラムのtaskの前回実行時のステップ8のx=ginで演算されたx値(前回値)又は前回実行時のステップ9のx=0で演算されたx値(前回値)又は今回実行時のステップ3のx=x+1で演算されたx値(今回値)がストアされたグローバル変数xの値である)、その選択されたxが演算ノードA6に伝播される。
次に、データフローグラフ生成装置1では、上記のS11の処理として、式(21)に示すように、カレント変数v(=x)を定義している演算(x=gin)の右辺で参照されている変数{gin}を未処理変数キューVQに追加する。そして、データフローグラフ生成装置1では、上記のS13に示す処理として、未処理変数キューVQが空か否かを判定する。
未処理変数キューVQは空でないので、データフローグラフ生成装置1では、上記のS14の処理として、式(22)に示すように、未処理変数キューVQの中に残っている変数{gin}の中からグローバル変数ginを取り出し、カレント変数vとして更新する。また、データフローグラフ生成装置1では、上記のS14の処理として、式(23)に示すように、カレント関数fを更新が、グローバル変数ginの定義はプログラムP外なので、カレント関数fは無しとする。これによって、未処理変数キューVQには、式(24)に示すように、空となる。
上記のS5の処理に戻って、データフローグラフ生成装置1では、カレント変数v(=gin)がグローバル変数か否かを判定する。ここでは、カレント変数vはグローバル変数のginなので、グローバル変数と判定される。データフローグラフ生成装置1では、上記のS8の処理として、カレント変数v(=gin)の定義がプログラムPに含まれているか否かを判定する。ここでは、カレント変数vのginの定義はプログラムPに含まれていないので、プログラムPに含まれていないと判定される。データフローグラフ生成装置1では、上記のS12の処理として、図17に示す生成途中のデータフローグラフDFG6にカレント変数v(=gin)の入力ポートを付加する。図17には、グローバル変数xを定義している演算を追加したデータフローグラフDFG6を示している。データフローグラフDFG7では、入力ポートIP5が追加されたデータフローグラフが構成される。
データフローグラフ生成装置1では、上記のS13の処理として、未処理変数キューVQが空か否かを判定する。式(25)に示すように未処理変数キューVQは空なので、出力変数Vout(=gout)に関係する全ての変数についての処理が終了したことになり、データフローグラフ生成装置1では、処理を終了する。この時点で生成されているデータフローグラフDFG7が、最終的な出力変数Vout(=gout)を出力とするデータフローグラフDFGである。
次に、図19〜図25を参照して、データフローグラフ生成装置1におけるグローバルコントロールフローグラフの具体的な生成過程を説明する。ここでは、カレント変数vとしてグローバル変数yが設定されている場合とグローバル変数xが設定されている場合についての生成過程を説明する。
まず、カレント変数vとしてグローバル変数yが設定されている場合について説明する。上記のS20の処理として、データフローグラフ生成装置1では、式(26)に示すように、変数定義関数テーブルからカレント変数v(=y)を定義している関数集合Ωdefを抽出する。また、データフローグラフ生成装置1では、式(27)に示すように、カレント変数v(=y)を参照している関数集合Ωrefを抽出する。そして、データフローグラフ生成装置1では、式(28)に示すように、関数集合Ωdefに含まれる関数Aについて、コールグラフから関数Aとその上位の関数の集合↑Aを抽出する。また、データフローグラフ生成装置1では、式(29)に示すように、関数集合Ωrefに含まれる関数Gについて、コールグラフから関数Gとその上位の関数の集合↑Gを抽出する。そして、データフローグラフ生成装置1では、式(30)に示すように、関数集合↑Aと関数集合↑Gの和集合を求め、カレント変数v(=y)に関連する関数集合Πを抽出する。図19には、コールグラフ上に、関数集合Ωdef、関数集合Ωref、関数集合↑A、関数集合↑Gを示している。
次に、データフローグラフ生成装置1では、上記のS21の処理として、カレント変数v(=y)に関連する関数集合Πに含まれる各関数task,A,F,Gについてのコントロールフローグラフを生成し、その各関数task,A,F,GのコントロールフローグラフからSESE領域を算出する。図20(a)には、関数taskのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域Ttask1,Ttask2,Ttask3,Ttask4を示している。また、図20(b)には、関数Aのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TA1,TA2,TA3,TA4,TA5,TA6,TA7,TA8,TA9,TA10を示している。図20(c)には、関数Fのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TF1,TF2を示している。図20(d)には、関数Gのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TG1,TG2,TG3を示している。
次に、データフローグラフ生成装置1では、上記のS22の処理として、カレント変数v(=y)に関連する関数集合Πに含まれる各関数task,A,F,GについてのSESE領域の中から、関数集合Πに含まれる各関数をコールしているSESE領域を選択し、カレント変数v(=y)を定義しているSESE領域を選択し、カレント変数v(=y)を参照しているSESE領域を選択し、その選択されたSESE領域を包含するSESE領域を選択する。図21に示すように、各関数をコールしているSESE領域としてはSESE領域Ttask1とSESE領域TA10とSESE領域TF1が選択され、カレント変数v(=y)を定義しているSESE領域としてはSESE領域TA5が選択され、カレント変数v(=y)を参照しているSESE領域としてはSESE領域TG3が選択され、その選択されたSESE領域を包含するSESE領域としてSESE領域TG2を選択される。
そして、データフローグラフ生成装置1では、上記のS23の処理として、選択された6個のSESE領域Ttask1,TA10,TF1,TA5,TG3,TG2に含まれるノードだけを用いてコントロールフローグラフを構成する。図22には、その生成されたグローバルコントロールフローグラフGCFGyを示しており、ノード1がカレント変数v(=y)を定義しているSESE領域TA5のノードで構成され、ノード3がカレント変数v(=y)を参照しているSESE領域TG3のノードで構成され、ノード2,3,4の関係が選択されたSESE領域を包含するSESE領域TG2のノードで構成され、関数A、F,Gの関係が各関数をコールしているSESE領域Ttask1,TA10,TF1のノードで構成される。
次に、カレント変数vとしてグローバル変数xが設定されている場合について説明する。上記のS20の処理として、データフローグラフ生成装置1では、式(31)に示すように、変数定義関数テーブルからカレント変数v(=x)を定義している関数集合Ωdefを抽出する。また、データフローグラフ生成装置1では、式(32)に示すように、カレント変数v(=x)を参照している関数集合Ωrefを抽出する。そして、データフローグラフ生成装置1では、式(33)に示すように、関数集合Ωdef及び関数集合Ωrefに含まれる関数Aについて、コールグラフから関数Aとその上位の関数の集合↑Aを抽出する。また、データフローグラフ生成装置1では、式(34)に示すように、関数集合Ωdef及び関数集合Ωrefに含まれる関数Cについて、コールグラフから関数Cとその上位の関数の集合↑Cを抽出する。また、データフローグラフ生成装置1では、式(35)に示すように、関数集合Ωdefに含まれる関数Eについて、コールグラフから関数Eとその上位の関数の集合↑Eを抽出する。そして、データフローグラフ生成装置1では、式(36)に示すように、関数集合↑Aと関数集合↑Cと関数集合↑Eの和集合を求め、カレント変数v(=y)に関連する関数集合Πを抽出する。
次に、データフローグラフ生成装置1では、上記のS21の処理として、カレント変数v(=x)に関連する関数集合Πに含まれる各関数task,A,B,C,D,Eについてのコントロールフローグラフを生成し、その各関数task,A,B,C,D,EのコントロールフローグラフにおいてSESE領域を算出する。図23(a)には、図20(a)と同様の関数taskのコントロールフローグラフ及びSESE領域を示している。た、図23(b)には、図20(b)と同様の関数Aのコントロールフローグラフ及びSESE領域を示している。図23(c)には、関数Bのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TB1,TB2を示している。図23(d)には、関数Cのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TC1を示している。図23(e)には、関数Dのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TD1,TD2を示している。図23(f)には、関数Eのコントロールフローグラフを示しており、そのコントロールフローグラフから求められたSESE領域TE1を示している。
次に、データフローグラフ生成装置1では、上記のS22の処理として、カレント変数v(=x)に関連する関数集合Πに含まれる各関数task,A,B,C,D,EについてのSESE領域の中から、関数集合Πに含まれる各関数をコールしているSESE領域を選択し、カレント変数v(=x)を定義しているSESE領域を選択し、カレント変数v(=x)を参照しているSESE領域を選択し、その選択されたSESE領域を包含するSESE領域を選択する。図24に示すように、各関数をコールしているSESE領域としてはSESE領域Ttask1とSESE領域TA2とSESE領域TA7とSESE領域TB2とSESE領域TD1が選択され、カレント変数v(=x)を定義しているSESE領域としてはSESE領域TA8とSESE領域TC1とSESE領域TE1が選択され、カレント変数v(=x)を参照しているSESE領域としてはSESE領域TA5とSESE領域TC1が選択され、その選択されたSESE領域を包含するSESE領域としてはSESE領域TA6とSESE領域TB1が選択される。
そして、データフローグラフ生成装置1では、上記のS23の処理として、選択された11個のSESE領域Ttask1,TA2,TA7,TB2,TD1,TA8,TC1,TE1,TA5,TA6,TB1に含まれるノードだけを用いてコントロールフローグラフを構成する。図25には、その生成されたグローバルコントロールフローグラフGCFGxを示しており、ノード2がカレント変数v(=x)を定義しているSESE領域TC1のノードで構成され、ノード1,2,3の関係が選択されたSESE領域を包含するSESE領域TB1のノードで構成され、ノード4がカレント変数v(=x)を参照しているSESE領域TA5のノードで構成され、ノード6がカレント変数v(=x)を定義しているSESE領域TE1のノードで構成され、ノード7がカレント変数v(=x)を定義しているSESE領域TA8のノードで構成され、ノード5,6,7,8の関係が選択されたSESE領域を包含するSESE領域TA6のノードで構成され、関数A、B,C,D,Eの関係が各関数をコールしているSESE領域Ttask1,TA2,TA7,TB2,TD1のノードで構成される。
このデータフローグラフ生成装置1によれば、テータフローグラフの出力変数Voutに関係する変数毎にコントロールフローグラフを生成して到達定義解析を行い、その到達定義解析結果を統合してデータフローグラフを生成することにより、テータフローグラフの出力変数Voutに関係する変数やその各変数に関連する関数のみを考慮してデータフローグラフを生成できるので、データフローグラフを効率的に生成できる。到達定義解析において出力変数Voutに関係する変数以外の変数の到達定義の計算及び伝播を行わないので、計算コスト(メモリ、計算時間等)を抑制できる。特に、プログラムが大規模になっても、出力変数に関係する各変数についてのコントロールフローグラフだけを生成し、その各コントロールフローグラフにおいてその各変数についての到達定義解析だけを行うので、コントロールフローグラフが大規模にならず、到達定義解析の計算コストも抑制でき、非常に効率的にデータフローグラフを生成できる。
また、データフローグラフ生成装置1によれば、出力変数Voutに関係する各グローバル変数についてのグローバルコントロールグローグラフを生成する際に、そのグローバル変数に関連する関数のみを抽出し、その抽出された各関数のSESE領域を算出し、そのSESE領域の中からそのグローバル変数に関係するSESE領域だけを選択してグローバルコントロールグローグラフを生成することにより、効率的にグローバルコントロールグローグラフを生成できる。
以上、本発明に係る実施の形態について説明したが、本発明は上記実施の形態に限定されることなく様々な形態で実施される。
例えば、本実施の形態ではデータフローグラフを生成するデータフローグラフ生成装置に適用したが、CD−ROM等の記憶媒体に格納されたプログラムやインタネット等のネットワークを介して利用可能なプログラム等に適用し、このようなプログラムをコンピュータ上で実行することによってデータフローグラフを生成する構成としてもよい。
また、本実施の形態では解析対象のプログラム(ソースコード)に含まれる全ての関数を解析して変数定義関数テーブルと関数コールグラフを生成したが、解析対象に含まれる一部の関数(少なくとも出力変数に関係する各変数に関連する関数を含む)だけを解析して変数定義関数テーブルと関数コールグラフを生成してもよい。
また、本実施の形態ではグローバル変数のグローバルコントロールフローグラフを生成する際に、SESE領域を用いて生成する手法を適用したが、他の手法によりグローバル変数のグローバルコントロールフローグラフを生成してもよい。
1…データフローグラフ生成装置。
Claims (3)
- 手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するデータフローグラフ生成装置であって、
プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析手段と、
データフローグラフの出力変数に関係する対象変数毎に、前記関数解析手段で生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出手段と、
データフローグラフの出力変数に関係する対象変数毎に、前記関数抽出手段で抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成手段と、
データフローグラフの出力変数に関係する対象変数毎に、前記コントロールフローグラフ生成手段で生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析手段と、
前記到達定義解析手段で解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成手段と、
を備えることを特徴とするデータフローグラフ生成装置。 - 手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するデータフローグラフ生成方法であって、
プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析ステップと、
データフローグラフの出力変数に関係する対象変数毎に、前記関数解析ステップで生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出ステップと、
データフローグラフの出力変数に関係する対象変数毎に、前記関数抽出ステップで抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成ステップと、
データフローグラフの出力変数に関係する対象変数毎に、前記コントロールフローグラフ生成ステップで生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析ステップと、
前記到達定義解析ステップで解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成ステップと、
を含むことを特徴とするデータフローグラフ生成方法。 - 手続き型言語によって記述されるプログラムの到達定義に基づくデータフローグラフを生成するためのデータフローグラフ生成プログラムであって、
コンピュータに、
プログラムに含まれる全部又は一部の関数を解析し、変数定義関数テーブルと関数コールグラフを生成する関数解析機能と、
データフローグラフの出力変数に関係する対象変数毎に、前記関数解析機能で生成された変数定義関数テーブルと関数コールグラフに基づいて対象変数に関連する関数のみを抽出する関数抽出機能と、
データフローグラフの出力変数に関係する対象変数毎に、前記関数抽出機能で抽出された関数を用いて対象変数に関するコントロールフローグラフを生成するコントロールフローグラフ生成機能と、
データフローグラフの出力変数に関係する対象変数毎に、前記コントロールフローグラフ生成機能で生成されたコントロールフローグラフに対して到達定義解析を行う到達定義解析機能と、
前記到達定義解析機能で解析された対象変数毎の到達定義解析結果に基づいてデータフローグラフを生成するデータフローグラフ生成機能と、
を実現させることを特徴とするデータフローグラフ生成プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011022014A JP2012164024A (ja) | 2011-02-03 | 2011-02-03 | データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011022014A JP2012164024A (ja) | 2011-02-03 | 2011-02-03 | データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012164024A true JP2012164024A (ja) | 2012-08-30 |
Family
ID=46843374
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011022014A Withdrawn JP2012164024A (ja) | 2011-02-03 | 2011-02-03 | データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2012164024A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016051367A (ja) * | 2014-09-01 | 2016-04-11 | 日本電気通信システム株式会社 | データ解析装置、データ解析方法、および、プログラム。 |
US11086604B2 (en) | 2017-11-21 | 2021-08-10 | Mitsubishi Electric Corporation | Source code splitting device, source code analyzing device, source code splitting method, and computer readable medium |
-
2011
- 2011-02-03 JP JP2011022014A patent/JP2012164024A/ja not_active Withdrawn
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016051367A (ja) * | 2014-09-01 | 2016-04-11 | 日本電気通信システム株式会社 | データ解析装置、データ解析方法、および、プログラム。 |
US11086604B2 (en) | 2017-11-21 | 2021-08-10 | Mitsubishi Electric Corporation | Source code splitting device, source code analyzing device, source code splitting method, and computer readable medium |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Schlatow et al. | Response-time analysis for task chains in communicating threads | |
US10089426B2 (en) | Logic circuit generation device and method | |
Diemer et al. | Compositional performance analysis in python with pycpa | |
US20180267784A1 (en) | Method and system for generating accelerator program | |
US20110161939A1 (en) | Apparatus for displaying the result of parallel program analysis and method of displaying the result of parallel program analysis | |
US20100199269A1 (en) | Program optimization device and program optimization method | |
JP2001166949A (ja) | シンボリック実行を用いてソースコードをコンパイルするための方法及び装置 | |
Anjorin et al. | 20 years of triple graph grammars: A roadmap for future research | |
US9639454B2 (en) | Computer-readable recording medium storing therein test data generating program, test data generating method, test data generating apparatus and information processing system | |
Sittel et al. | ILP-based modulo scheduling and binding for register minimization | |
Laneve et al. | Time analysis of actor programs | |
JP2012164024A (ja) | データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム | |
Jung et al. | Automatic CUDA code synthesis framework for multicore CPU and GPU architectures | |
US9152543B1 (en) | Symbolic execution with automatic abstractions | |
Skelin et al. | Worst-case throughput analysis for parametric rate and parametric actor execution time scenario-aware dataflow graphs | |
CN108920149B (zh) | 编译方法和编译装置 | |
Li et al. | Using design space exploration for finding schedules with guaranteed reaction times of synchronous programs on multi-core architecture | |
JP2009163662A (ja) | 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム | |
Miyamoto et al. | An approach for synthesizing intelligible state machine models from choreography using petri nets | |
Brandner et al. | Criticality: static profiling for real-time programs | |
Goel et al. | An executional framework for BPMN using Orc | |
Gold | Reductions of control flow graphs | |
JP2012194845A (ja) | ラッパープログラム及び集積回路装置 | |
JPWO2009128465A1 (ja) | サービス変更部品生成システム、方法及びプログラム | |
Pogrebnoy | Constructing graph models for software system development and analysis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20140513 |