Teilen über


Arbeiten mit der Semantik

Syntaxstrukturen stellen die lexikalische und syntaktische Struktur des Quellcodes dar. Obwohl diese Informationen allein ausreichen, um alle Deklarationen und Logik in der Quelle zu beschreiben, reicht es nicht aus, um zu identifizieren, auf was verwiesen wird. Ein Name kann Folgendes darstellen:

  • einen Typ
  • einem Feld
  • eine Methode
  • eine lokale Variable

Obwohl jede davon eindeutig unterschiedlich ist, erfordert die Feststellung, auf welche ein Bezeichner tatsächlich verweist, oft ein tiefes Verständnis der sprachlichen Regeln.

Es gibt Programmelemente, die im Quellcode dargestellt werden, und Programme können auch auf zuvor kompilierte Bibliotheken verweisen, die in Assemblydateien verpackt sind. Obwohl kein Quellcode und daher keine Syntaxknoten oder Strukturen für Assemblys verfügbar sind, können Programme weiterhin auf Elemente in ihnen verweisen.

Für diese Aufgaben benötigen Sie das Semantikmodell.

Neben einem syntaktischen Modell des Quellcodes kapselt ein semantisches Modell die Sprachregeln, sodass Sie bezeichner problemlos mit dem richtigen Programmelement abgleichen können, auf das verwiesen wird.

Kompilierung

Eine Kompilierung ist eine Darstellung aller Erforderlichen zum Kompilieren eines C#- oder Visual Basic-Programms, das alle Assemblyverweise, Compileroptionen und Quelldateien enthält.

Da sich alle diese Informationen an einem Ort befinden, können die im Quellcode enthaltenen Elemente ausführlicher beschrieben werden. Die Kompilierung stellt jeden deklarierten Typ, jedes Element oder jede Variable als Symbol dar. Die Kompilierung enthält eine Vielzahl von Methoden, mit denen Sie die Symbole finden und verknüpfen können, die entweder im Quellcode deklariert oder als Metadaten aus einer Assembly importiert wurden.

Ähnlich wie Syntaxstrukturen sind Kompilierungen unveränderlich. Nachdem Sie eine Kompilierung erstellt haben, kann sie nicht von Ihnen oder anderen Personen geändert werden, für die Sie sie möglicherweise freigeben. Sie können jedoch eine neue Kompilierung aus einer vorhandenen Kompilierung erstellen und dabei eine Änderung angeben. Sie können z. B. eine Kompilierung erstellen, die auf jede Weise wie eine vorhandene Kompilierung identisch ist, mit der Ausnahme, dass sie eine zusätzliche Quelldatei oder einen Assemblyverweis enthält.

Symbole

Ein Symbol stellt ein unterschiedliches Element dar, das vom Quellcode deklariert oder aus einer Assembly als Metadaten importiert wird. Jeder Namespace, Typ, Methode, Eigenschaft, Feld, Ereignis, Parameter oder lokale Variable wird durch ein Symbol dargestellt.

Eine Vielzahl von Methoden und Eigenschaften für den Compilation Typ helfen Ihnen, Symbole zu finden. Sie können z. B. ein Symbol für einen deklarierten Typ anhand des allgemeinen Metadatennamens finden. Sie können auch auf die gesamte Symboltabelle als Struktur von Symbolen zugreifen, die durch den globalen Namespace verwurzelt sind.

Symbole enthalten auch zusätzliche Informationen, die der Compiler aus der Quelle oder Metadaten bestimmt, z. B. andere referenzierte Symbole. Jede Art von Symbol wird durch eine separate Schnittstelle dargestellt, die von ISymbol abgeleitet wird, jede mit ihren eigenen Methoden und Eigenschaften, die die Informationen enthalten, die der Compiler gesammelt hat. Viele dieser Eigenschaften verweisen direkt auf andere Symbole. Die Eigenschaft informiert Sie beispielsweise über das tatsächliche Typsymbol, IMethodSymbol.ReturnType das die Methode zurückgibt.

Symbole stellen eine allgemeine Darstellung von Namespaces, Typen und Membern zwischen Quellcode und Metadaten dar. Beispielsweise wird eine Methode, die im Quellcode deklariert wurde, und eine Methode, die aus Metadaten importiert wurde, durch eine IMethodSymbol mit den gleichen Eigenschaften dargestellt.

Symbole ähneln dem CLR-Typsystem, wie es durch die System.Reflection API dargestellt wird, aber sie sind umfangreicher, da sie mehr als nur Typen modellieren. Namespaces, lokale Variablen und Bezeichnungen sind alle Symbole. Darüber hinaus sind Symbole eine Darstellung von Sprachkonzepten, nicht CLR-Konzepte. Es gibt viele Überschneidungen, aber es gibt auch viele sinnvolle Unterscheidungen. Beispielsweise ist eine Iteratormethode in C# oder Visual Basic ein einzelnes Symbol. Wenn die Iteratormethode jedoch in CLR-Metadaten übersetzt wird, handelt es sich um einen Typ und mehrere Methoden.

Semantikmodell

Ein Semantikmodell stellt alle semantischen Informationen für eine einzelne Quelldatei dar. Sie können es verwenden, um Folgendes zu ermitteln:

  • Die Symbole, auf die an einer bestimmten Stelle in der Quelle verwiesen wird.
  • Der resultierende Typ eines beliebigen Ausdrucks.
  • Alle Diagnosen, bei denen es sich um Fehler und Warnungen handelt.
  • So fließen Variablen in und außerhalb der Quellbereiche.
  • Die Antworten auf spekulativere Fragen.