In einem Ast-Walking-Interpreter wird der Code Knoten für Knoten ausgeführt. Wie kann ich Funktionen wie goto, break oder continue implementieren? Ich halte die aktuelle Ausführung an und springe zu einem anderen Knoten? Gibt es irgendwelche Best Practices?
Antwort
Zu viele Anzeigen?Die beste Praxis ist "interpretiere keine ASTs für Sprachen mit Gotos".
Grundsätzlich führt jede Art von Diskontinuität im Baumlauf zu einer erheblichen Verlangsamung, wenn die Sprache hauptsächlich Skalare verarbeitet. (Wenn Ihre Sprache hauptsächlich komplexe Werte verarbeitet, wie die Array-Sprache APL, spielt das keine Rolle).
Das Beste, was man sich erhoffen kann, ist, dass man den Baum im Voraus durchläuft und feststellt, wo die Gotos im AST tatsächlich hingehören, und dies in einem assoziativen Cache an der Seite aufzeichnet. Wenn Sie dann auf ein goto stoßen, konsultieren Sie einfach den Cache, anstatt den Baum zu durchsuchen.
Dies ist jedoch der erste Schritt auf dem Weg zur Kompilierung, d. h. zur Vorberechnung von Daten vor der Ausführung.