Translate

martes, 4 de abril de 2023

Roslyn, Compiler-as-a-Service

 


Roslyn expone el análisis del código del compilador para desarrolladores de C# y Visual Basic a través de tres capas principales de API. 

La capa Compiler Pipeline maneja el análisis de nivel inferior, el análisis de símbolos y el procesamiento de metadatos, incluidos los enlaces y la emisión de IL. La capa Compiler API ofrece acceso a la representación AST (abstract syntax tree) de los datos procesados y funciona como una abstracción de nivel superior para los desarrolladores de C# o Visual Basic. La capa Language Service proporciona un conjunto de herramientas de nivel superior para operar en los datos de la API del Compilador, incluidas las operaciones de navegación, la información y las posibilidades de formato.

Compiler Pipeline: Compiler Pipeline procesa la fuente de entrada en diferentes fases, comenzando con el proceso de análisis, donde la fuente se tokeniza en las reglas de lenguaje gramatical correspondientes. Posteriormente, los metadatos se analizan para extraer los símbolos requeridos, también llamada fase de declaración. El Binder hace coincidir los símbolos con los identificadores correspondientes y, al final, el Emisor construye un conjunto completo.

Compiler API: en equivalencia con las fases descritas anteriormente de Compiler Pipeline, Compiler API ofrece un modelo de objeto representativo en el lenguaje de destino actual para acceder a la información necesaria. La representación de la fase Parser es traducida por la Syntax Tree API como modelo AST, seguida de modelos de metadatos para los símbolos y enlaces, y la Emit API se abstrae del productor de código de bytes IL correspondiente.

Language Service: El Servicio Lingüístico se adapta a las capas y fases subyacentes. Por ejemplo, utiliza la tabla de símbolos para el Examinador de objetos o las funciones de navegación, y la representación del árbol de sintaxis para las funciones de esquematización y formato.

Roslyn está construido como un conjunto de APIs de dos capas, la capa de API del compilador y la capa de API del espacio de trabajo. La capa del compilador contiene los modelos de objetos que consisten en la información extraída sobre las fases individuales y los datos sintácticos y semánticos analizados desde el fuente. Ofrece una instantánea inmutable de una única invocación de un compilador. Esta capa es independiente de cualquier componente de Visual Studio. Esto permite que las herramientas de diagnóstico definidas por el usuario se conecten al proceso de compilación real para obtener información sobre errores y advertencias. La API del espacio de trabajo resuelve las dependencias del proyecto y utiliza la capa del compilador para proporcionar modelos de objetos para soluciones de análisis y refactorización.

La API del árbol de sintaxis es el componente central del marco de Roslyn. Vincula todas las funciones proporcionadas a las clases de modelos de objetos abstractos, conocidos como AST. El análisis de código, la refactorización, los componentes IDE, la información de origen, las construcciones gramaticales y muchas más funciones convergen en un punto, que es la API del árbol sintáctico. También es importante saber que todos los resultados analizados se pueden revertir a su texto de origen original (completamente de ida y vuelta). Además, el árbol de sintaxis es seguro para subprocesos e inmutable, lo que permite que múltiples usuarios interactúen simultáneamente sin interferir. Esto también significa que no se pueden enviar modificaciones en los árboles de sintaxis. Los métodos de fábricación proporcionan instantáneas adicionales del árbol de sintaxis para operar indirectamente con ellos, a costa de poca sobrecarga de memoria. Para ilustrar los principales componentes y características de la API del árbol sintáctico, el siguiente programa Hello World escrito en C# servirá como una ilustración práctica.


using System;

    namespace Demo {

        class Program {

            static void Main() {

                Console.WriteLine("Hello World!");

            }

        }

}

Roslyn también brinda posibilidades para visualizar secciones de código existentes como un árbol de sintaxis utilizando el SDK de la plataforma del compilador .NET, que está disponible como un paquete NuGet para Visual Studio. Después de instalar el paquete adicional, Visual Studio agrega un nuevo elemento de menú en la pestaña Ver/Otras ventanas/Visualizador de sintaxis. El visualizador de sintaxis crea el siguiente árbol de sintaxis a partir del código mostrado anteriormente, como se muestra en la figura 


También es posible ver una representación visual del árbol de sintaxis como se muestra en la figura. 


La leyenda en el lado derecho proporciona una descripción general de los elementos del árbol de sintaxis resultantes de un procedimiento de análisis.

Cada árbol de sintaxis de Roslyn consta de los siguientes elementos:

Nodos de sintaxis para declaraciones, sentencias, cláusulas y expresiones 

Tokens de sintaxis para representar terminales, los fragmentos de código más pequeños 

Sintaxis Trivia para espacios en blanco, comentarios y directivas de preprocesador, que son los elementos de código insignificantes que se pueden omitir después del análisis

Spanns para el posicionamiento del texto y la cantidad de caracteres utilizados por un nodo, token o trivia 

Tipos para identificar el elemento de sintaxis exacto correspondiente, que se puede convertir en enumeraciones específicas del lenguaje

Los errores de sintaxis, que no se ajustan a la gramática y se pueden adjuntar elementos de diagnóstico adicionales para el desarrollo o la depuración