python字节码指令研究

时间:2017-06-19 15:47:24

标签: python bytecode

我写了一些包含循环函数的程序 使用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和函数调用指令..... 请有人告诉我们这些在虚拟机中是如何工作的...... 是否有任何阅读链接?

1 个答案:

答案 0 :(得分:0)

假设您只对CPython如何做到这一点感兴趣。魔术,请查看Python/ceval.c,更具体地说是_PyEval_EvalFrameDefault函数。所有操作码都在那里。