¿Cuál es el mejor lenguaje de programación para usar al escribir un compilador, por ejemplo, ML, Lisp, Java, C ++, Python, etc.

Yo personalmente recomendaría OCaml. Haskell es muy agradable, pero como es puro, algunas transformaciones serán más difíciles de escribir. Por lo general, la función “gensym” para crear nombres nuevos (que a menudo se requieren en un compilador) será más difícil de codificar debido a su naturaleza con estado. Sin embargo, conozco a muchos haskellers que no estarían de acuerdo con esto, podría ser solo una cuestión de gustos.
La forma en que me gusta escribir un compilador es la siguiente: principalmente puramente funcional, con algunos efectos secundarios muy bien aislados. OCaml es una gran combinación para eso.
Pero, en general, creo que cualquier lenguaje de programación es bueno siempre que tenga tipos de datos algebric y coincidencia de patrones. Necesitará muchas transformaciones en los árboles, la coincidencia de patrones hace que el código sea más legible. Sin embargo, esto es solo una opinión personal y no un hecho. Lo que recomendaría a cualquiera que quiera usar C / C ++ es probarlo primero en un pequeño subconjunto. Defina un lenguaje pequeño con dichas expresiones aritméticas e intente escribir una transformación simple (ejemplo: propagación constante). Si no encuentra el limpiador de la versión ML, solo significa que nuestros cerebros están conectados de manera diferente 🙂

Escribimos un compilador en Haskell, aquí hay un capítulo del libro al respecto. Si bien el tema de la pureza te obliga a ser más honesto en algunos lugares, la honestidad finalmente vale la pena: GHC 7.8 admite la compilación paralela. La pureza es excelente para comprender el código que escribió hace mucho tiempo y que ha olvidado desde entonces: puede ver desde el tipo exactamente cuáles son las entradas y salidas de una función. Esto es genial para refactorizar, ya que es un tipeo fuerte (como argumentamos en ese artículo).

ML y derivados (OCaml, Haskell, etc.) tienen una larga tradición de implementación e investigación de compiladores, y las optimizaciones más comunes serán muy fáciles de implementar (o tendrán implementaciones fácilmente disponibles) en estos idiomas. Sé que Haskell tiene alex, happy y parsec, que son bibliotecas fantásticas.

Lisps está bien para escribir compiladores. Pueden ser buenos para esbozar cosas, pero creo que un sistema de tipos realmente te ayuda a expresar invariantes, que son una de las cosas más importantes para acertar en un compilador, por lo que un lisp te dejará mucho más trabajo.

C ++ es la opción obvia si desea utilizar LLVM (que parece ser una excelente opción a futuro, ya que obtiene muchas optimizaciones de forma gratuita), o el venerable combo flex / bison. C tiene el análogo lex / yacc. Existen innumerables recursos para ambas combinaciones, y para un escritor compilador por primera vez que no conoce ningún lenguaje funcional fuertemente tipado, una de estas combinaciones probablemente sería la más fácil. Editar: LLVM también tiene enlaces para otros idiomas, incluido OCaml, lo que hace de OCaml una opción fantástica.

No conozco a nadie que haya escrito un compilador de la industria en python o ruby ​​o perl (excepto PyPy, que es un gran proyecto, por cierto, y vale la pena verlo si está interesado en ver una optimización de vanguardia investigación en práctica activa). Tengo un par de implementaciones desechables de lisp en python y ruby ​​acumulando polvo en la parte posterior de un disco duro en alguna parte, pero no creo que esa clase de idiomas realmente se ajuste a la ley. Editar: Rubinus es un intérprete escrito en Ruby, y lo está haciendo muy bien.

Si fuera yo, usaría Haskell o LLVM con C ++ .