データフロー
言語のデータフローの側面では、到達不能なステートメントの検索、未使用の代入の検出、変数が読み込まれる前に初期化されていない可能性があるかどうかの確認などを行うことができます。また、「抽出メソッド」リファクタリングなど、いくつかのコード変換を実行することもできます。
データフロー分析のほとんどのユーザーは、その内部作業の詳細には関心がありませんが、必要な結果を得ることには関心があります。彼らはどのステートメントに到達できないのか、それが初期化される前に何を読むことができるのかを知りたがっています。これらの分析の複雑さからユーザーを保護するために、あなたのプログラムを翻訳するアセンブリのような中間言語を提供します。翻訳後、この中間表現が分析され、ユーザはどの原文の文が到達不可能であるかなどを知ることができます。
たとえば、baseLanguage からの 'for' ループの翻訳です。
まず、ラベルを発行して、移動できるようにします。次に、現在のノードの後に条件付き移動を実行します。それから、node.variable のコードを発行します。最後に、ループ本体のコードを発行し、以前に発行したラベルに移動します。
中間言語のコマンド
これが私たちの中間言語のコマンドです。
x を読む - 変数 x を読む
write x - 変数 x に書き込みます
ノードの前に移動 - ノードの前に移動
ノードの後ろに移動 - ノードの後ろに移動
ラベルの移動 - ラベルに移動
ifjump((前の | 後)ノード) | ラベル - ノードの前後のラベルへの条件付き移動
ノードのコード - ノードのコードを挿入
ret - 現在のサブルーチンから戻る
手が届かない
一部のコマンドは、到達不能としてハイライトされるべきではありません。たとえば、次のようなコードを書きたいと思うかもしれません。
この文のデータフロー中間コードを生成すると、最後のコマンド、条件移動後のコマンドに到達できなくなります。一方、これは正当な基本言語の文であるため、到達可能な文の分析中はこのコマンドを無視したいと思います。そうするために私達はそれがそれのまわりで波括弧によって示される到達不能かもしれないとしてそれを示す。適切なインテンションでこの設定を切り替えることができます。
あなたも私たちのデータフロークックブックを試すのが好きかもしれません。
リンク:
http://www.itu.dk/people/brabrand/UFPE/Data-Flow-Analysis/static.pdf(英語) - データフローや型システムを含む静的解析の入門書です。
関連ページ:
データフロー
このクックブックでは、あなたの言語用のデータフローを設計する際の素早い答えとガイドラインを提供するべきです。型システムの詳細な説明については、ユーザーガイドのデータフローセクションを参照してください。値を読む:読み取り操作は、特定の値が読み取られることをデータフローエンジンに指示します。data flow builder for LocalVariableReference { (node)->void { if (node.isVariableDefinedInThisMethod()
生成プログラム
導入:ジェネレーターは、言語の概念の表示的意味論を定義する言語仕様の一部です。MPS はモデル間変換アプローチに従います。MPS ジェネレーターは、入力言語でエンコードされた構成から出力言語でエンコードされた構成への変換を指定します。モデル間変換のプロセスには多くの中間モデルが含まれ、最終的には sn 出力モデルが生成されます。このモデルでは、すべての構成はすでに意味が別の場所で定義されている言語になります。たとえば、baseLanguage のほとんどの概念 (クラス、メソッドなど) は「機械が...