2

プログラムがソースコードを入力として受け取り、新しいソースコードを吐き出し、おそらくすぐに新しいコードを実行する場合、これは何と呼ばれますか?

例:

  1. 自動リファクタリング
  2. 関数を取得してGUIに変換する(関数入力を入力ボックスに変換する)
  3. 結果のキャッシュなど、関数に新しい機能を追加します。

これを行うのに最も簡単な言語は、単純な構文の関数型言語ですよね?(Lisp、Schemeなど)?

しかし、ソースコードをツリーまたは他のデータ構造に解析できる限り、どの言語でも、または言語間でもそれを行うことができますよね?(antlrまたは他のツールを使用していますか?)

それで、これは何と呼ばれていますか?大小を問わず、これを行う他の例は何ですか?一般的なツールは何ですか?この種のプログラミングを完全に理解するための出発点を教えてください。

(私は、自分のコードで何かを行うコードを書くことによって、1人のプログラマーとして1組の手でできることを活用しようとしています。)

4

1 に答える 1

0

あなたが興味を持っているのは、「ソースからソースへの」プログラム変換システムです

パーサーは必要ですが、十分ではありません。(実際、使用している言語の方言用のパーサーが必要です...人々が非常に多くの「プログラミング」言語を使用していることを考えると、これは多くのパーサーが必要です)。また、解析結果を(通常はツリーとして)キャプチャし、そのツリーを何らかの方法で操作できるようにしてから、ツリーから有効なソースコードを再生成する必要があります。そのソースコードを手動でプログラムされたソースへの永続的な変更にしたい場合、パーサー/ツリー/アンパーサーの組み合わせは、コードのフォーマットとコメントを可能な限り維持する必要があります。

多くの場合、識別子の意味が明確でない限り、コードを実際に変換することはできません。したがって、実際には、シンボルテーブルを解析するだけでなく、構築する必要があります(この時点で、パーサーではなく、コンパイラのフロントエンドに相当するものがあります)。多くの変換では、情報フローの追跡が必要です(制御フロー、データフロー、ポイントツー、誰が呼び出すかなど)。これらの機能がなければ、これらのツールは、ソースコードの大部分を構成する手続き型/オブジェクト指向言語にはあまり効果的ではありません。(すべてが式であるため、関数型言語の人はより少ないフロー分析でうまくいくことができますが、書かれたほとんどのコードは機能的ではないので、これは実際的な意味では重要ではありません)。

多くのソースからソースへの変換システムがあり、いくつかの言語固有のものがあります(たとえば、JackPot forJava)。いくつかは言語定義(TXL、Stratego、DMS)によってパラメーター化されています。

言語固有のもののいくつかは、シンボルテーブルとフロー分析を提供します。多くのプログラミング言語にこれらの機能を提供する変換を1つだけ知っています。それが、DMS SoftwareReengineeringToolkitです。

DMSは、おもちゃではなく、多くの実際のプログラミング言語とその一般的な方言(C、Java、COBOL)にこれを提供します。

DMSは、C++用の数少ないソースからソースへのプログラム変換システムの1つです。これは、大規模なC++プログラムに変更を加えるために怒りで使用されてきました。 Clangはかなり近いと思いますが、確かに野心的です。Roseコンパイラは、主にスーパーコンピューティングサークルで使用される別のコンパイラですが、どちらもC ++(おそらくCがスローされている)固有のものです。

于 2011-08-20T17:32:56.113 に答える