ウィキペディアでQuineという用語に出くわしたばかりですが、それが何を意味するのかわかりません。私はそれについてもっと混乱しています。実際の用途はありますか?
3 に答える
Quine は基本的に、独自のソース コードを出力するコマンドです。いいえ、実際には実用的な用途はありません。
クインは、次のシナリオで役立ちます。
- プログラムによるコンパイル
オブジェクト コードはディスクに直接シリアライズできますが、先頭に Cookie とバージョンが付加されます。しかし、Scheme を実行時にコンパイルするときは、Scheme の値 (たとえば、コンパイル済みのプロシージャ) が必要です。このため、抽象化を壊さないように、Guile は塔の一番下に偽の言語を定義します。
Value
値にコンパイルすると、オブジェクト コードがプロシージャに読み込まれ、眠っている巨人が目覚めます。
おそらく、この奇妙さは例で説明できます: compile-file はデフォルトでオブジェクト コードにコンパイルします。しかし、その製品が Guile の世界に再び参入するため、コンパイルのデフォルトは価値のあるコンパイルに設定されます。
実際、コンパイルのプロセスは、次のクワインに示されているように、これらのさまざまな世界を無期限に循環する可能性があります。
((lambda (x) ((compile x) x)) '(lambda (x) ((compile x) x)))
- セキュリティチェック:
Omniture の場合、攻撃者は cookie に quine を追加し、cid の新しい値を使用して eval を強制する必要があります。
巧妙に細工された gzip ファイル (添付ファイルは、それ自体に解凍される quine です) を使用して、tar(1) を実行しているマシン上のすべてのメモリが使い果たされるか、別のメモリがなくなるまで、tar(1) を取得して、gzip コンプレッサーの無限チェーンを呼び出すことができます。リソース制限が開始されます。
- 自己変革
基本的に、その直感的な (そして効果的な) 内容は、プログラムが変数として独自のソースを使用できるということです。つまり、プログラムがそれ自体 (ソース コード) を操作する機能をプログラミング言語に追加しても、その表現力は向上しません。そのため、独自のリストを圧縮するプログラムが存在します。独自の MD5 チェックサムを出力するものがあります (これは、MD5 チェックサムを含むプログラム (実際には任意のファイル) を見つけるよりもはるかに簡単です)
- 自己完結型の 2 層アーキテクチャ
データとデータベース コードが同じ場所に保存されていないと、一方を追跡できなくなり、もう一方が役に立たなくなる危険があります。
- 自己保存
TiddlyWiki は、実用的なクインの珍しい例です。変更を独自に保存する TiddlyWiki の機能の中心にあるのは、独自のソース コードのコピーを作成するこの機能です。
- 証明
「クワイン」が「入力として独自のソース コードを使用するオートマトン」を意味する場合、ゲーデルは多かれ少なかれクワインを使用して不完全性定理を証明し、チューリングは停止問題が計算不能であることを証明するためにクワインを使用し、トンプソンはそれをすべてのソフトウェアとコンパイラのソース コードにアクセスするだけではバックドアを見つけるには不十分であり、Steve Russell は、McCarthy の Lisp クワインを (709?) アセンブリにエンコードすることによって、関数型プログラミング言語をほぼ発明しました。John von Neumann は、self-一般的に生命体を再現することはクインであることが判明し、DNA の発見によって正しいことが証明されました。
したがって、クインが生命の存在、ゲーデルの不完全性定理、停止問題の計算不可能性の証明、および関数型プログラミング言語の存在に関与している場合、私はそれらをすべてのプログラムの中で最も歴史的に重要なカテゴリとして指名します。
- 非構造化ループ
Muriel には従来の制御構造はありません。代わりに、Muriel には、現在実行中の Muriel プログラムを特定の文字列に置き換え、代わりにそれを実行するコマンドがあります。これは、何らかの種類のループを実行するために、プログラムがそれ自体をクインしなければならないプログラミング方法につながります。
参考文献
いいえ、それは便利なことではありません。一部のプログラマーが楽しんでいるのは、単なるスタイルの練習です...