¿Qué tan difícil es aprender a escribir un compilador? ¿Cómo empiezo?

Depende de su educación, experiencia y habilidades de programación (recuerde que le lleva al menos diez años, y probablemente más de una vida, aprender la programación). Primero necesitas leer una buena Introducción a los Algoritmos …

Por cierto, recomiendo instalar y usar una distribución de Linux en su computadora. En su mayoría está hecho de software libre (¡incluidos muchos compiladores!) Cuyo código fuente puede descargar, estudiar y contribuir.

Primero, aprender y practicar varios lenguajes de programación. Recomendaría leer el libro de Pragmática del lenguaje de programación de Scott. Tenga en cuenta que la semántica de los lenguajes de programación es más importante que su sintaxis. Asegúrate de aprender algún dialecto de Lisp, como Scheme o Common Lisp (porque son idiomas homoicónicos). Tómese un tiempo para comprender qué son las continuaciones, qué es el estilo de paso de continuación y call / cc.

El compilador es un tema difícil pero interesante. Lee la última edición del Dragon Book. El análisis es un problema bien entendido hoy en día (pero dar un diagnóstico significativo a los novatos que cometen errores de sintaxis sigue siendo un problema). Por lo tanto, construir un árbol de sintaxis abstracta (en memoria) no debería ser difícil, y usted podría usarlo para los generadores de analizadores estándar (llamados incorrectamente compiladores-compiladores), como bison o ANTLR, o simplemente codificar a mano su analizador de descenso recursivo.

La generación de código y la optimización es un tema más complejo. La mayoría de los compiladores actuales (como GCC o Clang / LLVM) se refieren a la optimización, a menudo a través de transformaciones repetidas de algunas representaciones internas. Y es por eso que son software grande (de varios millones de líneas de código fuente).

Una vez que conozca algunos Lisp, lea el libro Lisp In Small Pieces de Queinnec. Explica en detalle varios estilos de intérpretes y compiladores similares a Lisp.

Si desea diseñar su lenguaje de programación (es decir, escribir en algún documento una especificación del mismo) y realizar alguna implementación (es decir, un código como un intérprete o compilador), podría enfocarse más en el lado del lenguaje y menos en el lado de la optimización. Luego, utilizará alguna biblioteca o marco de compilación JIT o de generación de código, como libjit, GCCJIT, LLVM, asmjit, GNU Lightning. (Algunos de ellos, por ejemplo, libjit & lightning) son simples y rápidos, pero producen rápidamente códigos de máquina malos y lentos, otros (GCCJIT y LLVM) son similares a un compilador y producen códigos de máquinas de optimización lenta).

Una posibilidad es diseñar su compilador como traductor a C (y aprovechar las capacidades de optimización de un compilador de C existente). Esto a veces se denomina transpiler o compilador de origen a origen. Hay muchos ejemplos exitosos de tal enfoque.

Los lenguajes de programación son, para la mayoría de nosotros, una parte necesaria de la base de cálculo. Solo un pequeño grupo de lenguajes modestos han tenido un gran efecto, y cuando un dialecto de programación llega a ser prominente, a partir de ahora probablemente tiene 10 años o una gran cantidad de historia. Esto implica que cuando el desarrollador normal revisa por primera vez “otro” dialecto, ha tenido un avance considerable detrás, bibliotecas y documentación, ha construido su propia sociedad particular y, sin duda, se han revelado algunas imperfecciones; también racimos de pequeños hacks de compacidad de escenario, y regularmente mejoras complejas. Enfrentada a este problema, la respuesta de la mayoría de los grupos de personas es encogerse de hombros y reconocerlo en la estima (la mayor parte), tratar de comprenderlo, no saber por dónde empezar (una minoría), o detectar que es así como el dialecto del otro (un pequeño grupo modesto de individuos). Desde que las dos clases iniciales empequeñecen en gran medida la tercera clasificación, se ha acumulado un sentimiento general, que no consideramos consciente de manera intencional, de que los lenguajes de programación son únicos, y por lo tanto, individuos únicos y poco comunes pueden hacerlos (un afrenta, si en algún momento vi una). En este sentido, en el caso de que proponga a las personas que, a pesar de haber hecho un dialecto de programación bien resaltado, no soy un ingeniero de software más competente que el siguiente, lo rechazan como falso desprevenido. Hay algo de verdad en esto. Además, siento que cuando los individuos dicen “compilador”, normalmente tienen un deseo que está más cerca de algo como GCC. Lo que está representando es muy parecido a un código para reunir al intérprete; en la escuela, en la primera semana o dos de la clase de compiladores, compusimos C básica para reunir intérpretes de código en yacc. Es realmente muy poco más que eso. Básicamente, lees, lo analizas y si tu dialecto es lo suficientemente básico, simplemente puedes descargar las instrucciones. Normalmente, esas eran una parte de las partes más difíciles y tediosas de la mejora del compilador.

Escribir un compilador no es tan difícil. Casi todas las cosas relevantes en teoría ya están allí en su libro de texto de diseño del compilador.

Este es el SOP para la mayoría de los cursos de compilación bien administrados en la universidad. Muchas universidades / institutos ejecutan el curso en base a 2–3 tareas donde construyen un compilador simulado para un lenguaje ficticio.

Mira cómo se escribió el lenguaje ruby ​​🙂