haskell - utiliza - programacion funcional ventajas y desventajas
Al elegir un lenguaje de programación funcional para usar con LLVM, ¿cuáles son las compensaciones? (4)
Supongamos por el momento que C ++ no es un lenguaje de programación funcional. Si desea escribir un compilador utilizando LLVM para el back-end, y desea usar un lenguaje de programación funcional y sus enlaces con LLVM para hacer su trabajo, tiene dos opciones, que yo sepa: Objective Caml y Haskell. Si hay otros, me gustaría saber sobre ellos también.
No estoy pidiendo opiniones subjetivas, así que no le des esta etiqueta subjective
. Quiero tomar una decisión al respecto, pero no estoy seguro de saber cuáles son todas las compensaciones. Por lo tanto, StackOverflow al rescate. ¿Qué son las compensaciones?
Haskell tiene enlaces de niveles más altos para LLVM que OCaml (los de Haskell proporcionan algunas garantías de seguridad de tipo interesante) y Haskell tiene muchas más bibliotecas para usar (1700 paquetes en http://hackage.haskell.org ) que facilitan el pegado de componentes. .
La disponibilidad de enlaces nativos no tiene por qué restringir su elección de idioma. Hay una tercera opción, además de usar enlaces o generar texto de IR directamente:
Puede usar un formato de serialización independiente del idioma, como los búferes de protocolo de Google, para servir de puente desde su extremo frontal hasta su extremo posterior. Los buffers de protocolo son, después de todo, solo ASTs disfrazados.
Su interfaz, implementada en un lenguaje funcional, hace lo que es mejor: análisis, comprobación de tipos, desugaring, transformaciones de núcleo a núcleo, etc., y el backend de C ++ toma el IR de su interfaz y utiliza la función de LLVM. API nativa de C ++ completa por definición para reducir su idioma IR a LLVM IR. Esto hace que sea mucho más fácil manejar las características "avanzadas" de LLVM, como los metadatos de depuración.
Estoy usando esta estrategia con hprotoc
y los enlaces de Haskell asociados para los búferes de protocolo, y estoy muy contento con los resultados. ¡Hay mucho que decir para usar la herramienta adecuada para el trabajo!
O OCaml o Haskell serían una buena opción. ¿Por qué no echa un vistazo a los tutoriales de LLVM para cada idioma? El tutorial de LLVM para OCaml está aquí: http://llvm.org/docs/tutorial/OCamlLangImpl1.html
Haskell tiene más impulso en estos días, pero hay muchas bibliotecas de análisis buenas para OCaml, como el generador de analizador PEG Aurochs , Menhir y el generador de analizador GLR Dypgen . También revise esta presentación en pcl, una biblioteca de combinadores de analizadores monádicos para OCaml (como Parsec para Haskell). Hay una buena información allí que compara el enfoque de Haskell y OCaml: http://osp.janestreet.com/files/pcl.pdf
Algunos dirán que la pereza le da a Haskell la ventaja de analizar, pero también se puede obtener la pereza en OCaml.
OCaml es el único lenguaje funcional con enlaces en la propia distribución de LLVM y documentación en llvm.org, como el tutorial de Kaleidoscope . Si tiene instalado OCaml cuando compila e instala LLVM, también generará e instalará automáticamente los enlaces de LLVM para OCaml. Además, estos enlaces OCaml han estado en uso durante años, por lo que son maduros y confiables.
He estado desarrollando HLVM en OCaml utilizando los enlaces estándar de LLVM y descubrí que OCaml + LLVM es una combinación extremadamente poderosa. HLVM proporciona tuplas, arreglos, uniones, TCO de todas las llamadas de cola, impresión genérica, FFI a C, compilación JIT y recolección de basura paralela con una máquina virtual que pesa menos de 2kLOC de código OCaml que tomó solo unas pocas semanas-hombre para desarrollarse desde cero . El rendimiento numérico de HLVM ya supera con creces el de los FPL de código abierto más rápidos de la actualidad, incluido el propio OCaml . He publicado artículos en el Diario OCaml que describen cómo se puede usar LLVM desde OCaml para todo, desde la evaluación de expresiones básicas hasta temas avanzados como el paralelismo y la recolección de basura. También te puede gustar este mini ejemplo .