将算法C转换为Python

时间:2020-03-06 14:42:46  来源:igfitidea点击:

我想将一些C代码转换为Python代码或者字节码。我所称的C代码纯粹是算法上的问题:与平台无关,没有I / O,只有算法和内存数据结构。

一个示例是正则表达式库。翻译工具将处理库源代码,并生成功能上等效的Python模块,该模块可以在沙盒环境中运行。

我们可以推荐哪些具体方法,工具和技术?

注意:不能选择Python C扩展名或者ctypes,因为环境是沙盒化的。

另一个注意事项:似乎有一个C到Java字节码的编译器,他们甚至将libjpeg编译为Java。 Java字节码+ VM与CPython字节码+ VM有太大区别吗?

解决方案

为什么不保留C代码并创建可以导入到正在运行的Python环境中的Python C模块?

首先,我考虑将现有的C库包装成Python语言,以python模块的形式提供API。我会看看swig,ctypes,pyrex,以及这些日子里其他的东西。 C库本身将保持不变。节省工作。

但是,如果我真的不得不基于C编写原始的Python代码,那么就没有我会使用的工具,只有我的大脑。 C允许使用指针进行过多有趣的操作,使用宏进行巧妙的操作等,即使有人向我指出了我,我也永远不会相信这种自动化工具。

我提到了Pyrex,这是一种类似于C的语言,但也是面向Python的。我没有做太多事情,但是考虑到我们从C入门,它可能比编写纯python容易。

从更受限,更温和的语言(例如IDL(科学家喜欢使用的数据语言,而不是其他IDL))进行转换非常困难,需要手动和脑力劳动。 C?算了,直到UFO员工为我们提供了比我们先进技术领先一千年的精美软件工具!

坦白说,没有办法在不遭受疯狂性能损失的情况下将C转换为Python。众所周知,Python不能达到C速度(使用当前的编译器和解释器),但更糟糕的是C擅长(位处理,整数数学,带有内存块的技巧)Python的速度非常慢Python擅长的方面不能直接用C表示。因此,直接翻译会显得效率低下,这很荒谬。

通常,更好得多的方法实际上是将C保留为C,并将其包装在Python扩展模块中(使用SWIG,Pyrex,Cython或者手动编写包装器),或者直接使用ctypes调用C库。 C对于已经存在的C或者以后添加的东西的所有优点(和缺点),以及对Python中任何代码的Python的所有方便(缺点)。

那将不能满足"沙盒"需求,但是我们应该意识到,无论如何,我们都无法很好地对Python进行沙箱操作;这需要花费大量的精力和对CPython的修改,并且如果我们忘记了监狱的某个小洞,那监狱将被打破。如果要对Python进行沙箱处理,则应先对整个过程进行沙箱处理,然后再对C扩展名进行沙箱处理。

如果不使用Python的强大功能,任何自动翻译都将遭受重创。如果将C类型的过程代码直接翻译成Python,运行速度将非常慢,我们将需要使用更多经过Python优化的代码来分析和替换整个部分。

最快的方法(就程序员的工作量而言,而不是效率)可能涉及使用现有的编译器将C编译为简单的东西(例如LLVM),并且可以:

  • 用Python解释(极大的性能损失)
  • 将其转换为Python(性能损失很大)
  • 将其转换为Python字节码(性能损失较大)

直接将C转换为Python是可能的(并且可能比上述方法产生更快的代码),但是实际上我们将在编写C编译器后端,这是一项艰巨的任务。

经过深思熟虑后进行编辑:一种可能更快捷的方法是获取C代码的解析树,将其转换为Python数据结构并在Python中对其进行解释。

我们始终可以编译C代码,并使用python中的ctypes加载库。

我会个人使用一个工具从C代码中提取一个uml sheme,然后使用它生成python代码。

从这个开始,我开始摆脱不必要的C风格的结构,然后用python代码填充这些方法。

我认为这将是更安全但最有效的方式。

用纯Python编写C解释器? ;-)