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条指令,每条指令是一个字节。