Microsoft Roslyn vs CodeDom


De un comunicado de prensa de ayer en InfoWorld sobre el nuevo Microsoft Roslyn :

La ventaja más obvia de este tipo de compilador "deconstruido" es que permite que todo el proceso compile-execute sea invocado desde dentro de aplicaciones. Net. Hejlsberg demostró un programa de C # que pasó algunos fragmentos de código al compilador de C# como cadenas; el compilador devolvió el código de ensamblado IL resultante como un objeto, que fue entonces pasado a la Common Language Runtime (CLR) para la ejecución. ¡Voilà! Con Roslyn, C# gana la capacidad de un lenguaje dinámico para generar e invocar código en tiempo de ejecución.

He sido capaz de hacer esto desde el lanzamiento de. NET 4 con CSharpCodeProvider.CompileAssemblyFromSource que de hecho uso en un ASP.Net proyecto escrito hace un tiempo que hace exactamente eso: permite al usuario escribir código en un cuadro de texto, elegir ensamblados / espacios de nombres para hacer referencia,y luego ejecutar y mostrar la salida de ese código sobre la marcha para vivir pruebas de código de entorno en Windows Azure.

¿Es CodeDom parte de / un precursor de Roslyn? ¿Cuál es el beneficio especial de Roslyn sobre CodeDom?

Author: mellamokb, 2011-10-21

4 answers

Descargo de responsabilidad: Trabajo para Microsoft en el equipo de Roslyn.

CodeDom es un precursor de Roslyn, pero solo está relacionado marginalmente. Esencialmente, CodeDom es una forma simple y (algo) agnóstica de generar código que se agregó en. NET 1.0 para soportar diseñadores (a la WinForms). Debido a que CodeDom fue un intento de proporcionar un modelo unificado que pueda generar código en C#, VB y otros lenguajes, carece de alta fidelidad con cualquiera de los lenguajes que admite (por eso no se puede crear una sentencia switch con CodeDom). CSharpCodeProvider.CompileAssemblyFromSource es simplemente un envoltorio alrededor de la ejecución de csc.exe.

Roslyn es un animal completamente diferente. Es una reescritura de los compiladores C# y VB desde cero usando código administrado C C # en C # y VB en VB (las versiones de csc.exe y vbc.exe que la nave hoy está escrita en código nativo). La ventaja de construirlos en código administrado es que los usuarios pueden hacer referencia a los compiladores reales como bibliotecas desde Aplicaciones. NET(no se necesitan envoltorios).

Al compilar cada componente de la canalización del compilador, hemos expuesto las API públicas en la parte superior:

  • Parser - > API de Árbol de sintaxis
  • Tabla de símbolos / Importación de metadatos - > API de símbolos
  • Binder - > Api de Enlace y Análisis de Flujo
  • IL Emisor - > Emitir API

Roslyn se puede usar como un sofisticado generador de código fuente de C# y VB, pero ahí es donde termina la similitud con CodeDom. Las API del compilador de Roslyn pueden ser se utiliza para analizar código, realizar análisis semánticos, compilar y evaluar código dinámicamente, etc.

Además de los compiladores, el equipo de Roslyn también está reconstruyendo las características de Visual Studio C# y VB IDE en la parte superior de las API del compilador público. Por lo tanto, las API del compilador son lo suficientemente ricas como para crear las herramientas de tiempo de diseño de Visual Studio, como IntelliSense y la refactorización del Método de extracción. Además, en capas por encima del compilador, Roslyn ofrece servicios para análisis o datos de nivel superior transformación. Por ejemplo, hay servicios para formatear código utilizando las reglas de formato C# y VB, o para encontrar todas las referencias a un símbolo en particular dentro de una solución.

Realmente, no hay solo un beneficio especial de Roslyn sobre el CodeDom. Donde CodeDom llenó una necesidad de generación de código muy específica, Roslyn está abordando todo el espacio de herramientas de lenguaje al proporcionar un marco que le permite construir casi cualquier tipo de herramienta de lenguaje C# o VB que pueda imaginar.

 221
Author: Dustin Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-24 00:13:43

CodeDom le permite compilar, pero no le da la capacidad de obtener realmente información sobre el código en sí (aparte de los errores del compilador). Básicamente, es una caja negra donde dices " compilar esto "y dice" Tuve éxito "o"fallé, aquí hay algunos errores".

Roslyn le permite inspeccionar completamente y construir el código sobre la marcha. Esto incluye cosas como ser capaz de ver / inspeccionar los comentarios dentro de una pieza de código fuente, información detallada sobre el estructura, etc. Puede revisar y obtener todo el árbol de sintaxis de la fuente que pasa a Roslyn, y hacer un análisis detallado o transformaciones en él.

Dada la información de sintaxis completa y rica, tiene una gran cantidad de control y flexibilidad adicionales. Así es como, por ejemplo, funciona el ejemplo que copia un bloque de código C# y lo pega como VB.NET código. Con Roslyn, puede hacer más que solo compilar, también puede manipular el código en sí de manera limpia. Esto debería hacer un montón de herramientas mucho más simple de generar, ya que cosas como las refactorizaciones se pueden hacer de manera muy simple, ya que las herramientas entienden la sintaxis completa, incluida la meta información (como los comentarios), y pueden trabajar con ella directamente.

 41
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-17 17:54:23

Una gran diferencia que veo: con CodeDom, cada vez que compilas VB.NET, sucede fuera de proceso. CSC.exe o VBC.exe son los verdaderos trabajadores detrás de la escena.

Si desea construir un servicio, en términos de arquitectura, escalabilidad, aislamiento, etc. (mencionas Azure), esto no es muy bueno.

Con Roslyn está en proceso.

Supongo que esta es una de las razones por las que lo llaman "Compilador como servicio".

Además, CodeDom es una API relativamente pobre, falla una gran cantidad de características, y no está realmente actualizado, ya que fue diseñado principalmente para soportar la generación automática de código de los diseñadores de interfaz de usuario de Visual Studio. Creo que Roslyn lo hará mucho mejor ya que está escrito por los chicos que escriben los compiladores. Espero que eso marque la diferencia.

PD: Una diferencia notable de CSC.exe y VBC.exe: Roslyn parece ser. NET puro (y usa CCI).

 9
Author: Simon Mourier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-21 17:44:11

Roslyn permite un control mucho más fino de todo el proceso - por ejemplo, podría analizar la cadena e incluso generar código adicional (sobre la marcha dentro del proceso de compilación basado en el análisis), etc.

CodeDom es "solo usando el compilador" mientras que Roslyn es "compilador como un servicio con acceso completo a (sub) partes"... con Roslyn estás "dentro del compilador" y puedes ver cómo se ve el código desde la perspectiva del compilador, lo que te permite cambiar las cosas de maneras que actualmente no posible.

Por ejemplo, puede usar Roslyn para extender C#, algo muy útil y mucho mejor que el estado actual de la implementación de AOP.

Para obtener una visión general del estado actual de Roslyn y los diferentes niveles de acceso y control que proporciona, consulte http://msdn.microsoft.com/en-us/hh500769

UPDATE

Microsoft acaba de hacer un nuevo CTP disponible con características adicionales y un montón de cambios/adiciones de API. Para más detalles, véase aquí.

 6
Author: Yahia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-22 01:23:43