Compiler: Een compiler is een programma dat broncode (oorspronkelijke taal) die in de ene programmeertaal is geschreven omzet in een andere (doeltaal). Compilatie is het proces waarbij wordt vertaald van broncode (meestal een hoog-niveau taal) naar objectcode (meestal een laag-niveau taal of machinetaal) die direct door een computer of virtuele machine kan worden uitgevoerd.
Op het .NET-platform zijn er twee verschillende compilers in verschillende fasen van het uitvoeren van het model: één genaamd de Roslyn-compiler, die C#- en VB-code compileert tot assemblies; De andere heet de RyuJIT-compiler, die de IL (intermediate language) code in de assembly compileert tot machinecode.
Dit artikel begint met de Roslyn-compiler. We hoeven niet te onderzoeken hoe het werkt, maar om te begrijpen hoe het werkt, om te weten waarvoor het gebruikt kan worden.
Aanvankelijk was de compiler van de C#-taal geschreven in C++, en later introduceerde Microsoft een nieuwe compiler die zelf in C# was geschreven: Roslyn, een bootstrap-compiler.
De bootstrap-compiler betekent dat de compiler van een bepaalde programmeertaal in de taal zelf is geschreven. Elke versie van de bootstrap-compiler wordt gecompileerd met een versie die eraan voorafging, maar de eerste versie moet worden gecompileerd door een compiler geschreven in een andere taal, zoals Roslyns eerste versie gecompileerd door een compiler geschreven in C++. Veel programmeertalen ontwikkelen zich en schrijven hun eigen compilers met de taal zelf, zoals C# en Go.
Op het .NET-platform is de Roslyn-compiler verantwoordelijk voor het compileren van C#- en VB-code tot assemblies.
De meeste bestaande traditionele compilers zijn "black box"-patronen die broncode omzetten in uitvoerbare bestanden of bibliotheekbestanden, en we hebben geen manier om te weten wat er tussenin gebeurt. In tegenstelling tot Roslyn kun je via API's toegang krijgen tot elke fase van het codecompilatieproces.
Het werkingsmechanisme is gebaseerd op een pijplijn, met vier fasen, elk een onafhankelijke module, en elke module biedt een bijbehorende API. Geïntegreerde ontwikkelomgevingen (IDE's) kunnen deze API's benutten om handige tools te bieden die de ontwikkelingsefficiëntie verbeteren, zoals codemarkering, slimme hints, refactoringtools, prestatie-analysetools en meer. Daarnaast kunnen ontwikkelaars met Roslyn de compiler als service in hun eigen programma's gebruiken.
Maak gebruik van de API's die Roslyn biedt om codevoorbeelden dynamisch te genereren
Maak eerst een nieuwe ClassLibraryGenerator-bibliotheek aan en maak een .NET standaard bibliotheekproject dat zich richt op de netstandard2.0 target framework-moniker (TFM). Voeg de NuGet-pakketten Microsoft.CodeAnalysis.Analyzers en Microsoft.CodeAnalysis.CSharp toe, csproj is als volgt geconfigureerd:
Maak een nieuw C#-bestand aan genaamd TestSourceGenerator.cs dat je eigen brongenerator als volgt specificeert:
Vanuit het contextobject kunnen we toegang krijgen tot het gecompileerde entry-point of de Main-methode. Een mainMethod-instantie is een IMethodSymbol die het symbool van een methode of vergelijkbare methode voorstelt (inclusief constructors, destructors, operatoren of attribute/event accessors). De Microsoft.CodeAnalysis.Compilation.GetEntryPoint-methode geeft het IMethodSymbol van het toegangspunt van het programma terug. Andere methoden stellen je in staat om elk methodesymbool in je project te vinden. In dit object kunnen we de naamruimte (als die bestaat) en het type dat het bevat afleiden. De bron in dit voorbeeld is een geïnterpoleerde string die de te genereren broncode sjablont, waarbij de geïnterpoleerde gaten de opgenomen naamruimte en type-informatie vullen. Voeg bron toe aan de context met de promptnaam. Voor dit voorbeeld maakt de builder een nieuw buildbronbestand aan dat de implementatie van de gedeeltelijke methode in de console-applicatie bevat. Een brongenerator kan worden geschreven om elke favoriete bron toe te voegen.
Maak een nieuwe ConsoleApp4-console-app aan (zonder top-level statements) met de volgende code:
Voeg tegelijkertijd de ClassLibraryGenerator-projectreferentie toe, als volgt:
Probeer de console-app te starten met de output als volgt:
Klik in Visual Studio op het project "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", dubbelklik op het "Program.g.cs"-bestand om de gegenereerde code te zien, als volgt:
Prompt:Het aanpassen van de bouwercode kan vereisen dat je Visual Studio opnieuw moet opstarten om het te kunnen zien。
Roslyn GitHub-adres:De hyperlink-login is zichtbaar.
Referentie:
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar. |