Ist es möglich Code der sich während der Laufzeit selbst ändert zu schreiben?



  • Hallo,

    Mal ne Frage, kann man mit C/C++ Code schreiben der es erlaubt,
    daß der Code sich selbst während der Laufzeit ändert?

    Beispiel wie ich mir das vorstelle (Pseudocode):

    main()
    {
      int x;
      x = read(); // liest X aus einer Textdatei.
    
      for (int i=1; i< 1000; i++)
      {
        if (x = 1)  // überprüft ob x = 1 ist
        {
          blabla(); // ruft Funktion blabal auf
        }
        tutut(); // ruft Funktion tut tut auf.
      } 
      return 0;
    }
    

    So, das wäre der normale Code,
    nun ist es aber so, daß ich Rechenzeit sparen will,
    d.h. es soll nur einmal überprüft werden ob x=1 ist,
    wenn das nicht der Fall ist, dann soll
    die Funktion blabla() und die if Bedingung nicht aufgerufen werden.

    D.h. ich bräuchte so etwas wie eine Weiche im Progammablauf
    der einfach die If Abfrage und die Funktion blabla im Hauptspeicher überspringt.

    So soll das irgendwie werden

    main()
    {
      int x;
      weiche sprung; 
      x = read(); // liest X aus einer Textdatei.
      if (x=1)
      {
        Sprung = &blabla;  // Pointer auf eine Funktion blabla  
      }
      else
      {
        Sprung = &tutut(); // Falls x != 1 ist spingt die Funktion gleich zu tutut 
      }
    
      // Eigentliche Algorithmus wird jetzt durchgeführt)
      for (int i=1; i< 1000; i++)
      {
        // Die if Abfrage ist nicht mehr notwendig, da das unsere Weiche 
        // Sprung übernimmt 
        //
        // if (x = 1)  // überprüft ob x = 1 ist
        // {
        //   blabla(); // ruft Funktion blabal auf
        // }
    
        Sprung(); // hier Funktioniert Sprung wie ein Goto,
                  // falls Sprung auf blabla() zeigt wird sofort blabla()
                  // ohne zu überprüfen ob x= 1 ist ausgeführt und danach tutut()
                  // falls Sprung auf tutut() zeigt, wird blabla übergangen.
                  // eine Überprüfung bezüglich x ist ebenfalls nicht notwendig.
        blabla();
        tutut(); // ruft Funktion tuttut() auf.
      } 
      return 0;
    }
    

    D.h. die Weiche wird während dem Programmablauf gestellt bleibt
    aber bis zum bestehen des Programms so erhalten.

    Wie kann man so etwas realisieren?

    Der Vorteil wäre, daß ich nicht immer überprüfen müßte, wie der
    Zustand von x ist.
    Natürlich kann man das auch eleganter Lösen
    in dem man die Überprüfung von anders macht und dann einfach 2 For Schleifen Köpfe macht, aber das ist ja auch nur ein Beispiel was das veranschaulichen soll.



  • Schon mal was von Funktionszeigern gehört? Das ist es was du suchst denk ich...



  • if (x = 1)
    

    wird aber nicht funktionieren 😃



  • (Pseudocode)



  • In Common Lisp ist das möglich, indem man die Funktion zur Laufzeit erstellt, evtl. compiliert, und ausführt.



  • in prolog ist das auch möglich....man kann während der laufzeit prädikate und regeln zu seiner wissensbasis hinzufügen.


Anmelden zum Antworten