¿Cuáles son las cosas que debería aprender / dominar antes de comenzar a programar un nuevo compilador?

Creo que este es un gran ejercicio de aprendizaje. Como tal, no se preocupe demasiado por las optimizaciones del compilador, aunque esto también es un ejercicio de aprendizaje continuo.

Antes de iniciar su propio idioma, busque un compilador simple de código abierto y vea cómo funciona. Me formé hace mucho tiempo en herramientas de lex y yacc para crear compiladores. lex divide la entrada en tokens y yacc interpretará la estructura del programa. Como primer paso, vea Escribir un intérprete con Lex, Yacc y Memphis.

Si desea aprovechar el trabajo existente en los entornos de tiempo de ejecución Just In Time, podría considerar compilar su código en el código de bytes de Java. Esto hará que tu lenguaje sea portátil. Otra posibilidad es generar su lenguaje en ensamblador y llamar al ensamblador durante la compilación.

Si su idioma es lo suficientemente simple, es posible que desee escribir un intérprete completo que lea e interprete su idioma en tiempo real. Esto es como llamar a “eval ()” en Lisp. Lo he hecho para mi propia programación genética y me gusta el control completo y la velocidad que he logrado. Otro beneficio de este enfoque es que puede permitir que su programa se modifique a sí mismo en tiempo de ejecución. Bonito.

Disfruta tu viaje!

Teniendo en cuenta sus objetivos específicos (que deberían ser parte de la pregunta en lugar de estar ocultos en un comentario), creo que está haciendo las cosas de manera incorrecta. Hay dos compiladores de código abierto de C #. Una es parte de Mono, la otra parte de la suite de LLVM.

LLVM, en particular, también admite archivos de objetos para algo así como una docena de arquitecturas. En lugar de reinventar la rueda y pretender que vas a “dominar” lo que algunas personas literalmente pasan toda la vida trabajando, sería mejor que veas cómo funciona el soporte del procesador de LLVM y concentres tu atención allí.

Sí, podrías intentar sumergirte y aprender sobre la marcha, pero si no es un lenguaje de juguete y si necesitas preguntar qué partes hay de un compilador, no vale la pena.

En primer lugar, debe darse cuenta de que escribir un compilador es desarrollar un nuevo lenguaje de programación. Debes dominar toneladas de cosas antes de intentar desarrollar un compilador.
Primero debes saber sobre los lenguajes de programación en sí. Debería poder responder por qué un lenguaje de programación necesita ser interpretado o compilado. Si debería ser tipificado estáticamente o dinámicamente, ¿Cuáles podrían ser los tipos posibles? ¿Qué sucede internamente cuando se llama un módulo? Un montón de cosas

En segundo lugar, debe conocer las herramientas que se utilizan para desarrollar compiladores como lex, flex, yacc.
También deberías conocer por completo los conceptos y paradigmas de programación. Un conocimiento de la estructura de datos es imprescindible.

Todo lo mejor 🙂

La respuesta del Sr. Hidasy es precisa, pero me inclino a decir que si tiene que preguntar, no está listo.

Los compiladores son piezas muy complejas de tecnología de software y no algo que un principiante pueda esperar lograr.

No lo dices, pero si te estás embarcando en la creación de un nuevo idioma, entonces mi respuesta es: ¡YO NO LO HAGO, ¡NO LO HAGAS! Hay algunas cosas más difíciles de hacer bien que la creación de un lenguaje de programación. Hoy estamos muy lejos de muchos idiomas mal concebidos y uno más no nos sirve.

Lexers, analizadores, tipos, ensamblajes y todo lo demás dentro del libro del dragón: Compiladores: Principios, técnicas y herramientas

Su tarea se puede reducir enormemente aprovechando los backends de los compiladores existentes (básicamente, en lugar de compilar en el ensamblaje, compile al lenguaje interno de gcc o llvm, y luego permita que las cosas se optimicen)

Lexers, analizadores, tipos, ensamblaje, teoría de autómatas …
Gracias por la A2A