Dudando entre C/C++, OCaml y F#para mi compilador
llvm (1)
La metaprogramación es un punto débil real de C ++. La mayor parte de su esfuerzo será gastado tratando de manipular los árboles. La ventaja principal de OCaml y F # en este contexto es la coincidencia de patrones sobre los tipos de unión (y no la programación funcional) precisamente porque esto hace que sea mucho más fácil manipular árboles. Históricamente, OCaml y F # provienen de la familia de idiomas ML y se crearon específicamente para este dominio de aplicación.
Utilicé LLVM a través de sus enlaces OCaml para escribir HLVM , que incluye compilación independiente y JIT a código nativo, recolección de basura con capacidad multinúcleo, interfaz de función externa, optimización de llamadas de cola y muchas otras características. La experiencia fue muy agradable. Mi único consejo sería hacer un seguimiento de qué funciones de LLVM se han probado y comprobadas y cuáles son experimentales porque no desea depender de nada experimental (por ejemplo, el soporte de GC cuando escribí HLVM).
Puede usar System.Reflection.Emit
fácilmente para generar CIL desde F #, pero obviamente no podrá aprovechar su backend LLVM, aunque sí puede obtener un recolector de basura de forma gratuita. Los enlaces de .NET a LLVM son una opción. No estoy familiarizado con los que usted cita, pero escribir enlaces a la API C de LLVM es relativamente sencillo. Sin embargo, no estoy seguro de qué tan bien es compatible con LLVM en la plataforma de Windows.
Con respecto a OCaml vs F #, ambos tienen ventajas y desventajas, pero diría que la diferencia general es relativamente pequeña en este contexto. Escribir funciones para imprimir valores de grandes tipos de unión debido a la falta de impresión genérica es tedioso en OCaml, aunque esto se puede automatizar utilizando algunas macros de terceros. F # proporciona impresión genérica, pero le faltan algunas características útiles, como las variantes polimórficas y los objetos de tipo estructurado.
Quiero comenzar a trabajar en un pequeño compilador y para construirlo estoy dudando entre varios idiomas diferentes.
Mis requisitos son simples, quiero poder emitir código LLVM-IR porque tengo un backend LLVM que me gustaría reutilizar para apuntar a una plataforma específica.
Así que ahora mismo tengo las siguientes opciones:
Utilice OCaml y los enlaces LLVM: eficiente, LLVM se envía con los enlaces OCaml, pero la experiencia de codificación con OCaml (IDE, soporte) no es la mejor.
Use C / C ++ y los enlaces de LLVM: la forma más obvia que diría, pero me gustaría usar un lenguaje funcional ya que este tema es nuevo para mí y quiero aprender algo nuevo.
Use F #: me sentí enamorado de este lenguaje, pero no hay enlaces oficiales de LLVM. Así que supongo que podría hacer lo mismo mediante el uso de System.Reflection.Emit. Aunque parece que hay una iniciativa aquí para el enlace F # para LLVM - https://github.com/keithshep/llvm-fs
Me encantaría saber lo que piensas sobre esto.