代码之家  ›  专栏  ›  技术社区  ›  Constantin

将算法C转换为Python

  •  9
  • Constantin  · 技术社区  · 17 年前

    我想把一些C代码翻译成Python代码或字节码。我称之为纯算法的C代码:与平台无关,没有i/O,只有算法和内存中的数据结构。

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

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


    注意:PythonC扩展或ctypes是 不是一个选择

    另一个音符 :看起来有一个 C-to-Java-bytecode compiler ,他们甚至将libjpeg编译成Java。Java字节码+VM与CPython字节码+VM是否太不同?

    9 回复  |  直到 12 年前
        1
  •  12
  •   Thomas Wouters    17 年前

    坦白地说,要机械地、有意义地将C语言转换成Python语言是不可能的。众所周知,Python的速度远不及C(使用当前的编译器和解释器),但更糟糕的是,C擅长的(位处理、整数运算、内存块技巧)Python的速度非常慢,Python擅长的东西不能直接用C来表达。因此,直接翻译会非常低效,甚至荒谬至极。

    总的来说,更好的方法是保持C为C,并将其包装在Python扩展模块中(使用 SWIG , Pyrex Cython writing a wrapper manually )或者直接调用C库 ctypes . C语言的所有优点(和缺点)对于已有的C语言或您以后添加的内容,以及Python对于Python中任何代码的所有便利性(和缺点)。

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

        2
  •  4
  •   John S    14 年前

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

    看看伟大的语言枪战,如果你想看看我在说什么,这是太多的竞争对手势利。。。

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

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

        3
  •  3
  •   Rafał Dowgird    17 年前

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

    • 将其转换为Python(巨大的性能损失)
    • 将其转换为Python字节码(性能损失很大)

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

        4
  •  1
  •   theller    16 年前

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

        5
  •  0
  •   jk.    17 年前

    为什么不保留C代码和 creating a Python C module 哪些可以导入到正在运行的Python环境中?

        6
  •  0
  •   DarenW    17 年前

    首先,我考虑用Pythonic goodness包装现有的C库,以提供python模块形式的API。我会看看swig,ctypes,pyrex,还有其他的东西。C库本身将保持不变。节省工作。

    但是如果我真的要基于C编写原始的Python代码,我就没有工具可以使用了,只有我的大脑。C允许太多有趣的指针技巧,宏的聪明技巧,等等,即使有人给我指出,我也永远不会相信自动化工具。

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

    从更受约束、更温和的语言(如IDL(科学家喜欢使用的数据语言,而不是其他IDL)进行转换非常困难,需要人工和脑力劳动。C呢?算了吧,除非不明飞行物的人给了我们比我们先进一千年的高级软件工具!

        7
  •  0
  •   paxdiablo    17 年前

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

        8
  •  0
  •   Bite code    17 年前

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

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

        9
  •  -1
  •   Sridhar Iyer    17 年前

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