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'}
那么,这是做什么的呢?
摆脱争论
通过查找减去它们 left.__sub__(right)
减少对垃圾收集的引用,left以及right减少垃圾收集的原因
将结果放在堆栈上
如果__add__不返回任何内容,则引发异常
DISPATCH(),基本上就意味着“转到下一条指令”
我完全可以写那个。
我们花了一些时间阅读处理Python中异常处理的C代码。这非常令人困惑,但是我了解到您可以raise ValueError from Exception设置异常原因。
基本上这里的教训是
byterun很好
实际上可以读取运行Python的C代码!
字节码由字节组成。就像,少于256条指令,每条指令是一个字节。