Kompilator: Kompilator to program, który konwertuje kod źródłowy (oryginalny język) napisany w jednym języku programowania na inny (język docelowy). Kompilacja to proces tłumaczenia z kodu źródłowego (zwykle języka wysokiego poziomu) na kod obiektowy (zwykle język niskopoziomowy lub maszynowy), który może być wykonywany bezpośrednio przez komputer lub maszynę wirtualną.
W platformie .NET istnieją dwa różne kompilatory na różnych etapach wykonywania modelu: jeden zwany kompilatorem Roslyn, który kompiluje kod C# i VB do asembli; Druga to kompilator RyuJIT, który kompiluje kod IL (język pośredni) w asemblerze do kodu maszynowego.
Ten artykuł zaczyna się od kompilatora Roslyn. Nie musimy zagłębiać się w to, jak działa, ale by zrozumieć, jak działa, by wiedzieć, do czego można go wykorzystać.
Początkowo kompilator języka C# był napisany w C++, a później Microsoft wprowadził nowy kompilator napisany w samym C#: Roslyn, który jest kompilatorem bootstrap.
Kompilator bootstrap oznacza, że kompilator danego języka programowania jest napisany w samym języku. Każda wersja kompilatora bootstrap jest kompilowana z wersją poprzedzającą ją, ale jej pierwsza wersja musi być skompilowana przez kompilator napisany w innym języku, na przykład pierwsza wersja Roslyn skompilowana przez kompilator napisany w C++. Wiele języków programowania dojrzewa i tworzy własne kompilatory wykorzystujące sam język, takie jak C# i Go.
Na platformie .NET kompilator Roslyn odpowiada za kompilację kodu C# i VB do asembli.
Większość istniejących tradycyjnych kompilatorów to wzorce typu "skrzynka", które konwertują kod źródłowy na pliki wykonywalne lub pliki biblioteczne, a my nie mamy pojęcia, co dzieje się pomiędzy. W przeciwieństwie do Roslyn, Roslyn umożliwia dostęp do każdego etapu procesu kompilacji kodu za pośrednictwem API.
Jego mechanizm działania opiera się na potokach, z czterema etapami, z których każdy stanowi niezależny moduł, a każdy moduł zapewnia odpowiadające mu API. Zintegrowane środowiska programistyczne (IDE) mogą wykorzystywać te API, aby zapewnić wygodne narzędzia zwiększające efektywność rozwoju, takie jak podświetlanie kodu, inteligentne wskazówki, narzędzia do refaktoryzacji, narzędzia do analizy wydajności i inne. Dodatkowo, w Roslyn deweloperzy mogą używać kompilatora jako usługi w swoich własnych programach.
Wykorzystaj API udostępnione przez Roslyn do dynamicznego generowania próbek kodu
Najpierw stwórz nową bibliotekę ClassLibraryGenerator i stworzyć projekt biblioteki standardowej .NET, który będzie celował w framework netstandard2.0 (TFM). Dodaj pakiety NuGet Microsoft.CodeAnalysis.Analyzers oraz Microsoft.CodeAnalysis.CSharp, a csproj jest skonfigurowany następująco:
Stwórz nowy plik C# o nazwie TestSourceGenerator.cs, który określa Twój własny generator źródeł w następujący sposób:
Z obiektu kontekstowego możemy uzyskać dostęp do skompilowanego punktu wejścia lub do metody Main. Instancja mainMethod to IMethodSymbol reprezentujący symbol metody lub podobnej metody (w tym konstruktorów, destruktorów, operatorów lub atrybutów/eventowych accessorów). Metoda Microsoft.CodeAnalysis.Compilation.GetEntryPoint zwraca IMethodSymbol punktu wejścia programu. Inne metody pozwalają znaleźć dowolny symbol metody w projekcie. W tym obiekcie możemy wywnioskować przestrzeń nazw (jeśli istnieje) oraz typ, który zawiera. Źródłem w tym przykładzie jest interpolowany ciąg tekstu, który szablonuje kod źródłowy do wygenerowania, a interpolowane luki wypełniają zawartą przestrzeń nazw i informacje o typie. Dodaj źródło do kontekstu wraz z nazwą promptu. W tym przykładzie twórca tworzy nowy plik źródłowy budowy, który zawiera implementację częściowej metody w aplikacji konsolowej. Generator źródeł może być napisany, aby dodać dowolne ulubione źródło.
Stwórz nową aplikację konsolową ConsoleApp4 (bez instrukcji najwyższego poziomu) z następującym kodem:
Jednocześnie dodaj odniesienie do projektu ClassLibraryGenerator, w następujący sposób:
Spróbuj uruchomić aplikację konsolową z następującym wynikiem:
W Visual Studio kliknij na projekt "Dependencies" – > "Analyzer" – > "ClassLibraryGenerator" – > "ClassLibraryGenerator.TestSourceGenerator", kliknij dwukrotnie na plik "Program.g.cs", aby zobaczyć wygenerowany kod, w następujący sposób:
Monit:Modyfikacja kodu budującego może wymagać ponownego uruchomienia Visual Studio, aby go zobaczyć。
Adres GitHub Roslyn:Logowanie do linku jest widoczne.
Odniesienie:
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne. |