在C#中解释Python字节码(精细控制)

Interpret Python bytecode in C# (with fine control)

我的一个项目idea,有以下需求,比较准确:

我希望能够在每个字节码指令的基础上执行 Python 代码(必要时预先编译)。我还需要访问 Python VM 中的内容(帧堆栈、数据堆栈等)。理想情况下,我还想删除很多 Python 内置功能并以我自己的方式重新实现其中一些(例如文件写入)。

所有这些都必须用 C# 编码(我使用的是 Unity)。

我可以接受 Python 的一些实际功能,特别是涉及复杂的导入等内容。但是,我想要大部分它保持完整。

我稍微研究了 IronPython 的代码,但它对我来说仍然很晦涩,而且看起来也很庞大。我开始翻译 Byterun(一个用 Python 编写的 Python 字节码解释器)但是我遇到了很多困难,因为 Byterun 利用了很多 Python' s 功能...解释 Python.

今天,我不要求预先制定的解决方案(除非你有一个想法?),而是寻求一些建议、要看的地方等。你对这些事情有什么想法吗?我应该先研究一下吗?

在遥远的过去,我曾尝试自己实现 Python 虚拟机并学到了很多东西,但从未接近完全工作的实现。我使用 C 实现作为起点,特别是 https://github.com/python/cpython/tree/main/Objectshttps://github.com/python/cpython/blob/main/Python/ceval.c(寻找switch(opcode)

这里有一些建议:

掌握 Python 对象模型。使用实例化、属性访问、索引和切片、调用、比较、算术运算和表示的必要方法实现抽象 PyObject class。为 None、布尔值、整数、浮点数、字符串、元组、列表和字典提供具体实现。

实现您的 VM 的核心:一个 Frame 对象,它循环遍历操作码并使用巨大的开关语句(在此处遵循 C 实现)分派到 PyObject 的相应方法。框架应该为操作码的操作维护一堆 PyObjects。根据操作码,参数从这个堆栈中弹出和压入。字典可用于存储和检索局部变量。使用 Frame 对象为函数对象创建 PyObject。

熟悉命名空间的概念以及 Python 构建命名空间概念的方式。实现一个模块,一个 class 和一个实例对象,使用字典将(属性)名称映射到对象。

最后,添加您认为需要的尽可能多的内置函数以获得有用的实现。

我认为很容易低估您要投入的工作量,但是...玩得开心!