Compilador: Um compilador é um programa que converte código-fonte (linguagem original) escrito em uma linguagem de programação para outra (língua de destino). Compilação é o processo de tradução do código-fonte (geralmente uma linguagem de alto nível) para o código objeto (geralmente uma linguagem de baixo nível ou linguagem de máquina) que pode ser executado diretamente por um computador ou máquina virtual.
Na plataforma .NET, existem dois compiladores diferentes em diferentes estágios de execução do modelo: um chamado compilador Roslyn, que compila códigos C# e VB em assemblies; O outro é chamado de compilador RyuJIT, que compila o código IL (linguagem intermediária) no assembly em código de máquina.
Este artigo começa com o compilador Roslyn. Não precisamos nos aprofundar em como funciona, mas sim entender como funciona, saber para que pode ser usado.
Inicialmente, o compilador da linguagem C# era escrito em C++, e depois a Microsoft introduziu um novo compilador escrito em C#: Roslyn, que é um compilador bootstrap.
O compilador bootstrap significa que o compilador de uma determinada linguagem de programação é escrito na própria linguagem. Cada versão do compilador bootstrap é compilada com uma versão que o precedeu, mas sua primeira versão deve ser compilada por um compilador escrito em outra linguagem, como a primeira versão do Roslyn compilada por um compilador escrito em C++. Muitas linguagens de programação amadurecem e escrevem seus próprios compiladores usando a própria linguagem, como C# e Go.
Na plataforma .NET, o compilador Roslyn é responsável por compilar códigos C# e VB em assemblies.
A maioria dos compiladores tradicionais existentes são padrões "caixa-preta" que convertem código-fonte em executáveis ou arquivos de biblioteca, e não temos como saber o que acontece entre esses processos. Ao contrário do Roslyn, o Roslyn permite que você acesse todas as etapas do processo de compilação de código por meio de APIs.
Seu mecanismo de funcionamento é baseado em pipeline, com quatro estágios, cada um dos quais é um módulo independente, e cada módulo fornece uma API correspondente. Ambientes de desenvolvimento integrados (IDEs) podem aproveitar essas APIs para fornecer ferramentas convenientes para melhorar a eficiência do desenvolvimento, como destaque de código, dicas inteligentes, ferramentas de refatoração, ferramentas de análise de desempenho e mais. Além disso, com o Roslyn, os desenvolvedores podem usar o compilador como um serviço em seus próprios programas.
Aproveite as APIs fornecidas por Roslyn para gerar amostras de código dinamicamente
Primeiro, crie uma nova biblioteca ClassLibraryGenerator e crie um projeto de biblioteca padrão .NET que tenha como alvo o nome de framework de alvo netstandard2.0 (TFM). Adicione os pacotes NuGet Microsoft.CodeAnalysis.Analyzers e Microsoft.CodeAnalysis.CSharp, o CSPROJ é configurado da seguinte forma:
Crie um novo arquivo C# chamado TestSourceGenerator.cs que especifica seu próprio gerador de fonte da seguinte forma:
A partir do objeto context, podemos acessar o ponto de entrada compilado ou o método Main. Uma instância mainMethod é um IMethodSymbol que representa o símbolo de um método ou método similar (incluindo construtores, destrutores, operadores ou acessores de atributos/eventos). O método Microsoft.CodeAnalysis.Compilation.GetEntryPoint retorna o IMethodSymbol do ponto de entrada do programa. Outros métodos permitem que você encontre qualquer símbolo de método no seu projeto. Neste objeto, podemos deduzir o namespace (se ele existir) e o tipo que ele contém. A fonte neste exemplo é uma cadeia interpolada que molda o código-fonte a ser gerado, com as lacunas interpoladas preenchendo o namespace contido e as informações de tipo. Adicione a fonte ao contexto com o nome do prompt. Para este exemplo, o construtor cria um novo arquivo fonte de compilação que contém a implementação do método parcial no aplicativo de console. Um gerador de fonte pode ser escrito para adicionar qualquer fonte favorita.
Crie um novo aplicativo de console ConsoleApp4 (sem instruções de nível superior) com o seguinte código:
Ao mesmo tempo, adicione a referência do projeto ClassLibraryGenerator, da seguinte forma:
Tente abrir o aplicativo de console com a saída da seguinte forma:
No Visual Studio, clique no projeto "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", clique duas vezes no arquivo "Program.g.cs" para ver o código gerado, da seguinte forma:
Rápido:Modificar o código do construtor pode exigir uma reinicialização do Visual Studio para visualizá-lo。
Endereço do GitHub de Roslyn:O login do hiperlink está visível.
Referência:
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível. |