MPS 2020.3 ヘルプ

データフロー

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

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

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

Dfx2

まず、ラベルを発行して、ジャンプできるようにします。次に、現在のノードの後に条件付きジャンプを実行します。それから、node.variable のコードを発行します。最後に、ループ本体のコードを発行し、以前に発行したラベルにジャンプします。

中間言語のコマンド

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

  • 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(英語) - データフローや型システムを含む静的解析の入門書です。