2011-10-21 9 views
94

Da un press release ieri sul InfoWorld per quanto riguarda la nuova Microsoft Roslyn:Microsoft Roslyn vs. CodeDom

Il vantaggio più evidente di questo tipo di "decostruito" compilatore è che permette l'intero processo di compilazione-esecuzione di essere invocato da all'interno di applicazioni .Net. Hejlsberg ha dimostrato un programma C# che ha passato alcuni frammenti di codice al compilatore C# come stringhe; il compilatore ha restituito il codice assembly IL risultante come oggetto, che è stato quindi passato al Common Language Runtime (CLR) per l'esecuzione. Ecco! Con Roslyn, C# acquisisce la capacità di una lingua dinamica di generare e richiamare il codice in fase di runtime.

Sono stato in grado di farlo dopo il rilascio di .NET 4 con CSharpCodeProvider.CompileAssemblyFromSource che ho in uso infatti in un progetto ASP.Net scritto poco fa che fa esattamente questo - Consente all'utente di digitare codice in una casella di testo, scegliere gruppi/spazi dei nomi da utilizzare come riferimento e quindi eseguire e visualizzare l'output da quel codice al volo per il test del codice dell'ambiente live su Windows Azure.

È CodeDom parte di/un precursore di Roslyn? Qual è il vantaggio speciale di Roslyn rispetto allo CodeDom?

risposta

215

Disclaimer: Lavoro per Microsoft nel team di Roslyn.

CodeDom è un precursore di Roslyn, ma è solo marginalmente correlato. Essenzialmente, CodeDom è un modo agnostico semplice e (un po ') langage per generare codice aggiunto in .NET 1.0 per supportare i progettisti (a la WinForms). Poiché CodeDom è stato un tentativo di fornire un modello unificato in grado di generare codice in C#, VB e altri linguaggi, manca di alta fedeltà con qualsiasi lingua supportata (ecco perché non è possibile creare un'istruzione switch con CodeDom). CSharpCodeProvider.CompileAssemblyFromSource è semplicemente un wrapper per l'esecuzione di csc.exe.

Roslyn è un animale completamente diverso. È una riscrittura dei compilatori C# e VB da zero usando codice gestito - C# in C# e VB in VB (le versioni di csc.exe e vbc.exe che vengono spedite oggi sono scritte in codice nativo). Il vantaggio di crearli nel codice gestito è che gli utenti possono fare riferimento ai compilatori reali come librerie da applicazioni .NET (non sono necessari wrapper).

Mentre la costruzione di ogni componente della pipeline compilatore, abbiamo esposti API pubbliche in cima:

  • Parser -> Syntax Tree API
  • Tabella dei simboli/Metadata Import -> Simbolo API
  • Binder -> Binding e di flusso di analisi API
  • L'emettitore -> Emit API

Roslyn può essere utilizzato come un sofisticato C# a nd VB generatore di codice sorgente, ma è qui che finisce la somiglianza con CodeDom. Le API di Roslyn Compiler possono essere utilizzate per analizzare il codice, eseguire analisi semantiche, compilare e valutare il codice in modo dinamico, ecc.

Oltre ai compilatori, il team di Roslyn sta anche ricostruendo le caratteristiche di Visual Studio C# e VB IDE in alto delle API del compilatore pubblico. Pertanto, le API del compilatore sono abbastanza ricche per creare gli strumenti di progettazione di Visual Studio, come IntelliSense e il refactoring del metodo Extract. Inoltre, a livelli superiori al compilatore, Roslyn offre servizi per l'analisi di livello superiore o la trasformazione dei dati. Ad esempio, esistono servizi per la formattazione del codice utilizzando le regole di formattazione C# e VB o la ricerca di tutti i riferimenti a un particolare simbolo all'interno di una soluzione.

Davvero, non c'è solo uno un vantaggio speciale di Roslyn su CodeDom. Laddove CodeDom ha riempito una necessità di generazione di codice molto specifica, Roslyn sta affrontando l'intero spazio degli strumenti linguistici fornendo un framework che consente di creare praticamente qualsiasi tipo di strumento di linguaggio C# o VB a cui si possa pensare.

+2

@Dustin: Roslyn sosterrà altre lingue? JavaScript (.NET), per esempio? – dbarros

+0

@ Dustin: Questo è perfetto per creare un'esperienza IDE completa in grado di imporre la qualità del codice nella mia organizzazione, anche se non vedo una sostituzione completa della revisione manuale del codice, ma vedo un notevole aumento della qualità. Presto! –

+0

Sarebbe bello se qualcuno avesse già creato uno strumento basato su Roslyn per convertire il codice che utilizza CodeDom in codice che utilizza la SyntaxFactory di Roslyn ... (In parte perché .Net Core ha Roslyn ma non CodeDom e sto usando una libreria di sviluppo CodeDom) – Emyr

40

CodeDom consente di compilare, ma non ti dà la possibilità di ottenere informazioni sul codice stesso (oltre agli errori del compilatore). Fondamentalmente, è una scatola nera dove dici "compila questo" e dice "Sono riuscito" o "Ho fallito, ecco alcuni errori".

Roslyn consente di ispezionare completamente e creare il codice al volo. Questo include cose come la possibilità di vedere/ispezionare i commenti all'interno di un pezzo di codice sorgente, informazioni dettagliate sull'intera struttura, ecc. Puoi passare e ottenere l'intero albero di sintassi della sorgente che passi a Roslyn, e fare analisi dettagliate o trasformazioni su di esso.

Date le informazioni complete e complete sulla sintassi, avete un'enorme quantità di controllo e flessibilità extra. Ecco come, ad esempio, il campione funziona che copia un blocco di codice C# e lo incolla come codice VB.NET. Con Roslyn puoi fare molto di più che compilare - puoi anche manipolare il codice in modo pulito. Questo dovrebbe rendere molto più semplice la creazione di molti strumenti, dal momento che cose come i refactoring possono essere fatte in modo molto semplice in quanto gli strumenti comprendono la sintassi completa, incluse le meta-informazioni (come i commenti) e possono semplicemente lavorare direttamente con esso.

6

Roslyn permette molto molto controllo più fine di tutto il processo - per esempio si potrebbe analizzare la stringa e anche generare il codice addizionale (on-the-fly nell'ambito del processo di compilazione in base all'analisi), ecc

CodeDom è "solo usando il compilatore" mentre Roslyn è "compilatore come servizio con accesso completo a (sotto-) parti" ... con Roslyn ci si trova "all'interno del compilatore" e si può vedere come appare il codice da una prospettiva del compilatore che consente di cambiare le cose in modi attualmente non possibili.

Ad esempio, è possibile utilizzare Roslyn per estendere C#: qualcosa di molto utile e molto migliore dello stato attuale dell'implementazione AOP.

Per una panoramica dello stato attuale Roslyn e dei diversi livelli di accesso e controllo che fornisce, vedi http://msdn.microsoft.com/en-us/hh500769

UPDATE

Microsoft ha appena fatto un nuovo CTP disponibile con funzionalità aggiuntive e un sacco di API modifiche/integrazioni. Per dettagli, vedere here.

+1

In realtà, non è vero che è possibile utilizzare Roslyn per estendere C# con parole chiave aggiuntive. –

+0

grazie ... corretto ... anche se non nella prima versione sono abbastanza sicuro che ciò sia possibile ... – Yahia

+2

@DustinCampbell, Cosa succede se si è trattato di qualsiasi errore del compilatore che la parola chiave pseudo causata dalla generazione del codice? –

9

Una grande differenza che vedo: con CodeDom, ogni volta che si compila un C# o VB.NET, succede fuori processo. CSC.exe o VBC.exe sono i veri lavoratori dietro la scena.

Se si desidera creare un servizio, in termini di architettura, scalabilità, isolamento, ecc. (Si parla di Azure), ciò non è molto buono.

Con Roslyn è in corso.

Suppongo che questo sia uno dei motivi per cui lo chiamano "Compilatore come servizio".

Inoltre, CodeDom è un'API relativamente scarsa, manca di molte funzionalità e non è aggiornato, in quanto è stato progettato principalmente per supportare la generazione automatica di codice dei designer di Visual Studio UI. Penso che Roslyn farà molto meglio perché è scritto dai ragazzi che scrivono i compilatori. Spero che farà la differenza.

PS: una differenza notevole da CSC.exe e VBC.exe: Roslyn sembra essere puro .NET (e utilizza CCI).