MPS 2024.3 ヘルプ

データフロー

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

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

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

dfx2.png

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

中間言語のコマンド

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

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

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

  • ノードの前に移動 - ノードの前に移動

  • ノードの後ろに移動 - ノードの後ろに移動

  • ラベルの移動 - ラベルに移動

  • ifjump((前の | 後)ノード) | ラベル - ノードの前後のラベルへの条件付き移動

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

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

手が届かない

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

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

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

dfx1.png
dfx2.png

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

リンク:

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