将基于算法的C语言翻译成Python

9
我希望将一些C代码翻译成Python代码或字节码。所涉及的C代码是我所谓的纯算法:平台无关,没有I/O,只有算法和内存数据结构。
例如,一个正则表达式库。翻译工具将处理库源代码并生成一个在沙盒环境中可运行的功能等效的Python模块。
您能推荐哪些具体的方法、工具和技术?
注意:由于环境被沙盒化,Python C扩展或ctypes不是一个选择。

另一个注意事项:看起来有一个C到Java字节码编译器,他们甚至将libjpeg编译成了Java。 Java字节码+VM与CPython字节码+VM差别太大吗?

9个回答

12
坦白地说,没有办法在不遭受极高性能惩罚的情况下将C语言机械翻译成Python,因为我们都知道Python与C语言速度相差甚远(使用当前编译器和解释器),更糟糕的是,C语言擅长的(位运算、整数运算、内存块技巧)Python执行速度非常缓慢,而Python擅长的则无法直接用C语言表达。因此,直接翻译会导致额外低效,甚至荒谬至极。
一般来说,更好的方法是保持C语言不变,并将其包装在Python扩展模块中(使用SWIGPyrexCython手动编写包装器),或者直接使用ctypes调用C库。对于已经是C语言或稍后添加的任何内容,都可以享受到C语言的所有优点(和缺点),并且对于Python中的任何代码都可以享受到Python的所有便利(和缺点)。
这样做可能无法满足您的“沙箱”需求,但您应该意识到,无论如何,您都无法很好地对Python进行沙箱处理;这需要大量的工作和修改CPython,如果您在某个地方忘记了一个小漏洞,那么您的监狱就会被打破。如果您想对Python进行沙箱处理,应该从沙箱整个进程开始,然后可以对C扩展进行沙箱处理。

4
使用indent(1)和ctopy(1)...来测试pypy的额外加分速度...如果要获得奖励积分,请使用pyastra生成汇编代码。
无论使用哪种语言,您都必须在运行时空间(CPU)或内存空间(RAM)之间牺牲各种结构和函数的输出存储。
如果您想了解我在说什么,请查看语言大比拼,不管怎样,这都是太多的计算机科学 snobbery...
这里有一个例子,想要使用浮点数学而不使用浮点数?
x * 1,000,000 = a
y * 1,000,000 = b
a {function} b = result
result / 1,000,000 = z

不要被困扰,回归原始,即使需要使用穴居人数学。

3

最快的方法(从程序员的努力而言,不是效率)可能涉及使用现有编译器将C编译成简单的东西(例如LLVM),并且要么:

  • 在Python中解释它(性能惩罚极高)
  • 将其翻译为Python(性能惩罚巨大)
  • 将其翻译为Python字节码(性能惩罚很大)

直接将C翻译成Python是可能的(并且可能比上述方法产生更快的代码),但您本质上是在编写C编译器后端,这是一项巨大的任务。

编辑,随后想到:一个更加快速且粗略的方法是获取C代码的解析树,将其转换为Python数据结构,并在Python中解释。


我确实想到了LLVM,但没有考虑解释它。好主意。 - Constantin
也许直接在Python中解释C解析树会更容易-我在编辑中添加了这个。 - Rafał Dowgird

1

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


嗨,Thomas,那是你下一个项目吗? :) - Constantin
如果我必须写这样的程序,我当然会使用Python。但是我不必这样做... - theller

0

Python C扩展不是一个选项,因为环境被沙盒化了。我更新了问题以反映这一点。 - Constantin

0

首先,我会考虑使用Pythonic的方式封装现有的C库,以提供一个Python模块形式的API。我会看看swig、ctypes、pyrex以及其他现有的工具。C库本身将保持不变。这样可以节省工作量。

但是如果我真的必须基于C编写原始的Python代码,那么我不会使用任何工具,只会依靠我的大脑。C允许使用指针进行许多有趣的技巧,使用宏进行聪明的操作等等,即使有人向我指出自动化工具,我也永远不会信任它们。

我提到了Pyrex——这是一种类似于C但也面向Python的语言。我没有做过太多的工作,但是鉴于你是以C为指南开始的,使用Pyrex可能比纯Python更容易。

从IDL(科学家喜欢使用的数据语言,而不是其他IDL)等更受限制、更温顺的语言转换很难,需要手动和心理努力。C?别想了,除非UFO人给我们他们的高级软件工具,那可是我们现在技术水平的千年之后的东西!


“宏魔法”不是一个根本性的问题,它可以通过单个预处理器传递来消除。 - Constantin

0
任何自动翻译都会因为没有使用Python的强大功能而受到影响。如果直接将C类型的过程式代码翻译成Python,它将运行得非常缓慢,您需要对整个部分进行分析并用更多针对Python优化的代码进行替换。

0

我个人会使用一个工具从C代码中提取UML图表,然后使用它来生成Python代码。

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

我认为这是最安全和最有效的方式。


你会使用哪个工具,生成哪种UML图表呢?是静态类图吗? :-S - Constantin
POWER AMC可以完成工作,但价格相当昂贵。是的,我认为没有其他自动过程可以有效地呈现静态类图。因此,您将不得不将C中的类逻辑转换为Python。但这仍然比从头开始做所有事情要容易得多。 - Bite code

-1

您可以随时编译C代码,并使用Python中的ctypes加载库。


不是我给你点了踩,但我能理解为什么——请注意问题。目标环境是沙盒化的,只接受纯Python模块。 - Constantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接