Selbstmodifizierende Prorgamme



  • Athar schrieb:

    Ein selbstmodifizierendes Programm zu schreiben geht schnell, aber ein sinnvolles zu schreiben ist wieder ein anderes Thema.

    Ich glaube der Satz gilt immer noch wenn man sinnvolles durch garantiert korrektes ersetzt.



  • In Prolog fuege ich einfach Praedikate hinzu oder loesche welche. 🙂

    und sich ausreichend mit einem Thema auskennt, dann ist fast nichts besonders schwer.

    Im Softwarebereich, ja.



  • knivil schrieb:

    In Prolog fuege ich einfach Praedikate hinzu oder loesche welche. 🙂

    In Forth und Lisp verwischen sich mir auch die Unterschiede zwischen Laufzeit und Compilezeit. In Perl kann man supi Quelltest zu Funktionen machen und ins laufende Programm stopfen und auch wieder rausmachen. .Net hat doch da auch sowas wie Expression Trees.

    Beim 64-er schreibe ich einfach eine einzufügende Zeile auf den Bildschirm und ein goto 50 drunter, setze der Cursor auf die obere Zeile, pushe zweimal die Eingabetaste in den Tastaturpuffer und halte das Programm an.
    (Siehe 64'er-Magazin 12/84)
    Oh, ich hab's schon damals gemacht. 🤡



  • Habe mir jetzt auch ein kleines Programm gebastelt welches sich selbst
    modifizieren/kompilieren kann. Jetzt muss ich aber immer den Quellcode
    in dem Programm mitschleppen. Gibt es vlt. eine Libarie um Quines zu erzeugen?

    0x0ERROR



  • 0x0ERROR schrieb:

    Gibt es vlt. eine Libarie um Quines zu erzeugen?

    Ändere doch die Sprache dahingehend, daß es einfacher ist.

    Hier mal was zum Anlehnen: http://www.dangermouse.net/esoteric/hq9plusplus.html

    Und /proc/config.gz



  • Ich würde dies lieber mit C++ machen, vorallem weil HQ9++ 5 Befehle
    zur verfügung hat. Hat jemand eine solche Libarie?

    0x0ERROR



  • 0x0ERROR schrieb:

    Ich würde dies lieber mit C++ machen, vorallem weil HQ9++ 5 Befehle
    zur verfügung hat. Hat jemand eine soclche Libarie?

    0x0ERROR

    Falls Du trollst:
    Sei nicht penentrant.

    Falls nicht, lies gleich mal "Gödel Escher Bach" und dann überlege die Frage nochmal.



  • Ich meine ein Programm, welches aus einem vorhandenen Quellcode
    einen einzeiligen String erzeugt. Diesen String will ich dann im Programm
    weiterverarbeiten.

    0x0ERROR



  • Habe jetzt folgenden Code, der aber nicht funktioniert:

    #include <iostream>
    #include <ostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    ofstream datei_out;
    ifstream datei_in;
    string name = "quine.cpp";
    char *inhalt = "";
    void quine(string name) {
    	datei_in.open(name.c_str(),ios_base::in);
    	while(!datei_in.eof()) {
    		datei_in.getline(inhalt,1000);
    		}
    	datei_out.open(name.c_str(),ios_base::out);
    	datei_out << inhalt << endl;
    }
    int main() {
    quine("main.cpp");
    return 0;
    }
    

    0x0ERROR


  • Mod

    0x0ERROR schrieb:

    Habe jetzt folgenden Code, der aber nicht funktioniert:

    Wenn du mit den Grundlagen von C++ strauchelst, dann wird das nichts mit selbstmodifizierendem Code. Der Code enthält einen schweren technischen Fehler (wohin zeigt inhalt?); mindestens drei schwere Logikfehler (die Leselogik ist dreifach falsch); einen schweren Programmierfehler (Dateien werden gleichzeitig mehrfach geöffnet); einen vermutlichen Programmierfehler (name?); und zahlreiche Programmierfehler, die nur darauf warten, dass sie noch passieren (globale Variablen, char-Arrays, fehlende Fehlerprüfungen), oder schon die oben genannten Fehler indirekt verursacht oder begünstigt haben.

    Zusätzlich warst du nicht in der Lage, diese Anfängerfehler selbstständig zu vermeiden oder mit einem Debugger zu analysieren (das wäre sehr einfach gewesen) oder wenigstens soweit zu erforschen, dass du mehr dazu sagen konntest als "funktioniert nicht". Vergiss selbstmodifizierenden Code, lern Grundlagen. In 5-6 Monaten kannst du dir das Thema noch einmal angucken. Wenn du gut bist, dann bekommst du es zu der Zeit dann auch alleine hin.



  • Ich kenne mich nur mit dem Dateilesen nicht aus. Ein kleines
    selbstveränderndes Programm habe ich schon programmiert.

    0x0ERROR



  • volkard schrieb:

    Beim 64-er schreibe ich einfach eine einzufügende Zeile auf den Bildschirm und ein goto 50 drunter, setze der Cursor auf die obere Zeile, pushe zweimal die Eingabetaste in den Tastaturpuffer und halte das Programm an.
    (Siehe 64'er-Magazin 12/84)
    Oh, ich hab's schon damals gemacht. 🤡

    Hehe, kenn ich!

    Lass mich raten:
    Um vom Benutzer eingegebene mathematische Formeln auswerten zu können?



  • Jockelx schrieb:

    volkard schrieb:

    Beim 64-er schreibe ich einfach eine einzufügende Zeile auf den Bildschirm und ein goto 50 drunter, setze der Cursor auf die obere Zeile, pushe zweimal die Eingabetaste in den Tastaturpuffer und halte das Programm an.
    (Siehe 64'er-Magazin 12/84)
    Oh, ich hab's schon damals gemacht. 🤡

    Hehe, kenn ich!

    Lass mich raten:
    Um vom Benutzer eingegebene mathematische Formeln auswerten zu können?

    Uih, das ist lange her. Wenn ich mich recht erinnere: Das Spiel "Kaiser" (in Basic geschrieben) ließ sich nach Abbruch LISTen, aber der Speicher war so verPOKEt, daß sonst wenig damit anzufangen war, insbesondere kein Abspeichern. Aber das Listing konnte ich wegschreiben. Und wie das zu einem Programm machen? Um Zeile 60000 eine Routine, die Zeile für Zeile liest und per programmiertem Direktmodus ins eigene Programm einfügt. Tadaaa!



  • Uii, Kaiser!!
    Sehr schön, wenn nach dem dritten oder vierten Krieg nicht immer ein out-of-memory Error gekommen wäre.

    Egal, genug Nostalgie!



  • Schreib das Programm in Python.
    Das Python-Programm generiert Python-Quelltext, der mit exec ausgeführt wird. Lauffähigen Pythoncode zu schreiben/generieren ist auch deutlich einfacher als C++-Code.
    Ansonsten schreibe einen Bootloader. Da kannst du dann einfach direkt in deinem Programmcode rumschreiben, allerdings wirst du nicht sehr viele C++-Features zum Laufen kriegen (cout zum Beispiel).


Anmelden zum Antworten