Wie kann ich Benutzer-C++-Code zur Laufzeit dynamisch kompilieren und neu laden (z. B. Hot-Reload)?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie kann ich Benutzer-C++-Code zur Laufzeit dynamisch kompilieren und neu laden (z. B. Hot-Reload)?

Post by Anonymous »

Ich möchte ein kleines C++-Programm erstellen, das einen einfachen Editor und ein Vorschaufenster einbettet, das ein Bild/eine Textur/einen Pixelsatz anzeigt.
Die Benutzeroberfläche besteht aus zwei Spalten: Auf der linken Seite kann der Benutzer C++-Code eingeben, und auf der rechten Seite gibt es ein Vorschaufenster, das ein Bild/eine Textur/einen Pixelsatz anzeigt. Das Ziel besteht darin, etwas Ähnliches wie den p5.js-Editor zu erstellen.
Beispiel für die Art von Skizze, die der Benutzer schreiben würde:

Code: Select all

// sketch.cpp

// global state...

// setup() runs once
void setup();

// draw() runs once per "tick", e.g., 30 times a second
void draw();
Es sollte möglich sein, dem Benutzer eine API zugänglich zu machen, z. B. Funktionen und „integrierte“ Variablen. Zum Beispiel eine Funktion wie:

Code: Select all

void create_canvas(uint32_t width, uint32_t height);
von dem erwartet wird, dass er innerhalb von setup() aufgerufen wird.
Wenn der Benutzer auf die Schaltfläche Ausführen klickt, möchte ich den Code aus dem Editor nehmen, ihn kompilieren und in eine Backend-Engine „einbetten“, die setup() einmal aufruft und dann in jedem Frame wiederholt draw() aufruft.

Hier ist ungefähr, wie es mir geht Stellen Sie sich vor, dass das System funktioniert:
  • Die Hauptanwendung stellt den Editor und das Rendering-Fenster bereit, ist in C++ geschrieben und verwendet z. B. GLFW/SDL und ImGUI für Fenster bzw. Benutzeroberfläche.
  • Wenn der Benutzer Ausführen drückt, speichert das Programm den Code des Benutzers in einer temporären .cpp-Datei.
  • Dieser Code wird kompiliert eine gemeinsam genutzte Bibliothek (

    Code: Select all

    .so
    unter Linux/macOS, .dll unter Windows).
  • Die Haupt-App lädt dann diese gemeinsam genutzte Bibliothek zur Laufzeit.
  • Die App sucht und ruft setup() und draw() aus dieser Bibliothek auf.
  • Wenn der Benutzer den Code erneut bearbeitet und Ausführen drückt, entlädt die App die alte Bibliothek und lädt die neue, was effektiv zu einem „Live-Update“ führt. Wirkung.
Die Idee ist, dass wir den Code, den der Benutzer schreibt, irgendwie in unsere Anwendung einfügen, damit wir sie ausführen können. Ich weiß nicht, ob das möglich ist, ich bin nicht so erfahren, wenn es um Bibliotheken und Code-Injection geht.

Etwas konkreter: Der Teil, bei dem ich mir nicht sicher bin, ist, wie ich dieses Live-Neuladen sauber und sicher handhaben soll:
  • Wie kann ich eine gemeinsam genutzte Bibliothek, die in jedem Frame verwendet wird, sicher entladen und neu laden?
  • Gibt es empfohlene Muster? um einen Status (z. B. benutzerdefinierte globale Variablen oder Canvas-Inhalte) zwischen Neuladevorgängen beizubehalten? Ich glaube nicht, dass ich irgendeinen Zustand tatsächlich beibehalten möchte, da ich mir vorstelle, dass es akzeptabel ist, einfach alles für meinen zukünftigen Anwendungsfall neu zu laden. Ich frage dies immer noch hauptsächlich aus Leistungsgründen, z. B. könnte es möglicherweise nützlich sein, eine Neuzuweisung von Speicher zwischen Neuladevorgängen zu vermeiden, wenn der Benutzercode kompliziert und „schwer“ ist. Ich bin neugierig, das ist alles.
  • Ist es besser, den Benutzercode in einem separaten Prozess auszuführen und über Interprozesskommunikation (IPC) zu kommunizieren, anstatt gemeinsam genutzte Bibliotheken im selben Prozess zu laden/entladen?
  • Gibt es Frameworks, Engines oder Beispiele, die diese Art des Neuladens von Live-C++-Code bereits implementieren?
Im Wesentlichen versuche ich, das zu reproduzieren „Bearbeiten – Ausführen – Ausgabe sofort anzeigen“-Workflow von p5.js, aber mit nativem C++.
Alle Hinweise, Entwurfsmuster oder realen Beispiele (Spiel-Engines, Plugins usw.), die dies tun, wären sehr hilfreich.
BEARBEITEN: Das Programm darf nur von mir selbst in einer isolierten Offline-Umgebung verwendet werden. Der Code wird jeweils nur von einer Person bearbeitet, nämlich von der Person, die das Programm in ihrer isolierten Offline-Umgebung ausführt. Daher sind die Sicherheitsbedenken, die natürlich auftreten, wenn es um das Einfügen und Ausführen von Code in eine von Ihnen ausgeführte Anwendung geht, in meinem speziellen Fall im Wesentlichen kein Problem.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post