对于我的一个项目想法,我有以下需求,这是相当精确的:
我希望能够在每字节码指令的基础上执行Python代码(必要时事先预编译)。我还需要访问Python VM内部的内容(帧堆栈,数据堆栈等)。理想情况下,我还希望删除许多Python内置特性,并以自己的方式重新实现其中一些(例如文件写入)。
所有这些都必须用c#编码(我使用Unity)。
我不介意放弃一些Python的实际特性,特别是涉及导入等复杂的东西。然而,我希望它的大部分保持完整。
我稍微看了一下IronPython但它对我来说仍然很晦涩,而且看起来也相当庞大。开始翻译Byterun(一个用Python编写的Python字节码解释器)但是我面临很多困难,因为Byterun利用了很多Python的特性来…解释Python。
今天,我不要求一个现成的解决方案(除非你心里有一个?),而是一些建议,看看的地方,等等。你觉得我应该先研究什么吗?
我在很久以前就尝试过自己实现Python VM,学到了很多东西,但从来没有接近一个完全工作的实现。我使用C实现作为起点,特别是https://github.com/python/cpython/tree/main/Objects和https://github.com/python/cpython/blob/main/Python/ceval.c(查找switch(opcode)
)
这里有一些指针:
掌握Python对象模型。用实例化、属性访问、索引和切片、调用、比较、算术运算和表示所需的方法实现一个抽象PyObject类。提供None、布尔值、整型、浮点数、字符串、元组、列表和字典的具体实现。
实现VM的核心:一个Frame对象,它使用一个巨大的switch语句(在这里遵循C实现)循环遍历操作码和分派到PyObject的相应方法。框架应该为操作码的操作符维护一个pyobject堆栈。根据操作码的不同,参数从这个堆栈中弹出并压入。字典可用于存储和检索局部变量。使用Frame对象为函数对象创建PyObject。
熟悉名称空间的概念以及Python基于名称空间概念构建的方式。实现一个模块、一个类和一个实例对象,使用字典将(属性)名称映射到对象。
最后,添加尽可能多的内置函数,以获得一个有用的实现。
我认为你很容易低估自己的工作量,但是……玩得开心!