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


higer schrieb:
> 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:

http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6493

Diez



More information about the Python-list mailing list