Programme rückwärts ausführen

7

Ich habe nie einen Debugger verwendet, der ein Programm rückwärts ausführen kann, aber ich würde es gerne tun. Jetzt frage ich mich, ob es viele Beweise und Theorien zur rückwärts laufenden Programmierung gibt, wann und warum ein Programm rückwärts ausgeführt werden kann oder wann und warum nicht?

Intuitiv finde ich, dass der Computer in der Lage sein sollte, das Programm rückwärts auszuführen, wenn er das Programm einmal vorwärts ausgeführt hat und weiß, dass das Programm rückwärts ausgeführt wird, wodurch Zustände des Programms gespeichert werden, die andernfalls verloren gehen und freigegeben werden könnten.

Das Debuggen ist nur ein praktisches Beispiel. Ich interessiere mich auch für die Theorie der Reversibilität. Wenn das Programm rückwärts ausgeführt werden kann, ist das, was das Programm tut, reversibel, nicht wahr?

Niklas
quelle
1
Ich habe vorher aus praktischer Sicht über Reverse Debugging nachgedacht. Ich denke, es wäre ein Killer-Plugin für jede IDE. Es gibt einige offensichtliche erste Beobachtungen: 1. Wenn Sie im Vorwärtsmodus in eine Variable schreiben, müssen Sie den vorherigen Status speichern (z. B. kostet dies ~ 2,4 GB Speicher / s). 2. Wenn Sie den zusätzlichen Speicher vermeiden möchten, können Sie das Programm bis zu der Zeile erneut ausführen, in der Sie das Debugging durchführen möchten. 3. Sie können einen Kompromiss zwischen den beiden vorherigen Punkten eingehen. 4. Es funktioniert nicht, wenn das Programm Nebenwirkungen hat, z. B. einen REST-Aufruf.
Albert Hendriks

Antworten:

3

Um das Programm tatsächlich rückwärts auszuführen, müssten Sie theoretisch alle Auswirkungen der Programmausführung rückgängig machen. Dies sollte für Speicheränderungen relativ einfach, wenn auch ineffizient, für Änderungen auf der Festplatte schwieriger und für das Netzwerk unmöglich sein. Und wenn der Code von einem externen Status abhängt (Tageszeit, Datei auf der Festplatte, die durch einen anderen Prozess geändert werden könnte), führt das Zurückspulen und erneute Ausführen nicht zum gleichen Ergebnis.

In der Praxis , was möglich ist, damit Sie schauen auf dem Zustand des Programms an einem gewissen Punkt in der Ausführung, aber ohne dass Sie von diesem Punkt aus neu zu starten. Auf diese Weise gibt es keine Probleme mit dem externen Status, da bei dieser Form des Zurückspulens keine Statusänderungen rückgängig gemacht werden müssen (mit Ausnahme des Speichers) und ein Vorwärtsschritt immer das gleiche Ergebnis liefert (da der Code nicht erneut ausgeführt wird). Diese Form des Zurückspulens wird in Visual Studio unter dem Namen Historical Debugging implementiert , obwohl der Programmstatus nicht bei jeder Anweisung oder Codezeile, sondern nur bei jedem Methodenaufruf aufgezeichnet wird.

svick
quelle