我写了一些包含循环函数的程序 使用dis模块进行反汇编
import dis
def f():
a = 10
while a < 50:
print a
a+=1
while a < 100:
print a
a+=1
dis.dis(f)
0 load_const 1 (10)
3 store_fast 0 (a)
6 setup_loop 31 (to 40)
9 load_fast 0 (a)
12 load_const 2(50)
15 compare_op 0(<)
18 pop_jump_if_false 39
21 laod_fast 0(a)
24 print_item
25 print_newline
26 load_fast 0(a)
29 load_const 3(1)
32 inplace_add
33store_fast 0(a)
36 jump_absolute 9
39 pop_block
40 setup_loop 31 (to 74)
43 load_fast 0(a)
46 load_const 4(10)
49 compare_op 0 (<)
52 pop_jump_if_false 73
55 load_fast 0(a)
58 print_item
59 print_newline
60 load_fast 0 (a)
63 load_const 3(1)
66 inplace_add
67 store_fast 0(a)
70 jump_absolute 43
73 pop_block
74 load_const 0(none)
77 return_value
我看到像load_const这样的指令, load_name等.... 但我没有实际上如何SETUP_LOOP和函数调用指令..... 请有人告诉我们这些在虚拟机中是如何工作的...... 是否有任何阅读链接?
答案 0 :(得分:0)
假设您只对CPython如何做到这一点感兴趣。魔术,请查看Python/ceval.c,更具体地说是_PyEval_EvalFrameDefault
函数。所有操作码都在那里。