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