给定一个Python解释器(CPython,Jython等),生成的字节码是否确定?也就是说,如果我编译2个不同的脚本,这些脚本只在空格上有所不同,但在语法上是等价的,那么所选择的编译器会生成完全相同的字节码吗?
目前尚不清楚你在寻找什么.在语法上,相同的代码肯定会导致执行相同的指令.但即使是语法上等效的python文件也可以生成不同的.pyc缓存字节码文件.添加或删除换行符将导致不同的行偏移:
>>> import dis
>>> def foo():
... # in the interpreter, comments will do the same job as newlines
... baz
... # extra newlines or comments push the bytecode offsets
... return 42
...
>>> def bar():
... baz
... return 42
...
>>> dis.dis(foo)
3 0 LOAD_GLOBAL 0 (baz)
3 POP_TOP
5 4 LOAD_CONST 1 (42)
7 RETURN_VALUE
>>> dis.dis(bar)
2 0 LOAD_GLOBAL 0 (baz)
3 POP_TOP
3 4 LOAD_CONST 1 (42)
7 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
注意左栏中的不同值; 解释器的行为仍然完全相同,但偏移量不同.
可以单独访问字节码和偏移量,使解释器执行的内容相等:
>>> foo.__code__.co_lnotab
'\x00\x02\x04\x02'
>>> bar.__code__.co_lnotab
'\x00\x01\x04\x01'
>>> foo.__code__.co_code == bar.__code__.co_code
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |