对于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();
}
Run Code Online (Sandbox Code Playgroud)
该TARGET和DISPATCH的东西是一个优化,它不太经过正规的部分switch机制。像PyNumber_Negative和PyNumber_Multiply这样的函数是 Python C API 的一部分,它们分派像否定和乘法这样的操作。
如果您指的是 Python 中的标准 Python (CPython),那么不是!字节码(.pyc 或 .pyo 文件)只是逐行代码的二进制版本,并在运行时解释。但如果你使用 pypy,是的!它有一个 JIT 编译器,可以像 Java dn .NET (CLR) 一样运行字节码。