Das Regelauswertungsmodul von Intent ist eine stapelbasierte virtuelle Maschine. Das Modul führt die spezifischen Prozesse der regelbasierten Modellierung aus. Dazu verwendet es eine kompilierte Version der Sprache Intent mit allgemeinen Anweisungen. Diese Anweisungen sind der Baugruppensprache ähnlich und liegen in keiner für den Menschen lesbaren Form vor.
Der Intent-Debugger wird bei speziellen allgemeinen Anweisungen, sogenannten Debug-Haltepunkten (debug_break), aufgerufen. Mit Ausnahme dieser Haltepunkte besteht kein Unterschied zu normalen Intent-Auswertungen, sodass es darüber hinaus zu keinen Leistungseinbußen kommt.
Der Debugger wird mit der speziellen Anweisung _debug aufgerufen. Das Vorhandensein einer solchen _debug-Anweisung in einer Regel bewirkt an dieser Position die Kompilierung einer debug_break-Anweisung. Wird während der Auswertung ein solcher Haltepunkt vorgefunden, so wird die Auswertung genau an dieser Stelle gestoppt und das Dialogfeld Debugger an dieser Position geöffnet. Die _debug-Anweisung hat darüber hinaus keinen weiteren Zweck. Sie bewirkt keinerlei Änderungen am System.
Der Intent-Debugger ist kein Quellen-Debugger. Die Anweisungen sind keinen Quellenzeilen zugeordnet, wie dies bei Anweisungen der Fall ist, die lokale Variablen zuweisen, initialisieren und freigeben, Typen überprüfen und Regelwerte abrufen und festlegen. Einige Anweisungen werden auch aufgrund des Vorhandenseins bestimmter Flags, wie Parameter und Lookup, eingefügt. Wir beabsichtigen mit diesen Erläuterungen nicht, die kompilierte Version dieser Sprache vollständig zu dokumentieren.
Jede Regel besteht aus drei Teilen: Leader, Body und Trailer. Leader und Trailer wirken gemeinsam an der Flagverarbeitung, der Initialisierung und der Ausgabe der Rückgabewerte der Regel. In diesem Fall befindet sich der Hauptteil der Regel (Body) zwischen den Anweisungen push_stack 0 0 und pop_stack 0 0. Dabei handelt es sich lediglich um die Anweisungen debug_break und push_statement_marker (letztere Anweisung folgt aus Bereinigungsgründen immer auf eine debug_break-Anweisung).
Die Anweisung bound? ermittelt, ob diese Regel bereits ausgewertet und gespeichert wurde. Diese Prüfung ist die erste Anweisung einer Regel, es sei denn, die Regel ist als Nicht im Cache gespeichert festgelegt. Bei No wird die Auswertung fortgesetzt, bei Yes wird der Wert aus dem gespeicherten Slot abgerufen und direkt mit der Anweisung end_rule fortgefahren. Der Wert 47 ist die Anzahl der zu überspringenden Byte. Jede Anweisung kann 1 bis 9 Byte belegen.
Zunächst aber wird bei der Auswertung die Rückgabevariable eingerichtet. Diese erhält den Namen der Regel, in diesem Fall eine Zeichenfolge. Die Anweisungen richten einen lokalen Variablenframe mit einem Element (auf dem Datenstapel) ein. Dieser erhält als Wert eine leere Zeichenfolge (Vorgabe für den Typ Zeichenfolge). Dieser Status liegt bei Erreichen des debug_break vor. Der Datenstapel zeigt den Namen und den Wert der Rückgabevariablen.
Danach können Sie die Auswertung verfolgen. Es besteht keine Möglichkeit, eine debug_break-Anweisung an einer früheren Stelle der Auswertung zu erhalten. Wie Sie diese Anweisungen durchlaufen, zeigen wir später.
Wenn Sie auf Step klicken, führt das Auswertungsprogramm einen Schritt aus und überträgt eine Anweisungsmarkierung auf den Datenstapel.
In der Spalte Name des Datenstapels wird <no symbol> angezeigt. Nicht alle Daten im Stapel haben einen Namen. Diesen haben nur lokale Variablen.
Beim Durchlaufen der Anweisung pop_stack 0 0 sehen Sie keine Änderung. In der Tat wird in diesem Fall weder durch push_stack 0 0 noch durch pop_stack 0 0 irgendetwas geändert. Bei einer Optimierung können Sie beide Anweisungen entfernen. Durch die pop-Anweisung wird die Anweisungsmarkierung entfernt. Durch die anschließenden Anweisungen wird die Regel geschlossen. Zunächst ruft get_var den debugHere-Wert aus dem Datenstapel ab. Anschließend wird die pop-Anweisung ausgeführt, wodurch der Wert (ohne Namen) an erster Stelle im Stapel erscheint; dabei wird überprüft, ob es sich um eine Zeichenfolge handelt, der Wert wird als Slotwert festgelegt und dann zurückgegeben.
Beim Durchlaufen der Anweisung end_rule wird der Wert zurückgegeben; das Ergebnis sehen Sie in den MinHost-Eigenschaften.
Sie können zu jedem Zeitpunkt auf einen Auswertungsframe klicken und die Anweisungen für die betreffende Regel sowie den Status der Regelausführung untersuchen.