3

計算可能性理論(クリーネの2番目の再帰定理など)の多くの結果により、独自のソースコードで動作できるプログラムを構築できることが保証されます。たとえば、Michael Sipserの「計算理論の紹介」では、2つの文字列を受け入れて文字列を生成する関数を表すプログラムはすべて、同等のプログラムに変換できると述べている再帰定理の特殊なケースを証明しています。 2番目の引数は、プログラム自体のソースコードと同じです。さらに、このプロセスは自動的に実行できます。

独自のソースコードにアクセスできるプログラムを作成するために使用する構造はよく知られており(ほとんどの計算理論にはそれが含まれています)、クワインを生成するためによく使用されます。私の質問は、誰かが、プログラムのソースのプレースホルダーを含む何らかの言語(たとえば、C)のプログラムを入力として受け入れ、プログラムを処理して、アクセス可能な新しいプログラムを生成する汎用ツールを作成したかどうかです。独自のソースコードに。これにより、たとえば、クワインを自動的に生成したり、構文ツリーをイントロスペクトできるプログラムを作成したりできます(おそらく、まだサポートされていない言語でのリフレクションが可能になります)。そうでない場合、私はそのようなツールの独自のバージョンを作成することを計画していましたが、これがすでに行われている場合は、車輪の再発明をしたくありません。

編集:@Henning Makholmの提案に基づいて、私はただ座ってそのようなプログラムを実装することにしました。結果のプログラム(私は「kleene」と呼んでいます)は、入力としてC ++プログラムを受け入れ、関数を呼び出すことによって独自のソースコードにアクセスできる新しいC++プログラムを生成しますkleene::MySource()。これは、次のプログラムを使用して、この非常に単純なプログラムをQuineに変換できることを意味しますkleene

#include <iostream>

int main() {
    std::cout << kleene::MySource() << std::endl;
}

あなたがそれをチェックすることに興味があるなら、それは私のウェブサイトでここに利用可能です。

4

2 に答える 2

3

ウィキペディアの記事とそこからのリンクに多くの例があります。1つか2つを見れば、ペイロードコードの任意の部分を入力として受け取る特定の言語でQuineジェネレーターを構築する方法が明らかになるはずです。

リフレクションのアイデアの 1 つの問題は、一般に、プログラムが構築したものが独自のソース コードであることを認識できないことです。

于 2011-08-11T18:09:49.133 に答える
0

当社のDMS Software Reengineering Toolkitプログラム変換システムであり、任意の構文 (「ドメイン記述」と呼ばれる明示的なパラメーターで DMS に記述) でプログラムを受け入れ、それらを AST に解析し、AST の分析と変換を実行し、変更されたバージョンから改訂されたプログラム テキストを再生成します。

もちろん、DMS は、DMS ドメイン記述が既に存在する言語 (実際にはドメイン固有言語のセットとして) でコーディングされています。したがって、DMS はそれ自体を読み取ることができ、その機能を使用して、追加の DMS 機能をブートストラップし、そのパフォーマンスを最適化します。そのため、クインを作成していませんが、自己拡張コードを使用してプログラムを構築しています。

そして、はい、任意の言語にリフレクションを提供するそのようなツールについてのあなたの観察はピシャリです。言語で提供されるほとんどのリフレクション機能では、「メソッド名」など、言語コンパイラの関係者が実行時にアクセスすることが最も重要であると考えたものへのアクセスのみが許可されます。もちろん、興味のないものにはアクセスできません。式の内容を教えてくれるリフレクション メカニズムを見たことがありますか? コメントで?

DMS は、汎用の完全なメカニズムを使用して外部からコードを検査することにより、ソース コードのすべての詳細への完全なアクセスを提供します。あなたの言語にリフレクションがない場合、DMS はコードにアクセスし、それについて任意に推論する方法です。あなたの言語にリフレクションがあるとしても、DMS はあなたの言語ではできない方法であなたの言語のプログラムについて推論することができます。なぜなら、DMS はそれ自身の詳細な構造にアクセスできないからです。

于 2011-08-11T21:22:02.270 に答える