Kompilators: kompilators ir programma, kas pārvērš vienā programmēšanas valodā rakstīto avota kodu (oriģinālvalodu) citā (mērķa valodā). Kompilācija ir tulkošanas process no avota koda (parasti augsta līmeņa valodas) uz objekta kodu (parasti zema līmeņa valodu vai mašīnvalodu), ko var izpildīt tieši ar datoru vai virtuālo mašīnu.
.NET platformā ir divi dažādi kompilatori dažādos modeļa izpildes posmos: viens, ko sauc par Roslyn kompilatoru, kas apkopo C# un VB kodu komplektos; Otru sauc par RyuJIT kompilatoru, kas apkopo IL (starpvalodas) kodu montāžā mašīnas kodā.
Šis raksts sākas ar Roslyn kompilatoru. Mums nav jāiedziļinās, kā tas darbojas, bet lai saprastu, kā tas darbojas, lai zinātu, kam to var izmantot.
Sākotnēji C# valodas kompilators tika rakstīts C++, un vēlāk Microsoft ieviesa jaunu kompilatoru, kas rakstīts pašā C#: Roslyn, kas ir bootstrap kompilators.
Bootstrap kompilators nozīmē, ka noteiktas programmēšanas valodas kompilators ir rakstīts pašā valodā. Katra bootstrap kompilatora versija tiek kompilēta ar versiju, kas bija pirms tās, bet tās pirmā versija ir jākompilē kompilatoram, kas rakstīts citā valodā, piemēram, Roslyn pirmā versija, ko kompilējis kompilators, kas rakstīts C++. Daudzas programmēšanas valodas nobriest un raksta savus kompilatorus, izmantojot pašu valodu, piemēram, C# un Go.
.NET platformā Roslyn kompilators ir atbildīgs par C# un VB koda kompilēšanu komplektos.
Lielākā daļa esošo tradicionālo kompilatoru ir "melnās kastes" modeļi, kas pārvērš avota kodu izpildāmos failos vai bibliotēkas failos, un mums nav iespējas zināt, kas notiek pa vidu. Atšķirībā no Roslyn, Roslyn ļauj piekļūt katram koda kompilēšanas procesa posmam, izmantojot API.
Tās darba mehānisms ir balstīts uz cauruļvadu, ar četriem posmiem, no kuriem katrs ir neatkarīgs modulis, un katrs modulis nodrošina atbilstošu API. Integrētās izstrādes vides (IDE) var izmantot šīs API, lai nodrošinātu ērtus rīkus izstrādes efektivitātes uzlabošanai, piemēram, koda izcelšanu, viedos padomus, pārveidošanas rīkus, veiktspējas analīzes rīkus un daudz ko citu. Turklāt, izmantojot Roslyn, izstrādātāji var izmantot kompilatoru kā pakalpojumu savās programmās.
Izmantojiet Roslyn nodrošinātās API, lai dinamiski ģenerētu koda paraugus
Vispirms izveidojiet jaunu ClassLibraryGenerator bibliotēku un .NET standarta bibliotēkas projektu, kas paredzēts netstandard2.0 mērķa struktūras monikeram (TFM). Pievienojiet NuGet pakotnes Microsoft.CodeAnalysis.Analyzers un Microsoft.CodeAnalysis.CSharp, csproj ir konfigurēts šādi:
Izveidojiet jaunu C# failu ar nosaukumu TestSourceGenerator.cs, kas norāda savu avota ģeneratoru šādi:
No konteksta objekta mēs varam piekļūt kompilētajam ieejas punktam vai galvenajai metodei. MainMethod instance ir IMethodSymbol, kas apzīmē metodes vai līdzīgas metodes simbolu (ieskaitot konstruktorus, destruktorus, operatorus vai atribūtu/notikumu piekļūstošos). Metode Microsoft.CodeAnalysis.Compilation.GetEntryPoint atgriež programmas ieejas punkta IMethodSymbol. Citas metodes ļauj projektā atrast jebkuru metodes simbolu. Šajā objektā mēs varam secināt nosaukumu telpu (ja tāda ir) un tajā esošo tipu. Šajā piemērā avots ir interpolēta virkne, kas veido ģenerējamo avota kodu, un interpolētās nepilnības aizpilda saturošo nosaukumvietu un tipa informāciju. Pievienojiet avotu kontekstam ar uzvednes nosaukumu. Šajā piemērā veidotājs izveido jaunu būvēšanas avota failu, kas satur daļējas metodes ieviešanu konsoles lietojumprogrammā. Avota ģeneratoru var uzrakstīt, lai pievienotu jebkuru iecienītāko avotu.
Izveidojiet jaunu ConsoleApp4 konsoles lietotni (bez augstākā līmeņa paziņojumiem) ar šādu kodu:
Tajā pašā laikā pievienojiet ClassLibraryGenerator projekta atsauci šādi:
Mēģiniet palaist konsoles lietotni ar izvadi šādi:
Visual Studio noklikšķiniet uz projekta "Atkarības" - > "Analizators" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", veiciet dubultklikšķi uz faila "Program.g.cs", lai redzētu ģenerēto kodu šādi:
Uzvedne:Lai modificētu veidotāja kodu, var būt nepieciešams restartēt Visual Studio, lai to redzētu。
Roslyn GitHub adrese:Hipersaites pieteikšanās ir redzama.
Atsauce:
Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama. |