MPS 2020.1 ヘルプ

データフロー

言語のデータフローの側面では、到達不能なステートメントの検索、未使用の代入の検出、変数が読み込まれる前に初期化されていない可能性があるかどうかの確認などを行うことができます。また、「抽出メソッド」リファクタリングなど、いくつかのコード変換を実行することもできます。

データフロー分析のほとんどのユーザーは、その内部作業の詳細には関心がありませんが、必要な結果を得ることには関心があります。彼らはどのステートメントに到達できないのか、それが初期化される前に何を読むことができるのかを知りたがっています。これらの分析の複雑さからユーザーを保護するために、あなたのプログラムを翻訳するアセンブリのような中間言語を提供します。翻訳後、この中間表現が分析され、ユーザはどの原文の文が到達不可能であるかなどを知ることができます。

たとえば、baseLanguage からの 'for' ループの翻訳です。

dfx2

First, we emit a label so we can jump after it: Then we perform a conditional jump after the current node: Then we emit code for node.variable: Finally, we emit code for the loop's body, and jump to the previously emitted label.

中間言語のコマンド

これが私たちの中間言語のコマンドです。

  • x を読む - 変数 x を読む

  • write x - 変数 x に書き込みます

  • ノードの前にジャンプ - ノードの前にジャンプ

  • ノードの後ろにジャンプ - ノードの後ろにジャンプ

  • ラベルのジャンプ - ラベルにジャンプ

  • ifjump((前の | 後)ノード) | ラベル - ノードの前後のラベルへの条件付きジャンプ

  • ノードのコード - ノードのコードを挿入

  • ret - 現在のサブルーチンから戻る

手が届かない

一部のコマンドは、到達不能としてハイライトされるべきではありません。たとえば、次のようなコードを書きたいと思うかもしれません。

for (Object o : list) { return o; }

この文のデータフロー中間コードを生成すると、最後のコマンド、条件ジャンプ後のコマンドに到達できなくなります。一方、これは正当な基本言語の文であるため、到達可能な文の分析中はこのコマンドを無視したいと思います。そうするために私達はそれがそれのまわりで波括弧によって示される到達不能かもしれないとしてそれを示す。適切なインテンションでこの設定を切り替えることができます。

dfx1

dfx2

あなたも私たちのデータフロークックブックを試すのが好きかもしれません。

リンク:

http://www.itu.dk/people/brabrand/UFPE/Data-Flow-Analysis/static.pdf(英語) - データフローや型システムを含む静的解析の入門書です。