Mezcla de Haskell y C++


Si tuvieras la posibilidad de tener una aplicación que usara tanto Haskell como C++. ¿Qué capas dejarías que administrara Haskell y qué capas dejarías que administrara C++?

¿Alguien ha hecho alguna vez tal asociación, (seguramente) ?

(el sitio de Haskell dice que es muy fácil porque Haskell tiene un modo donde se puede compilar en C por gcc)

Al principio creo que mantendría todas las operaciones de E/S en las capas de C++. Así como la gestión de GUI.

Es bonito vaga una pregunta, pero como estoy planeando aprender Haskell, estaba pensando en delegar algo de trabajo a Haskell-code (aprendo en codificación), y quiero elegir alguna parte donde veré los beneficios de Haskell.

Author: Don Stewart, 2010-08-22

4 answers

El beneficio de Haskell son las abstracciones poderosas que le permite usar. No estás pensando en términos de unos y ceros y direcciones y registros sino cálculos y propiedades de tipo y continuaciones.

El beneficio de C++ es cuán estrechamente puede optimizarlo cuando sea necesario. No estás pensando en mónadas altisonantes, flechas, aplicaciones parciales y componer funciones puras: ¡con C++, puedes llegar hasta el metal desnudo!

Hay tensión entre estos dos instrucción. En su documento "Programación estructurada con go to declaraciones," Donald Knuth escribió

He sentido durante mucho tiempo que un talento para la programación consiste en gran medida en la capacidad de cambiar fácilmente de vistas microscópicas a macroscópicas de las cosas, es decir, , para cambiar los niveles de abstracción con fluidez.

Saber cómo utilizar Haskell y C++, pero también cómo y cuándo combinar bien derribar todo tipo de problema.

El último gran proyecto que escribí que usó FFI involucró el uso de una biblioteca de modelado de radar interna escrita en C. Reimplementarlo habría sido tonto, y expresar la lógica de alto nivel del resto de la aplicación habría sido un dolor. Guardé el "cerebro" en Haskell y llamé a la biblioteca C cuando lo necesitaba.

Quieres hacer esto como un ejercicio, así que te recomiendo el mismo enfoque: escribe las inteligencias en Haskell. Encadenar a Haskell como esclavo C++ probablemente terminará frustrándote o haciéndote sentir como si hubieras perdido tu tiempo. Utilice cada idioma donde se encuentran sus fortalezas.

 24
Author: Greg Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-22 19:39:40

Así es como veo las cosas:

  • Los lenguajes funcionales sobresalen en transformando las cosas. Siempre que escriba programas que tomen una entrada y la mapeen/filtren/reduzcan, use construcciones funcionales. Ejemplos maravillosos del mundo real donde Haskell debería sobresalir son dados por aplicaciones web (básicamente transformas cosas almacenadas en una base de datos en páginas web).
  • Los lenguajes procedimentales (los lenguajes OOP son procedimentales) sobresalen en los efectos secundarios y la comunicación entre objetos. Son engorrosos de usar para transformar datos, pero siempre que desee hacer programación del sistema o interacción (bidireccional) con humanos (interfaces de usuario de cualquier tipo, incluida la programación web del lado del cliente), hacen el trabajo limpiamente.
  • Sin embargo, algunos pueden argumentar que las interfaces de usuario deben tener una descripción funcional, respondo que los marcos bien establecidos son lo suficientemente fáciles de usar con lenguajes de programación orientada a objetos que uno debe usarlos de esta manera. Después de todo, es natural pensar en componentes de interfaz de usuario en términos de objetos y comunicación entre objetos.
  • IO es solo una herramienta: cada vez que transformas entrada en salida, Haskell (o cualquier lenguaje FP) debe hacer el IO. Cada vez que hablas con un humano, C++ (o cualquier lenguaje OOP) debería hacer el IO.
  • No me importa la velocidad. Cuando utilizas Haskell para el trabajo correcto, es eficiente. Cuando utiliza C++ o Python para el trabajo correcto, es eficiente.

Por lo tanto, digamos que soy fluido en Haskell, C, C++ y Python, así es como escribir aplicaciones:

  • Si el papel principal de mi aplicación es transformar datos, lo escribo en Haskell, con posiblemente algunas partes de bajo nivel escritas en C (que a su vez pueden llamar a algunas partes de bajo nivel de alta tecnología escritas en C++, pero me quedaría con C como interfaz por razones de portabilidad).
  • Si el papel principal de mi aplicación es interactuar con un usuario, lo escribo en Python (PyQt, por ejemplo), y dejo que Python llame a rutinas críticas de rendimiento escritas en C++ (boost:: python es bastante bueno como un generador de unión). También puedo tener que llamar a subrutinas que transforman o obtienen datos, que se escribirán en Haskell.
  • Si tengo que escribir una parte de una aplicación en Haskell, la segrego en una API C-callable.
  • A veces, una aplicación Haskell que lee cosas en stdin y escribe de nuevo en stdout es útil como un submódulo (que se llama con fork/exec, o lo que sea en su plataforma). A veces, un script de shell es el wrapper correcto para tales aplicación.
 9
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-08 11:20:08

Esta respuesta es más una historia que una respuesta completa, pero utilicé una mezcla de Haskell, Python y C++ para mi disertación en lingüística computacional, así como varias herramientas de C y Java que no escribí. Me pareció más sencillo ejecutar todo como un proceso separado, usando Python como código de pegamento para iniciar los programas Haskell, C++ y Java.

El C++ era un bucle bastante simple y estrecho que contaba las ocurrencias de entidades. Básicamente todo lo que hizo fue matemáticas y simple I / O. En realidad opciones controladas haciendo que el código Python glue escriba un encabezado lleno de #define s y recompilando. Un poco pirado, pero funcionó.

El Haskell era todo el procesamiento intermedio: tomar la salida compleja de los varios analizadores de C y Java que usé, filtrar datos extraños y transformarlos en el formato simple que el código C++ esperaba. Luego tomé la salida de C++ y la transformé en LaTeX markup (entre otros formatos).

Este es un área que usted esperaría Python para ser fuerte, pero descubrí que Haskell facilita la manipulación de estructuras complejas; Python es probablemente mejor para transformaciones simples línea a línea, pero estaba cortando y cortando árboles de análisis y descubrí que olvidé los tipos de entrada y salida cuando escribí código en Python.

Dado que estaba usando Haskell como un lenguaje de scripting más estructurado, terminé escribiendo algunas utilidades de E / S de archivos, pero más allá de eso, las bibliotecas integradas para la manipulación de árboles y listas suficiente.

En resumen, si tienes un problema como el mío, sugeriría C++ para la parte con restricciones de memoria y velocidad crítica, Haskell para las transformaciones de alto nivel y Python para ejecutarlo todo.

 7
Author: Nathan Shively-Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-22 22:07:48

Nunca he mezclado ambos idiomas, pero su enfoque se siente un poco al revés para mí. Haskell es más apto para operaciones de alto nivel, mientras que C++ se puede optimizar y puede ser más beneficioso para bucles estrechos y otro código crítico de rendimiento.

Uno de los mayores beneficios de Haskell es la encapsulación de IO en mónadas. Mientras este IO no sea crítico con el tiempo, no veo ninguna razón para hacerlo en C++.

Para la parte GUI probablemente tengas razón. Hay una plétora de Haskell Bibliotecas GUI pero C++ tiene herramientas poderosas como QtCreator que simplifican mucho las tareas tediosas.

 5
Author: pmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-22 10:39:42