Al elegir un lenguaje de programación funcional para usar con LLVM, ¿cuáles son las ventajas y desventajas?


Supongamos por el momento que C++ no es un lenguaje de programación funcional. Si quieres escribir un compilador usando LLVM para el back-end, y quieres usar un lenguaje de programación funcional y sus enlaces a LLVM para hacer tu trabajo, tienes dos opciones que yo sepa: Objective Caml y Haskell. Si hay otros, entonces me gustaría saber sobre ellos también.

No estoy pidiendo opiniones subjetivas, así que por favor no le des a esto la etiqueta subjective. Quiero tomar mi propia decisión sobre esto, pero no estoy seguro de saber cuáles son todas las compensaciones. Entonces, StackOverflow al rescate. ¿Cuáles son las ventajas y desventajas?

Author: james woodyatt, 2009-11-21

4 answers

OCaml o Haskell serían una buena opción. ¿Por qué no echa un vistazo a los tutoriales LLVM para cada idioma? El tutorial LLVM para OCaml está aquí: http://llvm.org/docs/tutorial/OCamlLangImpl1.html

Haskell tiene más impulso en estos días, pero hay un montón de buenas bibliotecas de análisis para OCaml, incluyendo el generador de analizador PEG Aurochs, Menhir, y el generador de analizador GLR Dypgen. También echa un vistazo a esta presentación en pcl a monadic parser combinator library para OCaml (como Parsec para Haskell) hay algo de buena información allí comparando 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 en el análisis, pero también se puede obtener pereza en OCaml.

 14
Author: aneccodeal,
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
2009-11-21 03:13:43

Haskell tiene enlaces de mayor nivel a 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 ) por lo que es más fácil de pegar juntos componentes.

 9
Author: Don Stewart,
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
2009-11-21 19:25:23

La disponibilidad de enlaces nativos no tiene por qué limitar su elección de idioma. Hay una tercera opción, aparte de usar enlaces o generar texto IR directamente:

Puede usar un formato de serialización neutro en el idioma, como los búferes de protocolo de Google, para servir como el puente desde su front-end a su back-end. Los buffers de protocolo son, después de todo, solo ASTs disfrazados.

Su front end, implementado en un lenguaje funcional, entonces hace lo que es mejor en par parsing, type comprobación, desugaring, transformaciones core-to-core, etc the y el backend de C++ toma el IR de su frontend y utiliza la API nativa de C++ de LLVM completa por definición para bajar de su lenguaje 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 Haskell asociados para los búferes de protocolo, y estoy muy contento con los resultados. Hay mucho que decir para el uso de la la herramienta adecuada para el trabajo!

 7
Author: Ben Karel,
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
2011-02-08 05:34:13

OCaml es el único lenguaje funcional con enlaces en la propia distribución LLVM y documentación sobre llvm.org como el tutorial de Caleidoscopio . Si tiene OCaml instalado cuando compila e instala LLVM, también compilará e instalará automáticamente los enlaces LLVM para OCaml. Además, estas fijaciones OCaml han estado en uso durante años por lo que son maduras y confiables.

He estado desarrollando HLVM en OCaml usando el estándar LLVM y encontró OCaml + LLVM para ser una combinación extremadamente poderosa. HLVM proporciona tuplas, matrices, 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 VM 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 FPLs de código abierto más rápidos de hoy, incluida la propia OCaml. He publicado artículos en la Revista OCaml describiendo cómo se puede usar LLVM desde OCaml para todo, desde la evaluación básica de expresiones hasta temas avanzados como el paralelismo y la recolección de basura. También te puede gustar este mini ejemplo.

 6
Author: Jon Harrop,
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
2009-12-27 19:38:00