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.
- ¿Cómo aprendiste lingüística?
- ¿Dónde empiezo a aprender a hacer aplicaciones o codificación?
- ¿Cuál es la mejor manera de aprender las tecnologías Java, JSP y JSF?
- Cómo detener esta necesidad de viajar y aprender a apreciar mi entorno.
- Cómo aprender nuevas analogías.
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.