Kontrollfluss: Dieser Teil des Codes umfasst hauptsächlich die folgenden Bytecode-Anweisungen:
JUMP_FORWARD Die vollständige Anweisung ersetzt diesen Parameter Gehen Sie zur Anweisungsposition und springen Sie dann zum entsprechenden Ergebnis, um die Ausführung fortzusetzen.
Wenn das oberste Element des Stapels wahr ist, lautet die Anweisung zum Ändern der Bytecode-Ausführungsposition auf den empfangenen Parameterwert „POP_JUMP_IF_TRUE“. Nehmen Sie das oberste Element vom Stapel.
POP_JUMP_IF_FALSE, diese Anweisung ist dieselbe wie POP_JUMP_IF_TRUE, der einzige Unterschied besteht darin, zu bestimmen, ob das oberste Element des Stapels gleich true ist.
JUMP_IF_TRUE_OR_POP: Wenn das oberste Element des Stapels gleich true ist, wird die Ausführungsposition des Bytecodes auf den dem Parameter entsprechenden Wert gesetzt und es besteht keine Notwendigkeit, das oberste Element des Stapels zu entfernen. Wenn das oberste Element des Stapels falsch ist, muss das Element entfernt werden.
JUMP_IF_FALSE_OR_POP, dasselbe wie JUMP_IF_TRUE_OR_POP, außer dass das oberste Element des Stapels gleich false sein muss.
JUMP_ABSOLUTE setzt die Ausführungsposition des Bytecodes direkt auf den Wert des Parameters.
Im Allgemeinen ermöglichen diese Sprunganweisungen dem Python-Interpreter, den Ausführungsablauf entsprechend bestimmten Bedingungen beim Ausführen von Bytecode zu ändern und grundlegende Sprachstrukturen wie Schleifen und bedingte Anweisungen zu implementieren.
Jetzt verwenden wir ein Beispiel, um den Ausführungsprozess der verschiedenen oben genannten Anweisungen genau zu verstehen.
Die Ausgabe des obigen Programms über Risee 的 ist unten dargestellt:6 0 LOAD_CONST 1 (1)2 Store_fast 0 (A)
8 4 LOAD_FAST 0 (A)
6 load_const 1 (1)
8 Compare_op 4 ( & gt;) o 10 pop_jump_if_false 22
9 12 load_global 0 (print)
14 load_const 2 ('a & gt; 1')
16 call_function 1
18 POP_TOP
20 jump_Forward 26 (bis 4 8)
. 10 & GT; .
& G t; & gt; 48 load_const 0 (Keine)
Wir verwenden den Zähler, um die Ausführungsposition des aktuellen Bytecodes darzustellen:
Bevor der Bytecode mit der Ausführung beginnt, werden der Stapelspeicherplatz und der Der Status des Zählers lautet wie folgt:Führen Sie nun den ersten Bytecode LOAD_CONST aus. Nach der Ausführung ist der Zähler = 2. Da dieser Bytecode ein Byte belegt und der Parameterstapel ein Byte beträgt, befindet sich die Position des beim nächsten Mal ausgeführten Bytecodes in den unteren drei Positionen des Bytecodes Der Index ist 2, also ist der Zähler = 2.
Führen Sie nun den zweiten Bytecode STORE_FAST aus, lassen Sie einen Punkt auf 1, derselbe STORE_FAST-Opcode und -Operand belegen jeweils ein Byte, sodass nach der Ausführung dieses Bytecodes keine Daten im Stapelbereich vorhanden sind, Zähler = 4.
Als nächstes lädt LOAD_FAST das Objekt, auf das a zeigt, also 1, in den Stapel. Zu diesem Zeitpunkt ist der Zähler = 6. LOAD_CONST lädt die Konstante 1 in den Stapelbereich. Zu diesem Zeitpunkt ist der Zähler = 8. Nach der Ausführung dieser beiden Anweisungen sind die Änderungen im Stapelbereich wie in der folgenden Abbildung dargestellt:
Die nächste Anweisung ist COMPARE_OP. Diese Anweisung hat einen Parameter, der das Vergleichssymbol darstellt. Hier wird ein > verglichen. 1, und das Ergebnis des Vergleichs wird in den Stapel verschoben. Das Ergebnis des Vergleichs ist falsch, da COMPARE_OP zuerst die beiden Eingaben des Stapelspeichers speichert. Daher werden nach der Ausführung dieser Anweisung die Werte des Stapels angezeigt Leerzeichen und Zähler lauten wie folgt:
Die folgende Anweisung lautet POP_JUMP_IF_FALSE. Gemäß der Bedeutung des vorherigen Bytecodes legt dieser Bytecode das Falsche oben auf dem Stapel ab, springt und programmiert den Wert des Zählers direkt auf Der Wert des Parameters ist hier 22, also Zähler = 22. Nach der Ausführung dieser Anweisung ist das Ergebnis wie folgt:
Da es jetzt auf 22 gesprungen ist, ist die nächste auszuführende Anweisung LOAD_FAST. Dadurch wird die Variable a in den Stapelbereich geladen, und LOAD_CONST lädt die Konstante 1 in den Stapelbereich. Nach der Ausführung dieser beiden Ausführungen sind die Änderungen wie folgt:
Führen Sie POP_JUMP_IF_FALSE erneut aus, dieses Mal ist das Ergebnis ebenfalls falsch. Führen Sie also weiterhin POP_JUMP_IF_FALSE aus. Diesmal ist der Parameter 40. Setzen Sie den Wert des Zählers direkt auf 40.
Als nächstes lädt LOAD_GLOBAL einen globalen variablen Druckfunktionszähler und wird zu 42, LOAD_CONST lädt die Zeichenfolge „a == 1“ in den Stapelbereich, Zähler = 44 und der Status ist wie folgt:
CALL_FUNCTION Der Abschnittscode verfügt über einen Parameter, der die Anzahl der Parameter zum Aufrufen der Funktion angibt. Hier ist es 1, da die Druckfunktion nur einen Parameter hat und dann die Zeichenfolge „a== 1“ ausgibt, dies sollte jedoch hier beachtet werden dass die Druckfunktion „None“ zurückgibt. Daher ist der Status nach der Ausführung von CALL_FUNCTION wie folgt:
Zu diesem Zeitpunkt ist die obige Funktion fast ausgeführt und wird nicht noch einmal beschrieben .
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Kontrollfluss des Bytecodes der virtuellen Python-Maschine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!