El AJK, la máquina de pila y el CLR

Iba de camino al trabajo leyendo la MSDN Magazine, cuando me ha llamado la atención un artículo titulado “Cree un compilador de lenguaje para .Net Framework” (http://msdn.microsoft.com/msdnmag/issues/08/02/CompilerWriting/?loc=es). Me ha hecho sentirme joven y recordar a JosuKa: mi profe de compiladores en la universidad.

Lo primero por lo que he recordado a JosuKa es la similitud entre el CLR y la “máquina de pila” que inventó y desarrolló para sus prácticas. JosuKa… ¡eras un visionario!

Para los que no sepáis de qué hablo… JosuKa nos ponía como ejercicio el desarrollo de un compilador para un lenguaje y máquina objetivo ficticios. El lenguaje se llamaba “AJK” (que la verdad, no se que rayos significa) y generaba código para…¡¡tachán!! … ¡¡¡la máquina de pila!!!. Precisamente Joel Pobar, el autor del artículo que os comentaba, nos presenta el CLR como una máquina de pila… muy similar a la de JosuKa (como no podría ser de otra forma).

Lo segundo que he recordado, es que en nuestras prácticas usábamos herramientas específicas para el desarrollo de compiladores, cosa que en el artículo no se hace.
• Par el escáner usábamos Flex, un clon del Lex.
• Para el parser usábamos Bison, compatible con Yacc.
• El generador de código se escribía en C, por medio de una librería proporcionada por JosuKa. En el artículo se utiliza System.Reflection.Emit
(Más sobre Lex, Yacc, Flex y Bison en http://dinosaur.compilertools.net)

Me he puesto a hurgar un poco por Internet y he encontrado unos clones de Lex y Yacc para .Net:  GPLEX y GPPG (http://www.plas.fit.qut.edu.au/gppg/ y http://www.plas.fit.qut.edu.au/gplex/)

Por último, el artículo da unas pinceladas sobre cómo se enlaza el código en los lenguajes dinámicos… tan de moda con el DLR de Silverlight y con mi dulcemente odiado JavaScript (no es nada personal, mi querido lenguaje, todo es fruto de la incomprensión).

De verdad que os recomiendo la lectura del artículo… y seguro que añadiendo al “pack” estas herramientas, ¡podéis divertiros un buen rato!

¿Y por qué os cuento todo esto? Pues porque para mi, la moraleja es que todos los procesadores (reales o virtuales) son simples máquinas de pila, y todos los compiladores “comparten el 99% de los genes”.

No se si este conocimiento sirve realmente de algo… de hecho, ni siquiera puedo decir que te vaya a ayudar a programar mejor (y si puedes programar peor, si caes en el antipatrón de la optimización temprana). Ocurre lo mismo que con los coches: para conducir un coche no es necesario saber cómo funciona un motor de explosión… y sin embargo, para quien le gustan los coches, este es un conocimiento sin el que símplemente no podría vivir.

3 comentarios en “El AJK, la máquina de pila y el CLR”

  1. Gorka,

    Versiones “personalizadas” de GPLEX y GPPG se incluyen en el SDK de Visual Studio 2008 para facilitar la tarea a quienes quieran desarrollar compiladores de lenguajes.

    Saludos – Octavio

  2. Gracias por la puntualización, Octavio. La verdad que no lo sabía y es una gran noticia… porque la verdad, a pesar de que la informática avanza, a veces me sorprendo de la cantidad de veces que todavía nos pasamos parseando archivos y “reinventando” las gramáticas :-).

  3. Anda que no habré metido horas de LEX y YACC, en lo que durante unos años, fue un hobby para mi, hacer mi propio compilador.

    Hasta que los conocimientos de uno no dan para más, después lo deje unos años, y .Net entro en mi vida, entonces supe que nunca, jamás lo haría mejor ellos. Así que si no puedes con el enemigo únete a él. ¿¿¿¿Hay algo mejor que C#????

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *