Java 将算法C翻译成Python

Java 将算法C翻译成Python,java,python,c,sandbox,code-translation,Java,Python,C,Sandbox,Code Translation,我想把一些C代码翻译成Python代码或字节码。讨论中的C代码是我称之为纯算法的:与平台无关,没有i/O,只有算法和内存中的数据结构 正则表达式库就是一个例子。翻译工具将处理库源代码并生成功能等效的Python模块,该模块可以在沙盒环境中运行 您可以推荐哪些具体的方法、工具和技术 注意:PythonC扩展或ctypes不是一个选项,因为环境是沙盒的 另一个注意事项:看起来有一个,他们甚至将libjpeg编译成Java。java字节码+ VM与CPython字节码+ VM?< /P> < P >

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

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

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


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


另一个注意事项:看起来有一个,他们甚至将libjpeg编译成Java。java字节码+ VM与CPython字节码+ VM?< /P> < P >为什么不保留C代码,并导入到运行的Python环境?

< P>首先,我考虑用Pythonic的善良包装现有的C库,以Python模块的形式提供API。我会看看swig,ctypes,pyrex,还有这些天出现的任何东西。C库本身将保持不变。节省工作

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

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


从诸如IDL(科学家喜欢使用的数据语言,而不是另一种IDL)等更受约束、更驯服的语言转换是困难的,需要人工和脑力的努力。C算了吧,除非飞碟人给了我们比我们先进一千年的高级软件工具

坦率地说,要机械地、有意义地将C语言翻译成Python语言,就必须付出疯狂的性能代价。众所周知,Python的速度远不及C(使用当前的编译器和解释器),但更糟糕的是,C所擅长的(位摆弄、整数数学、内存块技巧)Python非常慢,而Python所擅长的不能用C直接表达。因此,直接翻译效率极低,甚至荒谬

一般来说,更好的方法确实是将C保持为C,并将其封装在Python扩展模块中(使用、或),或者直接使用调用C库。C的所有优点(和缺点)都适用于已经是C或以后添加的内容,Python的所有便利性(和缺点)也适用于Python中的任何代码


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

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

最快的方法(就程序员的努力而言,而不是效率而言)可能需要使用现有的编译器将C编译成简单的代码(例如LLVM)以及:

  • 用Python解释这一点(过高的性能损失)
  • 将其转换为Python(巨大的性能损失)
  • 将其转换为Python字节码(严重的性能损失)
直接将C翻译成Python是可能的(并且可能产生比上述方法更快的代码),但实际上您需要编写一个C编译器后端,这是一项巨大的任务


编辑,事后思考:一种可能更快捷、更肮脏的方法是为C代码获取解析树,将其转换为Python数据结构,并用Python进行解释。

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

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

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


我认为这是一种更安全、也是最有效的方法。

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

使用缩进(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

不要陷入困境,获取原始数据,如果必须,使用穴居人数学。

Python C扩展不是一个选项,因为环境是沙箱。我更新了问题以反映这一点。“宏魔术”不是一个基本问题,它被一个预处理器过程消除了。我确实想到了LLVM,但没有想到解释它。好的观点。也许直接用Python解释C解析树会更容易——在编辑中添加了这一点。不是我否决了你,但我能理解为什么——请注意这个问题。目标环境是沙盒环境,只接受纯Python模块。您将使用哪个工具以及生成哪个UML图?静态类图?:-SPOWER AMC将完成这项工作,但费用相当昂贵。是的,我不认为任何其他静态类图可以呈现为e