Frage

Ich habe gehört, dass es einige Dinge kann man als Computer-Programmierer nicht tun, aber ich weiß nicht, was sie sind. Eine Sache, die ich einfiel vor kurzem war: wäre es nicht schön, eine Klasse zu haben, die eine Kopie der Quelle des Programms machen könnte es läuft, das Programm zu ändern und ein Verfahren zur Klasse hinzufügen, die es ist, und dann läuft die Kopie des Programms und kündigen selbst. Ist es möglich, Code, Code zu schreiben?

War es hilfreich?

Lösung

Starten Sie, indem Sie auf quines , dann auf Makro-Combiner und dann lex & yacc und flex & Bison . Dann betrachten selbstmodifizierenden Code .

Hier ist ein quine (formatiert, verwenden Sie die Ausgabe als neuer Eingang):

#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);
}

Nun, wenn Sie nur für Dinge Programmierer suchen, kann nicht für das Gegenteil von der NP-vollständig suchen.

Andere Tipps

Wenn Sie sich über die Grenzen der Berechenbarkeit erfahren möchten, lesen Sie über die Halteproblem

  

In Berechenbarkeit der Theorie, das Anhalten   Problem ist ein Entscheidungsproblem der   kann wie folgt festgestellt werden: Bei einem gegebenen   Beschreibung eines Programms und einer endlichen   Eingang, entscheiden, ob das Programm   Ausführung beendet ist oder läuft immer,   gegeben, dass die Eingabe.

     

Alan Turing bewies 1936, dass ein   allgemeiner Algorithmus das Halteproblem für alle zu lösen   möglich Programm-Eingangspaar können nicht existieren

Natürlich. Das ist, wie viele Viren arbeiten!

Erhalten Sie Ihren Kopf um diese. Berechenbarkeit Theorie

Ja, das ist, was die meist Lisp-Makros tun (für nur ein Beispiel).

Ja, es ist sicherlich, wenn auch vielleicht nicht im Zusammenhang, Sie beziehen sich diese Post rel="nofollow zu überprüfen, auf t4.

Wenn Sie bei Functional Programming suchen, die viele Möglichkeiten bieten, um Code zu schreiben, weiteren Code erzeugt, die Art und Weise, die eine Sprache wie Lisp nicht zwischen Code und Daten differenzieren ist ein wichtiger Teil davon ist Macht.

Rails erzeugt die verschiedene Standardmodell und Controller-Klassen aus dem Datenbank-Schema, wenn es eine neue Anwendung zu schaffen. Es ist ziemlich Standard diese Art der Sache mit dynamischen Sprachen- zu tun ich ein paar Bits von PHP haben um die PHP-Dateien generieren, nur weil es die einfachste Lösung für das Problem war ich mit damals zu tun hatte.

So ist es möglich. Was die Frage fragen Sie, though-, dass vielleicht ein wenig vague- ist, was Umwelt und Sprache verwenden Sie? Was erwarten Sie den Code zu tun, und warum es werden muss hinzugefügt? Ein konkretes Beispiel kann mehr direkt relevante Antworten bringen.

Ja, es ist möglich, Code-Generatoren zu erstellen. Die meiste Zeit nehmen sie Benutzereingaben und gültigen Code erzeugen. Aber es gibt auch andere Möglichkeiten.

Selbst modifizierende programes sind ebenfalls möglich. Aber sie waren häufiger in der DOS-Ära.

Natürlich können Sie! In der Tat, wenn Sie eine dynamische Sprache verwenden, kann die Klasse selbst ändern (oder eine andere Klasse), während das Programm noch läuft. Es kann sogar neue Klassen erstellen, die es vorher nicht gab. Dies nennt man metaprogramming, und sie können Ihr Code sehr flexibel werden.

Sie sind verwirrend / conflating zwei Bedeutungen des Wortes „schreiben“. Eine Bedeutung ist die physische Schreiben von Bytes zu einem Medium, das andere ist die Gestaltung Software. Natürlich können Sie die ehemaligen das Programm zu tun haben, wenn es entworfen wurde, dies zu tun.

Der einzige Weg für ein Programm, um etwas zu tun, dass der Programmierer nicht explizit die Absicht hat, es zu tun, ist wie ein Lebewesen zu verhalten: mutieren (nimmt selbst Bits Umwelt) und verschiedene Mutanten replizieren mit unterschiedlichen Geschwindigkeiten (bis vermeiden vollständige Auslöschung, wenn eine Mutation Terminal).

Natürlich. Ich schrieb einen Effekt für Paint.NET *, die Ihnen einen Editor gibt und ermöglicht es Ihnen, einen grafischen Effekt „on the fly“ zu schreiben. Wenn Sie Pause eingeben es zu einer DLL kompiliert, lädt es und führt es aus. Nun, im Editor, müssen Sie nur die tatsächliche Render-Funktion, alles andere notwendig schreiben, um eine DLL erstellen wird durch den Editor geschrieben und auf den C # -Compiler gesendet.

Sie können es kostenlos herunterladen hier: http://www.boltbait.com/pdn/codelab /

In der Tat, es gibt sogar eine Option, den gesamten Code, um zu sehen, die für Sie geschrieben wurde, bevor es an den Compiler geschickt wird. Die Hilfe-Datei (oben verlinkten) spricht alles.

Der Quellcode ist verfügbar als auch von dieser Seite zum Download bereit.

* Paint.NET ist ein kostenloses Bildbearbeitungsprogramm, dass Sie hier herunterladen können: http://getpaint.net

In Bezug auf künstliche Intelligenz, werfen Sie einen Blick auf Evolutionäre Algorithmen .

  

eine Kopie der Quelle des Programms läuft, das Programm ändern und ein Verfahren zur Klasse hinzufügen, die es ist, und dann die Kopie des Programms auszuführen und beenden selbst

Sie können auch Code generieren, bauen sie in eine Bibliothek statt einer ausführbaren Datei, und dann die Bibliothek dynamisch laden ohne das Programm zu verlassen, die derzeit ausgeführt wird.

Dynamische Sprachen in der Regel nicht ganz funktioniert, wie Sie vorschlagen, dass sie nicht über einen völlig separaten Kompilierschritt. Es ist nicht erforderlich, dass ein Programm seine eigenen Quellcode zu verändern, neu kompiliert und von vorne anfangen. Typischerweise wird die neue Funktionalität im laufenden Betrieb erstellt und eingebunden.

Common Lisp ist eine sehr gute Sprach dies in der Praxis, aber es gibt andere, wo Sie Code erstellt und führen Sie es dann und dort. Typischerweise wird dies durch eine Funktion namens „eval“ oder etwas ähnliches. Perl hat eine „eval“ -Funktion, und es ist allgemein üblich, für Skriptsprachen die Fähigkeit zu haben.

Es gibt viele Programme, die andere Programme, wie zB yacc oder Bison schreiben, aber sie haben nicht die gleiche dynamische Qualität, die Sie zu sein scheinen suchen.

Hier finden Sie aktuelle Langtom-Schleife . Dies ist das einfachste Beispiel selbst reproduzieren „Programm“.

Es gibt eine ganze Klasse solcher Dinge genannt „Code-Generatoren“. (Obwohl, ein Compiler passt auch die Beschreibung, wie Sie es eingestellt ist). Und diejenigen, beschreiben die beiden Bereiche dieser Tiere.

Die meisten Code generiert, nehmen Sie irgendeine Form von Benutzereingaben (die meisten nehmen Sie ein Datenbankschema) und Produkt-Quellcode, der dann kompiliert wird.

Weitere fortgeschrittene ausgeben kann ausführbaren Code. Mit .NET, gibt es einen ganzen Namensraum (System.CodeDom) mit dem ausführbaren Code erstellen gewidmet ist. Die diese Objekte können Sie C # (oder eine andere Sprache) Code nehmen, kompilieren und verknüpfen Sie ihn auf Ihrer aktuell laufenden Programm.

Ich tue dies in PHP.

Um die Einstellungen für eine Klasse bestehen, halte ich eine lokale Variable namens $data. $ Data ist nur ein Wörterbuch / Hash-Tabelle / Assoc-Array (je nachdem, wo Sie kommen aus).

Wenn Sie die Klasse laden, es enthält eine PHP-Datei, die im Grunde Daten definiert. Wenn ich die Klasse zu speichern, schreibt es die PHP für jeden Wert von Daten aus. Es ist ein langsamer Schreibprozess (und es gibt derzeit einige Concurrency Probleme), aber es ist schneller als das Licht zu lesen. So viel schneller (und leichter) als eine Datenbank verwendet wird.

So etwas wäre für alle Sprachen nicht funktionieren. Es funktioniert für mich in PHP, weil PHP sehr on-the-fly ist.

Es ist immer möglich, Code-Generatoren zu schreiben. Mit der XML-Technologie kann auf den Einsatz von Codegeneratoren ein wichtiges Instrument sein. Angenommen, Sie für ein Unternehmen arbeiten, die mit XML-Dateien von anderen Unternehmen zu tun hat. Es ist relativ einfach, ein Programm zu schreiben, das den XML-Parser verwendet die neue XML-Datei zu analysieren und ein anderes Programm schreiben, das die Rückruf alle Funktionen einrichten muss XML-Dateien dieses Formats zu lesen. Sie würden immer noch das neue Programm bearbeiten müssen, um es auf Ihre Bedürfnisse spezifische, aber die Entwicklungszeit, wenn eine neue XML-Datei (neue Struktur, neue Namen) ist viel von der Verwendung dieser Art von Code-Generator abgeholzt. Meiner Meinung nach, ist dieser Teil der Stärke der XML-Technologie.

Lisp Lisp Lisp Lisp: p

scherzend, wenn Sie Code mögen, den Code generiert zu laufen und Sie haben Zeit für das Erlernen es zu verlieren und Ihren Geist mit rekursiven Sachen brechen mehr Code zu erzeugen, versucht Lisp zu lernen:)

(eval '(or true false))
  

wäre es nicht schön, eine Klasse zu haben, die eine Kopie der Quelle des Programms machen könnte es läuft, das Programm zu ändern und ein Verfahren zur Klasse hinzufügen, die es ist, und dann die Kopie des Programms ausgeführt werden und kündigen sich

Es gibt so gut wie keine Fälle, in denen das Problem lösen würden, die nicht gelöst werden kann „besser“ mit nicht-selbst-modifizierenden Code ..

Das heißt, es gibt einige sehr häufig (nützlich) Fälle von Code anderer Code zu schreiben .. Die offensichtlichste ist jede serverseitige Web-Anwendung, die HTML / Javascript erzeugt (na ja, ist HTML-Markup, aber es ist identisch Theorie). Auch jedes Skript, das eine Endgeräte-Umgebung ändert in der Regel gibt einen Shell-Skript, das von der Mutterschale eval'd wird. wxGlade generiert Code zu, dass mit nacktem Knochen schafft wx-basierte GUIs.

Sehen Sie unsere DMS Software Reengineering Toolkit . Dies ist Allzweck-Maschinen zu lesen und Programme zu ändern oder erzeugen Programme durch Fragmente der Montage.

Dies ist eine der grundlegenden Fragen der künstlichen Intelligenz. Ich persönlich hoffe, es nicht möglich ist - sonst bald werde ich aus einem Job sein !!! :)

Es heißt Meta-Programmierung und ist sowohl eine schöne Möglichkeit, nützliche Programme schreiben und ein interessantes Forschungsthema. Jacques Pitrat : das Gewissen einer bewussten Maschine Buch sollten Sie interessieren viel. Es ist vor allem im Zusammenhang mit Meta-Wissen basierten Computer-Programmen.

Ein weiterer verwandter Begriff ist mehrstufigen Programmierung (weil es mehrere Stufen von Programmen zu erzeugen, die jeweils die nächsten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top