为什么CPython需要像LOAD_X这样的字节码?

为什么CPython需要像LOAD_X这样的字节码?,python,cpython,Python,Cpython,让我们看看一个简单函数的字节码: >>> def func(a): ... print a ... >>> dis.dis(func) 2 0 LOAD_FAST 0 (a) 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST

让我们看看一个简单函数的字节码:

>>> def func(a):
...     print a
... 
>>> dis.dis(func)
  2           0 LOAD_FAST                0 (a)
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE
我们为什么不把它编译成这样的东西:

PRINT_ITEM               0 (a)         
PRINT_NEWLINE       
RETURN_VALUE             0 (None)

有什么想法吗?

Python虚拟机使用堆栈架构。这意味着(将要处理的)数据从FIFO结构中提取到虚拟功能块中

逐行执行您的功能

  • LOAD\u FAST 0(a)
    将变量
    a
    从主存放置到堆栈顶部(TOS)
  • PRINT\u ITEM
    获取TOS项,将其转换为字符串(使用strrepr方法),并将其放入
    stdout
  • PRINT_NEWLINE
    似乎是
    LOAD_FAST 0('\n')的快捷方式;打印项目
  • LOAD_CONST 0(None)
    places
    None
    singleton对象在TOS上
  • RETURN\u值
    从函数返回TOS
  • 关于你的问题,为什么它不只是一个三行的组装。短汇编不一定意味着程序快。这适用于真正的硅处理器以及虚拟机

    第二件事是Python开发团队可能更容易坚持堆栈虚拟机体系结构,而不是实现另一种高级中间语言。此外,更简单的命令允许我们优化它们的顺序,但我不确定CPython是否利用了这一优势(有关详细信息,请参阅)

    编辑


    关于简单命令的长代码与复杂命令的短代码的另一种解读是

    我不是100%确定这一点,但我认为像“打印项”这样的指令在寄存器上工作。大多数机器(甚至虚拟机)都是这样工作的:它们使用一小部分非常简单的指令。通过组合和执行许多指令,您可以完成复杂的任务。可用的指令集是有限的。