Translate

martes, 15 de noviembre de 2022

Roslyn, compiladores de C# y Visual Basic con unas APIs para crear herramientas de análisis de código.

Roslyn es la implementación de código abierto de los compiladores de C# y Visual Basic con unas APIs para crear herramientas de análisis de código.

La idea es que el compilador exponga información del proceso de compilación para crear herramientas que permitan mejorar ese código. 

Los compiladores procesan el código siguiendo reglas estructuradas que a menudo difieren de la forma en que los humanos leen y entienden el código. Una comprensión básica del modelo utilizado por los compiladores es esencial para comprender las API que utiliza al crear herramientas basadas en Roslyn.

El SDK de .NET Compiler Platform expone el análisis de código de los compiladores de C# y Visual Basic, al proporcionar una capa de API que refleja una canalización de compilador tradicional.

Cada fase de este proceso es un componente separado. Primero, la fase de análisis tokeniza y analiza el texto fuente en sintaxis que sigue la gramática del lenguaje. En segundo lugar, la fase de declaración analiza la fuente y los metadatos importados para formar símbolos con nombre. A continuación, la fase de enlace hace coincidir los identificadores en el código con los símbolos. Finalmente, la fase de emisión emite un ensamblado con toda la información construida por el compilador.

En correspondencia con cada una de esas fases, el SDK de .NET Compiler Platform expone un modelo de objeto que permite el acceso a la información en esa fase. La fase de análisis expone un árbol de sintaxis, la fase de declaración expone una tabla de símbolos jerárquicos, la fase de vinculación expone el resultado del análisis semántico del compilador y la fase de emisión es una API que produce códigos de bytes IL.


Cada compilador combina estos componentes como un único todo de extremo a extremo.

Estas API son las mismas que usa Visual Studio. Por ejemplo, las funciones de esquematización y formato del código usan los árboles de sintaxis, el Examinador de objetos y las funciones de navegación usan la tabla de símbolos, las refactorizaciones e Ir a definición usan el modelo semántico, y Edit and Continue usa todo esto, incluida la API Emit.

La capa del compilador contiene los modelos de objetos que corresponden a la información expuesta en cada fase de la canalización del compilador, tanto sintáctica como semántica. La capa del compilador también contiene una instantánea inmutable de una única invocación de un compilador, incluidas las referencias de ensamblado, las opciones del compilador y los archivos de código fuente. Hay dos API distintas que representan el lenguaje C# y el lenguaje Visual Basic. Las dos API tienen una forma similar pero están diseñadas para ofrecer alta fidelidad a cada lenguaje individual. Esta capa no tiene dependencias en los componentes de Visual Studio.

Como parte de su análisis, el compilador puede producir un conjunto de diagnósticos que cubren todo, desde errores de sintaxis, semánticos y de asignación definitiva hasta varias advertencias y diagnósticos informativos. La capa de API del compilador expone diagnósticos a través de una API extensible que permite que los analizadores se conecten al proceso de compilación. Permite que los diagnósticos definidos por el usuario, como los producidos por herramientas como StyleCop, se produzcan junto con los diagnósticos definidos por el compilador. Producir diagnósticos de esta manera tiene la ventaja de integrarse naturalmente con herramientas como MSBuild y Visual Studio, que dependen de los diagnósticos para experiencias como detener una compilación basada en una política y mostrar IL en vivo en el editor y sugerir correcciones de código.

Las API de alojamiento y secuencias de comandos forman parte de la capa del compilador. Puede usarlos para ejecutar fragmentos de código y acumular un contexto de ejecución en tiempo de ejecución. El REPL interactivo de C# (Read-Evaluate-Print Loop) utiliza estas API. El REPL le permite utilizar C# como lenguaje de secuencias de comandos, ejecutando el código de forma interactiva a medida que lo escribe.

La capa Workspaces contiene la API Workspace, que es el punto de partida para realizar análisis de código y refactorizar soluciones completas. Lo ayuda a organizar toda la información sobre los proyectos en una solución en un solo modelo de objeto, ofreciéndole acceso directo a los modelos de objetos de la capa del compilador sin necesidad de analizar archivos, configurar opciones o administrar dependencias de proyecto a proyecto.

Además, la capa Workspaces muestra un conjunto de API que se utilizan al implementar herramientas de análisis y refactorización de código que funcionan dentro de un entorno de host como el IDE de Visual Studio. Los ejemplos incluyen las API Buscar todas las referencias, Formato y Generación de código. Esta capa no tiene dependencias en los componentes de Visual Studio.