Compilatore: Un compilatore è un programma che converte il codice sorgente (linguaggio originale) scritto in un linguaggio di programmazione in un altro (linguaggio di destinazione). La compilazione è il processo di traduzione dal codice sorgente (di solito un linguaggio di alto livello) a codice oggetto (di solito un linguaggio di basso livello o linguaggio macchina) che può essere eseguito direttamente da un computer o da una macchina virtuale.
Nella piattaforma .NET, ci sono due diversi compilatori in diverse fasi di esecuzione del modello: uno chiamato compilatore Roslyn, che compila codice C# e VB in assembly; L'altro è chiamato compilatore RyuJIT, che compila il codice IL (linguaggio intermedio) nell'assembly in codice macchina.
Questo articolo inizia con il compilatore Roslyn. Non dobbiamo approfondire come funziona, ma capire come funziona, sapere a cosa può essere usato.
Inizialmente, il compilatore del linguaggio C# era scritto in C++, e successivamente Microsoft introdusse un nuovo compilatore scritto direttamente in C#: Roslyn, che è un compilatore bootstrap.
Il compilatore bootstrap significa che il compilatore di un determinato linguaggio di programmazione è scritto direttamente nel linguaggio. Ogni versione del compilatore bootstrap è compilata con una versione precedente, ma la sua prima versione deve essere compilata da un compilatore scritto in un altro linguaggio, come la prima versione di Roslyn compilata da un compilatore scritto in C++. Molti linguaggi di programmazione maturano e scrivono i propri compilatori utilizzando il linguaggio stesso, come C# e Go.
Sulla piattaforma .NET, il compilatore Roslyn è responsabile della compilazione del codice C# e VB in assembly.
La maggior parte dei compilatori tradizionali esistenti sono pattern "black box" che convertono il codice sorgente in eseguibili o file di libreria, e non abbiamo modo di sapere cosa succede nel mezzo. A differenza di Roslyn, Roslyn permette di accedere a ogni fase del processo di compilazione del codice tramite API.
Il suo meccanismo di funzionamento è basato su pipeline, con quattro stadi, ciascuno dei quali è un modulo indipendente, e ogni modulo fornisce una corrispondente API. Gli ambienti di sviluppo integrati (IDE) possono sfruttare queste API per fornire strumenti comodi per migliorare l'efficienza dello sviluppo, come l'evidenziazione del codice, suggerimenti intelligenti, strumenti di rifattorizzazione, strumenti di analisi delle prestazioni e altro ancora. Inoltre, con Roslyn, gli sviluppatori possono utilizzare il compilatore come servizio nei propri programmi.
Sfrutta le API fornite da Roslyn per generare dinamicamente campioni di codice
Per prima cosa, crea una nuova libreria ClassLibraryGenerator e crea un progetto di libreria standard .NET che prenda di mira il nome framework target netstandard2.0 (TFM). Aggiungendo i pacchetti NuGet Microsoft.CodeAnalysis.Analyzers e Microsoft.CodeAnalysis.CSharp, csproj è configurato come segue:
Crea un nuovo file C# chiamato TestSourceGenerator.cs che specifichi il tuo generatore di sorgente come segue:
Dall'oggetto di contesto, possiamo accedere al punto di ingresso compilato o al metodo Main. Un'istanza mainMethod è un IMethodSymbol che rappresenta il simbolo di un metodo o di un metodo simile (inclusi costruttori, distruttori, operatori o accessori attributi/eventi). Il metodo Microsoft.CodeAnalysis.Compilation.GetEntryPoint restituisce l'IMethodSymbol del punto di ingresso del programma. Altri metodi ti permettono di trovare qualsiasi simbolo di metodo nel tuo progetto. In questo oggetto, possiamo dedurre lo spazio dei nomi (se esiste) e il tipo che contiene. La sorgente in questo esempio è una stringa interpolata che modella il codice sorgente da generare, con le lacune interpolate che popolano lo spazio dei nomi e le informazioni di tipo contenute. Aggiungi la fonte al contesto con il nome del prompt. Per questo esempio, il builder crea un nuovo file sorgente di build che contiene l'implementazione del metodo parziale nell'applicazione console. Un generatore di sorgenti può essere scritto per aggiungere qualsiasi fonte preferita.
Crea una nuova app console ConsoleApp4 (senza istruzioni di alto livello) con il seguente codice:
Allo stesso tempo, aggiungi il riferimento al progetto ClassLibraryGenerator, come segue:
Prova ad avviare l'app console con l'output che segue:
In Visual Studio, clicca sul progetto "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", fai doppio clic sul file "Program.g.cs" per vedere il codice generato, come segue:
Sollecito:Modificare il codice del builder potrebbe richiedere un riavvio di Visual Studio per vederlo。
Indirizzo GitHub di Roslyn:Il login del link ipertestuale è visibile.
Riferimento:
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile. |