Skip to main content
 首页 » 编程设计

python之Cpython VM 是否为每个操作码执行 C 代码

2025年05月04日14daizhj

我读到一些 VM 将字节码转换为机器码。但我听说 Cpython VM 略有不同。我在读here python VM “执行一小段与操作码匹配的 C 代码”这是否意味着当 Cpython 解释器“执行”python 字节代码时,最终(经过大量操作)它调用由处理器依次执行的不同 C 程序?如果我的理解有误,请指正。

请您参考如下方法:

CPython 解释器是一个执行 Python 字节码的程序(用 C 编写,编译为机器代码)。解释器本质上是一个非常大的 switch 语句,它为每个不同的操作码做不同的事情。你可以看到它是如何工作的 in the source .

例如,为 BINARY_ADD 操作码(例如 a + b)运行的代码如下:

TARGET(BINARY_ADD) { 
    PyObject *right = POP(); 
    PyObject *left = TOP(); 
    PyObject *sum; 
    if (PyUnicode_CheckExact(left) && 
             PyUnicode_CheckExact(right)) { 
        sum = unicode_concatenate(left, right, f, next_instr); 
        /* unicode_concatenate consumed the ref to v */ 
    } 
    else { 
        sum = PyNumber_Add(left, right); 
        Py_DECREF(left); 
    } 
    Py_DECREF(right); 
    SET_TOP(sum); 
    if (sum == NULL) 
        goto error; 
    DISPATCH(); 
} 

请注意,这使用了许多预处理器函数来使其更具可读性和可写性。在此示例中,它实质上从堆栈中弹出两个对象,检查它们是否为字符串,否则调用 CAPI 函数 PyNumber_Add,然后调用底层的 __add__ 或 __radd__ 对象的函数。然后将结果压入堆栈。