Sdílet prostřednictvím


Práce se sémantikou

Stromy syntaxe představují lexikální a syntaktickou strukturu zdrojového kódu. I když samotné tyto informace stačí k popisu všech deklarací a logiky ve zdroji, není dostatek informací k identifikaci toho, na co se odkazuje. Název může představovat:

  • typ
  • pole
  • metoda
  • místní proměnná

I když se každý z nich jedinečně liší, určení toho, který identifikátor skutečně odkazuje, často vyžaduje hluboké porozumění jazykovým pravidlům.

Ve zdrojovém kódu jsou reprezentované prvky programu a programy mohou také odkazovat na dříve zkompilované knihovny zabalené v souborech sestavení. I když nejsou pro sestavení k dispozici žádné zdrojové kódy, a proto žádné uzly syntaxe ani stromy, programy mohou stále odkazovat na prvky uvnitř.

Pro tyto úlohy potřebujete sémantický model.

Kromě syntaktického modelu zdrojového kódu zapouzdřuje sémantický model pravidla jazyka a poskytuje snadný způsob, jak správně spárovat identifikátory se správným prvkem programu, na který odkazujete.

Kompilace

Kompilace je reprezentace všeho potřebného ke kompilaci programu jazyka C# nebo Visual Basic, který zahrnuje všechny odkazy na sestavení, možnosti kompilátoru a zdrojové soubory.

Vzhledem k tomu, že všechny tyto informace jsou na jednom místě, je možné podrobněji popsat prvky obsažené ve zdrojovém kódu. Kompilace představuje každý deklarovaný typ, člen nebo proměnnou jako symbol. Kompilace obsahuje řadu metod, které vám pomohou najít a spojit symboly, které byly buď deklarovány ve zdrojovém kódu, nebo importovány jako metadata ze sestavení.

Podobně jako u stromů syntaxe jsou kompilace neměnné. Po vytvoření kompilace ji nemůžete změnit vy ani nikdo jiný, se kterým ji můžete sdílet. Můžete však vytvořit novou kompilaci z existující kompilace a určit změnu, jak to uděláte. Můžete například vytvořit kompilaci, která je stejná každým způsobem jako existující kompilace, s výjimkou toho, že může obsahovat další zdrojový soubor nebo odkaz na sestavení.

Symboly

Symbol představuje jedinečný prvek deklarovaný zdrojovým kódem nebo importovaný ze sestavení jako metadata. Každý obor názvů, typ, metoda, vlastnost, pole, událost, parametr nebo místní proměnná je reprezentován symbolem.

Různé metody a vlastnosti typu Compilation vám pomůžou najít symboly. Symbol deklarovaného typu můžete například najít podle jeho běžného názvu metadat. K celé tabulce symbolů můžete přistupovat také jako ke stromu symbolů v kořenovém adresáři globálního oboru názvů.

Symboly také obsahují další informace, které kompilátor určuje ze zdroje nebo metadat, například z jiných odkazovaných symbolů. Každý druh symbolu je reprezentován samostatným rozhraním odvozeným od ISymbol, každý s vlastními metodami a vlastnostmi podrobně o informacích, které kompilátor shromáždil. Mnohé z těchto vlastností přímo odkazují na jiné symboly. IMethodSymbol.ReturnType Například vlastnost říká skutečnému typu symbol, že metoda vrací.

Symboly představují společnou reprezentaci oborů názvů, typů a členů mezi zdrojovým kódem a metadaty. Například metoda deklarovaná ve zdrojovém kódu a metoda, která byla importována z metadat, jsou reprezentovány pomocí IMethodSymbol stejných vlastností.

Symboly jsou podobné systému typů CLR, jak je znázorněno System.Reflection rozhraním API, ale jsou bohatší v tom, že modelují více než jen typy. Obory názvů, místní proměnné a popisky jsou všechny symboly. Symboly jsou navíc reprezentací konceptů jazyka, nikoli konceptů CLR. Existuje mnoho překrývajících se, ale existuje mnoho smysluplných rozdílů. Například metoda iterátoru v jazyce C# nebo Visual Basic je jediný symbol. Pokud je však metoda iterátoru přeložena do metadat CLR, jedná se o typ a více metod.

Sémantický model

Sémantický model představuje všechny sémantické informace pro jeden zdrojový soubor. Můžete ho použít ke zjištění následujících možností:

  • Symboly odkazované na konkrétní umístění ve zdroji.
  • Výsledný typ libovolného výrazu.
  • Všechna diagnostika, což jsou chyby a upozornění.
  • Jak proměnné proudí do a z oblastí zdroje.
  • Odpovědi na spekulativní otázky.