MPS 2019.1ヘルプ

データ・フロー

データ・フロー

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

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

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

最終更新日: 2019年6月7日