Roslyn — platforma kompilatora .NET
Wstęp
Dla tych, którzy są związani z branżą technologiczną od jakiegoś czasu, termin „.NET” jest prawdopodobnie znajomy. Mogą również wiedzieć, że został opracowany przez firmę Microsoft. Jednak zaskoczeniem może być fakt, że .NET stał się open source w 2016 roku. Ten artykuł skupia się na Roslyn , platformie kompilatora używanej w .NET.
Zanim zagłębisz się w Roslyn, ważne jest, aby najpierw zrozumieć, czym jest .NET.
Co to jest .NET?
.NET (znany również jako .NET core) to bezpłatna , wieloplatformowa platforma programistyczna typu open source opracowana przez firmę Microsoft do tworzenia wielu różnych typów aplikacji internetowych, mobilnych, komputerowych, gier, IoT i nie tylko . Jest to międzyplatformowy następca własnościowego .NET Framework , który działał głównie w systemie Windows .
.NET oferuje następujące 3 języki programowania.
C#
C# to uniwersalny język programowania wysokiego poziomu obsługujący wiele paradygmatów. C# obejmuje pisanie statyczne, silne pisanie, leksykalne, imperatywne, deklaratywne, funkcjonalne, ogólne, zorientowane obiektowo i komponentowo.
F#
F# to przede wszystkim funkcjonalny, wieloparadygmatowy język programowania ogólnego przeznaczenia, silnie typowany, który obejmuje funkcjonalne, imperatywne i obiektowe metody programowania.
Visual Basic
Visual Basic to wieloparadygmatowy, zorientowany obiektowo język programowania, który koncentruje się na przejrzystości, a nie na zwięzłości.
Czym jest Roslyn?
Roslyn to kryptonim projektu platformy kompilatora .NET, który wziął swoją nazwę od miasta o tej samej nazwie w Waszyngtonie w USA.
.NET Compiler Platform to zestaw kompilatorów typu open source i interfejsów API do analizy kodu dla języków C# i Visual Basic (VB.NET) .
Projekt zawiera wersje kompilatorów C# i VB.NET napisane w samych językach docelowych ( kompilatory self-hosted ). Kompilatory są dostępne za pośrednictwem programów wiersza poleceń, a także jako interfejsy API, których można używać natywnie z poziomu kodu platformy .NET.
Jak można napisać kompilator z samego języka docelowego?
Kiedy po raz pierwszy dowiedziałem się o językach programowania z kompilatorami napisanymi w samym języku, pojawiło się dla mnie pytanie: jak można stworzyć kompilator przy użyciu tego samego języka, który ma kompilować? Oto jak to się robi.
Początkowo kompilator jest napisany w istniejącym języku programowania, a gdy język jest wystarczająco dojrzały, rozwój kompilatora może przełączyć się na język, który kompiluje, umożliwiając kompilatorowi samodzielne zbudowanie. Te typy kompilatorów są określane jako kompilatory samoobsługowe.
Zagadka rozwiązana !!!
Co sprawia, że Roslyn jest wyjątkowa?
Roslyn wyróżnia się wśród większości innych kompilatorów głównie z następujących powodów.
- Roslyn to projekt typu open source : w przeciwieństwie do większości kompilatorów, które są zastrzeżone i mają zamknięte źródła, Roslyn jest oprogramowaniem typu open source. Oznacza to, że każdy może przeglądać kod źródłowy, modyfikować go i współtworzyć projekt. Dzięki temu jest bardziej przejrzysty i elastyczny, a programiści mogą na nim budować.
- Roslyn to platforma , a nie tylko kompilator : Roslyn to coś więcej niż tylko kompilator. To kompletna platforma do budowania kompilatorów i narzędzi językowych. Zawiera zestaw interfejsów API, które umożliwiają programistom pracę z drzewem składni, modelem semantycznym i innymi elementami języka na poziomie szczegółowym. Umożliwia to tworzenie potężnych narzędzi językowych, takich jak analiza kodu, refaktoryzacja i generowanie kodu.
- Roslyn zapewnia informacje zwrotne w czasie rzeczywistym : Roslyn została zaprojektowana tak, aby zapewniać informacje zwrotne w czasie rzeczywistym podczas pisania kodu. Podczas pisania parser Roslyn buduje drzewo składni z twojego kodu, a model semantyczny jest używany do analizy i zrozumienia kodu. Dzięki temu środowisko IDE zapewnia rozbudowane uzupełnianie kodu, sprawdzanie błędów i inne funkcje, które ułatwiają szybsze i dokładniejsze pisanie kodu.
- Roslyn jest wieloplatformowy : Podczas gdy tradycyjne kompilatory są często powiązane z określonym systemem operacyjnym, Roslyn został zaprojektowany jako wieloplatformowy. Może być używany do tworzenia aplikacji dla systemów Windows, Linux i macOS, dzięki czemu jest bardziej elastyczny i można go dostosować.
Architektura Roslyn
Dzięki warstwie API Roslyn, która odzwierciedla tradycyjny potok kompilatora, możesz uzyskać dostęp do analizy kodu kompilatorów C# i Visual Basic jak nigdy dotąd. To jak przepustka za kulisy do wewnętrznego działania kompilatorów.
Proces kompilacji Roslyn można podzielić na kilka faz.
- Rozbiór gramatyczny zdania
- Deklaracja
- Wiążący
- Emisja IL
Rozbiór gramatyczny zdania
Ta faza składa się z dwóch faz podrzędnych, które następują po analizie składniowej po tokenizacji.
- Tokenizacja — w kontekście kompilatora tokenizacja (znana również jako leksyfikacja, analiza leksykalna) to proces przekształcania kodu źródłowego w sekwencję ciągów znaków z przypisanymi znaczeniami (tokenami). Program wykonujący tokenizację nazywa się tokenizer lub lexer.
- Parsowanie — w fazie parsowania dane wyjściowe z fazy tokenizacji są wykorzystywane do zbudowania struktury danych zwanej abstrakcyjnym drzewem składni, która zapewnia strukturalną reprezentację danych wejściowych podczas sprawdzania poprawności składni.
W tej fazie metadane źródłowe i importowane są analizowane w celu utworzenia nazwanych symboli.
Wiążący
Ta faza dopasowuje identyfikatory w kodzie do symboli.
Emisja IL
W tej fazie emitowany jest kod w języku pośrednim ze wszystkimi informacjami.
Wykorzystując odpowiedni kompilator just-in-time (JIT), możliwe jest uruchomienie kodu IL na dowolnej architekturze komputera zgodnej z kompilatorem JIT.
Równolegle do każdej z tych faz kompilacji platforma kompilatora .NET udostępnia zestaw interfejsów API, które umożliwiają dostęp do informacji z każdej z tych faz.
- Parser — interfejs API drzewa składni
- Faza deklaracji — Symbole API
- Binder — interfejsy API do wiązania i analizy przepływu
- Emiter IL — API emisji
Zestaw SDK kompilatora .NET składa się z kilku warstw interfejsów API.
Interfejsy API kompilatora
Te interfejsy API składają się z modeli obiektów, które odpowiadają informacjom ujawnianym w każdej fazie potoku kompilatora, w tym zarówno dane składniowe, jak i semantyczne.
Zawierają niezmienną migawkę pojedynczego wywołania kompilatora, w tym odwołania do zestawu, opcje kompilatora i pliki kodu źródłowego.
Niezmienny oznacza, że kiedy zmieniamy obiekt, zwracana jest zmodyfikowana kopia.
Ta niezmienność pomaga zachować bezpieczeństwo wątków i zapewnia korzyści w zakresie wydajności.
Istnieją dwa różne interfejsy API, które reprezentują język C# i język Visual Basic.
Interfejsy API diagnostyki
W procesie kompilacji kompilator tworzy informacje diagnostyczne o kodzie, w tym błędy składniowe, ostrzeżenia i statystyki.
Warstwa interfejsu API kompilatora udostępnia powyższe informacje za pośrednictwem rozszerzalnego interfejsu API, który umożliwia podłączenie analizatorów zdefiniowanych przez użytkownika do procesu kompilacji.
Skryptowe interfejsy API
Warstwa kompilatora Roslyn obejmuje interfejsy API hostingu i skryptów, które umożliwiają użytkownikom wykonywanie fragmentów kodu i budowanie kontekstu wykonawczego.
Interaktywna pętla REPL (Read-Evaluate-Print Loop) języka C# wykorzystuje te interfejsy API, umożliwiając użytkownikom wykorzystanie języka C# jako języka skryptowego i interaktywne wykonywanie kodu podczas jego pisania.
Interfejsy API obszaru roboczego
Te interfejsy API służą jako punkt wyjścia do przeprowadzania analizy kodu i refaktoryzacji całych rozwiązań.
Ponadto warstwa Workspaces Roslyn udostępnia szereg interfejsów API wykorzystywanych podczas budowania narzędzi do analizy kodu i refaktoryzacji, które działają w środowisku hosta, takim jak Visual Studio IDE.
Niektóre zastosowania tych interfejsów API to interfejsy API formatowania, wyszukiwania wszystkich odwołań i generowania kodu.
Streszczenie
Biorąc pod uwagę wiedzę, którą zdobyliśmy do tej pory, oczywiste jest, że Roslyn zaznaczyła znaczący punkt zwrotny w ewolucji kompilatorów.
Służył jako źródło wiedzy i inspiracji dla nadchodzących języków programowania i kompilatorów.
Moim zdaniem decyzja Microsoftu o uczynieniu z niej technologii typu open source była przełomowa, ponieważ umożliwia globalnej społeczności współpracę i zwiększanie jej możliwości, torując w ten sposób drogę do lepszej przyszłości.
Jak się przyczynić
Oprogramowanie typu open source dominuje dzięki wkładowi hojnych, entuzjastycznych osób ze społeczności. Rozwój Roslyn odbywa się za pośrednictwem GitHub. Jeśli chcesz wnieść swój wkład, oto link do wytycznych dotyczących wkładu podanych w ich repozytorium GitHub.
https://github.com/dotnet/roslyn/blob/main/docs/contributing/Building%2C%20Debugging%2C%20and%20Testing%20on%20Windows.md
Bibliografia
Przewodnik po języku C# na platformie edukacyjnej firmy Microsoft
https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/
artykuły w Wikipedii
https://en.wikipedia.org/wiki/Roslyn_(compiler)— na Roslyn
https://en.wikipedia.org/wiki/Lexical_analysis— o analizie leksykalnej
https://en.wikipedia.org/wiki/Parsing#Parser— na parsowaniu
https://en.wikipedia.org/wiki/Self-hosting_(compilers)— na własnym hostingu
Gościnny wykład Matthew Robinsa na Uniwersytecie Xamarin
https://youtu.be/Gv7vuA-7UVA
Repozytorium GitHub Roslyn
https://github.com/dotnet/roslyn
Film autorstwa Velocity Code
https://youtu.be/8KdW_VfqLIg
Artykuł w Techopedii na temat języków pośrednich
https://www.techopedia.com/definition/24290/intermediate-language-il-net
Artykuł Richarda Campbella „When open source przyszedł do firmy Microsoft”.
https://www.codemag.com/Article/2009041/When-Open-Source-Came-to-Microsoft#:~:text=NET%20Framework%20open%2Dsource%3B%20the,%2C%20build%2C%20and%20test%20systems.