X Tutup
Skip to content

Latest commit

 

History

History
183 lines (148 loc) · 4.63 KB

File metadata and controls

183 lines (148 loc) · 4.63 KB

Python虚拟机中的控制流

if 控制流

用到的代码:

# if_control.py
a = 1
if a > 10:
    prin "a > 10"
elif a <= -2:
    print "a <= -2"
elif a != 1:
    print "a != 1"
elif a == 1:
    print "a == 1"
else:
    print "Unknown a"

if_control.py 对应的字节码:

  1           0 LOAD_CONST               0 (1)
              3 STORE_NAME               0 (a)

  2           6 LOAD_NAME                0 (a)
              9 LOAD_CONST               1 (10)
             12 COMPARE_OP               4 (>)
             15 JUMP_IF_FALSE            9 (to 27)
             18 POP_TOP

  3          19 LOAD_CONST               2 ('a > 10')
             22 PRINT_ITEM
             23 PRINT_NEWLINE
             24 JUMP_FORWARD            72 (to 99)
        >>   27 POP_TOP

  4          28 LOAD_NAME                0 (a)
             31 LOAD_CONST               3 (-2)
             34 COMPARE_OP               1 (<=)
             37 JUMP_IF_FALSE            9 (to 49)
             40 POP_TOP

  5          41 LOAD_CONST               4 ('a <= -2')
             44 PRINT_ITEM
             45 PRINT_NEWLINE
             46 JUMP_FORWARD            50 (to 99)
        >>   49 POP_TOP

  6          50 LOAD_NAME                0 (a)
             53 LOAD_CONST               0 (1)
             56 COMPARE_OP               3 (!=)
             59 JUMP_IF_FALSE            9 (to 71)
             62 POP_TOP

  7          63 LOAD_CONST               5 ('a != 1')
             66 PRINT_ITEM
             67 PRINT_NEWLINE
             68 JUMP_FORWARD            28 (to 99)
        >>   71 POP_TOP

  8          72 LOAD_NAME                0 (a)
             75 LOAD_CONST               0 (1)
             78 COMPARE_OP               2 (==)
             81 JUMP_IF_FALSE            9 (to 93)
             84 POP_TOP

  9          85 LOAD_CONST               6 ('a == 1')
             88 PRINT_ITEM
             89 PRINT_NEWLINE
             90 JUMP_FORWARD             6 (to 99)
        >>   93 POP_TOP

 11          94 LOAD_CONST               7 ('Unknown a')
             97 PRINT_ITEM
             98 PRINT_NEWLINE
        >>   99 LOAD_CONST               8 (None)
            102 RETURN_VALUE
None

for 控制流

用到的代码:

// for_control.py
lst = [1, 2]
for i in lst:
    print i

对应的字节码:

  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 (2)
              6 BUILD_LIST               2
              9 STORE_NAME               0 (lst)

  2          12 SETUP_LOOP              19 (to 34)
             15 LOAD_NAME                0 (lst)
             18 GET_ITER
        >>   19 FOR_ITER                11 (to 33)
             22 STORE_NAME               1 (i)

  3          25 LOAD_NAME                1 (i)
             28 PRINT_ITEM
             29 PRINT_NEWLINE
             30 JUMP_ABSOLUTE           19
        >>   33 POP_BLOCK
        >>   34 LOAD_CONST               2 (None)
             37 RETURN_VALUE
None

while 控制流

用到的代码:

// while_control.py
i = 0
while i < 10:
    i += 1
    if i >= 5:
        continue
    if i == 20:
        break
    print i

对应的字节码:

  1           0 LOAD_CONST               0 (0)
              3 STORE_NAME               0 (i)

  2           6 SETUP_LOOP              71 (to 80)
        >>    9 LOAD_NAME                0 (i)
             12 LOAD_CONST               1 (10)
             15 COMPARE_OP               0 (<)
             18 JUMP_IF_FALSE           57 (to 78)
             21 POP_TOP

  3          22 LOAD_NAME                0 (i)
             25 LOAD_CONST               2 (1)
             28 INPLACE_ADD
             29 STORE_NAME               0 (i)

  4          32 LOAD_NAME                0 (i)
             35 LOAD_CONST               3 (5)
             38 COMPARE_OP               5 (>=)
             41 JUMP_IF_FALSE            7 (to 51)
             44 POP_TOP

  5          45 JUMP_ABSOLUTE            9
             48 JUMP_FORWARD             1 (to 52)
        >>   51 POP_TOP

  6     >>   52 LOAD_NAME                0 (i)
             55 LOAD_CONST               4 (20)
             58 COMPARE_OP               2 (==)
             61 JUMP_IF_FALSE            5 (to 69)
             64 POP_TOP

  7          65 BREAK_LOOP
             66 JUMP_FORWARD             1 (to 70)
        >>   69 POP_TOP

  8     >>   70 LOAD_NAME                0 (i)
             73 PRINT_ITEM
             74 PRINT_NEWLINE
             75 JUMP_ABSOLUTE            9
        >>   78 POP_TOP
             79 POP_BLOCK
        >>   80 LOAD_CONST               5 (None)
             83 RETURN_VALUE
X Tutup