Roslyn CTP: Compiler as a service

Microsoft acaba de lanzar la Comunity Tech Preview de la herramienta Roslyn, que representa otra herramienta para los desarrolladores, esta vez en un servicio basado en extender capacidades del compilador para dar funcionalidades a los programas bastante más allá de nuestra imaginación.

Qué hace un compilador

Hasta la fecha los compiladores han sido, para algunos, una caja negra que generaba el ejecutable de manera mágica. Para otros un programa que convertía el fichero en un código objeto y posteriormente lo enlazaba, y, finalmente para los que hemos sufrido asignaturas del tipo Procesadores de lenguaje, es un programa que realiza varios pasos:

  • Análisis morfológico: Comprueba que los caracteres signifiquen variables, comandos, no nos falte ningún punto y coma o que no pongamos caracteres ilegales en el código
  • Análisis sintáctico: Comprueba que la formación del código sea la correcta, te falta un paréntesis o una llave que has borrado accidentalmente? esto lo detecta el analizador sintáctico.
  • Análisis semántico: Comprueba que el significado del código sea correcto, estás asignando un entero a una variable de tipo cadena?, o no devuelves un valor en una función declarada como void. Esto lo detecta el analizador semántico.
  • Generación de tabla de símbolos: La tabla de símbolos permite comprobar el estado de las variables, y donde buscar su significado (gestión de variables globales, argumentos, puntos de retorno de las funciones, etc).
  • Generación de código: Si el código es correcto, se sustituyen las porciones por código ensamblador correspondiente, se sustituyen valores y se genera un fichero ensamblable. Existen compiladores que generan directamente código objeto y se saltan este paso.
  • Optimización: Mediante técnicas como el desenrollamiento de bucles, se pueden conseguir unos ciclos de ejecución más, además de posibles técnicas para múltiples procesadores.

De hecho, hacer un compilador no es demasiado difícil. Se requieren ciertos conocimientos de Ensamblador, teoría de lenguajes formales, y paciencia. El análisis morfológico, sintáctico y semántico se puede hacer con las herramientas flex y bison, y generar un fichero ensamblador usando la herramienta NASM, en un proceso que lleva aproximadamente… un cuatrimestre para un grupo de 5 personas.

El caso, es que para arquitecturas como .net el proceso será un poco más complicado.

Las novedades

Lo que hace a Roslyn una herramienta tan especial, es que cada una de las fases que se han comentado antes tendrá una API específica, con lo cual nos encontraremos con varias API diferentes para las siguientes fases:

  • Árbol sintáctico
  • Tabla de símbolos
  • Enlace y análisis de flujo (semántico)
  • Generación de código.

Estas API proporcionan nuevos servicios para los lenguajes de programación, como resaltado de sintaxis, explorador de objetos, capacidad de refactoring, que podremos extender para nuestros proyectos.

Esto nos permite tener la capacidad de compilar código de manera dinámica (en tiempo de ejecución) desde un programa, o definir funciones que son creadas sobre la marcha, es decir, hacer programas que creen programas o metaprogramación, algo bastante común a lenguajes funcionales como LISP.

Esta capacidad permite tener una consola REPL (Read-Eval-Print-Loop) para poder usar C# o Visual Basic, o ejecutar directamente un código seleccionado. Esta consola se incluye con la CTP de Roslyn, y tiene IntelliSense, completado de código, opciones de refactor, ejecución de LINQ, generar interfaces de forma dinámica… para un código que estamos escribiendo en una consola, no esta nada mal.

En resumen, una utilidad muy interesante que seguramente hará las delicias de algunos, y que ahora está disponible para jugar con ello, y descubrir nuevas maneras de generar y usar el código (como por ejemplo hacer una utilidad que convierta de C# a VB).

Más información: