2

我一直在修补 pypy 源代码树一个星期,并提出了以下问题 - 有没有办法将 rpython 程序构建为共享对象,它为标准 cpython vm 公开它的一些功能(比如函数列表) ,换句话说,我希望这个函数可以通过共享对象导入从 python 脚本中调用。当我尝试像这样构建我的程序时:

python rpython --shared -O2 some_program.py

libmyprogram-c.so 实际上是生成的,但不能从 cpython 导入。接下来我应该为 cpython 使用 CFFI 还是 rpython 框架中有某种设施(装饰器或其他东西)应该很好地削减它?

4

1 回答 1

4

没有真正方便的方法可以做到这一点。正如您所描述的:编写一个 RPython 程序,转入libmyprogram-c.so,然后从 CPython 访问该 C 库,例如使用 cffi。

更详细地说,您将编写 RPython 源代码,以便.so使用 decorator 导出您选择的 C API rpython.rlib.entrypoint.entrypoint_highlevel()。但是你会得到一个在 C 级别上工作的 C 库。根本没有任何东西可以帮助你传递 Python 对象——你只有 C 类型。例如,没有像“list”或“dict”这样的数据结构的概念,也没有跨边界的自动生命周期管理。

此外,调试生成的 RPython 源代码libmyprogram-c.so比调试常规 C 库更难。通常的建议是在尝试将 RPython 程序或库转换为 C 之前对其进行彻底测试,因为至少可以在 Python 之上进行测试时进行调试。

RPython 只有在你使用它的垃圾收集器时才会发光,调整到高分配率,并且——最重要的是——它的即时编译器生成器,如果后者是一些 RPython 程序,则从 RPython 程序生成一个 JIT 编译器一种动态解释器。如果您对此没有用处,那么 RPython 不适合。但是,如果您这样做,那就另当别论了:-)

于 2017-06-19T19:07:10.040 回答