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



我对 PVM 如何让 CPU 执行字节码指令有点困惑。我在 StackOverflow 上的某个地方读到它不会将字节码转换为机器代码,(唉,我现在找不到线程(。

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

谢谢。

它比机器语言要高级得多。有一个巨大的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();
}

TARGETDISPATCH的东西是优化的一部分,它并不完全通过常规switch机制。像PyNumber_NegativePyNumber_Multiply这样的函数是Python C API的一部分,它们调度否定和乘法等操作。

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

最新更新