Python虚拟机(CPython)是否将字节码转换为机器语言?

Moo*_*dra 5 python

对于PVM如何获取CPU执行字节码指令,我有些困惑。我在StackOverflow上的某个地方读过,它没有将字节码转换为机器码,(可惜,我现在找不到线程)。

它是否已经对大量的预编译机器指令进行了硬编码,以根据字节码运行/选择其中之一?

谢谢。

use*_*ica 6

它比机器语言高级很多。有一个巨大的switch语句查看每个操作码并根据操作码决定要做什么。以下是一些片段:

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();
}
Run Code Online (Sandbox Code Playgroud)

TARGETDISPATCH的东西是一个优化,它不太经过正规的部分switch机制。像PyNumber_NegativePyNumber_Multiply这样的函数是 Python C API 的一部分,它们分派像否定和乘法这样的操作。


Kam*_*yar 3

如果您指的是 Python 中的标准 Python (CPython),那么不是!字节码(.pyc 或 .pyo 文件)只是逐行代码的二进制版本,并在运行时解释。但如果你使用 pypy,是的!它有一个 JIT 编译器,可以像 Java dn .NET (CLR) 一样运行字节码。