2010-08-22 16 views
30

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

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

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

Al principio creo que me gustaría mantener todas las E/S operaciones de E en las capas C++. Además de la gestión de GUI.

Es una pregunta bastante vaga, pero como estoy planeando aprender Haskell, estaba pensando en delegar un trabajo en Haskell-code (aprendo en realidad la codificación), y quiero elegir alguna parte donde vea Beneficios de Haskell.

+0

Sería útil describir qué tipo de aplicación planea construir. –

+0

Tengo varios proyectos. Cada uno realmente diferente. Lo que es importante es en lo que Haskell es bueno, mejor que C++ en, y luego intenta codificar a Haskell en tal parte para aprender Haskell y juzgar por mí mismo. –

Respuesta

22

El beneficio de Haskell es su poderosa abstracción que le permite usar. No estás pensando en términos de unos y ceros, direcciones y registros, sino de cálculos y propiedades de tipo y continuaciones.

El beneficio de C++ es qué tan preciso puede optimizarlo cuando sea necesario. No está pensando en mónadas, flechas, aplicaciones parciales y funciones puras de alta resolución: con C++, ¡puede llegar hasta el metal desnudo!

Hay tensión entre estas dos afirmaciones. En su papel “Structured Programming with go to statements,” Donald Knuth escribió

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

Saber utilizar Haskell y C++, sino también cómo y cuándo combinar bien van a tumbar todo tipo de problemas.

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

Usted quiere hacer esto como ejercicio, por lo que le recomendaría el mismo enfoque: escriba la inteligencia en Haskell. El encadenamiento de Haskell como esclavo de C++ probablemente terminará frustrando o haciéndote sentir como si hubieras perdido tu tiempo. Use cada idioma donde se encuentran sus puntos fuertes.

+0

Gracias por invertir mi posición. Haskell debería llamar a C++. Voy a intentar esto. Pero también significa que el núcleo de la aplicación es impulsado por Haskell. ¿Quiere decir que la programación de objetos, funciones y plantillas disponible en C++ es menos flexible que las posibilidades que ofrece Haskel? ¿Haskel se apegará estrictamente a los flujos fundamentales y las lógicas de la aplicación que puedo construir? ¿Es eso lo que quieres decir? –

+2

Y gracias por el artículo de Knuth, (los fundamentos nunca duelen). Aunque no está disponible gratuitamente a través de ACM (no tengo ninguna cuenta allí), se puede descargar en CiteSeerx –

+0

Esto es realmente bastante incorrecto. Puede optimizar C++ estrechamente cuando sea necesario, pero absolutamente puede pensar en términos de listas, recolección de basura y coincidencia de patrones en C++. Estás pensando en C. – Puppy

5

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 otros códigos de rendimiento crítico.

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

Para la parte de la GUI, probablemente tenga razón. Hay una gran cantidad de bibliotecas de GUI Haskell, pero C++ tiene herramientas potentes como QtCreator que simplifican mucho las tareas tediosas.

+0

No, no parece estar boca abajo. Usted está diciendo claramente: Use Haskell para todo. Excepto tal vez la GUI y las operaciones de tiempo crítico. Esa es la razón por la que no entiendes que puedo mezclar los dos idiomas. Hay una pequeña razón para mantenerme en la isla de C++ (aunque no he aprendido lo suficiente a Haskell para hacer comparaciones), con C++ sigo sintiendo lo que sucede detrás, hablando de operación de hardware, quiero decir. –

+3

No creo que pmr lo diga. Usted preguntó cuáles son las fortalezas relativas, y la respuesta de pmr es bastante precisa. Si te sientes más cómodo con un estilo imperativo, está bien. Pero es tu propio sentimiento, no una comparación de en qué son buenos los idiomas, que es lo que originalmente pediste. – Yitz

+1

Sí, es un sentimiento, estoy completamente de acuerdo con eso, sobre todo porque no conozco a Haskell lo suficiente. (hice pmr +1) –

7

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

El C++ era un bucle bastante simple y apretado que contaba las apariciones de características. Básicamente todo lo que hizo fue matemática y E/S simple. De hecho, controlé las opciones haciendo que el código de pegamento de Python escribiera un encabezado lleno de #define sy volviendo a compilar. Tipo de hacky, pero funcionó.

El Haskell fue todo el procesamiento intermedio: tomando la salida compleja de los diversos analizadores C y Java que utilicé, filtrando datos extraños y transformándolo en el formato simple que el código C++ esperaba. Luego tomé la salida C++ y la transformé en marcado LaTeX (entre otros formatos).

Esta es un área que esperaría que Python fuera fuerte, pero descubrí que Haskell facilita la manipulación de estructuras complejas; Es probable que Python sea mejor para transformaciones simples de 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í el código en Python.

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

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

+2

Mi programa era una operación por lotes, sin GUI, entonces C++ y Haskell no hablaron entre ellos, excepto a través de archivos. Los comencé a usar el subproceso de Python. Popen para poder maximizar el uso de los núcleos en mi máquina. Así que Python tampoco habló con los demás tampoco. PERO descubrí que tampoco necesitaba mucho C++, solo el algoritmo central más memorizador de memoria. Si necesita una gran cantidad de C++, o necesita una estrecha cooperación entre las piezas de su programa, entonces mi método puede no funcionar bien. –

+0

* transformación * es la palabra clave. Los lenguajes funcionales son la herramienta correcta si y solo si estás transformando cosas. –

8

Así es como veo las cosas:

  • Los lenguajes funcionales sobresalen en cosas transformadoras. Cada vez que escribe programas que toman una entrada y la mapean/filtran/reducen, use construcciones funcionales. Maravillosos ejemplos del mundo real donde Haskell debería sobresalir son dados por aplicaciones web (básicamente, transforma las cosas almacenadas en una base de datos en páginas web).
  • Lenguajes de procedimiento (lenguajes OOP son procedural) destacan en los efectos secundarios y la comunicación entre los objetos. Son engorrosos de usar para transformar datos, pero cada vez que desea realizar una programación del sistema o una interacción (bidireccional) con humanos (interfaces de usuario de cualquier tipo, incluida la programación web del lado del cliente), hacen el trabajo de forma limpia.
  • 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 los lenguajes de OOP que uno debería usarlos de esta manera. Después de todo, es natural pensar en los componentes de la interfaz de usuario en términos de objetos y comunicación entre objetos.
  • IO es solo una herramienta: cada vez que transforma una entrada en una salida, Haskell (o el lenguaje FP) debe hacer el IO. Siempre que hable con un ser humano, C++ (o cualquier lenguaje OOP) debería hacer el IO.
  • No importa la velocidad. Cuando usa Haskell para el trabajo correcto, es eficiente. Cuando usa 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 escribo aplicaciones:

  • Si el papel principal de mi solicitud es transformar los datos, lo escribo en Haskell , posiblemente con algunas partes de bajo nivel escritas en C (que, a su vez, pueden llamar partes de bajo nivel de alta tecnología escritas en C++, pero me quedaría con C como interfaz por razones de portabilidad).
  • Si la función principal de mi aplicación es interactuar con un usuario, la escribo en Python (PyQt por ejemplo) y dejo que Python llame rutinas de rendimiento crítico escritas en C++ (boost :: python es bastante bueno como generador de enlace) . También es posible que tenga que llamar a subrutinas que transforman o captan 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-invocable.
  • A veces, una aplicación Haskell que lee cosas en stdin y escribe en stdout es útil como un submódulo (al que llamas con fork/exec, o lo que sea en tu plataforma). A veces, un script de shell es el contenedor adecuado para tales aplicaciones.
+0

con las semanas pasando, he recurrido a F # en lugar de Haskell. A saber, por ser menos complejo y compatible con .Net. Regresaré a Haskell cuando esté bien a gusto con F #. Y tomo sus opiniones sobre la programación Funcional también para Haskell que para F #. –

+0

sigue pensando en su publicación. Cuando mencionas Programación funcional, bueno para la transformación, p. aplicaciones web: se le dio una base de datos y un tema gráfico -> sitio web. Pero aún no he oído hablar de la programación de los sitios web de Haskell, ¿podría informarme sobre eso? –

+0

@Stephane: Es principalmente porque la mayoría de los programadores web a menudo no tienen un conocimiento intenso de la informática ... La programación web ha sido principalmente confiable por php (que es malo). Puedes usar F # con ASP.Net (y sospecho que es la razón principal para introducir F # en primer lugar), lo cual es bueno. Mire http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell con la belleza y simplicidad de hacer programación web en lenguajes funcionales. –