2008-09-25 44 views
8

Me gustaría traducir algunos códigos C a Python code o bytecode. El código C en cuestión es lo que llamaría puramente algorítmico: plataforma independiente, sin E/S, solo algoritmos y estructuras de datos en memoria.Traducir Algoritmo C a Python

Un ejemplo sería una biblioteca de expresiones regulares. La herramienta de traducción procesaría el código fuente de la biblioteca y produciría un módulo de Python funcionalmente equivalente que se puede ejecutar en un entorno de espacio aislado.

¿Qué enfoques, herramientas y técnicas específicas puedes recomendar?


Nota: Python C extensión o ctypes es no es una opción porque el medio ambiente es un recinto de seguridad.

Otra nota: Parece que hay un C-to-Java-bytecode compiler, incluso se compilan libjpeg a Java. ¿Es Java bytecode + VM demasiado diferente de CPython bytecode + VM?

Respuesta

0

¿Por qué no mantener el código C y creating a Python C module que se pueden importar a un entorno Python en ejecución?

+0

La extensión Python C no es una opción porque el entorno es un espacio aislado. Actualicé la pregunta para reflejar eso. – Constantin

0

En primer lugar, consideraría envolver la biblioteca C existente con bondad Pythonic para proporcionar una API en forma de un módulo python. Vería swig, ctypes, pyrex y cualquier otra cosa que haya en estos días. La biblioteca C en sí misma permanecería allí sin cambios. Ahorra trabajo

Pero si realmente tuviera que escribir el código de Python original basado en la C, no hay ninguna herramienta que use, solo mi cerebro. C permite demasiados trucos divertidos con punteros, cosas ingeniosas con macros, etc. que nunca confiaría en una herramienta automatizada, incluso si alguien me señalara uno.

Mencioné Pyrex - este es un lenguaje similar al C pero también está orientado a Python. No he hecho mucho con eso, pero podría ser más fácil que escribir python puro, dado que estás empezando con C como guía.

La conversión de lenguajes domadores más restringidos como IDL (los lenguajes de datos que los científicos prefieren usar, no el otro IDL) es difícil, y requiere esfuerzo manual y mental. ¿DO? ¡Olvídalo, no hasta que la gente de OVNIS nos brinde sus sofisticadas herramientas de software que están mil años por delante de nuestro estado del arte!

+0

"Magia macro" no es un problema fundamental, se elimina con un solo pase de preprocesador. – Constantin

12

Francamente, no hay forma de traducir de forma mecánica y significativa C a Python sin sufrir una penalización de rendimiento insana. Como todos sabemos, Python no está cerca de la velocidad C (con los compiladores e intérpretes actuales), pero peor que eso es que C es bueno (bit-vikingo, matemáticas enteras, trucos con bloques de memoria) Python es muy lento en, y lo que Python es bueno para ti no puede expresarse en C directamente. Una traducción directa sería, por lo tanto, extraordinariamente ineficiente, hasta el punto de lo absurdo.

El mucho, mucho mejor enfoque, en general, es de hecho para mantener el C, el C, y se envuelve en un módulo de extensión de Python (usando SWIG, Pyrex, o writing a wrapper manually) o llame a la biblioteca de C directamente utilizando ctypes. Todos los beneficios (y desventajas) de C para lo que ya es C o lo agrega más adelante, y todas las ventajas (y desventajas) de Python para cualquier código en Python.

Eso no satisfará sus necesidades de "sandboxing", pero debe tener en cuenta que no se puede proteger particularmente Python; Se requiere mucho esfuerzo y modificación de CPython, y si olvida un pequeño agujero en algún lugar, su cárcel está rota.Si quieres sandbox Python, debes comenzar por guardar todo el proceso, y luego las extensiones C también pueden obtener un espacio aislado.

0

Cualquier traducción automática va a sufrir por no usar el poder de Python. El código de procedimiento de tipo C se ejecutaría muy lentamente si se tradujera directamente a Python, necesitaría perfilar y reemplazar secciones completas con más código optimizado para Python.

3

La forma más rápida (en términos de esfuerzo programador, no la eficiencia), probablemente sería implicar el uso de un compilador existente para compilar C a algo simple (por ejemplo LLVM) y, o bien:

  • interpretar que en Python (exorbitante penalización de rendimiento)
  • traducir eso a Python (enorme pérdida de rendimiento)
  • traducir eso a Python bytecode (gran penalización de rendimiento)

Tra nslating C to Python directamente es posible (y probablemente ceda un código más rápido que los enfoques anteriores), pero básicamente estarías escribiendo un compilador de C back-end, que es una tarea enorme.

Editar, segunda opción: Una forma quizás más rápida y sucia de hacer eso es tomar el árbol de análisis sintáctico para el código C, transformarlo en una estructura de datos de Python e interpretar eso en Python.

+0

Pensé en LLVM, pero no pensé en interpretarlo. Buen punto. – Constantin

+0

Bueno, quizás interpretar el árbol de análisis C directamente en Python sería más fácil, agregó eso en una edición. –

-1

Siempre puede compilar el código C y cargarlo en las bibliotecas usando ctypes en python.

+0

No fui yo quien te votó negativamente, pero puedo entender por qué, por favor presta atención a la pregunta.El entorno de destino es sandbox y solo acepta módulos puros de Python. – Constantin

+0

estuvo de acuerdo .. mi culpa. –

0

Personalmente usaría una herramienta para extraer un uml sheme del código C, luego lo usaría para generar el código python.

De este squeleton, empiezo a deshacerme de las innecesarias estructuras de estilo C y luego rellenaría los métodos con el código python.

Creo que sería la manera más segura y más eficiente.

+0

¿Qué herramienta usarías y qué diagrama UML generarías? Diagrama de clase estática? : -S – Constantin

+0

POWER AMC hará el trabajo, pero es bastante caro. Y sí, no creo que haya otros que los diagramas de clase estáticos puedan representarse de manera eficiente mediante un proceso automático. Por lo tanto, deberá traducir la lógica de clase de C a Python. Pero aún es mucho más fácil que hacer todo desde cero. –

1

¿Escribir un intérprete C en Python puro? ;-)

+0

Oye, Thomas, ¿es ese tu próximo proyecto, por casualidad? :) – Constantin

+0

Si tuviera que escribir semejante bestia, por supuesto usaría Python. Pero no tengo que ... – theller

4

use sangría (1) y ctopy (1) ... para obtener más velocidad de prueba de crédito en pypy ... para obtener crédito adicional use pyastra para generar el código de ensamblado.

Independientemente del idioma, siempre tendrá que sacrificar el almacenamiento de salidas de varias construcciones y funciones entre el espacio de tiempo de ejecución (CPU) o el espacio de memoria (RAM).

Compruebe el gran tanda de idioma si quieres ver lo que estoy hablando de cualquier manera esto es demasiado esnobismo borrador de ciencia ...

Aquí es un ejemplo, desea utilizar aritmética de punto flotante sin necesidad de utilizar flotantes números de puntos?

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

No te empantes, obtén primordial, utiliza caveman math si es necesario.

Cuestiones relacionadas