データフロー解析
データフロー解析(英: Data-flow analysis)は、プログラム内での変数の値がどのように流れるかを明らかにする手法です。この技術は、
制御フローグラフ(CFG)を使用して、特定の位置で定義される値の集合を把握し、これを基にプログラムの最適化を図ります。データフロー解析の基礎となる概念は「到達定義」(reaching definition)です。この定義は、プログラムのある点に到達する可能性のある変数の定義を特定することを意味します。
基本的な手法
データフロー解析を行う一般的な方法の一つは、
制御フローグラフの各ノードに対してデータフロー方程式を設計し、全体として安定した状態、すなわち
不動点に到達するまで計算を繰り返すというものです。この際、各ノードの計算が単調に進むことが、解析を完了させるための要件となります。特に、
ゲイリー・キルドールが
海軍大学院で教えていた際にこの手法が開発されたことには大きな意味があります。
繰り返しアルゴリズム
データフロー方程式の
不動点は一般に「ラウンドロビン繰り返しアルゴリズム」を用いて算出されます。この方法は、各ノードを訪れる順序を基に効率よく解を導くことを目指します。
順序の問題
データフロー方程式の繰り返し計算は、ノードを訪れる順序によって大きく影響を受けます。ラウンドロビン繰り返しアルゴリズムを用いる場合、ノードに付与される番号が計算の結果に影響を与えます。また、
制御フローグラフにおけるデータフロー方程式が前方解析や後方解析のいずれで行われるかも、効率に影響を及ぼします。
トラバーサルの順序
ここで、データフロー方程式を解く際に用いる順序には研究がなされています。無作為に順序を設定する方法(random order)は効率が低いものの、基本的なアプローチとして存在します。一方、後行順(postorder)は、一般的に深さ優先戦略と組み合わせられ、木構造においては子ノードをすべて処理してから親ノードへ進むことに相当します。また、逆後行順(reverse postorder)は前方解析に適した順序で、後行順とは異なる動きを見せます。
データフロー解析の実例
データフロー解析を用いてプログラムの特性を計算する際には、実際の特性が単なる近似であることに留意すべきです。これは、データフロー解析がプログラムの制御フローを正確にシミュレートしているわけではなく、CFGの構造を単に追いかけているに過ぎないためです。それでも、この近似は最適化にとっては重要な役割を果たします。
前方解析と後方解析
前方解析における到達定義は、特定のプログラムの各行において、その行に到達する可能性のある定義集合を求めます。例えば、変数「a」が行番号7に到達するためには、行番号2や4からの定義が必要であるといった具合です。
後方解析は生存変数(live variables)に注目します。これは、各ノードで変数が次に更新される前に読み取られる可能性を分析します。たとえば、行番号2では生存変数の集合が{a, b}ですが、行番号1では{a}のみになります。これは、変数「b」が行番号2で更新されるためです。
フローに関する特性
データフロー解析は基本的にフロー感度(flow-sensitive)であり、文の順序を考慮する必要があります。例えば、フロー非感度なポインタ・エイリアス解析が「変数xとyは同じ位置を参照するかもしれない」と判断する場合、フロー感度な解析は「行番号20の後で、xとyは同じ位置を参照するかもしれない」と結論づけます。
また、経路感度(path-sensitive)も重要な概念であり、これは条件分岐における条件判断に関連した情報を解析に組み込みます。条件の理解により、プログラムの経路に基づいたより精度の高い解析が可能になります。
文献
この分野に関する理解を深めるための参考文献として、以下の書籍が挙げられます。
- - Aho, Alfred V., Sethi, Ravi, Ullman, Jeffrey D. Compilers: Principles, Techniques and Tools. Addison Wesley, 1986.
- - Appel, Andrew W. Modern Compiler Implementation in ML. Cambridge University Press, 1999.
- - Cooper, Keith D., Torczon, Linda. Engineering a Compiler. Morgan Kaufmann, 2005.
- - Muchnick, Steven S. Advanced Compiler Design and Implementation. Morgan Kaufmann, 1997.
- - Hecht, Matthew S. Flow Analysis of Computer Programs. Elsevier North-Holland Inc., 1977.