Python 字节码 + 按值或按名称LOAD_NAME?

Python Bytecode + LOAD_NAME by value or by name?

提问人:smed 提问时间:5/28/2021 更新时间:5/28/2021 访问量:89

问:

我是高中的法语 CS 老师。我们正在研究字节码在 Python 虚拟机上的执行。我们最终得到了一个幼稚的问题:在执行(字节码地址 8 处的命令)后,堆栈顶部的符号是什么?还是 ?(此处为 238)。LOAD_NAME 0xx

接下来是反汇编的字节码

CONSTS (238, 1512, None)
NAMES ('x', 'y', 'm')
VARNAMES ()
  1           0 LOAD_CONST               0 (238)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (1512)
              6 STORE_NAME               1 (y)
              8 LOAD_NAME                0 (x)
             10 LOAD_NAME                1 (y)
             12 COMPARE_OP               4 (>)
             14 POP_JUMP_IF_FALSE       20
             16 LOAD_NAME                0 (x)
             18 JUMP_FORWARD             2 (to 22)
        >>   20 LOAD_NAME                1 (y)
        >>   22 STORE_NAME               2 (m)
             24 LOAD_CONST               2 (None)
             26 RETURN_VALUE

获得

import dis

prog = compile('x=238;y=1512;m=x if (x>y) else y;', '<string>', 'exec')
print(f"CONSTS {prog.co_consts}")
print(f"NAMES {prog.co_names}")
print(f"VARNAMES {prog.co_varnames}")
dis.dis(prog)

我想模块允许跟踪 TOS,但我还没有花时间爬过它的文档,所以如果有人可以分享知识我们很感兴趣。提前谢谢inspect

Python 字节码 按值调用 callbyname

评论

0赞 jasonharper 5/28/2021
这是在堆栈上推送的值。如果字节码出于某种原因需要推送变量名称,那将是字符串的LOAD_CONST。
0赞 smed 5/28/2021
感谢!您知道检查服务条款的简单方法吗?
0赞 jasonharper 5/28/2021
我不知道有什么方法可以在运行时检查评估堆栈 - 中各种与堆栈相关的函数都在谈论函数调用堆栈。一种替代方法是在兴趣点插入字节码以显示 TOS - DUP_TOP后跟 PRINT_EXPR。(像这样的模块使这种修改比其他方式要少得多。inspectbyteplay
0赞 smed 5/29/2021
我会试试的。谢谢大家!
0赞 Mous 3/4/2022
LOAD_NAME数字等效于获取模块的 codeobject 的 co_varnames[numer],然后将其推送到堆栈。参考资料: docs.python.org/3/library/dis.html

答: 暂无答案