質問
コンピュータプログラマとしてできないことはいくつかあると聞きましたが、それが何であるかはわかりません。最近私が思い浮かんだことの1つは、実行するプログラムのソースのコピーを作成し、そのプログラムを変更し、そのクラスにメソッドを追加してから実行できるクラスがあればいいのではないかということです。プログラムのコピーとそれ自体を終了します。コードでコードを書くことは可能ですか?
解決
最初にクイン、次にマクロアセンブラー、次に lex& yacc 、および flex&バイソン。次に、自己変更コードを検討します。
これはクインです(フォーマットされ、出力を新しい入力として使用します):
#include<stdio.h>
main()
{
char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
int b = '"';
printf(a,b,a,b,b);
}
今、プログラマーがnp-completeの反対を探すことができないものを探しているなら。
他のヒント
計算可能性の限界について知りたい場合は、停止の問題
計算可能性理論では、停止 問題は、決定問題です 次のように記述できます。 プログラムと有限の記述 入力、プログラムが 実行を終了するか、永久に実行されます。 その入力を与えられます。
Alan Turingは1936年に すべての停止問題を解決する一般的なアルゴリズム 可能なプログラムと入力のペアは存在できません
もちろんです。これが多くのウイルスの仕組みです!
これを理解する:計算可能性理論。
はい、それはほとんどのLispマクロが行うことです(ほんの一例です)。
はい、確かにありますが、参照しているコンテキストではないかもしれませんが、 post t4で。
さらにコードを生成するコードを書く機会が多い関数型プログラミングを見ると、Lispのような言語がコードとデータを区別しない方法は、その力の重要な部分です。
Railsは、新しいアプリケーションを作成するときに、データベーススキーマからさまざまなデフォルトモデルとコントローラークラスを生成します。動的言語でこの種のことを行うことは非常に標準的です-私が当時扱っていた問題に対する最も簡単な解決策だったという理由だけで、PHPファイルを生成するPHPのいくつかのビットがあります。
それで可能です。あなたが尋ねている質問については、しかし、それはおそらく少し曖昧なものですが、どの環境と言語を使用していますか?コードに何を期待し、なぜ追加する必要があるのですか?具体的な例は、より直接関連性の高い応答をもたらす可能性があります。
はい、コードジェネレーターを作成することは可能です。 ほとんどの場合、ユーザー入力を受け取り、有効なコードを生成します。しかし、他の可能性もあります。
自己修正プログラムも可能です。しかし、それらはドス時代に一般的でした。
もちろんできます!実際、動的言語を使用している場合、プログラムの実行中にクラスはそれ自体(または別のクラス)を変更できます。以前は存在しなかった新しいクラスを作成することもできます。これはメタプログラミングと呼ばれ、コードを非常に柔軟にします。
「書き込み」という単語の2つの意味を混同/混同しています。 1つの意味は、メディアへのバイトの物理的な書き込みであり、もう1つの意味はソフトウェアの設計です。もちろん、前者を実行するように設計されている場合は、前者を実行することもできます。
プログラムがプログラマーが明示的に意図していないことを行う唯一の方法は、生き物のように振る舞うことです:変異(それ自体に環境のビットを組み込みます)、異なるレートで異なる変異体を複製すること突然変異が終末である場合、完全な絶滅を避けてください。
もちろんです。 Paint.NET *用のエフェクトを作成しました。これにより、エディターが提供され、「オンザフライ」でグラフィカルなエフェクトを作成できます。入力を一時停止すると、dllにコンパイルされ、ロードされて実行されます。これで、エディターでは、実際のレンダリング関数を記述するだけで済みます。 dllの作成に必要なものはすべてエディターによって書き込まれ、C#コンパイラーに送信されます。
ここから無料でダウンロードできます: http://www.boltbait.com/pdn/codelab /
実際、コンパイラーに送信される前に作成されたすべてのコードを表示するオプションもあります。ヘルプファイル(上記にリンク)は、それについてすべて説明しています。
ソースコードもそのページからダウンロードできます。
* Paint.NETは、ここからダウンロードできる無料の画像エディターです。 http://getpaint.net
人工知能に関しては、進化的アルゴリズムをご覧ください。
実行するプログラムのソースのコピーを作成し、そのプログラムを変更してメソッドをクラスに追加してから、プログラムのコピーを実行してそれ自体を終了します
コードを生成し、実行可能ファイルではなくライブラリにビルドし、現在実行中のプログラムを終了することなくライブラリを動的にロードすることもできます。
通常、動的言語は、完全に独立したコンパイル手順を持たないという点で、あなたが提案するほどには機能しません。プログラムが独自のソースコードを変更し、再コンパイルし、ゼロから開始する必要はありません。通常、新しい機能はオンザフライでコンパイルおよびリンクされます。
Common Lispはこれを実践するのに非常に優れた言語ですが、コードを作成して実行できる他の言語もあります。通常、これは&quot; eval&quot;と呼ばれる関数を通じて行われます。または類似のもの。 Perlには&quot; eval&quot;があります関数、そしてスクリプト言語が能力を持つことは一般的に一般的です。
yaccやbisonなど、他のプログラムを作成するプログラムはたくさんありますが、探していると思われる動的な品質はありません。
Langtomのループをご覧ください。これは、自己複製の「プログラム」の最も単純な例です。
「コードジェネレーター」と呼ばれるクラスがあります。 (ただし、コンパイラは設定したとおりに記述に適合します)。そして、それらはこれらの獣の2つの領域を説明しています。
ほとんどのコードが生成され、何らかの形式のユーザー入力(ほとんどがデータベーススキーマを使用)および製品ソースコードが生成され、コンパイルされます。
より高度なものは、実行可能コードを出力できます。 .NETには、実行可能コードの作成専用の名前空間(System.CodeDom)があります。これらのオブジェクトは、C#(または別の言語)コードを取得してコンパイルし、現在実行中のプログラムにリンクできます。
これはPHPで行います。
クラスの設定を保持するために、 $ data
というローカル変数を保持します。 $ dataは単なる辞書/ハッシュテーブル/連想配列です(どこから来たのかに依存します)。
クラスをロードすると、基本的にデータを定義するphpファイルが含まれます。クラスを保存すると、データの値ごとにPHPが書き込まれます。書き込みプロセスは遅いですが(現在、並行処理の問題がいくつかあります)、読み取りが軽いよりも高速です。データベースを使用するよりもはるかに高速(かつ軽量)です。
このようなことは、すべての言語で機能するとは限りません。 PHPは非常にオンザフライで動作するため、PHPで動作します。
コードジェネレーターを作成することは常に可能です。 XMLテクノロジーでは、コードジェネレーターの使用が不可欠なツールになります。他の会社のXMLファイルを処理しなければならない会社で働いているとします。 XMLパーサーを使用して新しいXMLファイルを解析するプログラムを作成し、その形式のXMLファイルを読み取るようにすべてのコールバック関数を設定した別のプログラムを作成するのは比較的簡単です。ニーズに合わせて新しいプログラムを編集する必要がありますが、このタイプのコードジェネレーターを使用すると、新しいXMLファイル(新しい構造、新しい名前)が大幅に削減される開発時間を短縮できます。私の意見では、これはXMLテクノロジーの強さの一部です。
Lisp lisp lisp lisp:p
冗談、コードを生成するコードを実行したい場合、コードを生成する再帰的なもので学習を緩め、心を壊す時間があるなら、lispを学ぼう:)
(eval '(or true false))
実行するプログラムのソースのコピーを作成し、そのプログラムを変更し、それが存在するクラスにメソッドを追加し、プログラムのコピーを実行できるクラスがあると便利ではありませんか自分自身を終了する
「より良い」解決できない問題を解決するケースはほとんどありません。非自己修正コードを使用しています。
とはいえ、他のコードを記述するコードの非常に一般的な(有用な)ケースがいくつかあります。最も明白なのは、HTML / Javascriptを生成するサーバーサイドWebアプリケーションです(HTMLはマークアップですが、理論)。また、端末環境を変更するスクリプトは通常、親シェルによって評価されるシェルスクリプトを出力します。 wxGladeは、ベアボーンwxベースのGUIを作成するコードを生成します。
DMSソフトウェアリエンジニアリングツールキットをご覧ください。これは、プログラムを読み取って変更したり、フラグメントを組み立ててプログラムを生成したりするための汎用的な機械です。
これは、人工知能の基本的な質問の1つです。個人的にはそれが不可能であることを願っています-そうでなければすぐに私は失業します!!! :)
メタプログラミングと呼ばれ、便利なプログラムを作成するのに適した方法です、および興味深い研究トピック。 Jacques Pitratの人工的な存在:意識的な機械の良心の本は、あなたの興味を引くはずです。主にメタ知識ベースのコンピュータープログラムに関連しています。
別の関連用語は、マルチステージプログラミングです(複数のステージがあるためそれぞれ次のプログラムを生成するプログラム)。