Compilator: Un compilator este un program care convertește codul sursă (limbajul original) scris într-un limbaj de programare în altul (limbaj țintă). Compilarea este procesul de traducere din codul sursă (de obicei un limbaj de nivel înalt) în cod obiect (de obicei un limbaj de nivel scăzut sau un limbaj mașină) care poate fi executat direct de un calculator sau o mașină virtuală.
În platforma .NET, există două compilatoare diferite în diferite stadii ale execuției modelului: unul numit compilatorul Roslyn, care compilează codul C# și VB în asamblări; Celălalt se numește compilatorul RyuJIT, care compilează codul IL (limbaj intermediar) din asamblare în cod mașină.
Acest articol începe cu compilatorul Roslyn. Nu trebuie să intrăm în detalii despre cum funcționează, ci să înțelegem cum funcționează, să știm la ce poate fi folosit.
Inițial, compilatorul limbajului C# era scris în C++, iar mai târziu Microsoft a introdus un nou compilator scris chiar în C#: Roslyn, care este un compilator bootstrap.
Compilatorul bootstrap înseamnă că compilatorul unui anumit limbaj de programare este scris în limbajul propriu-zis. Fiecare versiune a compilatorului bootstrap este compilată cu o versiune anterioară, dar prima versiune trebuie să fie compilată de un compilator scris într-un alt limbaj, cum ar fi prima versiune a lui Roslyn compilată de un compilator scris în C++. Multe limbaje de programare se maturizează și își scriu propriile compilatoare folosind limbajul însuși, cum ar fi C# și Go.
Pe platforma .NET, compilatorul Roslyn este responsabil pentru compilarea codului C# și VB în asamblări.
Majoritatea compilatoarelor tradiționale existente sunt modele "cutie neagră" care convertesc codul sursă în executabile sau fișiere de bibliotecă, și nu avem nicio modalitate de a ști ce se întâmplă între acestea. Spre deosebire de Roslyn, Roslyn îți permite să accesezi fiecare etapă a procesului de compilare a codului prin API-uri.
Mecanismul său de funcționare este bazat pe conducte, cu patru etape, fiecare fiind un modul independent, iar fiecare modul oferă un API corespunzător. Mediile integrate de dezvoltare (IDE) pot valorifica aceste API-uri pentru a oferi instrumente convenabile care să îmbunătățească eficiența dezvoltării, cum ar fi evidențierea codului, indicii inteligente, instrumente de refactorizare, instrumente de analiză a performanței și altele. În plus, cu Roslyn, dezvoltatorii pot folosi compilatorul ca serviciu în propriile programe.
Folosește API-urile oferite de Roslyn pentru a genera dinamic exemple de cod
Mai întâi, creează o nouă bibliotecă ClassLibraryGenerator și creează un proiect de bibliotecă standard .NET care să vizeze denumirea framework-ului țintă netstandard2.0 (TFM). Adăugați pachetele NuGet Microsoft.CodeAnalysis.Analyzers și Microsoft.CodeAnalysis.CSharp, csproj este configurat astfel:
Creează un nou fișier C# numit TestSourceGenerator.cs care specifică propriul generator sursă astfel:
Din obiectul context, putem accesa punctul de intrare compilat sau metoda Main. O instanță mainMethod este un IMethodSymbol care reprezintă simbolul unei metode sau al unei metode similare (inclusiv constructori, distrugători, operatori sau accesorii de atribute/evenimente). Metoda Microsoft.CodeAnalysis.Compilation.GetEntryPoint returnează IMethodSymbol al punctului de intrare al programului. Alte metode îți permit să găsești orice simbol de metodă în proiectul tău. În acest obiect, putem deduce spațiul de nume (dacă există) și tipul pe care îl conține. Sursa din acest exemplu este un șir interpolat care șablonează codul sursă ce urmează să fie generat, cu golurile interpolate care populează spațiul de nume și informațiile de tip conținute. Adaugă sursa în context cu numele promptului. Pentru acest exemplu, constructorul creează un nou fișier sursă de build care conține implementarea metodei parțiale în aplicația de consolă. Un generator de surse poate fi scris pentru a adăuga orice sursă preferată.
Creează o nouă aplicație de consolă ConsoleApp4 (fără instrucțiuni de nivel superior) cu următorul cod:
În același timp, adăugați referința proiectului ClassLibraryGenerator, după cum urmează:
Încearcă să lansezi aplicația de consolă cu rezultatul următor:
În Visual Studio, faceți clic pe proiectul "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", faceți dublu clic pe fișierul "Program.g.cs" pentru a vedea codul generat, după cum urmează:
Prompt:Modificarea codului constructorului poate necesita repornirea Visual Studio pentru a-l vedea。
Adresa GitHub a lui Roslyn:Autentificarea cu hyperlink este vizibilă.
Referință:
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă. |