Pregunta

Digamos que tengo un programa o biblioteca Haskell que me gustaría hacer accesible para los no haskellers, potencialmente programadores C. ¿Puedo compilarlo a C usando GHC y luego distribuir esto como una fuente C?

Si esto es posible, ¿alguien puede proporcionar un ejemplo mínimo? (por ejemplo, un makile)

¿Es posible usar GHC para determinar automáticamente qué indicadores del compilador y encabezados y necesarios, y luego tal vez agrupe esto en una sola carpeta?

Básicamente, estoy interesado en poder escribir porciones de programas en C y Haskell, y luego distribuirlo como un tarball, pero sin requerir que el objetivo tenga instalado GHC y Cabal.

¿Fue útil?

Solución

Estoy interesado en poder escribir partes de programas en C y Haskell, y luego distribuirlo como un tarball, pero sin requerir que el objetivo tenga instalado GHC y Cabal.

Estás pidiendo una gran cantidad de infraestructura que es poco probable que encuentre. Recuérdalo Cualquier programa de Haskell, incluso si se va a compilar a C, es casi seguro que dependerá de un sistema de tiempo de ejecución grande y complejo para su funcionamiento correcto. Como mínimo, ese sistema de tiempo de ejecución tiene que apoyar la recolección de basura y la evaluación perezosa. Entonces tienes más que un solo problema de traducción.

Le sugiero que aborde este problema como un problema de distribución de software. En lugar de un tarball, proporcione un paquete para su plataforma de distribución favorita (Debian, Red Hat, InstallShield, lo que sea). Personalmente, para reutilizar los esfuerzos de otras personas, apuntaría a algo que verifique Cabal, instale Cabal si es necesario, luego usa Cabal para instalar el resto de lo que sus usuarios necesitarán.

Otros consejos

Puedes hacer esto con JHC. Sin embargo, es un programa completo que optimiza el compilador que compila a C. No tiene todas las extensiones elegantes que GHC admite.

Incluso si pudieras, no lo llamaría "fuente c". GHC puede usar C como parte de su sistema de compilación, pero el código C generado ni siquiera es ligeramente legible. Incluso si se pudiera leer y entender, no tendría sentido modificarlo porque no hay forma (aparte de el puerto posterior de los cambios en Haskell) para incorporar cualquier modificación realizada por los piratas informáticos C en futuras versiones de su programa.

El término "fuente" significa el código escrito por un humano y utilizado para generar el programa. En este caso, ese es el Haskell. C generado por un compilador no es "código fuente", es una representación intermedia.

No puedes llegar allí con GHC. Incluso cuando se compila a través de C, GHC se basa en manipular el ensamblaje resultante para barajar segmentos, un enorme sistema de tiempo de ejecución y mucho equipaje.

Por otro lado, es posible que tenga mejor suerte si lo que desea es compatible con un conjunto de características algo más limitado del compilador JHC de John Meacham, sin embargo, que genera una salida C bastante compacta.

Sé que esta es una publicación antigua, pero todavía quería mencionar también AJHC. AJHC bifurcó a JHC con los planes de agregar nuevas funciones y luego enviar las actualizaciones a JHC.

Digamos que tengo un programa o biblioteca Haskell que me gustaría hacer accesible para los no haskellers, potencialmente programadores C. ¿Puedo compilarlo a C usando GHC y luego distribuir esto como una fuente C?

Puede compilar a C, pero la C resultante no es legible por humanos. Es mejor que escriba archivos de encabezado y use el excelente C FFI junto a él. En cualquier caso, distribuir la C generada parece un recado de tontos.

Básicamente, estoy interesado en poder escribir porciones de programas en C y Haskell, y luego distribuirlo como un tarball, pero sin requerir que el objetivo tenga instalado GHC y Cabal.

No conozco ninguna solución que no involucre GHC. Tendría que distribuir al menos el Haskell RTS.

¿Puedo compilarlo a C usando GHC y luego distribuir esto como una fuente C?

No, no es posible, pero puede crear fácilmente la interfaz entre Haskell y C utilizando la interfaz de función extranjera (FFI) de Haskell.

Puedes tener más ejemplo aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top