byterun是用于CPython生成的字节码的纯python解释器,编写用于学习和娱乐。

我学到的一些东西

CPython解释器主要位于一个名为3500的文件中ceval.c。该文件的主要部分是2,000行的switch语句– switch(opcode) {...。阿克

但!令人惊讶的是,该文件并不可怕。或者,它使事情看上去并不可怕。例如,有一个BINARY_SUBTRACT操作码,它减去了东西。

这是处理此问题的实际C语言代码的实际值:

TARGET(BINARY_SUBTRACT) {
PyObject *right = POP();
PyObject *left = TOP();
PyObject *diff = PyNumber_Subtract(left, right);
Py_DECREF(right);
Py_DECREF(left);
SET_TOP(diff);
if (diff == NULL)
goto error;
DISPATCH();}

{:lang ='c'}

那么,这是做什么的呢?

  1. 摆脱争论

  2. 通过查找减去它们 left.__sub__(right)

  3. 减少对垃圾收集的引用,left以及right减少垃圾收集的原因

  4. 将结果放在堆栈上

  5. 如果__add__不返回任何内容,则引发异常

  6. DISPATCH(),基本上就意味着“转到下一条指令”

我完全可以写那个。

我们花了一些时间阅读处理Python中异常处理的C代码。这非常令人困惑,但是我了解到您可以raise ValueError from Exception设置异常原因。

基本上这里的教训是

  1. byterun很好

  2. 实际上可以读取运行Python的C代码!

  3. 字节码由字节组成。就像,少于256条指令,每条指令是一个字节。