Ya llevo algún tiempo con ganas de hacerme mi propio compilador. Sí, como lo oís, un compilador de un lenguaje personalizado.
Y es que mirando cada día el foro de D pues digo: «Joer, si cada día se complican más y más…»; y el caso es que ciertamente muchas de sus funcionalidades estarán muy bien en el momento que salga la versión 1.0 (que ya va siendo hora, por cierto) pero creo que es demasiado complejo, que está creciendo demasiado como le está pasando a Java, y eso que todavía no está terminado.
Bueno, el caso es que hay cosas con las que no comulgo, como que no hay strings nativas y sea un array dinámico del tipo char[], que está muy bien, que su tratamiento es totalmente correcto, pero no deja de ser un array especial como dicen en la documentación. ¿Tanto costará poner una palabra reservada string y que todo siga funcionando igual? Si es que va a ser lo mismo sintácticamente pero no semánticamente (sobre todo para los programadores más que para el lenguaje).
Y, como no, ya he mirado un poco cómo hacer un compilador de mi propio lenguaje. Lógicamente no va a ser uno competitivo, ni nada usable a priori, pero lo principal es aprender a hacerlo. Y, como no, ya he investigado un poco (a parte de las asignaturas de Teoría de Autómatas y Lenguajes Formales y Procesadores de Lenguaje de la carrera) y tengo algunas partes ya resueltas.
Lo primero es hacer la definición del mismo en un lenguaje formal. Vamos, cómo se va a escribir el lenguaje. Y esta es la parte más divertida a la par que compleja, tiene que quedar bien antes de comenzar con la implementación.
Luego está implementar el compilador con sus diferentes fases, que son el análisis léxico (cotar el código fuente en tokens, grupos de caracteres), análisis sintáctico (ver si los tokens con correctos dentro del lenguaje y crear un árbol con la estructura del programa), análisis semántico (comprobar si la estructura del árbol es correcta para dicho lenguaje para comprobar el significado del programa), crear código ejecutable para la máquina destino (a partir del árbol crear código objecto), compilarlo (unir todo el código objeto) y enlazarlo (enlazar la aplicación con las funciones externas del programa).
Qué de cosas ¿no?. Bueno, las tres primeras están más o menos superadas. No es demasiado difícil crear un árbol para un código fuente previamente definido. Pero la cuarta fase, la de crear código ejecutable todavía no la tengo muy clara. He estado viendo por aquí que se puede seguir el modelo MDA pero todavía no tengo la idea mental para hacerlo.
Y, finalmente, en caso de conseguir generar código objeto, se podría utilizar un enlazador (linker) genérico para enlazar el código y crear la aplicación final, por ejemplo, ld de GCC.
Pero vamos, que todavía no lo tengo muy claro. ¿Alguien quiere ayudar? Por cierto, en referencia a esta entrada ya antigua, este lenguaje sería para construir mi propio sistema operativo, es decir, mi lenguaje, mi sistema, mi arquitectura… eso sí, todo libre amigos. ¿Alguien se apunta? Yo sé que algunos de vosotros lo estáis deseando…
P.D.: Por cierto, tampoco tengo un nombre. ¿D++ quizás? Lo digo por lo de mi nombre, y como D ya está cogido…