Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli alberi della sintassi rappresentano la struttura lessicale e sintattica del codice sorgente. Anche se queste informazioni da sole sono sufficienti per descrivere tutte le dichiarazioni e la logica nell'origine, non sono sufficienti informazioni per identificare ciò che viene fatto riferimento. Un nome può rappresentare:
- una tipologia
- Un campo
- un metodo
- una variabile locale
Anche se ognuno di questi elementi è univocamente diverso, determinare quale identificatore fa effettivamente riferimento spesso richiede una conoscenza approfondita delle regole del linguaggio.
Sono presenti elementi di programma rappresentati nel codice sorgente e i programmi possono anche fare riferimento a librerie compilate in precedenza, incluse nei file di assembly. Anche se nessun codice sorgente, né nodi di sintassi o alberi, sono disponibili per gli assembly, i programmi possono comunque fare riferimento agli elementi all'interno di essi.
Per queste attività, è necessario il modello semantico.
Oltre a un modello sintattico del codice sorgente, un modello semantico incapsula le regole del linguaggio, offrendo un modo semplice per abbinare correttamente gli identificatori con l'elemento di programma corretto a cui viene fatto riferimento.
Compilazione
Una compilazione è una rappresentazione di tutti gli elementi necessari per compilare un programma C# o Visual Basic, che include tutti i riferimenti agli assembly, le opzioni del compilatore e i file di origine.
Poiché tutte queste informazioni si trovano in un'unica posizione, gli elementi contenuti nel codice sorgente possono essere descritti in modo più dettagliato. La compilazione rappresenta ogni tipo, membro o variabile dichiarato come simbolo. La compilazione contiene diversi metodi che consentono di trovare e correlare i simboli dichiarati nel codice sorgente o importati come metadati da un assembly.
Analogamente agli alberi della sintassi, le compilazioni non sono modificabili. Dopo aver creato una compilazione, non può essere modificata dall'utente o da altri utenti con cui è possibile condividerla. Tuttavia, è possibile creare una nuova compilazione da una compilazione esistente, specificando una modifica come si fa. Ad esempio, è possibile creare una compilazione identica a quella di una compilazione esistente, ad eccezione del fatto che può includere un file di origine o un riferimento all'assembly aggiuntivo.
Simboli
Un simbolo rappresenta un elemento distinto dichiarato dal codice sorgente o importato da un assembly come metadati. Ogni spazio dei nomi, tipo, metodo, proprietà, campo, evento, parametro o variabile locale è rappresentato da un simbolo.
Un'ampia gamma di metodi e proprietà sul Compilation tipo consente di trovare i simboli. Ad esempio, è possibile trovare un simbolo per un tipo dichiarato in base al relativo nome di metadati comune. È anche possibile accedere all'intera tabella dei simboli come un albero di simboli radicato dallo spazio dei nomi globale.
I simboli contengono anche informazioni aggiuntive che il compilatore determina dall'origine o dai metadati, ad esempio altri simboli a cui si fa riferimento. Ogni tipo di simbolo è rappresentato da un'interfaccia separata derivata da ISymbol, ognuno con i propri metodi e proprietà che descrivono in dettaglio le informazioni raccolte dal compilatore. Molte di queste proprietà fanno riferimento direttamente ad altri simboli. Ad esempio, la IMethodSymbol.ReturnType proprietà indica il simbolo di tipo effettivo restituito dal metodo.
I simboli presentano una rappresentazione comune di spazi dei nomi, tipi e membri, tra il codice sorgente e i metadati. Ad esempio, un metodo dichiarato nel codice sorgente e un metodo importato dai metadati sono entrambi rappresentati da un oggetto IMethodSymbol con le stesse proprietà.
I simboli sono simili al concetto del sistema di tipi CLR come rappresentato dall'API System.Reflection , ma sono più ricchi in quanto modellano più dei soli tipi. Gli spazi dei nomi, le variabili locali e le etichette sono tutti simboli. Inoltre, i simboli sono una rappresentazione dei concetti del linguaggio, non dei concetti CLR. C'è molta sovrapposizione, ma esistono anche molte distinzioni significative. Ad esempio, un metodo iteratore in C# o Visual Basic è un singolo simbolo. Tuttavia, quando il metodo iteratore viene tradotto in metadati CLR, diventa un tipo e comprende più metodi.
Modello semantico
Un modello semantico rappresenta tutte le informazioni semantiche per un singolo file di origine. È possibile usarlo per individuare quanto segue:
- Simboli a cui si fa riferimento in una posizione specifica nell'origine.
- Tipo risultante di qualsiasi espressione.
- Tutti i dati di diagnostica, che sono errori e avvisi.
- Modalità di flusso delle variabili all'interno e all'esterno delle aree di origine.
- Risposte a domande più speculative.