Python虚拟机(CPython)将字节码转换为机器语言吗?
问题描述:
我对于PVM如何获得执行字节码指令的cpu有点困惑。我曾经在StackOverflow的某处读过,它没有将字节码转换为机器码,(唉,我现在找不到线程)。Python虚拟机(CPython)将字节码转换为机器语言吗?
它已经有很多预编译的机器指令硬编码,它运行/根据字节代码选择其中之一吗?
谢谢。
答
如果你是Python的标准Python(CPython),那么不!字节码(.pyc或.pyo文件)只是一行代码的二进制版本,并在运行时解释。但是,如果你使用pypy,是的!它有一个JIT编译器,它运行你的字节代码,比如Java dn .NET(CLR)。
答
它比机器语言高很多。有一个giant switch
statement查看每个操作码,并根据操作码决定要执行的操作。下面是一些片段:
switch (opcode) {
...
TARGET(LOAD_CONST) {
PyObject *value = GETITEM(consts, oparg);
Py_INCREF(value);
PUSH(value);
FAST_DISPATCH();
}
...
TARGET(UNARY_NEGATIVE) {
PyObject *value = TOP();
PyObject *res = PyNumber_Negative(value);
Py_DECREF(value);
SET_TOP(res);
if (res == NULL)
goto error;
DISPATCH();
}
...
TARGET(BINARY_MULTIPLY) {
PyObject *right = POP();
PyObject *left = TOP();
PyObject *res = PyNumber_Multiply(left, right);
Py_DECREF(left);
Py_DECREF(right);
SET_TOP(res);
if (res == NULL)
goto error;
DISPATCH();
}
的TARGET
和DISPATCH
东西是一个优化,它不太经过正规switch
机制的一部分。诸如PyNumber_Negative
和PyNumber_Multiply
之类的函数是Python C API的一部分,它们派遣类似于否定和乘法的操作。
谢谢。因此,虚拟机将字节码翻译成不同的操作码,VM将这些操作码写入某个内存,然后CPU获取并执行(这些操作码)?我查找了操作码,看起来操作码是机器指令。所以我假设操作码是某种用于将指令传递给CPU的汇编语言? – Moondra
@Mondondra:不.CPython不会将字节码以任何方式转换为机器语言。它不写入CPU执行的指令。这个巨大的开关语句查看字节码指令并决定要做什么。字节码指令是这个巨大开关语句的指令,而不是CPU。这个巨大的switch语句被编译为机器语言,就像它调用的函数和解释机器的其余部分一样,但字节码不是。 – user2357112
我想我明白了。我只想澄清一些细节。它本质上听起来像是一个伪字典,字节码查找相关的开关指令/值。字节码的每一行(?)(它将是关键字)找到与其关联的开关值/指令(值) - 该开关值将被编译为CPU将最终执行的机器语言指令。所以有足够的开关值来匹配所有不同类型的字节码指令。术语操作码是指多个开关值和指令? – Moondra