将算法C语言翻译为Python

9 投票
9 回答
6814 浏览
提问于 2025-04-11 09:27

我想把一些C语言的代码转换成Python代码或者字节码。这里提到的C代码是纯粹的算法部分:不依赖平台,没有输入输出,只是算法和内存中的数据结构。

举个例子,比如一个正则表达式库。转换工具会处理这个库的源代码,然后生成一个功能上等价的Python模块,这个模块可以在一个沙盒环境中运行。

你能推荐一些具体的方法、工具和技术吗?


注意:Python的C扩展或者ctypes不适用,因为环境是沙盒的。

另一个注意:看起来有一个C到Java字节码的编译器,他们甚至把libjpeg编译成了Java。Java字节码加虚拟机和CPython字节码加虚拟机之间差别大吗?

9 个回答

3

最快的方法(从程序员的工作量来看,而不是效率)可能是使用现有的编译器把C语言编译成一些简单的东西(比如LLVM),然后可以选择:

  • 在Python中解释执行(这样性能会非常差)
  • 把它翻译成Python代码(性能损失也很大)
  • 把它翻译成Python字节码(性能损失也不小)

直接把C语言翻译成Python是可行的(而且可能比上面的方法生成的代码更快),但这基本上就是在写一个C语言编译器的后端,这是一项非常庞大的工作。

补充一下:还有一种可能更简单粗暴的方法,就是把C代码的解析树转换成Python的数据结构,然后在Python中解释执行。

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

别被这些复杂的东西搞晕了,简单点,必要时就用原始的“穴居人数学”。

12

老实说,把C语言直接翻译成Python是没办法做到的,而且这样做会让性能变得非常糟糕。大家都知道,Python的速度远远赶不上C(即使是现在的编译器和解释器),更糟糕的是,C擅长的事情(比如位操作、整数运算、内存块的各种技巧)在Python中执行得非常慢。而Python擅长的东西在C中又无法直接表达。所以,如果直接翻译,效率会低到让人觉得荒谬。

更好的方法是,保持C语言的特性,然后把它封装成一个Python扩展模块(可以使用SWIGPyrexCython,或者手动编写一个封装器),或者直接使用ctypes来调用C库。这样,你可以享受到C的优点(和缺点),同时也能利用Python的便利性(和缺点)来处理Python中的代码。

不过,这样做可能无法满足你对“沙箱”的需求,但你要明白,Python本身并不容易进行沙箱化;这需要很多努力和对CPython的修改,如果你在某个地方漏掉了一个小漏洞,你的沙箱就会被破坏。如果你想对Python进行沙箱化,应该先对整个进程进行沙箱化,这样C扩展也能被沙箱化。

撰写回答