Microsoft Roslyn contro CodeDom


111

Da un comunicato stampa di ieri su InfoWorld relativo al nuovo Microsoft Roslyn :

Il vantaggio più evidente di questo tipo di compilatore "decostruito" è che consente di richiamare l'intero processo di esecuzione-compilazione dall'interno delle 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 un oggetto, che è stato quindi passato al Common Language Runtime (CLR) per l'esecuzione. Ecco! Con Roslyn, C # acquisisce la capacità di un linguaggio dinamico di generare e richiamare codice in fase di esecuzione.

Sono stato in grado di farlo dal rilascio di .NET 4 con il CSharpCodeProvider.CompileAssemblyFromSourcequale di fatto uso in un progetto ASP.Net scritto tempo fa che fa esattamente questo: consente a un utente di digitare il codice in una casella di testo, scegliere assembly / spazi dei nomi per fare riferimento, quindi eseguire e visualizzare l'output di quel codice al volo per il test del codice dell'ambiente live su Windows Azure.

Fa CodeDomparte di / un precursore di Roslyn? Qual è il vantaggio speciale di Roslyn CodeDom?

Risposte:


241

Dichiarazione di non responsabilità : lavoro per Microsoft nel team di Roslyn.

CodeDom è un precursore di Roslyn, ma è correlato solo marginalmente. Essenzialmente, CodeDom è un modo semplice e (in qualche modo) indipendente dal linguaggio per generare codice che è stato aggiunto in .NET 1.0 per supportare i progettisti (come WinForms). Poiché CodeDom era un tentativo di fornire un modello unificato in grado di generare codice in C #, VB e altri linguaggi, manca di alta fedeltà con nessuno dei linguaggi supportati (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 utilizzando codice gestito - C # in C # e VB in VB (le versioni di csc.exe e vbc.exe fornite oggi sono scritte in codice nativo). Il vantaggio di crearli in codice gestito è che gli utenti possono fare riferimento ai compilatori reali come librerie da applicazioni .NET (non sono necessari wrapper).

Durante la creazione di ogni componente della pipeline del compilatore, abbiamo esposto le API pubbliche in primo piano:

  • Parser -> API dell'albero della sintassi
  • Importazione tabella dei simboli / metadati -> API dei simboli
  • Binder -> API di binding e analisi del flusso
  • IL Emitter -> Emit API

Roslyn può essere utilizzato come sofisticato generatore di codice sorgente C # e VB, ma è qui che finisce la somiglianza con CodeDom. Le API del compilatore Roslyn possono essere utilizzate per analizzare il codice, eseguire analisi semantiche, compilare e valutare il codice dinamicamente, ecc.

Oltre ai compilatori, il team di Roslyn sta anche ricostruendo le funzionalità IDE di Visual Studio C # e VB oltre alle API del compilatore pubblico. Pertanto, le API del compilatore sono sufficientemente ricche per creare gli strumenti della fase di progettazione di Visual Studio, come IntelliSense e il refactoring del metodo di estrazione. Inoltre, ai livelli sopra il 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 per trovare tutti i riferimenti a un particolare simbolo all'interno di una soluzione.

In realtà, non c'è solo un vantaggio speciale di Roslyn su CodeDom. Laddove CodeDom ha soddisfatto un'esigenza di generazione di codice molto specifica, Roslyn sta affrontando l'intero spazio degli strumenti del linguaggio fornendo un framework che ti consente di creare praticamente qualsiasi tipo di strumento di linguaggio C # o VB a cui puoi pensare.


2
@Dustin: Roslyn supporterà altre lingue? JavaScript (.NET), ad esempio?
Diego Barros

@Dustin: Questo è perfetto per costruire un'esperienza IDE completa che possa rafforzare 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!
Jerric Lyns John

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

43

CodeDom ti consente di compilare, ma non ti dà la possibilità di ottenere realmente informazioni sul codice stesso (a parte gli errori del compilatore). Fondamentalmente, è una scatola nera in cui dici "compila questo" e dice "sono riuscito" o "non sono riuscito, ecco alcuni errori".

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

Date le informazioni complete e ricche di sintassi, si dispone di un'enorme quantità di controllo e flessibilità extra. Ecco come, ad esempio, funziona l'esempio che copia un blocco di codice C # e lo incolla come codice VB.NET. Con Roslyn, puoi fare di più che compilare: puoi anche manipolare il codice stesso in modo pulito. Questo dovrebbe rendere molti strumenti molto più semplici da generare, dal momento che cose come il refactoring possono essere fatte molto semplicemente poiché gli strumenti comprendono l'intera sintassi, comprese le meta informazioni (come i commenti), e possono semplicemente lavorarci direttamente.


12

Vedo una grande differenza: con CodeDom, ogni volta che compili un po 'di C # o VB.NET, succede fuori processo. CSC.exe o VBC.exe sono i veri lavoratori dietro le quinte.

Se vuoi costruire un servizio, in termini di architettura, scalabilità, isolamento, ecc. (Menzioni Azure), questo 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 è davvero aggiornato, poiché è stato progettato principalmente per supportare la generazione automatica di codice dei progettisti dell'interfaccia utente di Visual Studio. Penso che Roslyn farà molto meglio perché è scritto dai ragazzi che scrivono i compilatori. Spero che faccia la differenza.

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


8

Roslyn consente un controllo molto più preciso dell'intero processo, ad esempio è possibile analizzare la stringa e persino generare codice aggiuntivo (al volo all'interno del processo di compilazione basato sull'analisi), ecc.

CodeDom "sta solo usando il compilatore" mentre Roslyn è "compilatore come servizio con pieno accesso alle (sotto) parti" ... con Roslyn sei "dentro il compilatore" e puoi vedere come appare il codice dal punto di vista del compilatore permettendoti di cambiare le cose in modi attualmente non possibili.

Ad esempio, puoi usare Roslyn per estendere C # - qualcosa di molto utile e molto migliore dell'attuale stato dell'implementazione AOP.

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

AGGIORNARE

Microsoft ha appena reso disponibile un nuovo CTP con funzionalità aggiuntive e molte modifiche / aggiunte API. Per i dettagli vedere qui .


1
In realtà, non è vero che puoi usare Roslyn per estendere C # con parole chiave aggiuntive.
Dustin Campbell

grazie ... corretto ... anche se non nella prima versione sono carino che questo sarà possibile ...
Yahia

2
@DustinCampbell, e se gestissi qualsiasi errore del compilatore causato dalla pseudo parola chiave durante la generazione del codice?
Rodrick Chapman

3
Avresti bisogno di fare una riscrittura prima di passarlo al compilatore. Innanzitutto, analizza il codice con le tue parole chiave speciali. Il codice verrà analizzato e, a meno che il parser non possa ricavarne testa o croce, le parole chiave non valide verranno visualizzate come SkippedTokenTrivia nell'albero risultante. Quindi, rileva le parole chiave saltate e riscrivi l'albero con un codice valido (ad es. Tessitura AOP). Infine, passa il nuovo albero al compilatore. Tuttavia, questo è sicuramente un trucco e non è garantito che funzioni con le versioni future di Roslyn. Ad esempio, il parser potrebbe non produrre lo stesso albero per il codice danneggiato nelle versioni future.
Dustin Campbell

@DustinCampbell: ma ci sarà QUALCOSA che permetterà la tessitura AOP nella finale di Roslyn? La mia tessitura Mono.Cecil INPC funziona bene così com'è, ma se potessi scrivere public notifying string Name {get;set;}sarebbe ancora più fantastico
TDaver
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.