2011-10-21 19 views
94

Desde un press release ayer en InfoWorld en relación con la nueva Microsoft Roslyn:Microsoft Roslyn vs CodeDom

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

he sido capaz de hacer esto desde el lanzamiento de .NET 4 con CSharpCodeProvider.CompileAssemblyFromSource que he hecho en uso en un proyecto de ASP.Net escrito hace un tiempo que hace exactamente eso - Permite a un usuario escribir código en un cuadro de texto, elija ensambles/espacios de nombres para referenciar, y luego ejecute y muestre el resultado de ese código sobre la marcha para la prueba del código del entorno en vivo en Windows Azure.

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

Respuesta

215

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

CodeDom es un precursor de Roslyn, pero está solo marginalmente relacionado. 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 intento 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 compiladores 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 compiladores reales como bibliotecas de aplicaciones .NET (no se necesitan envoltorios).

Aunque la construcción de cada componente de la tubería compilador, hemos expuesto API públicas en la parte superior:

  • Analizador -> Sintaxis Árbol API
  • Tabla de símbolos/metadatos Importación -> Símbolo API
  • Carpeta -> Encuadernación y análisis APIs de flujo
  • IL emisor -> Emit API

Roslyn se puede utilizar como un sofisticado C# una nd generador de código fuente VB, pero ahí es donde termina la similitud con CodeDom. Las API del compilador de Roslyn se pueden usar 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 el Visual Studio C# y VB IDE características en la parte superior de las API del compilador público. Por lo tanto, las API del compilador 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 compilador, 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 uno 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.

+2

@Dustin: ¿Roslyn estará apoyando otros idiomas? JavaScript (.NET), por ejemplo? – dbarros

+0

@Dustin: Esto es perfecto para crear una experiencia IDE completa que pueda aplicar la calidad del código en mi organización, aunque no veo un reemplazo completo de la revisión manual del código, pero veo un aumento considerable en la calidad. ¡Pronto! –

+0

Sería genial si alguien hubiera creado una herramienta basada en Roslyn para convertir código que usa CodeDom en código que utiliza SyntaxFactory de Roslyn ... (En parte porque .Net Core tiene Roslyn pero no CodeDom y estoy usando una lib basada en CodeDom) – Emyr

40

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

Roslyn le 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 sintaxis 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 sintaxis, tiene una enorme cantidad de control y flexibilidad extra. 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 compilar, 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 sintaxis completa, incluida la metainformación (como los comentarios), y pueden trabajar directamente con ella.

6

Roslyn permite mucho control mucho más preciso de todo el proceso - por ejemplo, se 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 usar el compilador" mientras Roslyn es "compilador como un servicio con acceso total a (sub) partes" ... con Roslyn estás "dentro del compilador" y puedes ver cómo se ve el código desde una perspectiva de compilación a cambiar las cosas de manera que actualmente no es 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 tener una visión general del estado Roslyn actual y los diferentes niveles de acceso y control que proporciona, ver http://msdn.microsoft.com/en-us/hh500769

ACTUALIZACIÓN

Microsoft acaba de hacer un nuevo CTP disponible con características adicionales y una gran cantidad de API cambios/adiciones Para detalles, ver here.

+1

En realidad, no es cierto que pueda usar Roslyn para extender C# con palabras clave adicionales. –

+0

gracias ... corregido ... aunque no en el primer lanzamiento, soy bueno que esto sea posible ... – Yahia

+2

@DustinCampbell, ¿Y si manejaste cualquier error del compilador que la pseudo palabra clave generada al generar el código? –

9

Una gran diferencia que veo: con CodeDom, cada vez que compila 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 arquitectura, escalabilidad, aislamiento, etc. (mencione Azure), esto no es muy bueno.

Con Roslyn está en proceso.

Supongo que esta es una de las razones por la que lo llaman "compilador como un servicio".

Además, CodeDom es una API relativamente pobre, pierde muchas características y no está 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 compiladores. Espero que eso haga la diferencia.

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

Cuestiones relacionadas