Udostępnij za pomocą


Korzystanie z semantyki

Drzewa składni reprezentują leksykatyczną i składniową strukturę kodu źródłowego. Chociaż te informacje są wystarczające do opisania wszystkich deklaracji i logiki w źródle, nie wystarczy informacji, aby zidentyfikować, do czego się odwołujesz. Nazwa może reprezentować:

  • typ
  • pole
  • metoda
  • zmienna lokalna

Chociaż każdy z nich jest unikatowo inny, określenie, który identyfikator rzeczywiście odwołuje się do często wymaga głębokiego zrozumienia reguł języka.

Istnieją elementy programu reprezentowane w kodzie źródłowym, a programy mogą również odwoływać się do wcześniej skompilowanych bibliotek, spakowanych w plikach zestawów. Chociaż nie ma kodu źródłowego, a zatem nie ma węzłów składniowych ani drzew dla zestawów, programy nadal mogą odwoływać się do elementów wewnątrz nich.

W przypadku tych zadań potrzebny jest model semantyczny.

Oprócz modelu składniowego kodu źródłowego semantyczny model hermetyzuje reguły języka, zapewniając łatwy sposób poprawnego dopasowania identyfikatorów przy użyciu odpowiedniego elementu programu, do którego odwołuje się odwołanie.

Kompilacja

Kompilacja to reprezentacja wszystkich elementów potrzebnych do skompilowania programu w języku C# lub Visual Basic, który obejmuje wszystkie odwołania do zestawów, opcje kompilatora i pliki źródłowe.

Ponieważ wszystkie te informacje znajdują się w jednym miejscu, elementy zawarte w kodzie źródłowym można opisać bardziej szczegółowo. Kompilacja reprezentuje każdy zadeklarowany typ, składową lub zmienną jako symbol. Kompilacja zawiera różne metody, które ułatwiają znajdowanie i powiązanie symboli, które zostały zadeklarowane w kodzie źródłowym lub zaimportowane jako metadane z zestawu.

Podobnie jak drzewa składni, kompilacje są niezmienne. Po utworzeniu kompilacji nie można jej zmienić ani przez Ciebie, ani przez inną osobę, której możesz ją udostępnić. Można jednak utworzyć nową kompilację z istniejącej kompilacji, określając zmianę podczas tego procesu. Możesz na przykład utworzyć kompilację, która jest taka sama w każdym przypadku jak istniejąca kompilacja, z wyjątkiem dodatkowego pliku źródłowego lub odwołania do zestawu.

Symbole

Symbol reprezentuje odrębny element zadeklarowany przez kod źródłowy lub zaimportowany z zestawu jako metadane. Każda przestrzeń nazw, typ, metoda, właściwość, pole, zdarzenie, parametr lub zmienna lokalna jest reprezentowana przez symbol.

Różne metody i właściwości typu Compilation ułatwiają znajdowanie symboli. Na przykład można znaleźć symbol zadeklarowanego typu według jego nazwy wspólnych metadanych. Możesz również uzyskać dostęp do całej tabeli symboli jako drzewa symboli zakorzenionych w globalnej przestrzeni nazw.

Symbole zawierają również dodatkowe informacje, które kompilator określa ze źródła lub metadanych, takie jak inne przywoływane symbole. Każdy rodzaj symbolu jest reprezentowany przez oddzielny interfejs pochodzący z ISymbolklasy , z których każdy ma własne metody i właściwości zawierające szczegółowe informacje zebrane przez kompilator. Wiele z tych właściwości bezpośrednio odwołuje się do innych symboli. Na przykład IMethodSymbol.ReturnType właściwość informuje cię o symbolu rzeczywistego typu zwracanego przez metodę.

Symbole przedstawiają wspólną reprezentację przestrzeni nazw, typów i elementów członkowskich między kodem źródłowym a metadanymi. Na przykład metoda zadeklarowana w kodzie źródłowym i metoda zaimportowana z metadanych jest reprezentowana przez obiekt IMethodSymbol o tych samych właściwościach.

Symbole są podobne do systemu typów CLR reprezentowanego przez System.Reflection interfejs API, ale są one bogatsze w to, że modelują więcej niż tylko typy. Przestrzenie nazw, zmienne lokalne i etykiety są symbolami. Ponadto symbole są reprezentacją pojęć językowych, a nie koncepcji CLR. Istnieje wiele nakładania się, ale również wiele znaczących różnic. Na przykład metoda iteratora w języku C# lub Visual Basic jest pojedynczym symbolem. Jednak gdy metoda iteratora jest tłumaczona na metadane CLR, jest to typ i wiele metod.

Model semantyczny

Semantyczny model reprezentuje wszystkie informacje semantyczne dla pojedynczego pliku źródłowego. Możesz go użyć, aby odnaleźć następujące elementy:

  • Miejsca, w których odwołuje się do symboli w źródle.
  • Wynikowy typ dowolnego wyrażenia.
  • Wszystkie dane diagnostyczne, które są błędami i ostrzeżeniami.
  • Sposób przepływu zmiennych w regionach źródła i poza nimi.
  • Odpowiedzi na bardziej spekulacyjne pytania.