为什么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项,将其转换为字符串(使用str或repr方法),并将其放入stdout
PRINT_NEWLINE
似乎是LOAD_FAST 0('\n')的快捷方式;打印项目
LOAD_CONST 0(None)
placesNone
singleton对象在TOS上RETURN\u值
从函数返回TOS关于简单命令的长代码与复杂命令的短代码的另一种解读是我不是100%确定这一点,但我认为像“打印项”这样的指令在寄存器上工作。大多数机器(甚至虚拟机)都是这样工作的:它们使用一小部分非常简单的指令。通过组合和执行许多指令,您可以完成复杂的任务。可用的指令集是有限的。