7

ソースコードの基本的なパターンマッチングと書き換えシステムを実装する古いソフトウェア (死んでいないが、私には死んでいる言語で ;-)) があります。このコードを復活させ、現代の言語に翻訳し、プロジェクトをリファクタリング パワー ツールとしてオープンソース化することを検討しています。さらに先に進む前に、このようなものがすでに存在するかどうかを知りたいです (今夜、私の google-fu がこれを煽っています)。

仕組みは次のとおりです。

  • パターン マッチング部分は、バインディング変数を含むテンプレートを使用して、複数行のコードにまたがるソース コード パターンと一致します。
  • パターン書き換え部分は、テンプレートを使用して一致したコードを書き換え、一致するテンプレートからバインドされた変数の内容を挿入します
  • 一致テンプレートと書き換えテンプレートは、単純な (無条件の) 書き換えルールによって (1:1) 関連付けられます

ソフトウェアは、入力アプリケーションの抽象構文ツリー (AST) で動作し、変更された AST を出力します。これは、新しいソース コードに再生成できます。

たとえば、実際には for ループであるはずの while ループがたくさん見つかったとします。次のテンプレートは、while ループ パターンに一致します。

Template oldLoopPtrn
    int @cnt@ = 0;
    while (@cnt@ < @max@)
    {
        … @body@
        ++@cnt@;
    }
End_Template

次のテンプレートは、出力の書き換えパターンを指定します。

Template newLoopPtrn
    for(int @cnt@ = 0; @cnt@ < @max@; @cnt@++)
    {
        @body@
    }
End_Template

それらを関連付ける簡単なルール

Rule oldLoopPtrn --> newLoopPtrn

コードは次のようになります

int i=0;
while(i<arrlen)
{
    printf("element %d: %f\n",i,arr[i]);
    ++i;
}

このように自動的に書き換えられます

for(int i = 0; i < arrlen; i++)
{
    printf("element %d: %f\n",i,arr[i]);
}

これに最も近いのはコード リファクタリング ツールの一部ですが、それらは大規模な自動変更ではなく、選択したスニペットのインタラクティブな書き換えを目的としているようです。

この種のツールはリファクタリングを促進し、複数の言語 (HTML/CSS でさえも) で動作すると信じています。また、コード ベースの変換と磨き上げは、私だけでは妥当な時間内に行うことのできない巨大なプロジェクトになると考えています。

それで、このようなものはすでにそこにありますか?そうでない場合、考慮すべき明らかな機能(書き換えルール条件以外)はありますか?

編集: このシステムの私が非常に気に入っている機能の 1 つは、テンプレート パターンがかなり明白で読みやすいことです。これは、テンプレート パターンが難解な変異正規表現/BNF 形式ではなく、ターゲット ソース コードと同じ言語で記述されているためです。

4

5 に答える 5

3

このコードを復活させ、現代の言語に翻訳し、プロジェクトをリファクタリング パワー ツールとしてオープンソース化することを検討しています。

このようなツールが無料で利用できるようになることは、単純に素晴らしいことだと思います。

しかし、利用可能な商用製品があります: DMS Software Reengineering Toolkit .

DMS Software Reengineering Toolkit は、言語 (「ドメイン」) の任意の混合を含む、カスタマイズされたソース プログラムの分析、変更、翻訳、またはソフトウェア システムの生成を自動化するためのツール セットです。DMS の「ソフトウェア」という用語は非常に広く、プログラミング言語、マークアップ言語、ハードウェア記述言語、設計表記法、データ記述などを含む、あらゆる正式な表記法を含みます。このツールキットは、The Design Maintenance System™ の実装に向けた最初のステップです。は、セマンティクスとキャプチャされた設計によって駆動される、大規模なアプリケーション システムの漸進的な構築と保守をサポートする 21 世紀のソフトウェア エンジニアリング環境の野心的なビジョンです。

また、C ソース コードにはcoccinelleツールがあります。

Coccinelle は、C コードで目的の一致と変換を指定する言語 SmPL (セマンティック パッチ言語) を提供するプログラム マッチングおよび変換エンジンです。Coccinelle は当初、Linux で副次的な進化を実行することを目的としていました。このような進化は、ライブラリ API の進化に応じてクライアント コードに必要な変更を含み、関数の名前の変更、値がコンテキストに依存する関数引数の追加、データ構造の再編成などの変更を含む場合があります。Coccinelle は、付随的な進化を超えて、システム コードのバグを見つけて修正するために (私たちや他の人々によって) うまく使用されています。

于 2010-03-21T21:00:19.100 に答える
1

TXLはパターン ベースではなくルール ベースであるため、より多くの機能を備えていますが、学習曲線が急勾配になる可能性があります。

于 2009-01-06T04:38:14.373 に答える
1

上記のルールの Coccinelle 実装は次のようになります。

@@
識別子 cnt;
式 max,E;
@@

cnt = 0
... != cnt=E の場合
-while (cnt < 最大)
+ for (cnt=0; cnt < max; cnt++)
{
  ...
- cnt++;
}

C コードの場合:

int メイン () {
  int i=0;
  printf ("こんにちは\n");
  while(i < アーレン) {
    printf("要素 %d: %f\n",i,arr[i]);
    ++i;
  }
}

それは与えます

int main () { int i=0; printf ("こんにちは\n"); for (i = 0; i < arrlen; i++) { printf("要素 %d: %f\n",i,arr[i]); } }

... when != cnt=E は cnt の初期化と while ループの間の任意のコードを許可しますが、 cnt が再定義されていないことを確認します。初期化と while ループの間で cnt が使用されていない場合、より精巧なルールを使用して cnt の初期化を取り除くこともできます。

于 2010-05-15T17:03:15.760 に答える
1

TXL では、次のようになります。

include "c.grm"

rule main
    replace [declaration_or_statement*]
        int cnt [id] = 0;
        while (cnt < max [shift_expression] )
        {
                body [declaration_or_statement*]
        }
    deconstruct * body
        ++cnt;
    by
        for (int cnt = 0; cnt < max; cnt++)
        {
                body
        }
end rule

この入力の場合:

int main () {
  int i=0;
  while(i < arrlen) {
    printf("element %d: %f\n",i,arr[i]);
    ++i;
  }
}

これは次のようになります。

int main () {
    for (int i = 0; i < arrlen; i++) {
        printf ("element %d: %f\n", i, arr [i]);
        ++i;
    }
}

上記の Coccinelle の例に示されている分割ケースでは、同様のガードをルールに追加します。

于 2012-06-03T08:12:33.120 に答える
1

当社の DMS については既に言及されています。OPが言うように、「ターゲットソースコードと同じ言語で書かれているため読みやすい」変換ルールがあります。

これは、 DMS を使用したパターン マッチング/変換の完全で詳細な例を示すリンクです

于 2010-05-18T18:19:15.070 に答える