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(); 
} 

TARGETDISPATCH东西是一个优化,它不太经过正规switch机制的一部分。诸如PyNumber_NegativePyNumber_Multiply之类的函数是Python C API的一部分,它们派遣类似于否定和乘法的操作。

+0

谢谢。因此,虚拟机将字节码翻译成不同的操作码,VM将这些操作码写入某个内存,然后CPU获取并执行(这些操作码)?我查找了操作码,看起来操作码是机器指令。所以我假设操作码是某种用于将指令传递给CPU的汇编语言? – Moondra

+1

@Mondondra:不.CPython不会将字节码以任何方式转换为机器语言。它不写入CPU执行的指令。这个巨大的开关语句查看字节码指令并决定要做什么。字节码指令是这个巨大开关语句的指令,而不是CPU。这个巨大的switch语句被编译为机器语言,就像它调用的函数和解释机器的其余部分一样,但字节码不是。 – user2357112

+0

我想我明白了。我只想澄清一些细节。它本质上听起来像是一个伪字典,字节码查找相关的开关指令/值。字节码的每一行(?)(它将是关键字)找到与其关联的开关值/指令(值) - 该开关值将被编译为CPU将最终执行的机器语言指令。所以有足够的开关值来匹配所有不同类型的字节码指令。术语操作码是指多个开关值和指令? – Moondra