question about a command like 'goto ' in Python's bytecode or it's just a compiler optimization?
Diez B. Roggisch
deets at nospam.web.de
Wed Jun 17 08:21:40 CEST 2009
> My Python version is 2.5.2; When I reading the bytecode of some pyc
> file, I always found that there are many jump command from different
> position,but to the same position. You can see this situation in
> following code(this bytecode is just from one .pyc file and I don't
> have its source .py file):
> 526 POP_TOP ''
> 527 LOAD_FAST 'imeHandle'
> 530 LOAD_ATTR 'isCnInput'
> 533 CALL_FUNCTION_0 ''
> 536 JUMP_IF_FALSE '574'
> 539 POP_TOP ''
> 540 LOAD_FAST 'GUIDefine'
> 543 LOAD_ATTR 'CandidateIsOpen'
> 546 JUMP_IF_TRUE '574'
> 549 POP_TOP ''
> 550 LOAD_FAST 'GUIDefine'
> 553 LOAD_ATTR 'CompositionWndIsOpen'
> 556 JUMP_IF_TRUE '574'
> 559 POP_TOP ''
> 560 LOAD_FAST 'isWanNengWB'
> 563 JUMP_IF_FALSE '574'
> 566 POP_TOP ''
> 567 LOAD_FAST 'state'
> 570 LOAD_CONST 1
> 573 BINARY_AND ''
> 574_0 COME_FROM ''
> 574_1 COME_FROM ''
> 574_2 COME_FROM ''
> 574_3 COME_FROM ''
> From the above bytecode,we know that line 574 is the point that many
> position jumps to.So,it just looks like the 'goto' function in C, but
> we know that there is none such function in Python.
> One 'JUMP**' command is companied with a 'COME_FROM' command,so more
> than one 'COME_FROM' OPs are listed on line 574...
> But ,the question is, I have tried a lot of ways(e.g.for loop,while
> loop and mixed) to re-present 'goto' style bytecodes like this, but
> the result depressed me.
> So,I think maybe it is just a compiler optimization in Python2.5? I'm
> not sure,so I'm appreciated that if anyone can help me.
Getting a depression because of a compiler is a bit strong...
However, yes, bytecode is similar to assembler, and in that respect
higher-level control-structures are created using (conditional) jumps.
The same is true for other bytecode-languages, see here for the JVM:
More information about the Python-list