Microsoft Roslyn vs. CodeDom

111

De um comunicado à imprensa ontem no InfoWorld sobre o novo Microsoft Roslyn :

A vantagem mais óbvia desse tipo de compilador "desconstruído" é que ele permite que todo o processo de compilação-execução seja chamado de dentro de aplicativos .Net. Hejlsberg demonstrou um programa C # que passava alguns trechos de código para o compilador C # como strings; o compilador retornou o código de montagem IL resultante como um objeto, que foi então passado para o Common Language Runtime (CLR) para execução. Voilà! Com o Roslyn, o C # ganha a capacidade de uma linguagem dinâmica para gerar e invocar código em tempo de execução.

Tenho sido capaz de fazer isso desde o lançamento do .NET 4, com o CSharpCodeProvider.CompileAssemblyFromSourcequal de fato uso em um projeto ASP.Net escrito há algum tempo que faz exatamente isso - permite que um usuário digite o código em uma caixa de texto, escolha assemblies / namespaces para fazer referência e, em seguida, executar e exibir a saída desse código em tempo real para teste de código de ambiente ao vivo no Windows Azure.

É CodeDomparte de / um precursor de Roslyn? Qual é o benefício especial de Roslyn CodeDom?

mellamokb
fonte

Respostas:

241

Isenção de responsabilidade : Eu trabalho para a Microsoft na equipe Roslyn.

CodeDom é um precursor de Roslyn, mas é apenas marginalmente relacionado. Essencialmente, CodeDom é uma maneira simples e (um tanto) agnóstica de linguagem de gerar código que foi adicionado em .NET 1.0 para dar suporte a designers (como WinForms). Como o CodeDom foi uma tentativa de fornecer um modelo unificado que pode gerar código em C #, VB e outras linguagens, ele carece de alta fidelidade com qualquer uma das linguagens que oferece suporte (é por isso que você não pode criar uma instrução switch com CodeDom). CSharpCodeProvider.CompileAssemblyFromSource é simplesmente um invólucro em torno da execução de csc.exe.

Roslyn é um animal completamente diferente. É uma reescrita de ambos os compiladores C # e VB do zero usando código gerenciado - C # em C # e VB em VB (as versões de csc.exe e vbc.exe que vêm hoje são escritas em código nativo). A vantagem de construí-los em código gerenciado é que os usuários podem fazer referência aos compiladores reais como bibliotecas de aplicativos .NET (sem necessidade de wrappers).

Ao construir cada componente do pipeline do compilador, expusemos APIs públicas no topo:

  • Parser -> API de árvore de sintaxe
  • Tabela de símbolos / Importação de metadados -> API de símbolos
  • Binder -> APIs de ligação e análise de fluxo
  • IL Emitter -> Emit API

Roslyn pode ser usado como um sofisticado gerador de código-fonte C # e VB, mas é aí que termina a semelhança com o CodeDom. As APIs do Roslyn Compiler podem ser usadas para analisar código, realizar análise semântica, compilar e avaliar código dinamicamente, etc.

Além dos compiladores, a equipe do Roslyn também está reconstruindo os recursos do Visual Studio C # e VB IDE com base nas APIs públicas do compilador. Portanto, as APIs do compilador são ricas o suficiente para criar as ferramentas de tempo de design do Visual Studio, como o IntelliSense e a refatoração do Método de Extração. Além disso, em camadas acima do compilador, Roslyn oferece serviços para análise de nível superior ou transformação de dados. Por exemplo, existem serviços para formatar código usando as regras de formatação C # e VB ou encontrar todas as referências a um símbolo específico em uma solução.

Na verdade, não há apenas um benefício especial do Roslyn sobre o CodeDom. Onde CodeDom preencheu uma necessidade muito específica de geração de código, Roslyn está lidando com todo o espaço de ferramentas de linguagem, fornecendo uma estrutura que permite a você construir praticamente qualquer tipo de ferramenta de linguagem C # ou VB que você possa imaginar.

Dustin Campbell
fonte
2
@Dustin: Roslyn oferecerá suporte a outros idiomas? JavaScript (.NET), por exemplo?
Diego Barros
@Dustin: Isso é perfeito para construir uma experiência IDE completa que pode reforçar a qualidade do código em minha organização, embora eu não veja uma substituição completa da revisão manual do código, mas vejo um aumento considerável na qualidade. Em breve!
Jerric Lyns John
Seria ótimo se alguém já tivesse criado uma ferramenta baseada em Roslyn para converter código que usa CodeDom em código que usa SyntaxFactory de Roslyn ... (Em parte porque .Net Core tem Roslyn, mas não CodeDom e estou usando uma biblioteca criada em torno de CodeDom )
Emyr
43

CodeDom permite que você compile - mas não dá a você a capacidade de realmente obter informações sobre o próprio código (exceto erros do compilador). Basicamente, é uma caixa preta onde você diz "compile isto" e ela diz "Eu consegui" ou "Eu falhei, aqui estão alguns erros".

Roslyn permite que você inspecione completamente e crie o código em tempo real. Isso inclui coisas como ser capaz de ver / inspecionar os comentários dentro de um trecho do código-fonte, informações detalhadas sobre a estrutura completa, etc. Você pode percorrer e obter toda a árvore de sintaxe da fonte que você passar para o Roslyn e fazer uma análise detalhada ou transformações nele.

Dadas as informações completas e ricas de sintaxe, você tem uma grande quantidade de controle e flexibilidade extras. É assim que funciona, por exemplo, o exemplo que copia um bloco de código C # e o cola como código VB.NET. Com Roslyn, você pode fazer mais do que apenas compilar - você também pode manipular o próprio código de forma limpa. Isso deve tornar muito mais simples a geração de um conjunto de ferramentas, uma vez que coisas como refatorações podem ser feitas de forma muito simples, pois o conjunto de ferramentas entende a sintaxe completa, incluindo metainformações (como comentários), e pode simplesmente trabalhar com elas diretamente.

Reed Copsey
fonte
12

Uma grande diferença que vejo: com CodeDom, cada vez que você compila algum C # ou VB.NET, isso acontece fora do processo. CSC.exe ou VBC.exe são os verdadeiros trabalhadores por trás da cena.

Se você quiser construir um serviço, em termos de arquitetura, escalabilidade, isolamento, etc. (você mencionou o Azure), isso não é muito bom.

Com Roslyn, está em andamento.

Suponho que esse seja um dos motivos pelos quais o chamam de "Compilador como serviço".

Além disso, CodeDom é uma API relativamente pobre, perde muitos recursos e não está realmente atualizado, pois foi projetado principalmente para oferecer suporte à geração automática de código de designers de IU do Visual Studio. Acho que Roslyn se sairá muito melhor se for escrito pelos caras que escrevem os compiladores. Espero que isso faça a diferença.

PS: Uma diferença notável de CSC.exe e VBC.exe: Roslyn parece ser .NET puro (e usa CCI ).

Simon Mourier
fonte
8

Roslyn permite um controle muito mais preciso de todo o processo - por exemplo, você pode analisar a string e até mesmo gerar código adicional (on-the-fly dentro do processo de compilação com base na análise), etc.

CodeDom está "apenas usando o compilador", enquanto Roslyn é "compilador como serviço com acesso total a (sub) partes" ... com Roslyn você está "dentro do compilador" e pode ver como o código se parece a partir de uma perspectiva de compilador permitindo que você mude as coisas de maneiras atualmente impossíveis.

Por exemplo, você pode usar o Roslyn para estender o C # - algo muito útil e muito melhor do que o estado atual da implementação de AOP.

Para obter uma visão geral do estado atual de Roslyn e dos diferentes níveis de acesso e controle que ele fornece, consulte http://msdn.microsoft.com/en-us/hh500769

ATUALIZAR

A Microsoft acaba de disponibilizar um novo CTP com recursos adicionais e muitas alterações / adições de API. Para detalhes veja aqui .

Yahia
fonte
1
Na verdade, não é verdade que você pode usar Roslyn para estender C # com palavras-chave adicionais.
Dustin Campbell,
obrigado ... corrigido ... embora não no primeiro lançamento estou bonita que isso será possível ...
Yahia
2
@DustinCampbell, E se você manipulasse qualquer erro do compilador que a pseudo palavra-chave causasse ao gerar código?
Rodrick Chapman
3
Você precisaria reescrever antes de passá-lo para o compilador. Primeiro, analise o código com suas palavras-chave especiais. O código irá analisar e, a menos que o analisador não consiga fazer cara ou coroa com ele, as palavras-chave inválidas aparecerão como SkippedTokenTrivia na árvore resultante. Em seguida, detecte as palavras-chave ignoradas e reescreva a árvore com o código válido (por exemplo, tecelagem AOP). Finalmente, passe a nova árvore para o compilador. No entanto, este é definitivamente um hack, e não é garantido que funcione com versões futuras do Roslyn. Por exemplo, o analisador pode não produzir a mesma árvore para código quebrado em versões futuras.
Dustin Campbell
@DustinCampbell: mas haverá ALGUMA COISA permitindo a tecelagem AOP na final de Roslyn? Minha tecelagem Mono.Cecil INPC funciona perfeitamente como está, mas se eu pudesse escrever public notifying string Name {get;set;}seria ainda mais incrível
TDaver