9

我想将一些 C 代码翻译成 Python 代码或字节码。有问题的 C 代码是我所说的纯算法代码:独立于平台,没有 I/O,只有算法和内存中的数据结构。

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

您可以推荐哪些具体的方法、工具和技术?


注意:Python C 扩展或 ctypes不是一个选项,因为环境是沙盒的。

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

4

9 回答 9

12

坦率地说,在不遭受疯狂的性能损失的情况下,没有办法机械地和有意义地将 C 转换为 Python。众所周知,Python 的速度远不及 C 的速度(使用当前的编译器和解释器),但更糟糕的是 C 擅长的东西(位摆弄、整数数学、内存块的技巧) Python 的速度非常慢,而Python擅长的东西你不能直接用C来表达。因此,直接翻译效率会特别低,甚至到了荒谬的地步。

一般来说,更好的方法确实是将 C 保留为 C,并将其包装在 Python 扩展模块中(使用SWIGPyrexCython手动编写包装器)或使用ctypes直接调用 C 库。C 的所有优点(和缺点)对于已经是 C 或您以后添加的内容,以及 Python 的所有便利(和缺点)对于 Python 中的任何代码。

这不能满足您的“沙盒”需求,但您应该意识到无论如何您都不能特别好地对 Python 进行沙盒;这需要大量的努力和 CPython 的修改,如果你忘记了某个地方的一个小洞,你的监狱就会被打破。如果你想对 Python 进行沙盒化,你应该首先对整个过程进行沙盒化,然后 C 扩展也可以被沙盒化。

于 2008-09-25T10:12:54.317 回答
4

使用 indent(1) 和 ctopy(1)... 在 pypy 上获得额外的信用测试速度... 对于奖励信用使用 pyastra 生成汇编代码。

无论使用哪种语言,您都必须牺牲在运行时空间 (CPU) 或内存空间 (RAM) 之间存储各种构造和函数的输出。

如果你想看看我在说什么,请查看伟大的语言枪战

这是一个例子,想使用浮点数学而不使用浮点数?

x * 1,000,000 = a
y * 1,000,000 = b
a {function} b = result
result / 1,000,000 = z

不要陷入困境,变得原始,如果必须的话,使用穴居人数学。

于 2011-07-28T11:09:45.267 回答
3

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

  • 在 Python 中解释(过高的性能损失)
  • 将其转换为 Python(巨大的性能损失)
  • 将其转换为 Python 字节码(很大的性能损失)

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

编辑,事后诸葛亮:一种可能更加快速和肮脏的方法是获取 C 代码的解析树,将其转换为 Python 数据结构并在 Python 中解释它。

于 2008-09-25T10:25:45.470 回答
1

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

于 2009-04-23T17:51:26.330 回答
0

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

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

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

于 2008-09-25T20:29:33.023 回答
0

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

于 2008-09-25T10:00:14.003 回答
0

首先,我会考虑用 Pythonic 的优点包装现有的 C 库,以提供 Python 模块形式的 API。我会看看 swig、ctypes、pyrex 以及这些天里的其他任何东西。C 库本身将保持不变。节省工作。

但是,如果我真的必须编写基于 C 的原始 Python 代码,我不会使用任何工具,只有我的大脑。C 允许太多有趣的指针技巧、宏聪明的东西等等,即使有人向我指出了一个自动化工具,我也永远不会相信。

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

从 IDL(科学家喜欢使用的数据语言,而不是其他 IDL)等更受限制、更驯服的语言转换是很困难的,需要手动和脑力劳动。C?忘了它吧,直到 UFO 人给我们他们花哨的软件工具,这些工具比我们最先进的技术领先一千年!

于 2008-09-25T10:07:47.620 回答
0

任何自动翻译都会因为不使用 Python 的强大功能而受到影响。如果直接翻译成 Python,C 类型的程序代码运行速度会非常慢,您需要使用更多 Python 优化代码来分析和替换整个部分。

于 2008-09-25T10:16:49.487 回答
-1

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

于 2008-09-25T18:52:54.737 回答