2

自動的に行われるプログラムコードの変更を記述できるようにする必要がある作業を行っています。

これを説明できる言語はありますか?

言語には、変更が行われるコード内の場所を受け取るモジュールまたは関数が必要であり、実行される可能性のある変更を指定できる必要があります。
特定の関数の削除、コードの周囲のif条件の追加、何もしない新しい関数宣言の追加など
の変更を記述できるようにする必要があります。変更は、元の関数を復元できるように、解析ツリーに対して行う必要があります。コード、変更のみ。
パーサーや実装を関連付けるための言語も必要ありません。必要なのは、BNF文法として、または非公式に、言語自体を説明することだけです。

PHPの事前コンパイラであるphcは、ソースコードをXML表現に変換して元に戻すことができるため、コードの変更と復元が容易になります。必要なのは、XMLの実際の変更を記述して、たとえば特定の関数呼び出しのすべてのインスタンスを削除したり、それぞれの周りにif(false)を追加したりできるプログラムを実行できるようにする方法です。また、必須ではありませんが、言語が言語に依存しない方がよいでしょう。

このようなものが存在すると思いますか?

4

2 に答える 2

2

SemanticDesignsのDMSソフトウェアリエンジニアリングツールキットをチェックしてください。それはあなたが探しているもののために使われるかもしれません。

于 2011-04-08T16:35:48.280 に答える
1

重要なアイデアはプログラム変換です。OndrejはDMSに関して正しい考えを持っていますが、私はDMSの作成者であるため、偏見がある可能性があります。

変換を実行するために使用されるDMS言語は、「(DMS)ルール仕様言語」またはRSLと呼ばれ、(プログラム変換)ルールを指定するために使用されます。このようなルールには次のものがあります。

  • 名前(私たちはそれらをたくさん持っている傾向があり、これはそれらを参照するための便利な方法です)
  • 対象のターゲット言語の文法に従って入力されたパラメーター(パターン変数の定義)、
  • 左側の「match-this」パターン
  • 右手「これで置き換える」パターン

パターンは、多くの場合、ターゲット言語の表面構文で記述されます。これは、パターン変数の拡張機能を使用して変換される言語のネイティブ構文です。RSL言語の構文をターゲット言語と区別するために、パターンは(メタ)引用符「...」内に記述されます。パターン内の\文字は、RSLに戻る(メタ)エスケープです。パターン変数は「\x」と書かれています。(メタ)関数foobarは\ foobar(...)と記述されます。(メタ)関数引数の(メタ)エスケープに注意してください。引用符の外では、メタエスケープが必要であり、これらの構成は\なしで記述されます(例:foobar(...))。

DMSルールはこれよりもはるかに複雑になる可能性がありますが、これらが基本です。表面構文パターンはテキストを表しません。むしろ、それらは実際にはパターン内のコードの同等のASTを表しています。DMSルールは、ASTを照合および変更するために使用されます。もちろん、プログラム変換システムには、ASTを生成するためのパーサーと、ASTをテキストに戻すためのアンチパーサー(「プリティプリンター」)が必要です。(DMSには、地球上で広く使用されているすべての言語と多くの珍しい言語用の言語フロントエンドの大きなライブラリがあります。MUMPSを追加したばかりです)。

特定の例では、次のルールでうまくいきます。

"...特定の関数を削除する":

rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations
  "  \f \p \b " -> " ; "  -- replace function delcaration by empty declation
  if f==target_function_name();

...コードのブロックの周りにif条件を追加します:

rule wrap_in_if(s:statement): statement -> statement
 " \s " ->  " \if ( \generated_condition\(\) ) \s ";

...何もしない新しい関数宣言を追加します。

rule insert_noop_function(d:declarations): delcarations -> declarations
" \d " -> " \target_function\name\(\) ( )  { } ";

あなたが観察したように、あなたはこれらをどこかに向けなければなりません。これは、AST内のどこにルールを適用するかを特定し、それらを適用する「メタプログラム」の仕事です。ルールについては、適切な場所を見つけるために(DMSを使用して)明示的な手続き型の方法が必要です。一部のDMSルールでは、「どこでも」適用できます。DMSは基本的に、指定されたAST全体を歩き回り、ルールを適用します。

コードの数行が印象的でないのと同じように、いくつかのルールは決して印象的ではありません。数百または数千行のコードが非常に興味深い結果を生成できるのと同じように、数百または数千のルールが非常に壮観なこと(完全な言語翻訳など)を実行できます。違いは、従来のコードは数値、文字列、構造で機能し、プログラム変換ツールはプログラム構造(AST)を計算することです。

DMSに対して言語とルールを定義する方法、およびそれらのルールを達成する「プログラム変更」にどのように適用するかを示す完全な実例があります(この例は実際には「代数式」を変更しますが、考え方はまったく同じです)。

DMSは恥ずかしがらずに商用であり、ダイムストアツールではないため、論文に必要なものではない可能性があります。

DMSでない場合は、同じアイデアを持つ無料のツールを入手できます。TXL(www.txl.ca)またはStrategoXt(www.strategoxt.org)を検討してください。DMS、TXL、Strategoはすべて、サーフェス構文パターンを使用してプログラム変換を実行しますが、TXLとStrategoは、DMSIMHOと同様にコードへの大規模な変更を処理できません。(いくつかの理由で、DMS Webサイトでフロー分析について読んでください)。ただし、TXLとStrategoは、基本を学び、強力なデモを作成するのに適しています。

于 2011-04-14T07:41:09.037 に答える