haskell ffi hsc2hs c2hs

haskell - ¿Diferencia entre hsc2hs y c2hs?



hackage (2)

¿Cuál es la diferencia entre hsc2hs y c2hs?

Sé que hsc2hs es un preprocesador, pero ¿qué hace exactamente?

Y c2hs puede hacer módulos Haskell a partir de código C, ¿pero necesito hsc2hs para esto?


Ambos tienen la misma función: facilitar la escritura de enlaces FFI. No necesita saber acerca de hsc2hs si elige usar c2hs; son independientes C2hs es más poderoso, pero también más complicado: Edward Z. Yang ilustra este punto con un bonito diagrama en su tutorial de c2hs :

¿Cuándo debo usar c2hs? Hay muchos preprocesadores Haskell; ¿Cual deberías usar? Una manera breve (y algo imprecisa) de caracterizar la jerarquía anterior es a medida que avanza, cuanto menor es la plantilla que debe escribir y más documentación debe leer; Por lo tanto, he escuchado consejos de que hsc2hs es lo que debe usar para proyectos FFI pequeños, mientras que c2hs es más apropiado para los proyectos más grandes.

Las cosas que admite c2hs que hsc2hs no:

  • Generación automática de importación extranjera basada en el contenido del archivo de encabezado C
  • Activación semiautomática hacia y desde llamadas a funciones, y
  • Traducción de tipos de punteros y jerarquías a tipos de Haskell.

La respuesta de Mikhail es buena, pero hay otro lado. También hay cosas que hsc2hs proporciona que c2hs no, y puede ser necesario usar ambas en conjunto.

En particular, hsc2hs funciona al producir un ejecutable C que se ejecuta para generar el código Haskell, mientras que c2hs analiza los archivos de encabezado directamente. Por lo tanto, hsc2hs le permite acceder a #define s, etc. Por lo tanto, si bien he encontrado que c2hs es mejor para generar enlaces y envolturas a enlaces, así como peeks y "deep" en estructuras complejas de C, no es bueno para acceder a constantes y enumeraciones. , y solo automatiza ligeramente la placa de calderas para instancias almacenables. También he encontrado hsc2hs necesario, junto con el paquete bindings-dsl [1], en particular en mi caso para constantes predefinidas. En una instancia, tengo un archivo hsc para una enorme cantidad de constantes y un archivo chs para ajustar las funciones que usan estas constantes.

[1] http://hackage.haskell.org/package/bindings-DSL