Bahagian kod aliran kawalan ini terutamanya melibatkan arahan kod bait berikut Semua arahan kod bait berikut akan mempunyai parameter:
JUMP_FORWARD, arahan lengkap akan menambah parameter ini pada kedudukan arahan bytecode yang sedang dilaksanakan, dan kemudian melompat ke hasil yang sepadan untuk meneruskan pelaksanaan.
Jika elemen teratas tindanan adalah benar, arahan untuk menukar kedudukan pelaksanaan bytecode kepada nilai parameter yang diterima ialah "POP_JUMP_IF_TRUE". Pop elemen atas daripada timbunan.
POP_JUMP_IF_FALSE, arahan ini adalah sama dengan POP_JUMP_IF_TRUE, satu-satunya perbezaan adalah untuk menentukan sama ada elemen teratas tindanan adalah sama dengan benar.
JUMP_IF_TRUE_OR_POP, jika elemen teratas timbunan adalah sama dengan benar, kedudukan pelaksanaan bytecode ditetapkan kepada nilai yang sepadan dengan parameter dan tidak perlu memunculkan elemen teratas daripada timbunan. Jika elemen atas timbunan adalah palsu, elemen itu mesti muncul.
JUMP_IF_FALSE_OR_POP, sama seperti JUMP_IF_TRUE_OR_POP kecuali elemen teratas tindanan adalah sama dengan palsu.
JUMP_ABSOLUTE secara langsung menetapkan kedudukan pelaksanaan bytecode kepada nilai parameter.
Secara amnya, arahan lompat ini membenarkan penterjemah Python menukar aliran pelaksanaan mengikut syarat tertentu apabila melaksanakan kod bait dan melaksanakan struktur bahasa asas seperti gelung dan pernyataan bersyarat .
Kini kami menggunakan contoh untuk memahami secara mendalam proses pelaksanaan pelbagai arahan di atas.
import dis def test_control01(): a = 1 if a > 1: print("a > 1") elif a < 1: print("a < 1") else: print("a == 1") if __name__ == '__main__': dis.dis(test_control01)
Output program di atas adalah seperti berikut: (a)
8 4 LOAD_FAST 0 (a)6 LOAD_CONST 1 (1)
8 COMPARE_OP 4 (> ;)
10 POP_ LOMPAT_JIKA_SALAH 22
9 12 LOAD_GLOBAL 0 (cetak)
14 LOAD_CONST 2 (' a > 1')
16 CALL_FUNCTION 200% hingga 48) > (1)
26 BANDINGKAN_OP 0 ( 28 POP_LOMPAT_JIKA_SALAH 40
11 30 LOAD _GLOBAL 0 ST ( 0 3 ('a 34 CALL_FUNCTION 1
36 POP_TOP
38 LOMPAT_FORWARD 8 (hingga 48)
13 >>>>>>>>>>> ; 42 LOAD_CONST 4 ('a = = 1')
1 50 RETURN_VALUE
Mari kita simulasi proses pelaksanaan bytecode di atas untuk menunjukkan kedudukan pelaksanaan bytecode semasa:
Sebelum bytecode bermula. melaksanakan, status ruang tindanan dan pembilang adalah seperti berikut:Sekarang laksanakan kod bait pertama LOAD_CONST Selepas pelaksanaan, pembilang = 2, kerana kod bait ini menduduki satu bait dan timbunan parameter ialah satu bait, jadi kedudukan kod bait yang dilaksanakan kali berikutnya adalah dalam kod bait Tiga kedudukan lebih rendah, yang sepadan. subskrip ialah 2, jadi pembilang = 2.
Sekarang laksanakan kod bait kedua STORE_FAST, biarkan satu titik ke 1, opcode dan operan STORE_FAST yang sama masing-masing menduduki satu bait, jadi perkataan ini dilaksanakan Tiada data dalam ruang tindanan selepas kod bahagian, pembilang = 4.
Seterusnya, LOAD_FAST memuatkan objek yang ditunjuk oleh a, iaitu 1, ke dalam tindanan Pada masa ini, pembilang = 6 dan LOAD_CONST memuatkan pemalar 1 ke dalam ruang tindanan. Ini Apabila pembilang = 8, selepas melaksanakan kedua-dua arahan ini, ruang tindanan berubah seperti yang ditunjukkan di bawah:
Arahan seterusnya ialah COMPARE_OP, arahan ini mempunyai parameter The mewakili simbol perbandingan Di sini ia membandingkan > 1, dan hasil perbandingan akan ditolak ke dalam tindanan, kerana COMPARE_OP akan mula-mula memaparkan dua input ruang tindanan, jadi selepas melaksanakan ini. nilai ruang tindanan dan pembilang selepas arahan adalah seperti berikut:
Arahan berikut ialah POP_JUMP_IF_FALSE Mengikut maksud bytecode sebelumnya, bytecode ini akan muncul palsu di bahagian atas timbunan , dan akan melompat, dan atur cara nilai pembilang terus kepada nilai parameter Di sini parameternya ialah 22, jadi pembilang = 22. Selepas melaksanakan arahan ini, hasilnya adalah seperti berikut:
Oleh kerana ia kini telah melonjak kepada 22, arahan seterusnya yang akan dilaksanakan ialah LOAD_FAST, yang memuatkan pembolehubah a ke dalam ruang tindanan space. Selepas dua pelaksanaan ini, perubahan Situasinya adalah seperti berikut:
Laksanakan POP_JUMP_IF_FALSE kali ini, dan keputusan kali ini juga palsu, jadi teruskan laksanakan POP_JUMP_IF_FALSE, kali ini parameternya ialah 40, teruskan tetapkan nilai pembilang kepada 40 .
Seterusnya, LOAD_GLOBAL memuatkan pembilang fungsi cetakan berubah global dan menjadi 42, LOAD_CONST memuatkan rentetan "a == 1" ke dalam ruang tindanan, pembilang = 44, kali ini status Seperti berikut:
CALL_FUNCTION Kod byte ini mempunyai parameter, menunjukkan bilangan parameter untuk memanggil fungsi, ini adalah 1, kerana fungsi cetakan hanya mempunyai satu parameter , dan kemudian mengeluarkan rentetan "a== 1", tetapi apa yang perlu diperhatikan di sini ialah fungsi cetakan akan mengembalikan Tiada, jadi status selepas melaksanakan CALL_FUNCTION adalah seperti berikut:
Pada ketika ini, fungsi di atas hampir dilaksanakan Itu sahaja.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan aliran kawalan kod bait mesin maya Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!