Microsoft Roslyn vs. CodeDom

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

La ventaja más obvia de este tipo de comstackdor “deconstruido” es que permite invocar todo el proceso de comstackción y ejecución desde las aplicaciones .Net. Hejlsberg demostró un progtwig C # que pasó algunos fragmentos de código al comstackdor de C # como cadenas; el comstackdor devolvió el código de ensamblado IL resultante como un objeto, que luego se pasó al Common Language Runtime (CLR) para su ejecución. Voilà! Con Roslyn, C # gana la capacidad de un lenguaje dynamic para generar e invocar código en tiempo de ejecución.

He podido hacer esto desde el lanzamiento de .NET 4 con CSharpCodeProvider.CompileAssemblyFromSource que, de hecho, uso en un proyecto de ASP.Net escrito hace un momento que hace exactamente eso: permite que un usuario escriba el código en un cuadro de texto, elija ensamblados / espacios de nombres para referenciar, y luego ejecutar y visualizar el resultado de ese código sobre la marcha para la prueba del código del entorno en vivo en Windows Azure.

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

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 agnóstica simple y (algo) aburguesa de generar código que se agregó en .NET 1.0 para admitir diseñadores (al estilo de WinForms). Debido a que CodeDom fue un bash de proporcionar un modelo unificado que puede generar código en C #, VB y otros lenguajes, carece de alta fidelidad con cualquiera de los idiomas que admite (es por eso que no puede crear una instrucción switch con CodeDom). CSharpCodeProvider.CompileAssemblyFromSource es simplemente un contenedor para la ejecución de csc.exe.

Roslyn es un animal completamente diferente. Es una reescritura de los comstackdores C # y VB desde cero utilizando código administrado: C # en C # y VB en VB (las versiones de csc.exe y vbc.exe que se envían hoy están escritas en código nativo). La ventaja de crearlos en código administrado es que los usuarios pueden hacer referencia a los comstackdores reales como bibliotecas de aplicaciones .NET (no se necesitan envoltorios).

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

  • Analizador -> API de árbol de syntax
  • Importar tabla de símbolos / metadatos -> API de símbolos
  • Binder -> API de enlace y análisis de flujo
  • Emisor IL -> Emitir API

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

Además de los comstackdores, el equipo de Roslyn también está reconstruyendo las características de Visual Studio C # y VB IDE sobre las API del comstackdor público. Por lo tanto, las API del comstackdor son lo suficientemente ricas como para construir las herramientas de Visual Studio en tiempo de diseño, como IntelliSense y la refactorización de Extract Method. Además, en las capas superiores al comstackdor, Roslyn ofrece servicios para análisis de alto nivel o transformación de datos. Por ejemplo, hay servicios para formatear código usando las reglas de formato C # y VB, o encontrar todas las referencias a un símbolo particular dentro de una solución.

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

CodeDom te permite comstackr, pero no te da la posibilidad de obtener realmente información sobre el código en sí (aparte de los compiler errors). Básicamente, es una caja negra donde dice “comstackr esto” y dice “Logré” o “Fallé, aquí hay algunos errores”.

Roslyn te permite inspeccionar por completo y construir el código sobre la marcha. Esto incluye cosas como poder ver / inspeccionar los comentarios dentro de un fragmento de código fuente, información detallada sobre la estructura completa, etc. Puede acceder y obtener todo el árbol de syntax de la fuente que pasa a Roslyn, y hacer un análisis detallado o transformaciones en eso.

Dada la completa y rica información de syntax, tiene una enorme cantidad de control y flexibilidad adicionales. Así es como, por ejemplo, funciona la muestra que copia un bloque de código C # y lo pega como código VB.NET. Con Roslyn, puede hacer más que simplemente comstackr, también puede manipular el código de manera limpia. Esto debería hacer que muchas herramientas sean mucho más sencillas de generar, ya que las refactorizaciones se pueden hacer de forma muy simple, ya que las herramientas comprenden la syntax completa, incluida la metainformación (como los comentarios), y pueden trabajar directamente con ella.

Una gran diferencia que veo: con CodeDom, cada vez que comstack C # o VB.NET, pasa 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 architecture, escalabilidad, aislamiento, etc. (menciona a Azure), esto no es muy bueno.

Con Roslyn está en proceso.

Supongo que esta es una de las razones por la que lo llaman “Comstackdor como servicio”.

Además, CodeDom es una API relativamente pobre, pierde muchas características y no está realmente actualizada, ya que fue diseñada principalmente para admitir la generación automática de código de diseñadores de Visual Studio UI. Creo que a Roslyn le irá mucho mejor ya que está escrito por los tipos que escriben los comstackdores. Espero que eso haga la diferencia.

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

Roslyn permite un control mucho más preciso de todo el proceso; por ejemplo, puede analizar la cadena e incluso generar código adicional (sobre la marcha dentro del proceso de comstackción en función del análisis), etc.

CodeDom está “simplemente usando el comstackdor” mientras que Roslyn es “comstackdor como un servicio con acceso total a (sub) partes” … con Roslyn estás “dentro del comstackdor” y puedes ver cómo se ve el código desde la perspectiva del comstackdor permitiéndole cambiar las cosas de maneras actualmente no posibles.

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 descripción general del estado actual de Roslyn y los diferentes niveles de acceso y control que proporciona, consulte http://msdn.microsoft.com/es-es/hh500769.

ACTUALIZAR

Microsoft acaba de hacer disponible un nuevo CTP con características adicionales y muchos cambios / adiciones de API. Para más detalles ver aquí .